Inspiration

We've all done it — sit down to check one thing and look up two hours later. We wanted something that actually catches that moment, not another screen-time report you check once and ignore. So instead of a passive dashboard, Sidekick watches for the moment you go idle and puts a real, talkable AI companion in front of you right then — while you're already paused, not after the damage is done.

What it does

Sidekick runs quietly in the background on Windows, tracking idle time. The moment you step away or pause, it captures and blurs your screen, then opens a frosted-glass overlay with an AI you can talk or type to. Ask it what to do instead of going back to the same tab, and it gives you a real, personalized suggestion — spoken back to you with natural voice, not just text. Mark it "did it" or "skip," and Sidekick remembers, building a streak of actual follow-through over time. A live dashboard shows your current and best streaks, a day-by-day chart of what you followed through on versus skipped, and your full suggestion history.

How we built it

  • Backend: FastAPI, with Tiger Data (TimescaleDB/Postgres) storing streaks, suggestions, and outcomes. Backboard gives the agent persistent memory across sessions via a per-user thread, so it actually remembers context between conversations instead of starting cold every time. ElevenLabs converts every suggestion into real spoken audio.
  • Frontend: Next.js and Tailwind for both the overlay UI and a live dashboard. The overlay itself isn't a browser tab — it's a native window via pywebview, triggered by a Python script polling Windows' idle-time API, so it can appear on top of literally anything you're doing, regardless of which app has focus.
  • Voice: push-to-talk using the Web Speech API for live transcription, paired with ElevenLabs for the AI's spoken replies.

Challenges we ran into

The overlay window not actually coming to the front was the hardest bug of the entire build. Windows has a built-in "foreground lock" that blocks background processes from stealing focus from whatever app you're actively using — so even with the window correctly marked topmost, it would sometimes get silently minimized by Windows and just flash in the taskbar instead of appearing. Fixing it took forcing a proper SW_RESTORE, re-asserting topmost z-order directly via the Win32 API, and using the AttachThreadInput trick to borrow foreground permission from whatever app currently had it.

We also discovered partway through that voice input straight-up doesn't work inside a pywebview window — Chromium-based embedded webviews (WebView2 on Windows) don't support the browser's network-backed speech recognition service at all, the same limitation Android's embedded WebView has. Rather than build a whole custom audio pipeline under time pressure, we leaned into typed input as the overlay's primary path and kept voice input working in a real browser tab.

Accomplishments that we're proud of

Getting a genuinely native, always-on-top, idle-triggered overlay working on Windows from a background Python script — not a browser extension, not a foreground app you have to keep open — feels like a real systems-level win. And end to end, the whole loop actually works: idle detection triggers the overlay, you talk or type to a real AI with persistent memory, it speaks back with real audio, and your streak updates live on a dashboard pulling from the same database.

What's next for Sidekick

Wake-from-sleep detection (not just idle-timeout), pattern recognition across suggestion history to make recommendations smarter over time, and solving voice input inside the overlay itself — likely by capturing raw audio and sending it to a proper speech-to-text service instead of relying on the browser's built-in recognition.

Built With

Share this project:

Updates

Submission history