Tinycast
Audited from github.com/abue-ammar/tinycast
Tinycast is a tiny, fully native macOS launcher written in Swift with SwiftUI and AppKit. It combines app launching, hotkeys, clipboard history, snippets, window management, notes and optional AI chat, and it can run existing Raycast extensions natively.
- Language
- Swift
- Hosting
- Cloudflare
- Running for
- 2 months
- Team
- Solo / 2-5 people
Why this architecture
Staying native with zero third-party dependencies and delegating search to Spotlight and system services keeps memory use low. A small embedded JavaScriptCore runtime adds Raycast extension compatibility without pulling in Electron.
Tech stack by layer
10 technologies · audited Sep 25, 2026- SwiftSwift 6 for the entire macOS app (Tinycast/App, Palette, Features, Windows, Platform)
- SwiftUIPalette, settings, notes, AI chat and rendered Raycast extension views(inferred)
- AppKitFloating panels, global hotkeys, menu bar item and window management actions(inferred)
- Next.jstinycast.dev website with Fumadocs docs, deployed as a Cloudflare Worker
- Tailwind CSSStyling of the website (Tailwind 4 via PostCSS)
- JavaScriptCoreEmbedded JS engine that runs Raycast extensions through a bundled React reconciler runtime
- ReactReact 19 + react-reconciler shim of @raycast/api, bundled to one file for JavaScriptCore
- esbuildBuilds the embedded Raycast runtime bundle
- CloudflareHosts the website worker (wrangler.jsonc) and media uploads
- GitHub ActionsSigned release builds, website deploys, media sync and triage
- XcodeGenproject.yml describes the Xcode project so the .xcodeproj can be regenerated(inferred)
- Model Context ProtocolMCP client support (stdio and OAuth) for the AI chat, covered by dedicated tests
Tinycast architecture diagram
Open SVGDiagram as text
- Palette (SwiftUI · AppKit) → Tinycast app (Swift 6): commands
- Tinycast app (Swift 6) → Raycast runtime (JavaScriptCore · React): run extensions
- Raycast runtime (JavaScriptCore · React) → Palette (SwiftUI · AppKit): SwiftUI views
- Tinycast app (Swift 6) → AI chat (MCP client): chat
- Tinycast app (Swift 6) → macOS (apps · files · windows): system APIs
Key architectural decisions
5 decisions- 01
Fully native with zero third-party Swift dependencies
The README states the app is SwiftUI and AppKit with no third-party dependencies and no Electron; the only package manifests are website/package.json and Scripts/raycast-runtime/package.json, and the app itself is built from Tinycast.xcodeproj.
- 02
Raycast extensions run in JavaScriptCore and render as SwiftUI
Scripts/raycast-runtime bundles React 19, react-reconciler and an @raycast/api shim with esbuild into a single file that JavaScriptCore executes; the reconciler output is mapped to native views, covered by the many Tests/ext-*-test.swift files.
- 03
Reuse the OS instead of building indexes
Per the README, file search goes through Spotlight, dictionary lookups read the Mac's own dictionaries and Apple Shortcuts are called directly, which helps keep the app under the stated 100 MB of RAM.
- 04
Performance tests beside functional tests
Tests/ contains *-performance.swift files (calc, clipboard, emoji search, file search, notes editor, text diff) next to behaviour tests, run through Scripts/run-tests.sh.
- 05
Website and app share one repository but not a toolchain
website/ is an independent Next.js 16 + Fumadocs project with its own lockfile and wrangler.jsonc, deployed by website.yml, while release.yml and Scripts/build-dmg.sh plus verify-signature.sh produce the signed macOS build.
How Tinycast is built
How Tinycast is structured
The macOS app lives in Tinycast/, is built from Tinycast.xcodeproj, and is described by project.yml. The sources are grouped by responsibility:
| Path | Role |
|---|---|
Tinycast/App |
App lifecycle and wiring |
Tinycast/Palette |
The command palette: search, ranking, navigation, tabs |
Tinycast/Features |
Individual commands such as clipboard, calculator, snippets, notes, AI chat, calendar and window management |
Tinycast/Windows |
Floating panels and auxiliary windows |
Tinycast/Platform |
macOS integrations (hotkeys, accessibility, Spotlight, pasteboard) |
Tinycast/DesignSystem |
Shared visual components |
Tinycast/Resources |
Generated data (emoji, countries, currencies from Scripts/gen-*.js) |
docs/ holds architecture.md, development.md, testing.md, standards.md, ui.md, release.md and signing.md. AGENTS.md and CLAUDE.md give coding agents instructions. The public website sits in website/ as a separate project.
Frontend
The whole UI is native. The README names SwiftUI and AppKit, and the feature list (floating palette, menu bar meeting indicator, 34 window-management actions, per-app hotkeys) depends on AppKit-level APIs. The layer assignments above are marked as inferred because the audit did not open individual Swift files.
The feature set is broad for a small app: fuzzy app launching, Spotlight-backed file search, dictionary lookup, clipboard history with images, an inline calculator with currency conversion, quicklinks, Apple Shortcuts, snippets with keyword expansion, custom shell commands, system actions, calendar and meetings, Markdown notes, an emoji picker, AI chat and Quick Actions. Each feature has a matching test in Tests/.
Backend & APIs
There is no server. The notable "runtime" is the Raycast compatibility layer. Scripts/raycast-runtime uses esbuild to bundle React 19, react-reconciler and a shim of @raycast/api into one file. The app loads that file into JavaScriptCore and turns the reconciler's tree into SwiftUI. The Tests/ext-* suite covers extension forms, lists, menus, icons, metadata, storage, fetch and cleanup.
The AI features are off by default. They use the user's own key or an installed AI account, and Tests/mcp-*.swift covers Model Context Protocol stdio and OAuth connections.
Data & persistence
All data stays local: settings (with backup and import, including import from Raycast), clipboard history, snippets, and notes, which are stored as plain Markdown files. Tests/settings-backup-test.swift, backup-archive-test.swift and redaction-test.swift cover export and privacy handling. The README states there is no telemetry.
Build, test & deploy
- Lint and format:
.swiftlint.yml,.swift-format,Scripts/lint.shandScripts/format.sh. - Tests:
Scripts/run-tests.shruns the Swift files inTests/, including the performance suites. - Release:
Scripts/build-dmg.sh,verify-signature.shandrelease-notes.sh, run by therelease.ymlworkflow. Distribution is a Homebrew tap with Apple-silicon and universal casks. - Website: Next.js 16 with Fumadocs MDX, Tailwind CSS 4 and a Cloudflare Worker (
website/wrangler.jsonc), deployed bywebsite.yml. Media is synced bywebsite-media.yml. Tips are processed through the Polar SDK.
Self-hosting notes
This is a desktop app, so there is nothing to host. It requires macOS 26 or later. Building from source needs Xcode. .vscode/ tasks and Scripts/sync-lsp.sh support editing the Swift code in VS Code. The GitHub license field reads NOASSERTION while the README badge says AGPL-3.0, and the repository also has a contributor license agreement. Check LICENSE before reusing code.
What to copy (and what not to)
What to copy
- Using platform services (Spotlight, system dictionaries, Shortcuts) instead of shipping your own indexes and data.
- Bridging an existing JavaScript extension ecosystem into a native app through a reconciler running in JavaScriptCore.
- Performance tests stored beside the functional tests for the hot paths: search, clipboard and editor.
What not to copy
- A zero-dependency policy means reimplementing things like fuzzy search, Markdown rendering and diffing. That is only worth it when binary size and memory are the product.
- Requiring the newest macOS release limits reach. Consider whether the APIs you use really need it.
Sources & repo audit
- Audited
- Sep 25, 2026
- Commit
- 03e74d2
- License
- NOASSERTION
- README (features, install, native-only approach)
- docs/architecture.md
- Scripts/raycast-runtime/package.json (embedded Raycast runtime)
- website/package.json (Next.js + Fumadocs site)
Independent analysis of repository at github.com/abue-ammar/tinycast. Spotted an inaccuracy? Use the claim form to request a correction.
Maintainer? Add the architecture badge to your README
[](https://stackitfast.com/project/tinycast) Scaffold it with your agent
Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with Tinycast's architecture.
- 1Copy the promptThe full markdown spec, with every layer and decision.
- 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
- 3Paste and scaffoldUse it as the first instruction; review before you ship.
# MISSION: Scaffold "Tinycast" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **Tinycast**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: Tinycast
- **What It Does**: Tinycast is a tiny, fully native macOS launcher written in Swift with SwiftUI and AppKit. It combines app launching, hotkeys, clipboard history, snippets, window management, notes and optional AI chat, and it can run existing Raycast extensions natively.
- **Domain & Category**: Native macOS Launcher & Clipboard Manager
- **Production Scale**: Solo / 2-5 people
- **Development Mode**: HYBRID
- **Architectural Rationale**: Staying native with zero third-party dependencies and delegating search to Spotlight and system services keeps memory use low. A small embedded JavaScriptCore runtime adds Raycast extension compatibility without pulling in Electron.
- **Live Website Reference**: https://tinycast.dev
- **Source Repository**: https://github.com/abue-ammar/tinycast
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: Swift, SwiftUI, AppKit, JavaScriptCore, React, esbuild, Next.js, Tailwind CSS, Cloudflare, GitHub Actions
- **Primary Language(s)**: Swift, JavaScript, TypeScript, Shell, CSS
- **License of the reference repo**: NOASSERTION
- **Frontend**: Swift — Swift 6 for the entire macOS app (Tinycast/App, Palette, Features, Windows, Platform); SwiftUI — Palette, settings, notes, AI chat and rendered Raycast extension views; AppKit — Floating panels, global hotkeys, menu bar item and window management actions; Next.js — tinycast.dev website with Fumadocs docs, deployed as a Cloudflare Worker; Tailwind CSS — Styling of the website (Tailwind 4 via PostCSS)
- **Backend & APIs**: JavaScriptCore — Embedded JS engine that runs Raycast extensions through a bundled React reconciler runtime; React — React 19 + react-reconciler shim of @raycast/api, bundled to one file for JavaScriptCore; esbuild — Builds the embedded Raycast runtime bundle
- **Infrastructure & deploy**: Cloudflare — Hosts the website worker (wrangler.jsonc) and media uploads; GitHub Actions — Signed release builds, website deploys, media sync and triage; XcodeGen — project.yml describes the Xcode project so the .xcodeproj can be regenerated
- **Tooling, testing & ops**: Model Context Protocol — MCP client support (stdio and OAuth) for the AI chat, covered by dedicated tests
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/abue-ammar/tinycast @ 03e74d2)
1. **Fully native with zero third-party Swift dependencies**: The README states the app is SwiftUI and AppKit with no third-party dependencies and no Electron; the only package manifests are website/package.json and Scripts/raycast-runtime/package.json, and the app itself is built from Tinycast.xcodeproj.
2. **Raycast extensions run in JavaScriptCore and render as SwiftUI**: Scripts/raycast-runtime bundles React 19, react-reconciler and an @raycast/api shim with esbuild into a single file that JavaScriptCore executes; the reconciler output is mapped to native views, covered by the many Tests/ext-*-test.swift files.
3. **Reuse the OS instead of building indexes**: Per the README, file search goes through Spotlight, dictionary lookups read the Mac's own dictionaries and Apple Shortcuts are called directly, which helps keep the app under the stated 100 MB of RAM.
4. **Performance tests beside functional tests**: Tests/ contains *-performance.swift files (calc, clipboard, emoji search, file search, notes editor, text diff) next to behaviour tests, run through Scripts/run-tests.sh.
5. **Website and app share one repository but not a toolchain**: website/ is an independent Next.js 16 + Fumadocs project with its own lockfile and wrangler.jsonc, deployed by website.yml, while release.yml and Scripts/build-dmg.sh plus verify-signature.sh produce the signed macOS build.
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
- Structure as a Turborepo monorepo with strict package boundaries:
- `apps/web`: Application UI, routing, layouts, and server endpoints.
- `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
- `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
- `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
- Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
- Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
- Utilize Next.js 15 App Router: default to React Server Components (RSC) for data fetching. Handle mutations through Server Actions with Zod validation. Keep 'use client' directives restricted strictly to interactive leaf components.
4. **Design System & Aesthetics**:
- Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
- Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
- Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
- Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer: client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.Frequently asked about Tinycast
What is Tinycast built with?
Tinycast is a native macOS app written in Swift 6 with SwiftUI and AppKit and, according to its README, no third-party dependencies. Raycast extensions run in JavaScriptCore through a bundled React reconciler, and the tinycast.dev website is a Next.js app on Cloudflare.
Can Tinycast run Raycast extensions?
Yes. It embeds a JavaScript runtime that shims @raycast/api on top of React and react-reconciler, runs it in JavaScriptCore, and renders the extension UI as native SwiftUI views.
Is Tinycast an Electron app?
No. The app is fully native Swift. JavaScript is used only for the embedded Raycast extension runtime and the separate marketing website.
How do I install Tinycast?
Through Homebrew: add the abue-ammar/tinycast tap and install the tinycast cask (Apple silicon, macOS 26 or later) or tinycast-universal (Intel on macOS 26).
One email a month: new deep dives and stack trends
New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.
Similar architectures
- shadcn/uiHybridCopy-Paste UI Component Architecture · 1M+ MAUShares React · Tailwind CSS · Next.js
- Supabase StudioClassicDeveloper Tool · 20+ peopleShares Next.js · React · Tailwind CSS
- tRPCHybridEnd-to-End Typesafe API Framework · 1M+ MAUShares React · Next.js
- BunClassicAll-in-One JavaScript Runtime & Toolchain · 1M+ MAUShares JavaScriptCore
- Cosmo (WunderGraph)HybridFederated GraphQL API Gateway · 6-20 PeopleShares Next.js
- Tailwind CSSClassicUtility-First CSS Engine & Framework · 1M+ MAUShares Tailwind CSS