{"id":1146,"date":"2025-12-31T19:02:46","date_gmt":"2026-01-01T03:02:46","guid":{"rendered":"https:\/\/marcusvorwaller.com\/blog\/?p=1146"},"modified":"2025-12-31T19:02:46","modified_gmt":"2026-01-01T03:02:46","slug":"2025-in-code","status":"publish","type":"post","link":"https:\/\/marcusvorwaller.com\/blog\/2025\/12\/31\/2025-in-code\/","title":{"rendered":"2025 in Code"},"content":{"rendered":"\n<p>This year was the year I rediscovered how much I love to code. At the beginning of the year AI coding assistants were good enough to help overcome all the annoying hurdles of getting a new project going and were good enough at writing small chunks of code that I could bring ideas to life without having to spend much time studying syntax. By the end of the year, with Claude Opus 4.5, it&#8217;s good enough to write entire features in one go.<\/p>\n\n\n\n<p>I&#8217;ve always had lots of ideas for projects, this was the year of building them. It was the most fun I&#8217;ve ever had on a computer. <\/p>\n\n\n\n<p>What follows is a tour through some of the projects that emerged from this year-long experiment in human-AI programming. Some are polished. Some are prototypes, and these are just the ones I wrote for myself. Missing are all the projects I wrote at work to make my management job more efficient and many, many small tools or one-offs that weren&#8217;t big enough to mention here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Highlights<\/h3>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marcus\/sidecar\">Sidecar<\/a><\/strong>&nbsp;is the project I&#8217;m most excited about right now. It&#8217;s a terminal UI that gives developers unified visibility into their AI coding sessions\u2014monitoring Claude Code conversations, git status, task progress, and project files without leaving the terminal. Built in Go with the Charmbracelet stack (bubbletea, lipgloss, bubbles), it&#8217;s designed for developers who live in the terminal and want to avoid context-switching to web browsers.<\/p>\n\n\n\n<p><em>Go | Charmbracelet | SQLite | fsnotify<\/em><\/p>\n\n\n\n<p>The architecture uses a plugin-based system with inter-plugin communication via tea.Msg broadcasts. Four core plugins: Git Status with side-by-side diffs, a Conversations browser for Claude Code sessions, a TD Monitor for task management, and a File Browser with syntax highlighting. Mouse support throughout. Still in alpha, but fully functional.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"580\" height=\"439\" src=\"https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?resize=580%2C439&#038;ssl=1\" alt=\"\" class=\"wp-image-1147\" srcset=\"https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?w=1978&amp;ssl=1 1978w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?resize=530%2C401&amp;ssl=1 530w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?resize=768%2C582&amp;ssl=1 768w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?resize=1536%2C1163&amp;ssl=1 1536w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?resize=1200%2C909&amp;ssl=1 1200w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-8.png?w=1740&amp;ssl=1 1740w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/figure>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marcus\/td\">todo<\/a><\/strong>&nbsp;is a task manager built for AI agents. The problem: agents forget everything between sessions. Context window amnesia. The next session starts from scratch, leading to redundant work and confusion about what&#8217;s done. todo provides structured handoffs\u2014capturing working state so new context windows can resume where previous ones stopped.<\/p>\n\n\n\n<p><em>Go | SQLite | Cobra | Charmbracelet<\/em><\/p>\n\n\n\n<p>Agents get a CLI optimized for their workflow: create issues, log progress, submit for review, hand off state. Humans get a live TUI monitor to observe agent activity across sessions. Session isolation ensures the agent that writes code can&#8217;t approve it\u2014a different session must review. Run&nbsp;<code>td usage<\/code>&nbsp;and the agent gets everything it needs: current focus, pending reviews, open issues, recent decisions.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"580\" height=\"438\" src=\"https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?resize=580%2C438&#038;ssl=1\" alt=\"\" class=\"wp-image-1148\" srcset=\"https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?w=1974&amp;ssl=1 1974w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?resize=530%2C401&amp;ssl=1 530w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?resize=768%2C580&amp;ssl=1 768w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?resize=1536%2C1161&amp;ssl=1 1536w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?resize=1200%2C907&amp;ssl=1 1200w, https:\/\/i0.wp.com\/marcusvorwaller.com\/blog\/images\/image-9.png?w=1740&amp;ssl=1 1740w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Creative Tools<\/h3>\n\n\n\n<p><strong>Melville<\/strong>&nbsp;is a multi-agent orchestration system for autonomous novel writing. It&#8217;s not a prompt chain\u2014it&#8217;s production infrastructure for agentic work. Specialized AI agents (author, developmental editor, copy editor, researcher) work in coordinated stages to produce complete manuscripts. The system has successfully generated 16 complete published novels across diverse genres: science fiction, literary fiction, romantasy, thriller, horror, even middle-grade adventures.<\/p>\n\n\n\n<p><em>Python | SQLite | Claude API | React | Prisma<\/em><\/p>\n\n\n\n<p>Durable execution ensures no work is lost on failures. Task dependencies enforce narrative coherence. The filesystem serves as long-term memory, allowing the orchestrator to operate without holding entire books in context.<\/p>\n\n\n\n<p><strong>Endless2<\/strong>&nbsp;generates infinite AI conversations with progressive summarization. Jerry and George discussing philosophy, indefinitely, with streaming output and rate control that emulates audiobook pacing. As dialogue accumulates, older exchanges are compressed, allowing the conversation to continue forever while maintaining coherent character voices.<\/p>\n\n\n\n<p><em>Python | LiteLLM | FastAPI | SQLite | Peewee<\/em><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marcus\/good-composer\">Good Composer<\/a><\/strong>&nbsp;and&nbsp;<strong><a href=\"https:\/\/github.com\/marcus\/good-drawer\">Good Drawer<\/a><\/strong>&nbsp;are real-time AI generation tools. Type a description and watch as AI composes music\u2014every note plays as it arrives, visualized on an interactive piano roll. Or watch AI draw artwork live on your canvas using SVG paths, with smooth marker animation. Both stream content chunk-by-chunk, enabling progressive rendering rather than waiting for complete generation.<\/p>\n\n\n\n<p><em>Python | FastAPI | WebSockets | Tone.js | SVG<\/em><\/p>\n\n\n\n<p><strong>Meditation Generator<\/strong>&nbsp;creates guided meditations from scratch: AI-written scripts with intelligent pause placement, high-quality audio narration via OpenAI or ElevenLabs, and professional assembly using forced alignment technology. The forced alignment API extracts precise word-level timestamps from audio, enabling perfect pause placement at natural speech breaks.<\/p>\n\n\n\n<p><em>Python | Flask | OpenAI TTS | ElevenLabs | FFmpeg<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Applications<\/h3>\n\n\n\n<p><strong>Muse<\/strong>\u00a0is a complete ecosystem for distraction-free writing. A native desktop Mac app (Tauri + React) with automatic versioning and timeline navigation, backed by a self-hosted sync server written in Rust. Every keystroke gets captured; scrub through writing iterations like video playback. Local-first with optional cloud synchronization.<\/p>\n\n\n\n<p><em>Tauri | React | Rust | Axum | SQLite<\/em><\/p>\n\n\n\n<p><strong>Bookmarx<\/strong>&nbsp;(<a href=\"https:\/\/www.tumblelog.com\/\">tumblelog.com<\/a>) is an AI-enhanced bookmark manager. Save a link, and AI automatically generates descriptions, suggests tags, and recommends related content\u2014all happening in the background without blocking your workflow. Rails 8 with Hotwire for real-time UI updates, RubyLLM for multi-provider AI support.<\/p>\n\n\n\n<p><em>Ruby on Rails 8 | Hotwire | SQLite | RubyLLM | Tailwind<\/em><\/p>\n\n\n\n<p><strong>Eventalicious and Promptalicious<\/strong>&nbsp;(<a href=\"https:\/\/www.maqx.com\/\">maqx.com<\/a>) is an AI-powered multi-agent system that automatically discovers, scrapes, categorizes, and persists events from web sources. CrewAI orchestrates specialized AI agents that work together to find events, extract details, classify them, and store them. Patchright provides stealth web scraping with bot-detection evasion.<\/p>\n\n\n\n<p><em>Python | CrewAI | Playwright | Peewee | SQLite<\/em><\/p>\n\n\n\n<p><strong>Nevermore<\/strong>&nbsp;is a full-stack personal budgeting application with smart CSV import. The trick: AI-powered column mapping that automatically detects how your bank formats exports. Rails 8 API with React 19 frontend, WebSocket updates for import progress, and support for investment tracking with symbol and share data.<\/p>\n\n\n\n<p><em>Rails 8 | React 19 | Zustand | SQLite | ActionCable<\/em><\/p>\n\n\n\n<p><strong>Marcus.Pictures<\/strong>&nbsp;is my personal photo gallery with AI-powered automation. Images automatically gain captions, titles, and metadata extraction. The admin interface is specifically designed for rapid image curation\u2014Y\/N shortcuts with auto-advance every 12 seconds. Three-level hierarchy (Galleries ? Groups ? Images) with multiple layout options including masonry and slideshow.<\/p>\n\n\n\n<p><em>Flask | Peewee | Huey | OpenAI | Pillow<\/em><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marcus\/inquiry\">Inquiry<\/a><\/strong>&nbsp;brings Byron Katie&#8217;s method of self-inquiry into the digital age. A SvelteKit application that guides users through the four questions and turnarounds, with AI-powered suggestions for deeper exploration. The UI embodies a contemplative aesthetic\u2014minimalist, centered, serene.<\/p>\n\n\n\n<p><em>SvelteKit | Tailwind | Drizzle | SQLite | OpenAI<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hardware Projects<\/h3>\n\n\n\n<p><strong>Slinky<\/strong>&nbsp;is a smart content system for e-ink displays. Rotates conversation-starting content every 30 minutes across multiple sources: personal photos, curated quotes, AI-generated artwork (via Claude + Google Gemini), Hacker News headlines, weather, poetry. Includes presence detection (auto-pauses when your iPhone leaves the network), quiet hours, and weighted random selection with content cooldowns. The AI image generation supports character consistency with seed images across generations.<\/p>\n\n\n\n<p><em>Python | SQLite | Flask | Inky | Claude | Gemini<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Games<\/h3>\n\n\n\n<p><strong><a href=\"https:\/\/github.com\/marcus\/programaxis\">Programaxis<\/a><\/strong>&nbsp;is a futuristic coding-themed idle game. Build features, ship builds, grow revenue. Automate software development workflows, manage technical debt, balance code quality, and scale through a tech tree with 40+ upgrades across 8 specialized branches. Three.js powers GPU-accelerated particle effects with a cyberpunk Tron aesthetic.<\/p>\n\n\n\n<p><em>React | TypeScript | Three.js | D3.js | Zustand<\/em><\/p>\n\n\n\n<p><strong>Smile<\/strong>&nbsp;is a fast-paced endless runner featuring a rolling smiley emoji navigating a procedurally generated ASCII world. One-button gameplay with coyote time, jump buffering, and progressive difficulty. PixiJS for WebGL rendering, seeded random generation for reproducible maps.<\/p>\n\n\n\n<p><em>TypeScript | PixiJS | Vite | Web Audio API<\/em><\/p>\n\n\n\n<p><strong>Sneaky Squirrel<\/strong>&nbsp;is an iOS game where you control a squirrel bouncing between nets while dodging horizontally-crossing bees. Tap to flip direction, earn points on bounces, avoid the bees. Progressive difficulty ramps as your score climbs. Built with SpriteKit targeting 120fps on ProMotion devices, with haptic feedback and generated sound effects.<\/p>\n\n\n\n<p><em>Swift | SpriteKit | SwiftUI | Core Haptics<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">And More<\/h3>\n\n\n\n<p><strong>Talking<\/strong>&nbsp;is a modern web interface for streaming AI conversations from the endless2 API. Terminal-style UI with word-by-word animation, adjustable playback rates, and comprehensive resource management. React 19 with Zustand, designed with a split-flap aesthetic.<\/p>\n\n\n\n<p><strong>Our Year Wrapped<\/strong>&nbsp;is a Spotify Wrapped-style website celebrating a relationship, built from iMessage conversation data. Transforms raw messaging history into data visualizations and personal narratives\u2014emoji analysis, word clouds, trip timelines, monthly highlights.<\/p>\n\n\n\n<p>For just-for-fun projects, there&#8217;s&nbsp;<strong>Dogvertize<\/strong>&nbsp;(<a href=\"https:\/\/www.dogvertize.com\/\">dogvertize.com<\/a>)\u2014best experienced rather than explained.<\/p>\n\n\n\n<p>Smaller experiments live at&nbsp;<a href=\"https:\/\/www.opentangle.com\/\">opentangle.com<\/a>: 3D visualizations (Necker Cube, Rabbit Hole tunnel), a Kufic calligraphy maze generator, a rainbow text creator, and a poetic presentation of Hsin Hsin Ming.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What I Learned<\/h3>\n\n\n\n<p>The tools changed more than my productivity, they changed what I considered possible to build alone. A native desktop app with cloud sync? A multi-agent novel-writing system? A real-time music composer? These would have been months of work before and, knowing that, I just wouldn&#8217;t have started them. I cannot wait to see what the years ahead hold. <\/p>\n\n\n\n<p>We&#8217;re still early. The collaboration patterns are crude. The context window amnesia is real (hence td). But watching an AI draw music note by note while I adjust the tempo\u2014that&#8217;s a different relationship with code than I&#8217;ve had before. More improvisational. More playful.<\/p>\n\n\n\n<p>Here&#8217;s to more experiments in 2026.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This year was the year I rediscovered how much I love to code. At the beginning of the year AI coding assistants were good enough to help overcome all the annoying hurdles of getting a new project going and were good enough at writing small chunks of code that I could bring ideas to life [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9],"tags":[],"class_list":["post-1146","post","type-post","status-publish","format-standard","hentry","category-etc"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/ppj2P-iu","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/posts\/1146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/comments?post=1146"}],"version-history":[{"count":1,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/posts\/1146\/revisions"}],"predecessor-version":[{"id":1151,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/posts\/1146\/revisions\/1151"}],"wp:attachment":[{"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/media?parent=1146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/categories?post=1146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcusvorwaller.com\/blog\/wp-json\/wp\/v2\/tags?post=1146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}