← Back to work
Live

Silvio OS

A personal operating system running 24/7 on a VPS. It captures knowledge, enriches with AI, answers questions via RAG, generates daily intelligence briefs, and tracks commitments. One Telegram chat runs the whole thing.

The Problem

Capturing information is effortless. Processing it is not. I was saving articles, notes, ideas, and tasks across half a dozen tools, but nothing connected them. Knowledge saved was knowledge lost. Commitments fell through cracks because no system tracked them proactively. And the work of organizing, tagging, and surfacing insights was always manual.

I wanted to invert the traditional PKM labor model: AI handles the processing, I handle the judgment. One interface, always on, that turns raw captures into actionable intelligence without me having to think about filing, tagging, or scheduling.

Architecture

A single FastAPI process runs on a VPS as a systemd service. Telegram is the universal interface: text, URLs, voice notes, and images all flow in through one chat. Gemini handles the intelligence layer. Two SQLite databases separate concerns: gateway (commitments, routing, scheduling) and knowledge (notes, embeddings, enrichment logs).

Telegram (You)
    ↓
FastAPI Gateway (webhook / polling)
    ├── Message Router → classifies intent
    ├── APScheduler → 10+ cron jobs
    │
    ├── Knowledge System
    │   ├── Capture → vault/inbox/
    │   ├── Enrich (every 5 min) → tag, classify, link
    │   ├── Index (every 6 min) → vector embeddings
    │   └── Retrieve → /ask RAG pipeline
    │
    ├── Commitments Tracker
    │   └── Tasks, shopping, errands with reminders
    │
    ├── Career Integration (read-only)
    │   └── Pipeline status from CareerOS
    │
    └── Briefs Engine
        ├── Daily (7 AM) → captures, commitments, serendipity
        └── Weekly (Sunday 8 AM) → patterns, drift, analytics

Key Decisions

3-tier model routing

Not every task needs the same model. Message classification uses the cheapest tier, enrichment uses mid-range, and complex synthesis (weekly reviews, digital twin queries) uses the most capable model. This keeps monthly costs under $5 while maintaining quality where it matters.

Controlled taxonomy over free tagging

The enrichment pipeline classifies notes into a fixed taxonomy (inbox, references, ideas, actions, archive) and applies structured tags. Free-form tagging creates chaos at scale. A controlled vocabulary means the system can reason about note relationships reliably.

Quality gates on enrichment

Every enrichment pass produces structured YAML output (summary, concepts, classification, relevance, tags, extracted commitments). The system validates the output before applying it. Bad enrichment is worse than no enrichment because it corrupts the knowledge base.

Markdown as source of truth

SQLite indexes the knowledge base, but markdown files in the vault are the source of truth. This means the entire system can be rebuilt from files alone. No database lock-in, no migration headaches, and the vault is readable without any tooling.

What I Built

21+ features

Knowledge, commitments, briefs, career, contacts

10+ scheduled jobs

Enrichment, indexing, briefs, nudges, RSS

Daily intelligence

7 AM brief with captures, tasks, serendipity

RAG retrieval

/ask queries your entire knowledge vault

Career integration

34 applications tracked from CareerOS

MCP server

Claude Code can query the knowledge base

Tech Stack

Core

  • Python 3.12
  • FastAPI
  • SQLite (2 databases)
  • uvicorn

AI / ML

  • Gemini 2.5 Flash
  • 3-tier model routing
  • sqlite-vec (embeddings)
  • RAG pipeline

Interface

  • Telegram Bot API
  • Webhook + polling modes
  • edge-tts

Scheduling

  • APScheduler
  • 10+ cron jobs
  • systemd service

Integrations

  • Google Sheets / Drive / Gmail
  • Jina (tweets)
  • trafilatura (articles)
  • MCP server

What I Learned

The most important feature in Silvio OS isn't RAG or embeddings. It's the daily brief. Everything else is infrastructure to make that 7 AM message useful. When I stopped thinking about "knowledge management" and started thinking about "what do I need to know right now," the architecture simplified dramatically.

I also learned that always-on systems need to be boring. No Docker, no Postgres, no Kubernetes. One Python process, two SQLite files, one systemd service. The system has been running for weeks without intervention because there's nothing fancy to break. Reliability comes from simplicity, not redundancy.