A quiet home for everything worth keeping.
Native macOS notes, quick captures, and an assistant that can search your knowledge.
Features · Get started · Shortcuts · Development · License
Good ideas rarely arrive in the right window. Worktable gives you somewhere to put them: a snippet from another app, a link to revisit, an image, or a thought you do not want to lose. Keep them in a local library, connect them into knowledge, and ask questions when you need the context back.
Capture → Collect → Connect
- Capture the moment. Type a note, add an image, or press Shift three times quickly to capture a selection from another app.
- Keep the context. Search your entries, browse by topic, and bring your GitHub stars into the same library.
- Find the connection. Build knowledge, then ask the assistant about what you have saved. Citation chips take you back to the original entries.
| What you can do | |
|---|---|
| Quick capture | Save selected text or images with triple-Shift, without switching away from the app you are using |
| A library for more than text | Keep notes, links, and images together; open full entries and view images fullscreen |
| Search and organize | Filter entries and sort by time, alphabetically, or by topic; use keyboard navigation and multi-selection |
| Connected knowledge | Build local topics and relationships, with optional AI topic enrichment from your chosen provider |
| An assistant with context | Read streaming answers, follow source citations, stop a running answer, and reopen or delete saved chats |
| GitHub stars | Import repositories you have starred, including their descriptions and links |
| At home on macOS | Stay in the menu bar, check for updates, use native menus and shortcuts, and switch between Ayu Light and Ayu Dark |
Built with Rust, GPUI, and GPUI Component. The AI runtime lives in the native app through Rig; there is no JavaScript worker or separate sidecar to install.
You will need:
- macOS — the packaged app targets macOS 13 or later.
- Rust installed through rustup — the repository pins
its nightly toolchain in
rust-toolchain.toml. - Xcode Command Line Tools — install them with
xcode-select --installif they are not already available.
git clone https://github.com/MalinrRuwan/worktable.git
cd worktable
cargo run -p worktable-appRustup selects the pinned toolchain automatically. The first build takes longer while it compiles the native UI dependencies.
worktable-cli starts the real app with an isolated data directory and drives
the same controls a person uses through a local Unix socket:
cargo build -p worktable-app -p worktable-cli
./target/debug/worktable-cli start --seed '["Remember the milk"]'
./target/debug/worktable-cli state
./target/debug/worktable-cli screenshot
./target/debug/worktable-cli stopThe control socket exists only when WORKTABLE_CONTROL_SOCKET is set, uses
owner-only permissions, and never listens on the network. Commands print JSON,
so scripts and agents can inspect the app after every action. See
docs/cli.md for the full command set, state shape, raw
protocol, and screenshot permission notes.
- Take the welcome tour. Every step is skippable, and you can replay it from Settings → Appearance.
- Enable capture when you want it. The tour links to macOS Accessibility settings. Triple-Shift uses the foreground app's Copy action and clipboard, so that app must support copying the selected text or image.
- Add your first note. The note bar is always ready: type and press Return. Shift+Return adds a line; the field grows to four lines. Use its plus button to choose an image.
- Set up the assistant, optionally. Open Settings → Providers, configure a provider, and choose a model. Build knowledge before asking about your library.
Notes and the local knowledge-building pass work without an AI provider. Closing the window keeps Worktable in the menu bar by default; change Keep running in the menu bar in Settings → General if you prefer closing to quit. The menu-bar icon hides as soon as that toggle is turned off.
Worktable → Check for Updates… checks the latest stable GitHub release. An installed copy downloads the DMG, verifies its published SHA-256 and signature, replaces itself, and reopens. If macOS dropped the Accessibility grant during that replacement, Worktable asks once to turn it back on; a preserved grant does not prompt.
While Accessibility is off, the menu-bar glyph carries a red dot and the library menu prepends Accessibility is off…. That dialog explains the System Settings path, opens the pane, and checks the grant again without a relaunch.
| Provider | Authentication |
|---|---|
| OpenCode, with Go and Zen services | API key |
| OpenAI | API key |
| ChatGPT subscription | Device OAuth sign-in |
| Anthropic | API key |
| DeepSeek | API key |
Available models come from authenticated provider discovery, not a bundled model list. ChatGPT subscription sign-in is separate from an OpenAI API key. Provider access, limits, and any charges depend on the service you choose.
| Shortcut | Action |
|---|---|
| ⇧ three times quickly | Capture selected text or an image from another app |
| ⌘F | Return to Entries and focus search |
| ⌘1 / ⌘2 | Show Entries / Assistant |
| ⌘, | Open Settings |
| ⌘T | Switch between light and dark themes |
| ↑ / ↓ | Move the entry selection |
| Return | Open the selected entry |
| Delete (⌫) | Delete selected entries |
| ⌘C / ⌘⇧C | Copy selected entries / copy the selected entry's link |
| ⌘⇧P | Clear search |
| ⌘Return | Submit the note bar |
| Shift+Return | Add a line to the note bar (up to four lines) |
| Escape (⎋) | Dismiss the current overlay or image viewer |
| ⌘Q | Quit Worktable |
Entry commands are scoped to the Entries page and yield to focused text fields. Return in the note bar adds a note; Return in search sends the query to the assistant instead of opening an entry.
Worktable stores its library locally. By default:
| Location | Contents |
|---|---|
~/.worktable/worktable.db |
Entries, settings, provider credentials, saved chats, and model context |
~/.worktable/media/ |
Imported images, hard-linked when possible and copied across devices |
~/.worktable/images/ |
Images saved by global capture |
~/.worktable/logs/worktable.log |
Diagnostic log, written only after you turn on Settings → General → Diagnostic logs |
~/.worktable/codesign/ |
Self-signed code-signing identity, keychain, and password used by local release packaging |
Diagnostic logging is off by default. When enabled, it appends startup and
background errors (including database migration failures) to the log file;
nothing technical is written to stderr in its place.
Local storage does not mean local AI inference. Assistant prompts, retrieved entry content, and content used for AI topic enrichment can be sent to your configured provider. GitHub imports contact GitHub, and loading remote images contacts their hosts.
Provider credentials are stored in Worktable's database, not the macOS Keychain. Treat the database and its backups as sensitive, and never commit credentials to the repository.
One native app, with a small Rust workspace:
| Crate | Responsibility |
|---|---|
worktable-app |
macOS shell, main view, settings, capture, and service orchestration |
worktable-cli |
Agent-friendly CLI that starts and drives the real app |
worktable-control |
Typed local control protocol and Unix-socket client |
worktable-ui |
Shared motion, activity indicators, streaming text, and interactive citations |
worktable-ai |
Rig-backed assistant, providers, model discovery, and cancellation |
worktable-db |
SQLite persistence for the native app |
worktable-events |
Typed events shared across the app and runtime |
worktable-helix |
Embedded knowledge graph, topic extraction, and search |
The everyday development loop is:
cargo run -p worktable-appWorkspace crates retain debug information, while dependencies are optimized so the debug UI stays responsive.
cargo test -p worktable-ui
cargo test -p worktable-app
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all -- --checkUI interaction tests exercise the real view using stable debug selectors. Provider tests do not make live AI requests.
Real Metal visual snapshots
The macOS visual runner is a binary so it can render on the main thread:
cargo run -p worktable-app --bin worktable_visual_test --features visual-testsTo intentionally update its baselines:
UPDATE_BASELINE=1 cargo run -p worktable-app --bin worktable_visual_test --features visual-testsVisual snapshots complement interaction tests; they do not replace them.
| Variable | Purpose |
|---|---|
WORKTABLE_DB_PATH |
Use a different database file |
WORKTABLE_MEDIA_DIR |
Use a different imported-image library |
WORKTABLE_CONTROL_SOCKET |
Enable the local control socket at this path |
WORKTABLE_APP_BIN |
App binary used by worktable-cli start |
WORKTABLE_THEMES_DIR |
Watch a different directory for development theme overrides |
WORKTABLE_LOG_DIR |
Write the gated diagnostic log to this directory |
RUST_LOG |
Configure logging, for example worktable=debug |
Set the version you want to package:
VERSION=1.5.1 sh scripts/package-macos.shThe script builds the release binary, bundles themes and the app icon, signs the app, and creates:
dist/
├── Worktable.app
├── Worktable-1.5.1.dmg
└── Worktable-1.5.1.dmg.sha256
Packaging uses the host architecture and a dedicated self-signed identity by
default; it does not notarize the app. Generated files in dist/ are ignored
by Git.
The default identity is Worktable Self-Signed Code Signing. The first
package run creates it in its own keychain at
~/.worktable/codesign/worktable-codesign.keychain-db and stores the
certificate and keychain password beside it. The certificate is trusted only
as a user-domain code-signing root, not in the login keychain. Creating the
identity needs OpenSSL 3 with pkcs12 -legacy (brew install openssl@3); the
script also finds Homebrew's keg-only install. The first run may ask macOS to
confirm the user trust setting for that certificate. Signing uses the certificate leaf
as the designated requirement
(designated => identifier "com.worktable.app" and certificate leaf = H"…")
rather than an ad-hoc cdhash, so replacing the app in /Applications keeps the
same requirement. Losing or recreating that keychain creates a new certificate,
changes the requirement, and may cost one Accessibility re-grant. Replacing an
older ad-hoc build with this self-signed one also changes the requirement once;
the app's red-dot lamp and Accessibility dialog walk through the re-grant. To
use a Developer ID instead, set CODESIGN_IDENTITY to the identity name:
CODESIGN_IDENTITY="Developer ID Application: Name (TEAMID)" \
VERSION=1.5.1 sh scripts/package-macos.shA Developer ID-signed and notarized build remains the reliable TCC path for
keeping Accessibility across updates. The self-signed build is best effort:
macOS may still require enabling Accessibility once after an update, and if
capture stays blocked, remove Worktable from System Settings → Privacy &
Security → Accessibility and add it again. Ad-hoc signing is no longer a
supported release path; the packaging script rejects CODESIGN_IDENTITY=-.
Worktable also records last_run_version and accessibility_granted, so an
update can offer the recovery step once when a grant that used to work is gone.
Bug reports and focused improvements are welcome. Read AGENTS.md
for the project's architecture, UI, accessibility, and testing conventions
before changing code. Include tests for behavior changes and run the checks
above before submitting a pull request.
Worktable builds on GPUI from Zed, GPUI Component from Longbridge, and Rig. Its agent presentation includes components adapted from aiCSS, with motion inspired by transitions.dev and the Ayu theme family.
Worktable is licensed under the MIT License.
Copyright © 2026 Malin Dhamsara. Dependencies and adapted components retain their respective licenses.
