Phase 32 left three survivors, each for a different reason and all the same finding: AppCore still owns what comparable types own for themselves. QuicklinkCoordinator is the only coordinator not handed a paletteCoordinator; its six siblings take one. That inconsistency alone keeps the showPalette and hidePalette forwarders alive. runWindowCommand is the only feature action still implemented on AppCore, because window management is the only feature without a coordinator. SettingsBackup's gather/apply carry a `= .shared` default that no caller ever supplies, while BackupActions reaches the singleton six times outright — the same coupling in two spellings, one of which defeats the grep that measures it. Nothing else in the roadmap picks these up: 33 puts gather/apply on its own must-NOT-change list, 35 touches SettingsBackup only for a comment, and no phase mentions window management. 32b must therefore land before 33, which freezes the two signatures. Roadmap gains the phase row, the status row, a risk-register entry for the window-command funnel, and M6 goes 4 phases/~14 h to 5/~17 h.
Tinycast
A tiny, fully native macOS launcher — the essentials, without the bloat.
Around 3 MB on disk and under 100 MB of RAM — no Electron, no telemetry, no background CPU churn. Just SwiftUI + AppKit with zero dependencies. It's fast because there's nothing to it.
Features
- App launcher — fuzzy-search and launch anything, pin favorites, see what's running, quit an app or every app at once.
- Custom commands — run named shell commands through fuzzy search or their own global hotkeys.
- Calculator — do math, unit and live currency conversions inline, right in the palette.
- Clipboard history — text and images, searchable, pasted back into the app you were using.
- Snippets — reusable Markdown templates with dynamic placeholders, arguments, nested references and optional keyword expansion.
- Global hotkey — one shortcut summons the palette from anywhere.
- Per-app hotkeys — bind a key to an app; press it to toggle (focus/hide).
Install
brew trust --tap abue-ammar/tinycast # required for third-party taps
brew tap abue-ammar/tinycast
brew install --cask tinycast # stable
brew install --cask tinycast@beta # beta (installs side-by-side)
Each channel is a separate app (Tinycast.app, Tinycast Beta.app) with its own settings and
permissions, so you can run stable next to the beta.
Tinycast is self-signed. Installing via Homebrew clears the macOS quarantine flag for you
automatically on every install and update, so there's nothing to run. (If you download the DMG
directly from Releases instead, clear it once: xattr -dr com.apple.quarantine "/Applications/Tinycast.app".)
Permissions
Accessibility — needed when Tinycast pastes or expands text into another app, and the only permission snippet keyword expansion needs. You're prompted when you first use a feature that needs it; grant access in System Settings → Privacy & Security → Accessibility. Snippets ship disabled, and keystrokes are matched locally, never stored and never sent anywhere.
Using it
- Open Settings → General and record a global shortcut to summon Tinycast.
- Press it anywhere → the palette floats in. Type to filter, ↵ to launch.
- Tab switches between Apps and Clipboard; ↑/↓ move, Esc dismisses.
- Settings → Shortcuts — search an app or custom command and record a global shortcut.
- Settings → Snippets — enable the feature, then create templates with expansion keywords.
Building from source
See docs/development.md for the toolchain, build, packaging, release, and website workflows, and docs/ui.md for the UI design system.
Contributing
Important
Open an issue before you write code — this is mandatory. Get the bug or the feature agreed on first; discussing it in the issue (or on Discord) is strongly encouraged. A PR with no agreed issue behind it gets closed however good the patch is, and the work is wasted. Typo and docs-only fixes are the one exception.
Read CONTRIBUTING.md first — it covers the memory budget every PR is held to, the before/after video requirement for visual changes, and why features get declined. Every PR fills in the pull request template. Security issues go through SECURITY.md, not the issue tracker.
Questions, ideas, or just want to follow along? Join the Discord.
