Oats tauri
Use when changing oats backend — Rust commands in src-tauri, the invoke contract, capabilities/permissions, Tauri plugins, multi-window, or running the cargo test suite. Includes the macOS build/test workarounds.From its SKILL.md
npx -y skills add ariso-ai/oats --skill oats-tauriAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 23 stars23 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.2 KB, as published. Nobody here has run it
oats Backend (Tauri v2) Conventions
The backend is Rust in src-tauri/, exposing commands the Vue frontend calls via
invoke. Tauri v2, Apple-Silicon macOS only.
Layout (src-tauri/src/)
main.rs— app setup, plugin registration, tray, window creation,invoke_handler.commands.rs— the bulk of#[tauri::command]functions (the frontend API surface).- Domain modules:
audio_capture.rs,transcribe.rs,model_manager.rs,storage.rs,recording_state.rs,mic_monitor.rs,meeting_notifications.rs,recorder_pill.rs,tray.rs/tray_meeting.rs,update_manager.rs.
The invoke contract
Frontend → backend goes through typed wrappers in src/tauri.ts
(import { invoke } from '@tauri-apps/api/core'). To add a command:
- Write
#[tauri::command] async fn foo(...)incommands.rs(or a domain module). - Register it in the
invoke_handler![...]inmain.rs. - Add a typed wrapper in
src/tauri.ts; call that from views/composables.
Capabilities & permissions
src-tauri/capabilities/default.json is the allowlist — it names the windows
(main, waveform, settings, update, library, onboarding, meeting-prompt,
silence-prompt, meeting-end-prompt) and the
permissions they get (core:window:*, store:default, opener:default,
notification:default, updater:default, plus a scoped opener:allow-open-url for
x-apple.systempreferences:*). A new window or plugin capability must be added here or
calls are rejected at runtime.
Plugins in use
@tauri-apps/plugin-store (persisted settings), plugin-updater (R2-hosted auto-update,
configured under plugins.updater in tauri.conf.json), plugin-notification,
plugin-opener. The tauri-plugin-mcp server is gated behind --features mcp — see
oats-debugging.
Run / build
npm run tauri:dev— run the app.npm run tauri:dev:debug— run with the MCP server (--features mcp).npm run tauri:build— bundle. Exits non-zero on the updater signing step (TAURI_SIGNING_PRIVATE_KEYmissing) but the.appis already built atsrc-tauri/target/release/bundle/macos/oats.appand is fully usable.
Testing the Rust suite (macOS workarounds — important)
Default cargo test fails on this platform two ways. Full green command:
DYLD_LIBRARY_PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.5/macosx" \
cargo test --manifest-path src-tauri/Cargo.toml -- --test-threads=1
DYLD_LIBRARY_PATHfixes a missinglibswift_Concurrency.dylibSIGABRT. A benignobjc[...] Class ... implemented in bothwarning still prints.--test-threads=1avoids a pre-existing isolation flake (somerename_local_recording*/finalize*tests mutate process-wide state and collide in parallel).
Fresh git worktree bootstrap
A fresh worktree is missing .gitignored build inputs; bootstrap before building/testing:
- Sidecar binaries (
src-tauri/binaries/is gitignored) — copy from the primary checkout:cp -R <primary>/src-tauri/binaries/{ariso-stt-aarch64-apple-darwin,mlx-swift_Cmlx.bundle} src-tauri/binaries/. npm ci(repo uses npm +package-lock.json).npm run vite:buildonce —generate_context!needsdist/to exist.
macOS permission (TCC) testing
Test TCC grants (system-audio etc.) on the bundled app (stable id ai.ariso.desktop),
not the adhoc-signed tauri:dev binary (unstable identity across rebuilds). System-audio
capture (Core Audio process taps) prompts on capture start and the grant lands under
"System Audio Recording Only" in Privacy → Screen & System Audio Recording. Reset a grant
with tccutil reset ScreenCapture ai.ariso.desktop; a leftover broad Screen Recording
grant silently satisfies the tap and suppresses the narrow prompt.
For frontend conventions see oats-vue; for the big picture see oats-architecture;
for driving the running app see oats-debugging.