Skip to content

Repository files navigation

Tomo app icon

Tomo

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.

Features

  • 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.

Requirements

  • 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

Getting started

  1. Launch Tomo and open Settings > Providers.
  2. Add a provider, API key, and model. For Ollama, make sure its OpenAI-compatible endpoint is running locally.
  3. Select the provider and model, then start a conversation.
  4. Grant Screen Recording or Accessibility access only if you use the corresponding capture feature.

Building

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 test

To 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 ID

Forks should also replace TOMO_BUNDLE_IDENTIFIER in that file with a unique identifier they control.

Privacy and security

  • API keys are stored in the macOS Keychain, not in UserDefaults or 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.llc for 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=1 in a Debug build may write prompt or response content to logs.

Known limitations

  • 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.

Repository layout

  • Tomo/ - application source
  • TomoTests/ - unit tests
  • TomoUITests/ - launch and UI test target
  • Config/ - shared and developer-local signing configuration
  • release-notes/ - canonical Markdown release notes
  • scripts/ - release packaging, appcast, and license helpers

Contributing and releases

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.com

For 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.md

After 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.

License

Released under the MIT License.

About

A lightweight floating AI chat app for macOS for OpenAI API compatible LLMs

Topics

Resources

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages