English ยท ไธญๆ
An AI-native, desktop-first, Web-capable cross-platform app scaffold
An extensible Tauri 2 + Vue 3 foundation: desktop is primary, with Beta-level Web and mobile adaptation.
The stable core covers local data, tray integration, and a design system; sync, updater, Agent, MCP, and local inference are enabled according to maturity.
meow-starter is a modular, AI-native cross-platform app scaffold. It takes care of the repetitive engineering behind desktop and multi-runtime productsโdata access, system tray behavior, updates, and a design systemโwhile exposing Agent, local inference, and MCP capabilities as pluggable modules that can be enabled only when a product needs them.
Core philosophy: keep the core small, make capabilities optional, and add them on demand. Without any Agent code it remains a clean desktop scaffold. A Preview capability becomes a product feature only after the downstream project explicitly configures and verifies it.
Turn something you want to learn into a small step you can finish, prove, and revisit.
Shixue is a personal learning record assistant built from meow-starter and the first public reference application in this ecosystem. It demonstrates how the general scaffold can be shaped into a focused product without bypassing its data, module, security, or release boundaries.
| From scaffold to product | Shixue implementation |
|---|---|
| Domain and data | A capture โ organize โ schedule โ focus โ evidence-backed completion โ review loop, with IndexedDB on Web and SQLite on desktop |
| UI / UX | An iOS-inspired warm-paper, deep-ink, and sage visual language with desktop drawers, mobile full-screen flows, bottom sheets, and responsive four-tab navigation |
| Windows delivery | Tauri-based x64 NSIS, localized MSI, and Portable EXE packaging, checksums, install-and-launch smoke checks, and an updater release path |
Explore the Shixue source, screenshots, and setup guide โ
Shixue v0.2.3 publishes Windows installers, a Portable EXE, updater metadata, and signed updater payloads. Its Windows binaries are not Authenticode-signed, so code-signing identity, SmartScreen reputation, and end-to-end upgrade validation remain separate work. Every downstream app must configure and protect its own updater endpoint and signing key.
| Platform | Status | Scope |
|---|---|---|
| Web | Beta | Vite static build + IndexedDB persistence; native-only modules are skipped by runtime capability checks |
| macOS | Stable | Default desktop capabilities have automated gates; a real endpoint, signing, and notarization are still project-specific release work |
| Windows | Stable | Default desktop capabilities have automated gates; a local unsigned NSIS lifecycle smoke is available |
| Linux | Stable | Default desktop capabilities have automated gates; the Ubuntu release build template still requires downstream validation |
| iOS | Beta | Responsive behavior and desktop-capability fallback are implemented; continuous Xcode/device validation is not yet available |
| Android | Beta | Emulator android dev plus local debug APK/AAB builds have been verified; signing, real-device testing, and store delivery are not complete |
Android has local debug evidence, but that is not evidence of signing, real-device behavior, store acceptance, or production update delivery. See docs/delivery-path.md for the full boundary and next steps.
- Frontend: Vue 3.5 + TypeScript 5.6 + Vite 8, with system-aware dark mode
- Data layer: one domain interface; SQLite on Tauri and IndexedDB on Web
- System integration: system tray, single-instance behavior, and close-to-tray instead of quit
- Auto-update (Beta): signing, download, install, and relaunch code paths; requires a downstream endpoint and signing keys before release validation
- Design system: complete design tokens, six base components, and four themes
- Modularity: four gatesโconfiguration, dynamic import, runtime capability, and native Cargo feature
- Sync foundation (Preview): opt-in outbox engine, collection allowlist, and HTTP transport without vendor lock-in
- Agent (Preview): Vercel AI SDK inline adapter and extension interfaces; off by default
- Secret safety (Preview): stored keys cannot be read back by the WebView; OpenAI and Anthropic calls use a fixed-target Rust proxy
- Local inference (Preview): Ollama/OpenAI-compatible presets that require verification on the developer's machine
- MCP (Preview): HTTP/SSE client adapter; the complete Agent tool loop is still being verified
- Engineering: GitHub Actions CI gates plus a three-desktop-platform draft-release template that stays blocked until real updater and signing configuration is supplied
- No Electron: application bundles are typically around 3โ20 MB instead of roughly 300 MB
New to the project? Follow this path:
| I want toโฆ | Go to |
|---|---|
| ๐ Run the project | Quick start โ Rename checklist |
| โ Turn the scaffold into a double-clickable product with consistent UI and defaults | docs/application-standard.md |
| ๐ Configure local development / an exFAT workspace | docs/development.md |
| ๐งญ Define product intent, capabilities, and data boundaries | docs/application-protocol.md |
| ๐ฆ Understand the Release Kit and release boundary | docs/release-kit.md |
| ๐ช Build a Portable EXE / choose an Authenticode path | docs/windows-distribution.md |
| ๐ค๏ธ Move from a local scaffold to services and release | docs/delivery-path.md |
| ๐ฏ Decide whether the scaffold fits | docs/project-guide.md |
| ๐งญ Build a first application from the scaffold | docs/blueprints/README.md |
| ๐ฑ Explore a real application built from the template | Shixue ยท ๆพๅญฆ |
| ๐ Understand the architecture | Architecture + modular architecture |
| ๐จ Use the design system and components | docs/design-system.md |
| ๐ค Integrate an Agent | docs/agent-integration.md |
| ๐ Connect a local model such as Ollama | docs/local-inference.md |
| ๐งฉ Connect MCP tools | docs/mcp.md |
| ๐ Run or deploy the Web build | docs/web.md |
| ๐ Add account, cloud, or LAN sync | docs/sync.md |
| ๐ฑ Adapt Android / iOS | docs/mobile.md |
| ๐ง Review the full AI capability roadmap | docs/ai-capabilities.md |
| ๐ค Contribute / ask questions | CONTRIBUTING.md ยท Discussions |
For AI agents: this repository has explicit module boundaries and a routed documentation set. Read the relevant document before changing a feature.
# Option 1: clone the repository
git clone https://github.com/Shiaoming123/meow-starter.git my-app
cd my-app && npm ci && npm run tauri dev
# Option 2: use degit for a clean copy without Git history (recommended)
npx degit Shiaoming123/meow-starter my-app
cd my-app && npm ci && npm run tauri devWeb only:
npm run dev:webPrerequisites: Node.js 22+, Rust 1.77.2+, and platform dependencies. macOS requires Xcode Command Line Tools, Windows requires MSVC and WebView2, and Linux requires webkit2gtk and related packages. See the Tauri prerequisites.
tauri dev is a developer workflow, not an end-user delivery format. Before calling a downstream app usable, follow the application development and delivery standard and verify a package or Portable executable that a non-developer can launch by double-clicking.
Missing any of these items can break the build or collide with another application's identity:
nameinpackage.jsonnameand[lib] nameinsrc-tauri/Cargo.toml(libname = underscored package name +_lib)productNameandidentifierinsrc-tauri/tauri.conf.json(โ ๏ธ treat the identifier as immutable after release)- Replace
public/meow-mark.svg, then runnpm run tauri -- icon public/meow-mark.svg -o src-tauri/icons - Regenerate the updater signing key with
npm run tauri:signer - Replace
OWNER/REPOinplugins.updater.endpointswith the downstream repository - Update repository, homepage, and author metadata in
package.jsonandsrc-tauri/Cargo.toml - Replace UI branding, the tray tooltip, and the keychain namespace in
src-tauri/src/agent/secrets.rs - Keep versions synchronized across
package.json,src-tauri/Cargo.toml, andsrc-tauri/tauri.conf.json
Each capability is a pluggable module controlled by src/modules/config.ts:
| Module | Type | Default | Description |
|---|---|---|---|
core |
core | always | Design system, components, themes, and icons |
storage |
core | always | Domain storage contract and safe in-memory fallback |
sqlite |
platform adapter | on | Tauri SQLite data layer; assembled only in native runtimes |
indexedDb |
platform adapter | on | IndexedDB persistence; assembled only in Web runtimes |
sync |
optional | off | Local-first contracts, outbox engine, and transport |
tray |
core | on | System tray integration |
updater |
core | on | Automatic update module |
themes |
core | on | Four visual themes |
agent |
optional | off | Agent runtime; requires npm run add:agent |
mcp |
optional | off | MCP integration; requires npm run add:mcp |
shortcut |
optional | off | Global shortcut capability (P1) |
clipboard |
optional | off | Clipboard capability (P1) |
notification |
optional | off | Notification capability (P1) |
autostart |
optional | off | Launch-at-login capability (P1) |
See docs/modular-architecture.md for the complete design. Disabled modules are not loaded by the default runtime path. Use the lockfile and actual build outputโnot this tableโto assess dependency and bundle size.
src/modules/contract.ts is the static catalog for module platforms, runtime capabilities, dependencies, and native build requirements. The assembler filters this catalog before dynamic import and rejects loaded modules whose declarations differ from their contract before setup begins.
Native build configuration is a separate plane: a frontend toggle never enables a Cargo feature or grants a Tauri permission. After changing default module configuration, validate the intended target:
npm run check:modules # desktop target (default)
npm run check:modules -- web # Web targetThis validates checked-in configuration consistency only. It does not change Cargo features or permissions, and it is not evidence of plugin behavior, installable packages, signing, or device behavior.
| Level | Meaning | Current capabilities |
|---|---|---|
| Stable | Automated gates cover the default path | core, SQLite, themes, desktop tray/single-instance |
| Beta | The code path exists, but release-environment evidence is limited | Web IndexedDB, updater, responsive mobile adaptation, and desktop-feature fallback |
| Preview | Off by default; interfaces or safety boundaries may change | Sync, Agent, Ollama, MCP, and optional system plugins |
| Roadmap | Design or placeholder only | sidecar, RAG, speech, and OCR |
The Vue frontend communicates with the Rust runtime through invoke and listen. The module loader assembles enabled capabilities in dependency order. Agent, Ollama, cloud-provider, and MCP integrations live in the Preview extension layer and are not loaded on the default path.
The same Vue codebase targets Web / macOS / Windows / Linux / Android / iOS. Desktop is the primary validation target. Web uses IndexedDB and skips native-only modules, while mobile uses responsive layouts and degrades desktop-specific capabilities.
.
โโโ .github/ # CI gates and a three-desktop-platform release template
โโโ docs/ # Documentation hub
โ โโโ architecture.svg # Architecture diagram
โ โโโ application-standard.md # Product UI, defaults, and double-click delivery standard
โ โโโ development.md # Local development, verification, and exFAT guidance
โ โโโ release-kit.md # Release Kit and release maturity boundaries
โ โโโ windows-distribution.md # Windows Portable and Authenticode guidance
โ โโโ design-system.md # Tokens, components, themes, performance, accessibility
โ โโโ project-guide.md # Project fit and product-type guidance
โ โโโ modular-architecture.md # Four module gates and the compatibility contract
โ โโโ ai-capabilities.md # AI-native capability roadmap
โ โโโ agent-integration.md # Agent integration and security architecture
โ โโโ local-inference.md # Ollama and local inference
โ โโโ web.md # Web runtime, persistence, and deployment
โ โโโ sync.md # Account, cloud, and LAN sync boundaries
โ โโโ mcp.md # MCP integration guide
โโโ src/
โ โโโ assets/themes/ # Theme tokens and global styles
โ โโโ components/ # Icon.vue and reusable UI components
โ โโโ modules/ # Configuration, loader, and capability modules
โ โโโ agent/ # Agent runtime, providers, tools, memory, hooks, and UI
โ โโโ storage/ # Domain ports plus IndexedDB, SQLite, and memory adapters
โ โโโ sync/ # SyncProvider, outbox, and HTTP transport
โ โโโ lib/ # db.ts and updater.ts
โ โโโ App.vue # Demonstration application
โโโ src-tauri/
โ โโโ src/lib.rs # Application assembly and feature gating
โ โโโ src/tray.rs # System tray behavior
โ โโโ src/db.rs # SQLite migrations
โ โโโ src/agent/ # Native secret and provider proxy boundary
โ โโโ capabilities/ # Tauri permission allowlist
โ โโโ tauri.conf.json # Tauri application configuration
โโโ agent.config.ts # Agent model, provider, and tool configuration
โโโ CONTRIBUTING.md
โโโ CODE_OF_CONDUCT.md
โโโ SECURITY.md
โโโ CHANGELOG.md
โโโ LICENSE
The frontend accesses domain interfaces through src/lib/db.ts. Tauri SQLite migrations are defined in src-tauri/src/db.rs and run during startup; the Web runtime stores data in IndexedDB. See docs/web.md.
๐ Each migration must contain one SQL statement only because the underlying sqlx
executecall does not support multiple statements.
The Todo example also exposes an optional, versioned JSON data port. await exportTodos() emits application-domain data, while await importTodos(json) validates the complete payload before appending records and returning the imported count. It does not export database files, keys, Agent state, or sync state. Import does not overwrite existing data, and repeated imports intentionally create duplicate records. Product UI should request explicit user confirmation before import.
src-tauri/src/tray.rs registers left-click window toggling and a right-click menu for showing or hiding the window, checking for updates, and exiting. Together with single-instance handling, reopening the app focuses the existing window.
src/lib/updater.ts wraps check() โ downloadAndInstall() โ relaunch(). Tauri verifies updater signatures. Configure a downstream application before its first release:
npm run tauri:signer
# Put the public key in plugins.updater.pubkey in tauri.conf.json
# Store the private key as the TAURI_SIGNING_PRIVATE_KEY GitHub secret
# Replace OWNER/REPO in plugins.updater.endpoints with the downstream repository๐ Losing the updater private key prevents future releases from updating existing installations. Back it up securely and never commit it.
A template placeholder endpoint is treated as unconfigured at build time, so the application does not request an invalid update URL.
The Agent module is off by default. To enable its dependencies:
npm run add:agent
# Set enabled: true in agent.config.ts, then configure providers and a default modelCloud providers such as OpenAI and Anthropic, as well as local Ollama-compatible models, are supported by the extension layer. Cloud secrets are stored in the operating system keychain; the WebView can write, delete, and test whether a key exists but cannot read the plaintext value back. Rust injects secrets only for fixed official provider targets. See docs/agent-integration.md and docs/local-inference.md.
โ ๏ธ The cloud proxy uses an allowlist: by default onlyapi.openai.comandapi.anthropic.comare allowed. Local Ollama or vLLM endpoints use the direct path. DeepSeek, Moonshot, Groq, and other OpenAI-compatible cloud services are rejected when configured with keychain-backed secrets until the allowlist is extended deliberately. See docs/agent-integration.md ยง3.4.1.
MCP is off by default. To add its dependencies:
npm run add:mcp
# Enable mcp in modules/config.ts and connect a server with connectMcpServerSee docs/mcp.md.
The design system provides restrained typography, spacing, radius, shadow, motion, and layer tokens; six base components; and four themes. Downstream products use self-hosted Manrope Variable for Latin text and numbers, Noto Sans SC Variable for Chinese, and a restrained iOS-inspired acrylic treatment. See the application standard and design system.
| Command | Purpose |
|---|---|
npm run dev |
Start the frontend development server |
npm run dev:web |
Start explicit Web development mode |
npm run build |
Type-check and build the frontend |
npm run build:web |
Type-check and create the Web static build |
npm run smoke:web-persistence |
Optional: add a Todo in a real browser and verify IndexedDB persistence after reload |
npm run smoke:windows-package |
Optional: build an unsigned NSIS package, install it in an isolated directory, and verify process liveness on Windows |
npm run package:windows |
Build the versioned NSIS, MSI, Portable EXE, manifest, README, and SHA-256 delivery kit |
npm run package:windows:audit |
Recheck an existing Windows delivery kit without rebuilding |
npm test |
Run behavior tests without an additional test framework |
npm run typecheck |
Run TypeScript/Vue type checking only |
npm run check:modules |
Validate module catalog, defaults, and native build requirements |
npm run check:protocol |
Validate the application protocol against modules, data ports, acceptance commands, and delivery boundaries |
npm run check:csp |
Validate the production Tauri CSP |
npm run check:layout |
Validate the mobile layout contract in the production CSS |
npm run check:docs |
Check relative Markdown links |
npm run tauri dev |
Run the desktop application with Rust hot reload |
npm run tauri build |
Package for the current platform |
npm run tauri:signer |
Generate an updater signing key pair |
npm run add:agent |
Install Agent dependencies |
npm run add:mcp |
Install MCP dependencies |
The two smoke commands are local acceptance checks and are not part of default CI or npm run verify. The Web smoke does not download a browser; it uses an installed Edge or Chrome and honors MEOW_BROWSER_PATH when automatic discovery fails. The Windows smoke temporarily disables updater artifacts, constrains installation and app data to src-tauri/target/meow-windows-package-smoke-*, terminates only the process it started, and removes only its validated temporary directory.
These checks do not prove code signing, hosted updater delivery, offline installation, graceful tray exit, store approval, or release readiness on any platform.
- The production Tauri CSP permits same-origin resources and Tauri IPC only. Declare each required external source precisely; do not relax it with wildcards.
- Treat the application
identifieras immutable after release. - API keys belong in the operating system keychain, not source code or localStorage; stored keys have no plaintext read command.
- Sync uses a collection allowlist. API keys, tokens, cookies, MCP credentials, and local paths must never enter the generic sync layer.
- A new plugin requires coordinated changes to
Cargo.toml,lib.rs, andcapabilities/default.json.
Issues and pull requests are welcome. Read CONTRIBUTING.md and the Code of Conduct. Report security vulnerabilities through SECURITY.md.
- ๐ Bugs and feature requests โ Issues
- ๐ฌ Questions and ideas โ Discussions
- โค๏ธ Support the project โ GitHub Sponsors
MIT ยฉ 2026 Shiaoming123
Tauri ยท Vue.js ยท Lucide ยท Vercel AI SDK ยท Model Context Protocol