Skip to content
Aryan.
← All work

02 · Personal AI OS

Jebb

Status
In daily use (permanent prototype)
Role
Solo developer
Started
2025

FastAPI / Next.js 15 / Supabase / pgvector / Celery / Redis / Railway / ElevenLabs

Jebb screenshot

Elevator pitch

My personal AI operating system. A single browser-based dashboard with eleven floating widgets (chat, notes with wiki-links, knowledge graph, tasks, calendar, health, finance, memory, briefing, documents, settings) sharing a common backend, a voice pipeline with barge-in, and cross-session memory. I use it daily. On builtbyaryan.dev, a portfolio edition of Jebb serves as the concierge that answers recruiter questions about my work.

The problem

Every "personal productivity" tool solves one slice (notes, or tasks, or calendar) and expects you to context-switch. That's the wrong model for how I actually think. My notes reference my tasks, my calendar drives my briefings, my health data belongs next to my finance data because both track slow trends. I wanted one dashboard that respects the connections between these things and lets an AI reason across them.

The approach

Modular widget architecture over a shared FastAPI backend, so each widget evolves independently but they all read and write to the same knowledge substrate. Everything is cross-linked: notes have Obsidian-style [[wiki-links]] that resolve to entities, entities appear as nodes in a knowledge graph, tasks reference notes, briefings pull from calendar and tasks and notes. Voice pipeline layers over the whole system so I can talk to any widget without touching the mouse.

Technical architecture

  • Backend: FastAPI on Railway (Singapore region for latency)
  • Frontend: Next.js 15 App Router. Custom floating widget system with drag-resize-close. Ten visual themes, some of which change the underlying layout
  • Database: Supabase (Postgres with pgvector for semantic memory, plus auth and storage)
  • Background jobs: Celery + Redis for scheduled tasks, briefing generation, re-embedding
  • Voice pipeline: Custom state machine (IDLE, LISTENING, PROCESSING, SPEAKING) with barge-in support. ElevenLabs sentence-streamed TTS so playback starts before the full response finishes generating
  • Memory: pgvector-backed cross-session memory. Jebb remembers what I told it last week
  • Responsive: Full-screen panels on mobile, floating on desktop

Key decisions and why

  • Own the whole stack. I have opinions about how personal AI should work; existing tools don't share them. Building lets me change any layer without asking permission
  • Knowledge graph as a projection, not a source of truth. Graph edges are generated from database relations, not parsed from markdown. The graph is a view; the database is the source
  • Wiki-links resolved from DB edges. Cleaner than parsing markdown. Notes and graph always agree because they read from the same place
  • State machine for voice. Voice UX is a real interaction pattern with real states. Modeling it as a state machine catches edge cases (user speaks before TTS finishes) at design time, not in production

Known issues (honest)

  • Reminder timezone bug: UTC vs Sydney time offset, needs a proper fix rather than the hacky workaround currently in place
  • Widget pop-out feels disconnected from the main dashboard. Planned fix: strip browser chrome via window.open() features string, use getScreenDetails() for multi-monitor placement

Portfolio edition

On builtbyaryan.dev, a stripped-down instance of Jebb serves as the concierge. Same backend architecture, but the knowledge store contains only my portfolio content: project deep-dives, resume, research direction, "what I'm looking for." Rate-limited by IP, prompt-injection defended, monochrome answers in a specific voice (direct, honest, no oversell). Every recruiter question is logged for review.

The production Jebb (with my personal data) and the portfolio Jebb are entirely separate services. Never the same instance, never sharing a database, never sharing an endpoint.

Next

Few-Shot Adaptation of CLIP (Capstone) →