[ Back to home ]
2024

A dual-interface personal AI assistant.

Press Ctrl+Alt+Z for an instant popup. Launch the Electron dashboard for the full workspace. Both surfaces talk to one Flask API and one SQLite memory store, so the assistant feels like one tool no matter where it is invoked from.

1. Abstract

Personal AI assistants force a tradeoff. A popup is fast but shallow. A desktop app does everything but opens too slowly for the small task that prompted the question. Zephyr ships both over one backend, so memory and integrations stay consistent. Quick command, popup. Complex management, dashboard. The assistant never has two minds.

A Tkinter popup on a system-wide hotkey (Ctrl+Alt+Z) handles instant capture. A Flask API on localhost owns all state. An Electron + React dashboard holds the full workspace. SQLite holds persistent memory, and a multi-LLM router fronts Groq Llama 3.1 8B, OpenAI, and Gemini so one provider outage does not take the assistant down.

The novelty is the surface design, not the LLM. Multi-LLM routing, SQLite-backed memory and system-tray apps all exist. The contribution is the discipline that makes two interfaces over one backend feel like one product.

2. Introduction

Phone voice assistants are fast but shallow; desktop AI apps are deep but slow to launch. Real tasks span one memory but want different interfaces.

2.1 Why three tiers, not two

One process shipping both UIs breaks once either UI must update independently, run on another machine, or make room for a third client (a mobile companion, a Slack bot, a voice device). Three tiers make the API the only stable contract. Cost: an extra process. Benefit: the assistant grows without rebuilding state management.

2.2 What is actually new

Tkinter, Flask, Electron and the LLM providers are all off the shelf. The structure that makes them one product is new.

Everything below makes those three commitments hold across two UI surfaces.

3. System

3.1 Tiny Zephyr (the popup)

3.2 Flask API bridge

Runs on localhost:5000, auto-started with Tiny Zephyr but addressable independently.

3.3 Electron dashboard

3.4 Memory and routing

3.5 Integrations

4. Evaluation

Evaluation is functional, measured on the running daily-use install rather than against a benchmark suite.

These measure this build on its own protocol, not against another assistant. Personal assistants have no settled benchmark suite, and Zephyr's two-surface design is not directly comparable to single-surface OS-native assistants. Read them as evidence of a working daily tool, not a leaderboard claim.

5. Conclusion and Implications

The right interface depends on the task, not the assistant. Splitting popup and dashboard while unifying state behind an API lets the user pick the mode without losing coherence. Any future surface (mobile companion, voice device, Slack bot, terminal client) becomes another client, not a fork. Local LLMs (Ollama, llama.cpp, LM Studio) slot in without redesign. For a personal tool that must live in the daily workflow without becoming another app to manage, that boundary is the load-bearing one.

5.1 Limitations and future work

6. Acknowledgments

Built independently. LLM inference relies on Groq, OpenAI, and Google Gemini. Spotipy wraps the Spotify Web API; WeatherAPI and the Google Calendar API supply the remaining external state. Desktop integration uses the standard Electron shell.