In 2024, I took the leap to go indie full-time. By 2025, that shift enabled me to focus exclusively on building tools I care about, from a blogging platform, iOS apps, and macOS utilities, to Emacs packages. It also gave me the space to write regularly, covering topics like Emacs tips, development tutorials for macOS and iOS, a few cooking detours, and even launching a new YouTube channel.The rest of this post walks through some of the highlights from 2025. If you’ve found my work useful, consider sponsoring. Now let’s jump in.Launched a new blogging serviceFor well over a decade, my blogging setup consisted of a handful of Elisp functions cobbled together over the years. While they did the job just fine, I couldn't shake the feeling that I could do better, and maybe even offer a blogging platform without the yucky bits of the modern web. At the beginning of the year, I launched LMNO.lol. Today, my xenodium.com blog proudly runs on LMNO.lol.LMNO.lol blogs render pretty much anywhere (Emacs and terminals included, of course).2026 is a great year to start a blog! Custom domains totally welcome.A journaling/note-taking app that feels like tweetingSure, there are plenty of journaling and note-taking apps out there. For one reason or another, none of them stuck for me (including my own apps). That is, until I learned a thing or two from social media.With that in mind, Journelly was born: like tweeting, but for your eyes only. With the right user experience, I felt compelled to write things down all the time. Saving to Markdown and Org markup was the mighty sweet cherry on the cake.Let's learn JapaneseAs a Japanese language learning noob, what better way to procrastinate than by building yet another Kana-practicing iOS app? Turns out, it kinda did the job.Here's mochi invaders, a fun way to practice your KanaA new Emacs-native AI/LLM agent (powered by ACP)2025 brought us the likes of Claude Code, Gemini CLI, Goose, Codex, and many more AI/LLM CLI agents. While CLI utilities have their appeal, I wanted a native Emacs integration, so I simply ignored agents for quite some time.I was initially tempted to write my own Emacs agent, but ultimately decided against it. My hope was that agent providers would somehow converge to offer editor integration, so I could focus on building an Emacs integration while leveraging the solid work from many teams producing agents. With LLM APIs historically fragmented, my hope for agent convergence seemed fairly far-fetched.To my surprise, ACP (Agent Client Protocol) was announced by Zed and Google folks. This was the cue I had been waiting for, so I set out to build acp.el, a UX agnostic elisp library, followed by an actual client: agent-shell.I'm fairly happy with how agent-shell's been shaping up. This is my most popular package from 2025, receiving lots of user feedback. If you're curious about the feature-set, I've written about agent-shell's progress from early on:agent-shell 0.25 updatesagent-shell 0.17 improvements + MELPAagent-shell 0.5 improvementsIntroducing Emacs agent-shell (powered by ACP)Introducing acp.elSo you want ACP (Agent Client Protocol) for Emacs?chatgpt-shell improvementsWhile agent-shell is the new kid on the block, chatgpt-shell received DeepSeek, Open Router, Kagi, and Perplexity support, in addition to a handful of other improvements and bugfixes.A new YouTube channelWhile most of what I share usually ends up as a blog post, this year I decided to try something new. I started the Bending Emacs YouTube channel and posted 8 episodes:Bending Emacs - Episode 1: Applying CLI utilsBending Emacs - Episode 2: From vanilla to your flavorBending Emacs - Episode 3: Git clone (the lazy way)Bending Emacs - Episode 4: Batch renaming filesBending Emacs - Episode 5: Ready Player ModeBending Emacs - Episode 6: OverlaysBending Emacs - Episode 7: Eshell built-in commandsBending Emacs - Episode 8: completing-readEnjoying the content? Leave me a comment or subscribe to my channel.My decade with org (Emacs Carnival)While I enthusiastically joined the Emacs Carnival, I didn't quite manage monthly posts. Having said that, when I did participate, I went all in, documenting my org experience over the last decade. Ok well… I also joined in with my elevator pitch ;)Awesome Emacs on macOSWhile migrating workflows to Emacs makes them extra portable across platforms, I've also accumulated a bunch of tweaks enhancing your Emacs experience on macOS.A new time zone Emacs packageEmacs ships with a perfectly functional world clock, available via M-x world-clock, but I wanted a little more, so I built time-zones.Also covered in:time-zones now on MELPA. Do I have your support?Emacs time-zonesA new WhatsApp Emacs clientFor better or worse, I rely on WhatsApp Messenger. Migrating to a different client or protocol just isn't viable for me, so I did the next best thing and built an Emacs client.While not a trivial task, wuzapi and whatsmeow offered a huge leg up. I wanted tighter Emacs integration, so I upstreamed a handful of patches to add JSON-RPC support, plus easier macOS installation via Homebrew.WhatsApp from you know whereWant a WhatsApp Emacs client?Spiff that shell upWhile both macOS and iOS offer APIs for generating URL previews, they also let you fetch rich page metadata. I built rinku, a tiny command-line utility, and showed how to wire it all up via eshell for a nifty shell experience.With similar eshell magic, you can also get a neat cat experience.Emacs can trim your videos tooEmacs is just about the perfect porcelain for command-line utilities. With little ceremony, you can integrate almost any CLI tool. Magit remains the gold standard for CLI integration.While trimming videos doesn't typically spring to mind as an Emacs use case, I was pleasantly surprised by the possibilities.Landing Emacs patches upstreamWhile I've built my fair share of Emacs packages, I'm still fairly new at submitting Emacs features upstream. This year, I landed my send-to (aka sharing on macOS) patch. While the proposal did spark quite the discussion, I'm glad I stuck with it. Both Eli and Stefan were amazingly helpful.This year, I also wanted to experiment with dictating into my Emacs text buffers, but unfortunately dictation had regressed in Emacs 30.Bummer. But hey, it gave me a new opportunity to submit another patch upstream.Ready Player improvementsReady Player, my Emacs media-playing package received further improvements like starring media (via Emacs bookmarks), enabling further customizations, and other bug fixes. Also showcased a tour of its features.GitHub activityCommits: 1,095Issues created: 37PRs reviewed: 106Average commits per day: ~3New GitHub projectsEverTime - An ever present clock for macOSacp.el - An ACP implementation in Emacs lispagent-shell - A native Emacs buffer to interact with LLM agents powered by ACPdiverted - Identify temporary Emacs diversions and return to original locationemacs-materialized-theme - An Emacs theme derived from Materialhomebrew-evertime - EverTime formula for the Homebrew package managerhomebrew-one - Homebrew recipe for onehomebrew-rinku - Homebrew recipe for rinkuone - Transform images into character art using text from your codebaserinku - Generate link previews from the command line (macOS)time-zones - View time at any city across the world in Emacsvideo-trimmer - A video-trimming utility for Emacswasabi - A WhatsApp Emacs client powered by wuzapi and whatsmeowBlog postsJournelly 1.3 released: Hello Markdown!agent-shell 0.25 updatesBending Emacs - Episode 8: completing-readAt one with your codeBending Emacs - Episode 7: Eshell built-in commandsRinku: CLI link previewsBending Emacs - Episode 6: OverlaysWhatsApp from you know whereWant a WhatsApp Emacs client? Will you fund it?Bending Emacs - Episode 5: Ready Player Modeagent-shell 0.17 improvements + MELPAtime-zones now on MELPA. Do I have your support?Bending Emacs - Episode 4: Batch renaming filesEmacs time-zonesBending Emacs - Episode 3: Git clone (the lazy way)agent-shell 0.5 improvementsBending Emacs - Episode 2: From vanilla to your flavorBending Emacs - Episode 1: Applying CLI utilsIntroducing Emacs agent-shell (powered by ACP)Introducing acp.elSo you want ACP (Agent Client Protocol) for Emacs?Diverted modeWho moved my text?Dired buffers with media overlaysBrisket recipeA tiny upgrade to the LLM model pickerEmacs elevator pitchEmacs as your video-trimming toolmacOS dictation returns to Emacs (fix merged)Writing experience: My decade with OrgInteractive ordering of dired itemsPatching your Homebrew's Emacs Plus (macOS)Emacs send-to (aka macOS sharing) merged upstreamMochi Invaders now on the App StoreMarkdown is coming to JournellyEverTime available via HomebrewJournelly 1.2 releasedRanking Officer now on the App StoreAwesome Emacs on macOSJournelly 1.1 releasedLLM text chat is everywhere. Who's optimizing its UX?A richer Journelly org capture templateJournelly: like tweeting but for your eyes only (in plain text)Journelly vs Emacs: Why Not Both?The Mac Observer showcases JournellyJournelly open for betaDeepSeek, Open Router, Kagi, and Perplexity join the chatKeychron K3 Pro: F1-F12 as default macOS keysE-ink bookmarksSourdough bookmarksCardamom Buns recipeA tour of Ready Player ModeA platform that moulds to your needsBlogging minus the yucky bits of the modern webHope you enjoyed my 2025 contributions. Sponsor the work.