Tomo is a macOS app for chatting with cloud or local language models and bringing whatever is on your screen into the conversation.
Learn more and download at wvlen.llc/apps/tomo.
Warning
Tomo is an early-stage, independently maintained project built primarily for the author's workflow. It has not received a third-party security audit, provider compatibility can change without notice, and automated coverage does not yet exercise every network, permission, and UI path. Treat releases as beta software and review the code and configuration before using Tomo with sensitive or critical material.
- OpenAI-compatible providers - OpenAI, Anthropic, Google Gemini, OpenRouter, Ollama, and custom endpoints.
- Screen and text capture - Add a screenshot, full-screen capture, or selected text from another app.
- Personas - Save reusable system prompts and switch between them without leaving the conversation.
- Quick selector - Search providers, models, and personas from one switcher.
- Global hotkeys - Show or hide Tomo and capture content from the app you are using.
- Images, streaming, and Markdown - Attach images and render streamed responses with highlighted code blocks.
- Local key storage - API keys are stored in the macOS Keychain.
- macOS 14.0 or later
- Xcode 16 or later for source builds and tests
- An API key for a configured cloud provider, or a local OpenAI-compatible server such as Ollama
- Launch Tomo and open Settings > Providers.
- Add a provider, API key, and model. For Ollama, make sure its OpenAI-compatible endpoint is running locally.
- Select the provider and model, then start a conversation.
- Grant Screen Recording or Accessibility access only if you use the corresponding capture feature.
Open Tomo.xcodeproj in Xcode and build the Tomo scheme.
To build and run the unit tests without code signing:
xcodebuild -project Tomo.xcodeproj -scheme TomoTests \
-destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO testTo sign a build, provide your Apple Developer Team ID via a local, gitignored config file:
cp Config/Local.xcconfig.example Config/Local.xcconfig
# then edit Config/Local.xcconfig and set DEVELOPMENT_TEAM to your team IDForks should also replace TOMO_BUNDLE_IDENTIFIER in that file with a unique identifier they control.
- API keys are stored in the macOS Keychain, not in
UserDefaultsor the repository. - Messages, images, screenshots, captured text, and persona prompts are sent to the selected model endpoint. A cloud provider may retain or process that data under its own terms.
- A local endpoint such as Ollama can keep model traffic on your Mac, provided the endpoint itself is local and configured that way.
- Screen Recording and Accessibility access are optional macOS permissions used only by their capture features.
- Tomo has no app analytics. Sparkle checks
tomo.wvlen.llcfor software updates, and normal chat traffic goes to the endpoint you configure. - Custom endpoints are trusted configuration. Confirm their URL and data-handling policy before sending private content.
- Provider request logging is off by default. Setting
TOMO_DEBUG_API_LOGGING=1in a Debug build may write prompt or response content to logs.
- Tomo targets the OpenAI chat-completions shape. Provider-specific features outside that compatibility layer may not work.
- Anthropic support uses its limited OpenAI SDK compatibility layer, so native Claude API features are not available through Tomo.
- Preconfigured model lists are starter defaults, not a live catalog. Providers rename and retire models, so you may need to add a current model manually.
- Conversations are not a durable record and should not be your only copy of important output.
- Screen and text capture depend on macOS permissions and on the source application's accessibility support.
- Unit tests cover core parsing, conversion, search, provider, and keychain-keying logic. UI tests currently provide launch-level coverage rather than full workflow coverage.
Tomo/- application sourceTomoTests/- unit testsTomoUITests/- launch and UI test targetConfig/- shared and developer-local signing configurationrelease-notes/- canonical Markdown release notesscripts/- release packaging, appcast, and license helpers
See CONTRIBUTING.md for development and pull-request guidance and SECURITY.md for reporting vulnerabilities privately.
Release notes are tracked in release-notes/<version>.md, and app version
metadata is defined once in Config/Version.xcconfig. Configure the
Tomo-specific notarization profile once:
scripts/publish-release.sh \
--setup-notary-profile \
--apple-id you@example.comFor each release, update the version and notes and commit them. Then prepare and validate the release locally without publishing:
scripts/publish-release.sh \
--version 0.2.12 \
--build 14 \
--notes release-notes/0.2.12.mdAfter reviewing the generated artifacts, push the release commit and run the
same command with --publish. A matching artifact manifest makes the
publishing run reuse the exact reviewed bytes. The release script tests, signs,
notarizes, packages, and verifies the app before publishing the payloads and
finally the Sparkle appcast. Each successful publish also updates the stable
download URL https://tomo.wvlen.llc/Tomo.dmg from the same verified DMG bytes;
public download buttons should use that URL instead of a versioned filename.
Regenerate committed third-party acknowledgements with
scripts/fetch-licenses.sh after changing dependencies. A Sparkle upgrade also
requires reviewing its release tool and updating the pinned checksum in
scripts/update-appcast.sh.
Released under the MIT License.