OiMy Desktop App
Hermes v0.16 Fork
Rebrand the Hermes desktop app (MIT/Apache 2.0) as OiMy. Bundle Gemma 4 12B locally via Ollama. Connect to OiMy's existing cloud backend for BCT and deep inference. Families get a private, always-on AI that runs on their MacBook.
Why 12B, and why now
Results from the full Gemma 4 eval on RunPod RTX 3090 with correct models. 10 persona judges (Grok 4.3 + GPT-5.5), all 22 conv + 10 BCT scenarios.
12B handles 80% of OiMy interactions (logistics, lists, quick conv, urgency, safety) with a gap of only 0.38 vs Sonnet. BCT and complex coaching (-0.94 gap) stay in cloud. This is exactly the split the laptop-server architecture requires. Tool calling gap vs Kimi K2.6 (0.30 pts) is small enough to address with one more Opus prompt iteration.
System Design
[OiMy Desktop .dmg Installer]
├── Electron Shell (Onboarding + Menubar UI)
│ ├── React Wizard (5-step setup flow)
│ ├── Menubar Agent (persistent tray icon)
│ └── System Config Writer
│ ├── LaunchAgent .plist generator
│ ├── pmset override (AC power only)
│ └── Cloudflare tunnel provisioner
│
└── Embedded Assets /
├── python-build-standalone (3.12, isolated)
├── Ollama binary (v0.23+, pre-compiled)
├── Gemma 4 12B Q4_K_M GGUF (~8GB bundled or download-on-first-run)
├── OiMy skill manifests (85 skills, Hermes format)
├── Hermes gateway (Python, MIT license)
└── cloudflared binary (Cloudflare tunnel client)
Family iPhone (OiMy iOS / Telegram)
|
|-- Local WiFi ---> OiMy Desktop Mac (:8000 WebSocket / FastAPI)
| |
| +-- Gemma 4 12B (Ollama :11434) [fast path]
| | 80% of requests handled locally
| |
| +-- OiMy Cloud (Hetzner) [fallback]
| BCT, deep coaching, complex planning
|
|-- Via Cloudflare Tunnel (when not on same WiFi)
https://[familyid].oimyai.com -> Mac :8000
Mac OFF / unavailable:
iPhone -> OiMy Cloud directly (same quality, higher latency/cost)
- Quick conv (logistics, scheduling)
- Urgency responses
- Safety triage
- List management
- Calendar tool calls
- Reminders
- Venting / emotional
- BCT coaching (Grok 4.3)
- Deep profile inference (Opus 4.8)
- Multi-step planning
- Transport coordination (gap: TC07)
- Mac unavailable (auto-fallback)
- Family data sync
- Daily rhythm engine
Where the spec needs fixes
pmset -a disablesleep 1 kills battery on all power states. Users will notice within 24 hours and leave a 1-star review.
// WRONG - disables sleep on battery too exec('sudo pmset -a disablesleep 1', callback) // CORRECT - AC power only, battery sleeps normally exec('sudo pmset -c disablesleep 1', callback) // Plus: caffeinate -s as child of daemon (belt + suspenders) // -c = charger only | -b = battery only | -a = all
Missing WorkingDirectory, EnvironmentVariables, and log paths from the reference spec. Without these the daemon starts blind.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0"><dict>
<key>Label</key>
<string>com.oimy.agent</string>
<key>ProgramArguments</key>
<array>
<string>/Users/USER/Library/Application Support/OiMyAgent/env/bin/python</string>
<string>-m</string><string>hermes_agent.gateway</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/USER/Library/Application Support/OiMyAgent</string>
<key>EnvironmentVariables</key>
<dict>
<key>OPENROUTER_API_KEY</key><string>INJECTED_AT_SETUP</string>
<key>OLLAMA_HOST</key><string>127.0.0.1:11434</string>
<key>OIMY_CLOUD_URL</key><string>https://api.oimyai.com</string>
<key>CLOUDFLARE_TUNNEL_TOKEN</key><string>INJECTED_AT_SETUP</string>
</dict>
<key>StandardOutPath</key>
<string>/Users/USER/Library/Logs/OiMyAgent/agent.log</string>
<key>StandardErrorPath</key>
<string>/Users/USER/Library/Logs/OiMyAgent/agent-error.log</string>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict></plist>
Without a tunnel, iOS can only reach the Mac on the same WiFi. Parents at work, kids traveling - broken.
OiMy already runs api-tunnel on Hetzner - same pattern needed here.
# Auto-provisioned at first run via Cloudflare Zero Trust API # Stored in OiMy account, associated with family ID cloudflared tunnel create oimy-[family-id] cloudflared tunnel route dns oimy-[family-id] [family-id].oimyai.com # Then added as second .plist daemon: # com.oimy.tunnel.plist -> cloudflared tunnel run oimy-[family-id] # KeepAlive: true # When Mac is on + internet -> iOS works from anywhere
4-week MVP (Option A: Telegram)
Fork Hermes v0.16.0, rebrand assets, replace config defaults, get Gemma 4 12B running via bundled Ollama.
- Fork
nousresearch/hermes-agent, rename tooimy-desktop - Replace branding (name, logo, colors, window titles)
- Bundle
python-build-standalone3.12 into Electron assets - Bundle Ollama binary, configure for Gemma 4 12B
- Inject OiMy Opus 4.8 prompts as default system prompt
- electron-builder DMG config, sign with Apple developer cert
LaunchAgent daemon, pmset AC-only override, Cloudflare tunnel provisioning, and the BotFather onboarding wizard.
- LaunchAgent .plist generator (with WorkingDirectory + env vars)
pmset -c disablesleep 1+ caffeinate child process- Cloudflare Zero Trust API integration (auto-provision tunnel)
- React wizard: Welcome -> Download 12B -> Enable daemon -> Connect Telegram
- Embedded animation: BotFather flow for creating bot
- Token input field + automated config.toml write + gateway start
Port 85 OiMy skill manifests into Hermes skill format. This is the bulk of OiMy-specific work.
- Map OiMy YAML manifest format to Hermes skill schema
- Write migration script for batch conversion
- Priority skills first: list-manager, calendar, reminders, conv, BCT
- Test each skill end-to-end through Telegram
- Configure cloud fallback routing (BCT, planning -> Hetzner)
- Validate tool calling scenarios TC01-TC10 pass through local model
Family profile sync between local and cloud. Hardware testing across Mac configs. Beta to 3 existing OiMy families.
- Profile sync: pull from Hetzner on app launch, push on session end
- Test on: 16GB M2 MacBook Air, 24GB M3 MacBook Pro, 16GB Intel MacBook
- Graceful degradation: E4B mode for 8-12GB Macs
- Menubar UI: status indicator, model info, cloud/local routing display
- Beta install with 3 pilot families from existing 38
- Crash reporting via Sentry
What to watch
Verdicts from eval
Conv NPS 6.06 (-0.55 vs Sonnet). Viable as intent classifier and pre-filter. Not reliable enough as sole conv model without fine-tuning. Fallback to 12B or cloud for complex turns.
Conv NPS 6.23 (-0.38 vs Sonnet). Close enough for the 80% of interactions that are logistics/conv. BCT gap (-0.94) stays cloud. One more Opus iteration could close the gap further.
Tool calling 3.38 vs Kimi 3.68. Transport coordination (TC07) scored 2.0 vs 4.6. Multi-step orchestration needs work. Two more Opus iterations on tool calling prompt could change this.
Why this matters
"Your family's AI runs on your own Mac. Nothing leaves your house." Compelling pitch for privacy-conscious parents. True local inference = no third-party cloud touching family data.
Families who use OiMy 50-100x/day would be expensive at cloud rates. Local model eliminates that ceiling. Power users get a better deal; OiMy saves API spend.
35-45yo parents with MacBooks. ~60% have 16GB+ M-chip Macs (2022+). Remaining 40% get E4B mode or cloud fallback. Hardware gate is manageable for this demographic.
Bedtime routine help works when Hetzner is down. Kids' morning chaos handled locally. Cloud is enhancement, not dependency for 80% of interactions.