All projects

Production

AI-Driven Personal Operating System

25 autonomous agents running around the clock against a Johnny Decimal Obsidian vault - CRM, email, job pipeline, calendar, planner, and content publishing

Java 21Spring Boot 3.5Spring AIClaude Haiku / SonnetQuartz SchedulerObsidianJohnny Decimal
AI-Driven Personal Operating System - abstract illustration

What it is

The Obsidian vault is the state store. Every agent reads from it, writes to it, and leaves a cursor behind so the next run picks up where the last one left off. The Spring AI MCP server (a separate project) is the tool layer: 59 tools across 12 functional domains - the vault's filesystem, email (IMAP/SMTP), Git, CalDAV, CardDAV, S3, image generation, and system utilities - exposed over the Model Context Protocol. The Quartz scheduler drives 25 Claude Code agents on crons ranging from every 10 seconds to once a week. The result is a system that manages CRM, email processing, job sourcing, calendar sync, planner management, content publishing, and vault maintenance without me touching it.

Johnny Decimal as the AI's address space

Every folder in the vault has a JD code: W58.01 for CRM contacts, W54.UP.01 through W54.UP.06 for the Upwork proposal pipeline stages, W75.02 for CV materials, and so on. Agents don't guess paths - they navigate the JD tree. This eliminates a category of failure that plagues LLM file operations: hallucinated or inconsistent paths. A weekly index-auditing agent traverses all JD folders and verifies that every subfolder has an up-to-date index note. When something is missing or stale, it repairs it.

CRM and email pipeline

The crm-email-sync agent runs daily against all CRM contacts and leads, fetching new emails via batch tools, appending email notes to the relevant contact files, updating follow-up tickler dates, and advancing a cursor so each run only processes new mail. The linkedin-sync agent processes a LinkedIn connections scrape and imports new connections as CRM leads, building dossier notes. The crm-followup-sync agent runs nightly to compute tickler dates and sync overdue follow-ups to the Today Summary Note. The crm-leads-for-analysis agent runs at 4 AM and scores the lead pipeline.

Upwork job pipeline

A scrape job fires on a schedule through the day, calling a macOS Shortcut that pulls the current Upwork job listing index and writes it as a Markdown file to the inbox. The upwork-job-screener agent picks it up within a minute, reads the Skills and Accomplishments Inventory, and classifies each new job as high, medium, low, or reject - creating a proposal note in the appropriate JD staging folder. The upwork-proposal-writer runs against the high and medium queues and drafts a tailored cover letter. A staleness-check job alerts me if no new scrape files have arrived in 48 hours.

Email inbox and planner

A checker agent fires every 60 seconds and processes incoming email using two agents in sequence: crm-email-sync handles CRM-relevant mail, and planner-email-processor extracts bills, deadlines, and events and writes structured planner notes. A separate command-checker fires every 10 seconds and handles emails addressed to a special run address - these are instructions I send to Claude directly via email, and the agent executes them and replies in-thread. The caldav-sync agent mirrors planner events and bills to CalDAV so they appear in my calendar app.

Content and publishing

The content pipeline agents - blog-post-publisher, news-item-generator, news-item-publisher, social-media-content-generator, and chamber-social-post-generator - read brand voice guidelines from the vault and publish directly to the CMS. The remarkable-page-exporter handles imports from my reMarkable tablet: when a page export arrives via email, it extracts the content and files it into the correct JD location. The today-summary-note-updater consolidates everything into a single daily overview.

Ownership and concurrency

Each vault object type has one agent that owns writes to it. An Agent Ownership Map in the vault documents which agent owns contacts, leads, follow-up notes, planner notes, and the Today Summary. This prevents conflicting writes from two agents that both process email. The Today Summary Note has an explicit concurrent-write rule: any agent that writes to it must re-read from disk immediately before writing, merging its changes into the current on-disk content rather than overwriting a stale copy. Every scheduled run logs its start time, end time, and duration to a JD-addressed log folder.

Stack

Java 21Spring Boot 3.5Spring AIClaude Haiku / SonnetQuartz SchedulerObsidianJohnny Decimal

Want something like this built?

This is the kind of system I build for clients. Tell me what you're trying to do, and I'll give you a straight answer on whether AI is the right tool.

Book a 30-minute call