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, please consider sponsoring.
Off we go…
Launched a new blogging service
For 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 tweeting
Sure, 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 Japanese
As 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 Kana


A 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 updates
- agent-shell 0.17 improvements + MELPA
- agent-shell 0.5 improvements
- Introducing Emacs agent-shell (powered by ACP)
- Introducing acp.el
- So you want ACP (Agent Client Protocol) for Emacs?
chatgpt-shell improvements
While 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 channel
While 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 8: completing-read
- Bending Emacs - Episode 7: Eshell built-in commands
- Bending Emacs - Episode 6: Overlays
- Bending Emacs - Episode 5: Ready Player Mode
- Bending Emacs - Episode 4: Batch renaming files
- Bending Emacs - Episode 3: Git clone (the lazy way)
- Bending Emacs - Episode 2: From vanilla to your flavor
- Bending Emacs - Episode 1: Applying CLI utils
Enjoying 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 macOS
While migrating workflows to Emacs makes them extra portable across platforms, I've also accumulated a bunch of tweaks enhancing your Emacs experience on macOS.
![]()
EverTime for macOS
While we're talking macOS, I typically like my desktop free from distractions, which includes hiding the status bar.
Having said that, I don't want to lose track of time, and for that, I built EverTime, an ever-present floating clock (available via Homebrew).

A new time zone Emacs package
Emacs 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:
A new WhatsApp Emacs client
For 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 wasabi, 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.


Details covered in a couple of posts:
Spiff that shell up
While 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.

At one with your code
I always liked the idea of generating some sort of art or graphics from a code base, so I built one, a utility to transform images into character art using text from your codebase. Also covered in a short blog post.
Emacs can trim your videos too
Emacs 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 upstream
While 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 improvements
Ready 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 activity
- Commits: 1,095
- Issues created: 37
- PRs reviewed: 106
- Average commits per day: ~3
New GitHub projects
- EverTime - An ever present clock for macOS
- acp.el - An ACP implementation in Emacs lisp
- agent-shell - A native Emacs buffer to interact with LLM agents powered by ACP
- diverted - Identify temporary Emacs diversions and return to original location
- emacs-materialized-theme - An Emacs theme derived from Material
- homebrew-evertime - EverTime formula for the Homebrew package manager
- homebrew-one - Homebrew recipe for one
- homebrew-rinku - Homebrew recipe for rinku
- one - Transform images into character art using text from your codebase
- rinku - Generate link previews from the command line (macOS)
- time-zones - View time at any city across the world in Emacs
- video-trimmer - A video-trimming utility for Emacs
- wasabi - A WhatsApp Emacs client powered by wuzapi and whatsmeow
Blog posts
- Journelly 1.3 released: Hello Markdown!
- agent-shell 0.25 updates
- Bending Emacs - Episode 8: completing-read
- At one with your code
- Bending Emacs - Episode 7: Eshell built-in commands
- Rinku: CLI link previews
- Bending Emacs - Episode 6: Overlays
- WhatsApp from you know where
- Want a WhatsApp Emacs client? Will you fund it?
- Bending Emacs - Episode 5: Ready Player Mode
- agent-shell 0.17 improvements + MELPA
- time-zones now on MELPA. Do I have your support?
- Bending Emacs - Episode 4: Batch renaming files
- Emacs time-zones
- Bending Emacs - Episode 3: Git clone (the lazy way)
- agent-shell 0.5 improvements
- Bending Emacs - Episode 2: From vanilla to your flavor
- Bending Emacs - Episode 1: Applying CLI utils
- Introducing Emacs agent-shell (powered by ACP)
- Introducing acp.el
- So you want ACP (Agent Client Protocol) for Emacs?
- Diverted mode
- Who moved my text?
- Dired buffers with media overlays
- Brisket recipe
- A tiny upgrade to the LLM model picker
- Emacs elevator pitch
- Emacs as your video-trimming tool
- macOS dictation returns to Emacs (fix merged)
- Writing experience: My decade with Org
- Interactive ordering of dired items
- Patching your Homebrew's Emacs Plus (macOS)
- Emacs send-to (aka macOS sharing) merged upstream
- Mochi Invaders now on the App Store
- Markdown is coming to Journelly
- EverTime available via Homebrew
- Journelly 1.2 released
- Ranking Officer now on the App Store
- Awesome Emacs on macOS
- Journelly 1.1 released
- LLM text chat is everywhere. Who's optimizing its UX?
- A richer Journelly org capture template
- Journelly: like tweeting but for your eyes only (in plain text)
- Journelly vs Emacs: Why Not Both?
- The Mac Observer showcases Journelly
- Journelly open for beta
- DeepSeek, Open Router, Kagi, and Perplexity join the chat
- Keychron K3 Pro: F1-F12 as default macOS keys
- E-ink bookmarks
- Sourdough bookmarks
- Cardamom Buns recipe
- A tour of Ready Player Mode
- A platform that moulds to your needs
- Blogging minus the yucky bits of the modern web
Hope you enjoyed my 2025 contributions. Sponsor the work.
powered by LMNO.lol