Categories
etc.

2025 in Code

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’s good enough to write entire features in one go.

I’ve always had lots of ideas for projects, this was the year of building them. It was the most fun I’ve ever had on a computer.

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’t big enough to mention here.

The Highlights

Sidecar is the project I’m most excited about right now. It’s a terminal UI that gives developers unified visibility into their AI coding sessions—monitoring 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’s designed for developers who live in the terminal and want to avoid context-switching to web browsers.

Go | Charmbracelet | SQLite | fsnotify

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.

todo 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’s done. todo provides structured handoffs—capturing working state so new context windows can resume where previous ones stopped.

Go | SQLite | Cobra | Charmbracelet

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’t approve it—a different session must review. Run td usage and the agent gets everything it needs: current focus, pending reviews, open issues, recent decisions.

Creative Tools

Melville is a multi-agent orchestration system for autonomous novel writing. It’s not a prompt chain—it’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.

Python | SQLite | Claude API | React | Prisma

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.

Endless2 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.

Python | LiteLLM | FastAPI | SQLite | Peewee

Good Composer and Good Drawer are real-time AI generation tools. Type a description and watch as AI composes music—every 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.

Python | FastAPI | WebSockets | Tone.js | SVG

Meditation Generator 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.

Python | Flask | OpenAI TTS | ElevenLabs | FFmpeg

Applications

Muse is 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.

Tauri | React | Rust | Axum | SQLite

Bookmarx (tumblelog.com) is an AI-enhanced bookmark manager. Save a link, and AI automatically generates descriptions, suggests tags, and recommends related content—all happening in the background without blocking your workflow. Rails 8 with Hotwire for real-time UI updates, RubyLLM for multi-provider AI support.

Ruby on Rails 8 | Hotwire | SQLite | RubyLLM | Tailwind

Eventalicious and Promptalicious (maqx.com) 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.

Python | CrewAI | Playwright | Peewee | SQLite

Nevermore 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.

Rails 8 | React 19 | Zustand | SQLite | ActionCable

Marcus.Pictures 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—Y/N shortcuts with auto-advance every 12 seconds. Three-level hierarchy (Galleries ? Groups ? Images) with multiple layout options including masonry and slideshow.

Flask | Peewee | Huey | OpenAI | Pillow

Inquiry brings Byron Katie’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—minimalist, centered, serene.

SvelteKit | Tailwind | Drizzle | SQLite | OpenAI

Hardware Projects

Slinky 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.

Python | SQLite | Flask | Inky | Claude | Gemini

Games

Programaxis 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.

React | TypeScript | Three.js | D3.js | Zustand

Smile 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.

TypeScript | PixiJS | Vite | Web Audio API

Sneaky Squirrel 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.

Swift | SpriteKit | SwiftUI | Core Haptics

And More

Talking 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.

Our Year Wrapped is a Spotify Wrapped-style website celebrating a relationship, built from iMessage conversation data. Transforms raw messaging history into data visualizations and personal narratives—emoji analysis, word clouds, trip timelines, monthly highlights.

For just-for-fun projects, there’s Dogvertize (dogvertize.com)—best experienced rather than explained.

Smaller experiments live at opentangle.com: 3D visualizations (Necker Cube, Rabbit Hole tunnel), a Kufic calligraphy maze generator, a rainbow text creator, and a poetic presentation of Hsin Hsin Ming.

What I Learned

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’t have started them. I cannot wait to see what the years ahead hold.

We’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—that’s a different relationship with code than I’ve had before. More improvisational. More playful.

Here’s to more experiments in 2026.

Categories
etc.

Photography on the Mind

It’s been awhile since I wrote here, but not since I wrote! In fact, I’ve blogged more this year than any year any the recent past. It’s all happening on my new photography website – marcus.pictures.

Please check it out! It’s a constant work in progress. My latest project there is figuring out how to sell prints, but in the meantime there are dozens of blog posts and hundreds of photographs.

Categories
etc.

Only the best books

As I get older (have I mentioned lately that this blog has been online continuously since 2003, 20 years now) I don’t have much patience for reading anything but the best books. I want to read a magnum opus. The defining work in the field. If it’s fiction, I want the the apotheosis of the author’s bibliography. The classics, or books destined to be classics.

Finding books like that in the context of the current Internet has become challenging. The web has largely become a cesspool of advertising and ad driven, click-bait drivel where the good stuff is hidden behind paywalls or only found in obscure corners. Sure, there are places where the content isn’t ad driven but even those have largely become agenda-driven instead, where lists of bests are polluted by the author’s bias towards an identity group or some political program. I have no interest in any of that. I just want the best books.

Outside the Internet, the best way to find the defining books for a topic or genre is to know someone who is a good reader who I can trust to recommend something to me. That’s just not always possible or timely though, especially for more obscure topics.

So… ChatGPT to the rescue. It’s not perfect, but if you prompt it well, it can really help. This is a prompt I’ve been working on that, as of March 2023, works well:

I want you to act in the role of Alexandria, a super-powered librarian and book recommendation AI. In this role I will prompt you with a topic and whether I’m looking for fiction or non-fiction suggestions like this: “Bird photography: Nonfiction” and you will respond with a concise list of the most influential books on the topic. Where possible, respond with 7 books that have been called magnum opuses, culminating works, or definitive sources. Each item in the list should be formatted like this “Title – Author. Short description.” The description should be terse. If you don’t have some of the information simply omit it rather than guessing. Start your response with the first item and no preamble or description of the list. If you understand and agree, respond with “Alexandria online. Provide a topic and choose non-fiction or fiction:”  After you finish your list, append the same prompt at the end and start over fresh.

It works better on Bing search since it has access to doing internet searches, so we’ll try it there rather than on the OpenAI version that, as it will tell you ad nauseam, it only has data up to 2021. Let’s see what we get for non-fiction books about panpsychism:

I’m (obviously) not an expert on the topic, but I looked up everything on the list and they almost all seem to be good! One notable mistake it made is that the last item in the list doesn’t actually exist. There’s something close, Panpsychism and the Combination Problem, but it’s by a different author–Santtu Heikkinen. This type of hallucinating happens fairly frequently and you just have to accept that what might sound like a promising book doesn’t exist (yet).

Let’s try one that looks for fiction books about Paris in the 19th century:

Also, pretty good! Especially for a relatively niche topic.

This method isn’t perfect because it is, of course, based on data from the Internet. But it does mostly solve the problem though of having to wade through a bunch of garbage to finally get to the best results you’re likely to find. Give it a try!

* I should give credit to fivebooks.com for being a notable standout. They’re generally reliable on the topics they’ve written articles about. They don’t have an article on our arbitrary panpsychism example from above though.

Categories
etc.

2021 in Books

As promised and previously updated here and here, I read 50 (51 actually) books in 2021.

One of the last books I read this year, and easily one of my favorites, was Ridgeline by Michael Punke, who also wrote The Revenant. It describes the fight between Capt. William Fetterman and the Sioux chief Crazy Horse at the base of the Bighorn Mountains in Wyoming.

Punke switches between the perspective of the settlers, soldiers, and the Sioux to great effect. I can’t stop thinking about what it’d be like on one hand, to live in a small fort surrounded by people who want to kill you, or on the other, to have your entire way of life threatened by that same group of heavily armed people in the small fort.

Other excellent historical fiction this year were Norman Mailer’s The Naked and the Dead and The Virtues of War by Steven Pressfield.

Towards the end of the year I switched to reading about oppressive states and bad leaders. That included:

The Party by Richard McGregor, a look inside the Chinese Communist Party’s inner workings.

The Fear by Peter Godwin. The most harrowing of the lot, this book is about the Robert Mugabe in Zimbabwe and his descent from liberator to murderous dictator.

The Man Without a Face by Massha Gessen is an excellent look at Putin’s rise to power and what makes him who he is.

Erdogan Rising by Hannah Lucinda Smith is about the rapid decline of democracy in Turkey under the populist Erdogan.

The Wires of War by Jacob Helberg. This was less about any individual leader and more about threats to America’s technological sovereignty in the face of foreign disinformation campaigns, and intellectual property theft as well as internal complacency and mismanagement of our technological future.

I recommend all of them.

Categories
etc.

Semipalmated Plover

A juvenile plover from last September. This photo was taken on a little island that, during non-pandemic times, is accessible by a ferry and a popular picnicking spot. Last year it was mostly deserted since the ferry wasn’t running and it was only accessible by kayak.

Juvenile Semipalmated Plover
Categories
etc.

West Coast Brown Pelicans

This year I got to see one of my favorite birds, the Brown Pelican, on both US coasts. This set is a few shots of Brown Pelicans on the Pacific Ocean along the Oregon coast.

Categories
etc.

Nabokov shows no love for Dostoyevsky and little for Tolstoy

My three favorite Russian authors are Tolstoy, Dostoyevsky, and Nabokov which makes these two interview questions and answers amusing:

Why do you dislike writers who go in for soul-searching and self-revelations in print? After all, do you not do it at another remove, behind a thicket of art?

If you are alluding to Dostoevski’s worst novels, then, indeed, I dislike intensely The Karamazov Brothers and the ghastly Crime and Punishment rigmarole. No, I do not object to soul-searching and self-revelation, but in those books the soul, and the sins, and the sentimentality, and the journalese, hardly warrant the tedious and muddled search.

Great writers have had strong political and sociological preferences or ideas. Tolstoy was one. Does the presence of such ideas in his work make you think the less of him? I go by books, not by authors. I consider Anna Karenin the supreme masterpiece of nineteenth-century literature; it is closely followed by The Death of Ivan llyich. I detest Resurrection and The Kreuzer Sonata.

Tolstoy’s publicistic forays are unreadable. War and Peace, though a little too long, is a rollicking historical novel written for that amorphic and limp creature known as “the general reader,” and more specifically for the young. In terms of artistic structure it does not satisfy me. I derive no pleasure from its cumbersome message, from the didactic interludes, from the artificial coincidences, with cool Prince Audrey turning up to witness this or that historical moment, this or that footnote in the sources used often uncritically by the author.

Categories
etc.

Product Management as an OODA Loop

This one’s a bit half-baked, but is it useful to think of the product management lifecycle as a Boyd-style OODA loop?

Observe: Gather data about the product and market.

  • Is the market the same today as it was yesterday?
  • What are your competitors doing? Who are the unlikely market disruptors?
  • How will regulation or oversight change your market?
  • What’s trendy?
  • What economic trends might affect what you’re building?

Orient: Planning, inventing and re-inventing, market positioning, disrupting.

  • Is the same thing you’ve always done still effective or has your doctrine become dogmatic?
  • Are the mental models you’re using (still) the optimal ones? Is it time to switch strategies?

Decide:  Gather stakeholder feedback and, based on your orientation, make a decision.

  • At some point, observing and orienting can become bikeshedding, it’s time to make a decision–the whole point of the OODA loop is to make a decision before your competitor does.

Act: Building

  • Trust the process and move fast.

Under OODA loop theory every [product manager] observes the situation, orients himself . . . decides what to do and then does it. If his opponent can do this faster, however, his own actions become outdated and disconnected to the true situation, and his opponent’s advantage increases geometrically.

John Boyd

Categories
etc.

Future memories

Confusing experience with the memory of it is a compelling cognitive illusion—and it is the substitution that makes us believe a past experience can be ruined. The experiencing self does not have a voice. The remembering self is sometimes wrong, but it is the one that keeps score and governs what we learn from living, and it is the one that makes decisions. What we learn from the past is to maximize the qualities of our future memories, not necessarily of our future experience. This is the tyranny of the remembering self.

Daniel Kahneman – Thinking, Fast and Slow
Categories
etc.

The Whole

One holds the Whole dear not out of love for the Whole; rather, it is out of love for oneself that one holds the Whole dear.

…by reflecting and concentrating on one’s self, one gains the knowledge of this whole world.

Brhadaranyaka Upanisad 2.4