omi / app
AGENTS.md14k starsChanged 10 months agoMITView on GitHub
UI: contract. Speakers: SpeakerNames/DiarizationLabel (lib/ui/format/); EpisodePresentation.participants counts names. This handles: pub get, build_runner, gen-l10n, and flavor configuration. For physical-device builds, use the wrapper: it owns dev + local_dev and prod + mobile_beta pairing plus auth env setup. Direct builds must first run scripts/validate_mobile_build_config.sh --flavor <dev|prod> --profile <profile> with the matching OMI_APP_PROFILE; release/profile helpers do this too. OMI_MOBILE_BUILD_MODE=profile installs an AOT build that opens untethered (debug builds need flutter run attached on a physical iPhone; see README).
- Reads credentials
- Installs packages
Trending
More talk lately.about the whole repository
Who's talking about BasedHardware/omi
- Hungry Labs“omi: Open-Source AI That Watches Your Screen and Listens to Your Conversations”YouTube · Apr 19, 2026 · 3.2k views
- Omi“Setting up local frontend development environment”YouTube · Nov 19, 2024 · 2.8k views
- Karn“omi just hit 10K stars — it watches your screen and you paid for it”YouTube · Apr 19, 2026 · 1.5k views
- 딸깍 검증소“아스트라가 이렇게 똑똑하다길래, 돈을 벌어오라고 시켜봤다”YouTube · Sep 14, 2026 · 1.5k views
- Seeed Studio“How to Build 5000 Pcs AI Gadgets in 30 Days?”YouTube · Sep 13, 2024 · 1.4k views
The biggest 5 of 83 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 83
Talked about on GitHub, YouTube, Bluesky and Hacker News (83 times).
On GitHub · 50
- Mar 2, 2026refactor firmware — 0xkelvin/veea-pendant1 reaction
- Nov 5, 2026agent-skills.github.basedhardware.omi: 0.12.567 → 1.0.577 — sudosubin/agents.nix0 reactions
- Nov 5, 2026agent-skills.github.basedhardware.omi: 1.0.577 → 0.12.567 — sudosubin/agents.nix0 reactions
- Oct 28, 2026docs(07-recorder): 收录 Omi 商业产品卡 — smile-xuc/aihw-starter0 reactions · 1 comment
- Oct 26, 2026agent-skills.github.basedhardware.omi: refs/tags/v1.0.577+1514-android-cm → refs/tags/v1.0.577+1516-android-cm — sudosubin/agents.nix0 reactions
45 more on GitHub
- Oct 26, 2026agent-skills.github.basedhardware.omi: 1.0.573 → 1.0.577 — sudosubin/agents.nix0 reactions
- Oct 23, 2026agent-skills.github.basedhardware.omi: 1.0.571 → 1.0.573 — sudosubin/agents.nix0 reactions
- Oct 22, 2026agent-skills.github.basedhardware.omi: 0.12.523 → 1.0.571 — sudosubin/agents.nix0 reactions
- Oct 22, 2026agent-skills.github.basedhardware.omi: 0.12.522 → 0.12.523 — sudosubin/agents.nix0 reactions
- Oct 22, 2026agent-skills.github.basedhardware.omi: 0.12.521 → 0.12.522 — sudosubin/agents.nix0 reactions
- Oct 21, 2026agent-skills.github.basedhardware.omi: 0.12.520 → 0.12.521 — sudosubin/agents.nix0 reactions
- Oct 21, 2026agent-skills.github.basedhardware.omi: 0.12.519 → 0.12.520 — sudosubin/agents.nix0 reactions
- Oct 21, 2026agent-skills.github.basedhardware.omi: 0.12.517 → 0.12.519 — sudosubin/agents.nix0 reactions
- Oct 21, 2026agent-skills.github.basedhardware.omi: 0.12.516 → 0.12.517 — sudosubin/agents.nix0 reactions
- Oct 20, 2026agent-skills.github.basedhardware.omi: 0.12.514 → 0.12.516 — sudosubin/agents.nix0 reactions
- Oct 20, 2026agent-skills.github.basedhardware.omi: 0.12.511 → 0.12.514 — sudosubin/agents.nix0 reactions
- Oct 20, 2026agent-skills.github.basedhardware.omi: 0.12.508 → 0.12.511 — sudosubin/agents.nix0 reactions
- Oct 19, 2026agent-skills.github.basedhardware.omi: 0.12.505 → 0.12.508 — sudosubin/agents.nix0 reactions
- Oct 19, 2026agent-skills.github.basedhardware.omi: 0.12.504 → 0.12.505 — sudosubin/agents.nix0 reactions
- Oct 18, 2026agent-skills.github.basedhardware.omi: 0.12.503 → 0.12.504 — sudosubin/agents.nix0 reactions
- Oct 18, 2026agent-skills.github.basedhardware.omi: 0.12.502 → 0.12.503 — sudosubin/agents.nix0 reactions
- Oct 18, 2026agent-skills.github.basedhardware.omi: 0.12.501 → 0.12.502 — sudosubin/agents.nix0 reactions
- Oct 18, 2026agent-skills.github.basedhardware.omi: 0.12.500 → 0.12.501 — sudosubin/agents.nix0 reactions
- Oct 17, 2026agent-skills.github.basedhardware.omi: 0.12.498 → 0.12.500 — sudosubin/agents.nix0 reactions
- Oct 17, 2026agent-skills.github.basedhardware.omi: 0.12.497 → 0.12.498 — sudosubin/agents.nix0 reactions
- Oct 17, 2026agent-skills.github.basedhardware.omi: 0.12.495 → 0.12.497 — sudosubin/agents.nix0 reactions
- Oct 17, 2026agent-skills.github.basedhardware.omi: 0.12.494 → 0.12.495 — sudosubin/agents.nix0 reactions
- Oct 16, 2026agent-skills.github.basedhardware.omi: 0.12.493 → 0.12.494 — sudosubin/agents.nix0 reactions
- Oct 16, 2026Preserve processing policy and retry behavior — thesohamdatta/omi0 reactions
- Oct 16, 2026Finalize eligible desktop recordings with enrichment — thesohamdatta/omi0 reactions
- Oct 16, 2026Prove the desktop from-segments finalization regression — thesohamdatta/omi0 reactions
- Oct 16, 2026agent-skills.github.basedhardware.omi: 0.12.491 → 0.12.493 — sudosubin/agents.nix0 reactions
- Oct 16, 2026agent-skills.github.basedhardware.omi: 0.12.490 → 0.12.491 — sudosubin/agents.nix0 reactions
- Oct 16, 2026agent-skills.github.basedhardware.omi: 1.0.562 → 0.12.490 — sudosubin/agents.nix0 reactions
- Oct 14, 2026[HYDRA] Paid work lead watch — p1ngtoohigh/Jarvus-Pub0 reactions · 143 comments
- Oct 14, 2026agent-skills.github.basedhardware.omi: 1.0.555 → 1.0.562 — sudosubin/agents.nix0 reactions
- Oct 7, 2026agent-skills.github.basedhardware.omi: 1.0.554 → 1.0.555 — sudosubin/agents.nix0 reactions
- Oct 6, 2026agent-skills.github.basedhardware.omi: refs/tags/v1.0.554+1338-android-cm → refs/tags/v1.0.554+1371-android-cm — sudosubin/agents.nix0 reactions
- Oct 3, 2026agent-skills.github.basedhardware.omi: 1.0.552 → 1.0.554 — sudosubin/agents.nix0 reactions
- Sep 27, 2026feat(app,firmware): remappable single/double/triple tap button actions (#2825) — sirgawain0x/omi0 reactions · 1 comment
- Sep 25, 2026agent-skills.github.basedhardware.omi: init at 1.0.552 — sudosubin/agents.nix0 reactions
- Sep 21, 2026[Cash Ops] [Bounty proposal] docs(cli): Spanish agent quickstart and CSV export guide ($60 proposed) — apb31/maintainerops0 reactions · 2 comments
- Sep 7, 2026Fix setup failure for playlist owners without display names — BasedHardware/omi-spotify-integration0 reactions
- May 20, 2026Add ChatGPT/Codex subscription tier (loopback proxy) — Git-on-my-level/omi0 reactions · 3 comments
- Jan 18, 2026[]() — ztfw4ccpgv-lang/Savad0 reactions
- Jan 18, 2026 — ztfw4ccpgv-lang/Savad0 reactions
- Nov 4, 2025Expose button as custom action — SimpleOpenSoftware/chronicle0 reactions · 1 comment
- Oct 29, 2025Issue #10 - [FEATURE] Add undo functionality for memories deleted by swiping — nikikim01/omi0 reactions
- Oct 29, 2025Issue #10 - [FEATURE] Add undo functionality for memories deleted by swiping — nikikim01/omi0 reactions
- Oct 21, 2025Issue #10 - [FEATURE] Add undo functionality for memories deleted by swiping — dezzysdream/omi0 reactions
On YouTube · 21
- Apr 19, 2026omi: Open-Source AI That Watches Your Screen and Listens to Your Conversations — Hungry Labs3.2k views · 1 comment
- Nov 19, 2024Setting up local frontend development environment — Omi2.8k views · 2 comments
- Apr 19, 2026omi just hit 10K stars — it watches your screen and you paid for it — Karn1.5k views
- Sep 14, 2026아스트라가 이렇게 똑똑하다길래, 돈을 벌어오라고 시켜봤다 — 딸깍 검증소1.5k views
- Sep 13, 2024How to Build 5000 Pcs AI Gadgets in 30 Days? — Seeed Studio1.4k views · 5 comments
16 more on YouTube
- Apr 17, 2026Omi: Open-Source AI Wearable That Remembers Everything — Prism Labs1.1k views
- Apr 20, 20269.6K+ Stars • AI | omi — A 2nd brain you trust more than your 1st #shorts — Neural-Nexus1.1k views
- Jan 25, 2025This AI gadget can read your mind! — Sadman Sakib799 views
- Apr 18, 2026Omi: 당신의 두 번째 AI 두뇌 비서 — Repocast | GitHub 일일 브리핑568 views · 1 comment
- Apr 12, 2025Omni Open Source AI Wearable Is A Total Game Changer — Moikapy493 views
- Apr 19, 2026This $89 necklace records your entire life (10K stars, open source) — Indie Hacker News306 views
- Oct 2, 2026Build Your Own AI Second Brain with Omi — RepoManiac233 views
- Apr 25, 2026Omi: 당신의 AI 제2의 뇌 — Decoded AI141 views
- Apr 14, 2025GitHub - BasedHardware/omi: AI wearables. Put it on, speak, transcribe, automatically — GitHub Daily Trend AI Podcast124 views
- Apr 19, 2026How Omi AI Started: 10,000+ Commits in 2 Months! 🚀 — CodeTimelapse110 views
- Oct 24, 2026omi: Screen-watching AI assistant that never skips a beat — Cherry Picked82 views · 1 comment
- Apr 16, 2026Omi Watches Your Screen & Listens — Then Acts — Deployed-AI72 views
- Aug 31, 2026🚀 Build a Dynamic AI Agent with Omi Wearable! #Omi #louispython #AI #Python — LOUIS PYTHON37 views
- Apr 15, 2026Is This AI Second Brain the Future of Productivity? — Github Signals24 views
- Apr 14, 2025BasedHardware/omi - Gource visualisation — Gourcer22 views · 1 comment
- Oct 8, 2026APÓS BATER 13 #Shorts — Ryan SantosTG7 views
On Bluesky · 7
- Apr 16, 2026Ok, est-ce que ça va trop loin ? "IA qui voit votre écran, écoute vos conversations et vous dit quoi faire" Idée du CM : On va voir si on… — @bearstech.com3 likes and reposts
- Sep 16, 2025📦 BasedHardware / omi ⭐ 6,385 (+83) 🗒 C AI wearables. Put it on, speak, transcribe, automatically — @github-trending.bsky.social3 likes and reposts
- Apr 13, 2025📦 BasedHardware / omi ⭐ 4,587 (+37) 🗒 C AI wearables. Put it on, speak, transcribe, automatically — @github-trending.bsky.social3 likes and reposts
- Oct 24, 2026Screen-watching AI that never misses omi captures your screen and conversation, transcribes live, and serves up summaries and action items.… — @cherrypickedhq.bsky.social2 likes and reposts
- May 4, 2025📦 BasedHardware / omi ⭐ 5,452 (+16) 🗒 C AI wearables. Put it on, speak, transcribe, automatically — @github-trending.bsky.social1 likes and repost
2 more on Bluesky
- Jul 1, 2026Damn even these? github.com/BasedHardwar... — @imdylan.bsky.social0 likes and reposts · 2 replies
- Apr 16, 2026🚀 Skyrocketing! 🚀 (200+ new stars) 📦 BasedHardware / omi ⭐ 8,685 (+448) 🗒 Dart AI that sees your screen, listens to your conversations… — @github-trending.bsky.social0 likes and reposts · 1 reply
On Hacker News · 5
- Aug 23, 2024Show HN: Omi – Open-source AI wearable for capturing conversations117 points · 94 comments
- Apr 15, 2026Show HN: Omi – watches your screen, hears conversations, tells you what to do19 points · 13 comments
- Apr 14, 2025Show HN: Open-Source Meta Raybans with 6x of their battery12 points
- Jun 13, 2025Show HN: Omi Desktop – open-source meeting summarizer4 points · 2 comments
- Aug 8, 2024Omi – Open-source AI wearables2 points
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- backend/AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- .github/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .cursor/rules/arc.mdCursor rule
- .cursor/rules/backend-imports.mdcCursor rule
- .cursor/rules/backend-testing.mdcCursor rule
- .cursor/rules/common-mistakes.mdcCursor rule
- .cursor/rules/flutter-localization.mdcCursor rule
- .cursor/rules/formatting.mdcCursor rule
The file
We split this AGENTS.md into the rules it gives an agent
8 rules. About 0 are common, 1 is distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 36
Never run flutterfire configure — it overwrites prod credentials.
- Very specific: line 49
After editing the contract, regenerate: flutter pub run build_runner build
- Very specific: line 121
All user-facing strings use context.l10n.keyName.
- Very specific: line 122
Add/change/remove a key with scripts/l10n.py (add/set/remove).
- Very specific: line 129
If expired, calls AuthService.instance.getIdToken() for Firebase refresh
- Very specific: line 151
After any Flutter UI edit, verify with agent-flutter (Marionette is integrated in debug builds).
- Distinctive: line 161
Must reconnect after every hot restart (kills VM Service session).
- Very specific: line 164
Prefer find type X / find key "name" over hardcoded @ref.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
App (Flutter)
UI: contract.
Speakers: SpeakerNames/DiarizationLabel (lib/ui/format/); EpisodePresentation.participants counts names.
Build Bootstrap
Flavors
- dev: Android
com.friend.ios.dev, iOScom.friend-app-with-wearable.ios12.development— uses.dev.env, Firebase projectbased-hardware-dev - prod: Android
com.friend.ios, iOScom.friend-app-with-wearable.ios12— uses.env, Firebase projectbased-hardware-prod - raybanDat: camera-capable iOS target with the same iOS development identity;
scripts/rayban_dat.shexcludes mcumgr only for that transaction, then restores the default graph.
Version string
pubspec.yaml (1.0.543+992) is the local placeholder. Store binaries ignore it: Codemagic sets BUILD_NAME from the latest store version and BUILD_NUMBER to max(store)+1 (pubspec seeds only with no store history). Analytics/Crashlytics build_number is OMI_BUILD_NUMBER. Authoritative: stores = Codemagic; local/dev = pubspec; analytics = OMI_BUILD_NUMBER.
Release
GREEN gate (13:15 UTC) → train: iOS phased 100% after 12h; Android 1%→10%→50%→100%; rollout-advance every 4h on a ≤26h GREEN receipt. Never withdraw an iOS version Apple has to ship a newer one. .github/agent-docs/mobile-release-process.md.
Generated Files (never edit)
envied, json_serializable, pigeon (lib/pigeon_interfaces.dart → lib/gen/ + iOS/Android stubs), and flutter_gen: flutter pub run build_runner build. ARB → flutter gen-l10n (lib/l10n/app_localizations*.dart). Never edit *.g.dart / *.gen.dart.
Setup Sequence
bash setup.sh ios # or: bash setup.sh androidThis handles: pub get, build_runner, gen-l10n, and flavor configuration.
For physical-device builds, use the wrapper: it owns dev + local_dev and prod + mobile_beta pairing plus auth env setup. Direct builds must first run
scripts/validate_mobile_build_config.sh --flavor <dev|prod> --profile <profile>
with the matching OMI_APP_PROFILE; release/profile helpers do this too.
OMI_MOBILE_BUILD_MODE=profile installs an AOT build that opens untethered
(debug builds need flutter run attached on a physical iPhone; see README).
Firebase Config
Never run flutterfire configure — it overwrites prod credentials. Config files:
- Dev:
android/app/src/dev/ - Prod:
android/app/src/prod/ - Local emulator:
lib/firebase_options_local.dart
Native Bridge
Pigeon Interface (bidirectional, iOS ↔ Dart)
- Contract:
lib/pigeon_interfaces.dart— paired host/Flutter APIs for the watch recorder, BLE, and Ray-Ban Meta - Dart side:
lib/gen/pigeon_communicator.g.dart - iOS side:
ios/Runner/PigeonCommunicator.g.swift - Android side:
android/app/src/main/kotlin/com/friend/ios/PigeonCommunicator.g.kt - Implementation:
ios/Runner/RecorderHostApiImpl.swift - After editing the contract, regenerate:
flutter pub run build_runner build
MethodChannel (Phone Calls)
- Channel:
com.omi/phone_calls+ EventChannelcom.omi/phone_calls/events - Dart:
lib/services/phone_call_service.dart - iOS:
ios/Runner/PhoneCalls/OmiPhoneCallsPlugin.swift - Android:
android/app/src/main/kotlin/com/friend/ios/phonecalls/PhoneCallsPlugin.kt - Methods: initialize, makeCall, endCall, toggleMute, toggleSpeaker
Pigeon (Phone Mic — conversation capture)
- Contract:
lib/phone_mic_interface.dart→lib/gen/phone_mic_pigeon.g.dart+ios/Runner/PhoneMic/PhoneMicPigeon.g.swift+android/app/src/main/kotlin/com/friend/ios/phonemic/PhoneMicPigeon.g.kt - Regenerate:
dart run pigeon --input lib/phone_mic_interface.dart - Modules: iOS
ios/Runner/PhoneMic/(self-healing AVAudioEngine capture; interruptions/routes recover natively); Androidandroid/app/src/main/kotlin/com/friend/ios/phonemic/(AudioRecord with self-healing rebuild + silencing detection;PhoneMicForegroundServicekeeps background capture alive; batch opus encode via a JNI shim over the plugin-shipped libopus) - Dart service:
lib/services/mic/native_mic_recorder_service.dartbehindServiceManager.phoneMic; chat memos/speech profile stay on flutter_sound viaServiceManager.mic;MicArbiterarbitrates the two stacks - Events carry a Dart-minted session id (
start(mode, sessionId)); Dart drops foreign-id events,start()onto a live session adopts the new id and re-emits state, andstop()always forwards to native then tears down locally once - Two capture modes fixed at
start(mode):stream(frames → Dart → socket/WAL) andbatch(Transcribe Later — opus → WAL-compatibleaudio_omibatchphone[auto]_…bin; no frames cross to Dart; liveness =onBatchProgress: iOS 4s healthy/1s fault, Android 1Hz; Dart 10s unchanged). Selection:CaptureController.streamRecording(explicit/offline);omibatchphoneautouploads on reconnect
On-device speech deadlines and cleanup: contract.
MethodChannel (On-device tool surface)
com.omi.device_tools(lib/services/device_tools/device_tool_surface.dart, iOSDeviceToolsService.swift):search_contacts,propose_message,request_permission. iOS verb is propose — the compose sheet is the approval; cancelled ≠ delivered. Ridesdevice_toolsonPOST /v2/messages+tool:SSE frames, never surfaced to chat UI. Contract:desktop/macos/docs/device-tool-surface.md.
Permission Matrix
| Permission | Android | iOS | Feature |
| Microphone | RECORD_AUDIO | NSMicrophoneUsageDescription | Recording, speech profile |
| Bluetooth | BLUETOOTH_SCAN, BLUETOOTH_CONNECT | NSBluetoothAlwaysUsageDescription | Omi device connection |
| Location | ACCESS_FINE_LOCATION | NSLocationUsageDescription | Background features |
| Contacts | READ_CONTACTS | NSContactsUsageDescription | People recognition |
| Calendar | READ/WRITE_CALENDAR | NSCalendarsUsageDescription | Calendar integration |
| Camera | — | NSCameraUsageDescription | QR/photo features |
| Notifications | POST_NOTIFICATIONS | (automatic) | Push notifications |
| Background | FOREGROUND_SERVICE_* (5 types) | UIBackgroundModes (7 modes) | Continuous capture |
Test Strategy
Test Structure
test/spine/— protected contracts;test/unit/— auth and utilitiestest/widgets/— UI components (shimmer, waveform, transcript)test/providers/— State management (capture_provider, device_provider)test/utils/— Utility functions (localization helpers)
Running Tests
bash test.sh # all unit/widget tests (hermetic)
flutter test test/unit/ # specific directory
make mobile-verify ARGS="fast --paths <changed-file>" # focused product journeys
make mobile-verify ARGS="fast --all" # full hermetic journey suite
(cd android && ./gradlew :app:testDevDebugUnitTest) # Android JVM: JDK 21, SDK 36test.sh bootstraps missing inputs with empty API_BASE_URL. Journey selection/receipts/CI: scripts/dev-harness/MOBILE_VERIFY.md.
Native: ruby ios/test/batch_audio_energy_test.rb; phone/BLE replay.
Performance
UI: bash app/tool/perf_gate.sh (guide); red blocks shipping.
Heavy: bash app/tool/perf_device_run.sh (never-uninstall guide).
Test Patterns
- Mock singletons (SharedPreferencesUtil, AuthService, FirebaseAuth) since they aren't injectable
- Capture seams/ownership: C1 contract; inject fakes.
- HTTP result/consumer migration: C3 contract.
- Mind Map identity: contract.
- Everything under
test/must be hermetic — no network, live backends, or real devices — becausebash test.sh(the CI suite) runs all of it. - Chat transcript layout: pumping only
AIMessagein aSingleChildScrollViewmisses scroll-extent bugs; chat list changes must keeptest/widgets/chat_scroll_layout_test.dartgreen (ListView drag + citation/markdown sizes) — it is the Mobile App Checks contract for this class. - Tests needing a live service/device/real API go under
integration_test/(plaintest.shskips them); the hermetic seeded journeys there run in CI viamobile-verify fast --allwith loopback fixtures only. Local-backend tests setOMI_APP_TEST_API_BASE_URL=http://127.0.0.1:<port>/. - Coverage: root
AGENTS.md→ Testing.
Localization (l10n)
- All user-facing strings use
context.l10n.keyName. Template:lib/l10n/app_en.arb. Never hardcode a locale count;python3 scripts/l10n.py templatelists every locale the tree has. - Add/change/remove a key with
scripts/l10n.py(add/set/remove). Do not edit ARB files by hand or withjq. The caller supplies translations (no network); the tool writes every locale, runsflutter gen-l10n, formats generated Dart, and refuses a partial or placeholder-mismatched change. python3 scripts/l10n.py checkis the fast consistency gate (parse, key-set, placeholders, generated freshness). Ready for a pre-push hook; not wired in this package.
Auth & Security
Token Lifecycle
getAuthHeader()inlib/backend/http/shared.dartchecks token expiry (5-minute buffer)- If expired, calls
AuthService.instance.getIdToken()for Firebase refresh - Token stored via SharedPreferencesUtil in flutter_secure_storage (Keychain / EncryptedSharedPreferences); expiration timestamp stays in SharedPreferences. One-time migrateAuthTokenFromPrefs() runs at SharedPreferencesUtil.init() so existing sessions keep their token.
- 401 responses trigger automatic refresh + retry
Auth Methods
- Google
google_sign_in; Applesign_in_with_apple(nonce+SHA256 PKCE). - Firebase Auth; browser flows: mobile auth.
Request Headers
Gated features show read-only on TestFlight by default; never money, entitlements or data: backend/config/app_channel.py.
API Base URLs
- Dev: configured in
.dev.env→Env.apiBaseUrl - Prod: configured in
.prod.env→Env.apiBaseUrl
App Flows & E2E
- Flows:
e2e/SKILL.md. Own-voice enrollment: guide. - See
e2e/flows/*.yamlfor individual flow definitions
Verifying UI Changes (agent-flutter)
After any Flutter UI edit, verify with agent-flutter (Marionette is integrated in debug builds). Install once: npm install -g agent-flutter-cli.
Edit → Verify → Evidence loop:
- Edit code, hot restart:
kill -SIGUSR2 $(pgrep -f "flutter run" | head -1) - Connect:
AGENT_FLUTTER_LOG=/tmp/flutter-run.log agent-flutter connect - Verify:
agent-flutter snapshot -i - Interact:
agent-flutter press @e3/press 540 1200/find type button press/fill @e5 "text"/dismiss - Evidence:
agent-flutter screenshot /tmp/evidence.png
Key rules:
- Must reconnect after every hot restart (kills VM Service session).
- Refs go stale frequently — always re-snapshot before every interaction. Use
press x yas fallback. AGENT_FLUTTER_LOGmust point to flutter run stdout (not logcat).- Prefer
find type X/find key "name"over hardcoded@ref. AddKey('descriptive_name')to new interactive widgets.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

