My projects

Hi, I’m Álvaro 👋. These are my projects. Web lmno.lol - Start your blog here (no ads, tracking, paywalls, or bloat). Powered by a single markdown file. Drag and drop to the web. Bring your domain. My xenodium.com blog is hosted at lmno.lol. iOS Flat Habits Inspired by Ato … | Continue reading


@xenodium.com | 2 days ago

Flat Habits for iOS

Form and track positive lasting habits built with 💙 by me - powered by org 🦄 Why Keeping habits accessible and trackable has helped me form good habits. I built an app to remove friction from the tracking process, so I could increase the likelihood of sticking wit … | Continue reading


@xenodium.com | 6 days ago

Plain Org for iOS

4.7 / 5 ★★★★★ Bring org to your iPhone built with 💙 by me - powered by org 🦄 Why? Org mode on Emacs is wonderful. I'm a big fan and use it regularly on my laptop. As an iPhone user, I wanted quick access to my org files while on the go... so I built Plain Org for … | Continue reading


@xenodium.com | 6 days ago

Journelly vs Emacs: Why Not Both?

JTR recently posted an interesting question in response to Irreal's post wondering why he feels the need to use something that is not Emacs for quick notes? While I'm in no position to speak on behalf of Irreal, I am the Ramírez building this Journelly app he speaks of ;-) From m … | Continue reading


@xenodium.com | 16 days ago

The Mac Observer showcases Journelly

The Mac Observer is showcasing Monday App Finder: Journelly, a Twitter-Like Journal for iOS. Bemfica de Oliva does a wonderful rundown of Journelly's features and capabilities, much better than anything else I've posted before. They even mentioned Org markup and Emacs text editor … | Continue reading


@xenodium.com | 23 days ago

Journelly open for beta

I've reignited Journelly, my note-taking/journaling project. The iOS app is coming along nicely. I've been using Journelly daily. The best I can describe the experience is: "kinda like tweeting but for my eyes only". Journelly automatically includes date and time in your entries. … | Continue reading


@xenodium.com | 1 month ago

DeepSeek, Open Router, Kagi, and Perplexity join the chat

Back in November, I announced the chatgpt-shell Emacs package going offline. In real terms, it meant adding Ollama support after chatgpt-shell went multi-model. Since then, support for a handful of providers and models has been added. While DeepSeek is the latest joinee, Open Rou … | Continue reading


@xenodium.com | 1 month ago

Keychron K3 Pro: F1-F12 as default macOS keys

After resetting my Keychron K3 Pro, my F1 to F12 keys were no longer my default macOS keys. The entire row was defaulting to macOS's special keys (i.e. Mission Control, Launch Pad, Volume, etc). At first, I thought I may just need to revisit the macOS setting "Use F1, F2, etc key … | Continue reading


@xenodium.com | 1 month ago

Alzheimer bookmarks

#NYC #Alzheimer's Association hybrid event (in-person and Zoom). Dementia Training Australia (DTA), Free online courses and resources. Woman claims Alzheimer’s symptoms were reversed after five years | CNN. | Continue reading


@xenodium.com | 2 months ago

Raspberry Pi bookmarks

Raspberry Pi 5: Getting Started - YouTubee. | Continue reading


@xenodium.com | 2 months ago

Sourdough bookmarks

Reading crumbs structure: fermentation. Todays loaf and some advice after making 100+ loaves over 6 years. | Continue reading


@xenodium.com | 2 months ago

E-ink bookmarks

cPiArtFrame. DIY E-Ink clock update with more faces, github repo & full youtube tutorial. Show HN: E-Paper 7-color display showing the current weather | Hacker News. | Continue reading


@xenodium.com | 2 months ago

Cardamom Buns recipe

Buns 150 ml milk 2 tsp instant yeast (2.25 tsp active-dry yeast, 17.5g fresh yeast) 1 large egg 1 egg yolk 50 grams sugar 1/2 tsp vanilla extract 1/2 tsp ground cardamom 1/2 tsp salt 375 grams all-purpose or bread flour 57 grams unsalted butter, softened Filling 71 grams unsalted … | Continue reading


@xenodium.com | 2 months ago

A tour of Ready Player Mode

Ready Player Mode, which began as a tiny media-viewing experiment, has now become my daily music player. Along the way, I moved from regular daily streaming to buying and playing music offline, relying on the odd streaming service exclusively for discovery. This setup's been work … | Continue reading


@xenodium.com | 2 months ago

A platform that moulds to your needs

Emacs users may be known for bringing in all sorts of diverse workflows into their beloved text editor. From the outside, I get how odd this may seem. We often treat our text editor as a platform of sorts to do our email, web browsing, calendars, project management, chat… the lis … | Continue reading


@xenodium.com | 2 months ago

Blogging minus the yucky bits of the modern web

Happy New Year! If you follow my blog, you may have noticed that I've been hosting it on lmno.lol for a while now, a blogging service I built (invitation-only until now). #+ATTR_HTML: :width 90% Why build a blogging platform There's been a resurgence in blogging of sorts. Wonder … | Continue reading


@xenodium.com | 3 months ago

Blogging minus the yucky bits of the modern web

Happy New Year! If you follow my blog, you may have noticed that I've been hosting it on lmno.lol for a while now, a blogging service I built (invitation-only until now). #+ATTR_HTML: :width 90% Why build a blogging platform There's been a resurgence in blogging of sorts. Wonder … | Continue reading


@xenodium.com | 3 months ago

symbol-overlay-mc now on MELPA

Some time ago, I wrote about adding multiple cursor support to symbol-overlay by gluing the two packages together. If you're keen to learn how to bend Emacs to your way, have a look at that post. Later on, in a "Multiple cursors - how and why?" Reddit post, I showcased the overla … | Continue reading


@xenodium.com | 3 months ago

symbol-overlay-mc now on MELPA

Some time ago, I wrote about adding multiple cursor support to symbol-overlay by gluing the two packages together. If you're keen to learn how to bend Emacs to your way, have a look at that post. Later on, in a "Multiple cursors - how and why?" Reddit post, I showcased the overla … | Continue reading


@xenodium.com | 3 months ago

Hello emacs.tv

A few days ago, Sacha Chua mentioned how cool it would be to have an Emacs video index like Ruby Video. I mentioned how I had similarly considered a low-tech solution, maybe powered by plain text (bonus points for org mode of course). A little later, Sacha shared a preliminary vi … | Continue reading


@xenodium.com | 3 months ago

Hello emacs.tv

A few days ago, Sacha Chua mentioned how cool it would be to have an Emacs video index like Ruby Video. I mentioned how I had similarly considered a low-tech solution, maybe powered by plain text (bonus points for org mode of course). A little later, Sacha shared a preliminary vi … | Continue reading


@xenodium.com | 3 months ago

An experimental (e)shell pager

These days, my LLM interactions primarily take place via chatgpt-shell's compose UX. I've grown fond of this hybrid style of interaction. On sharing the latest incarnation, jllw asked about the possibility to port to comint shells. With jllw's great idea in mind, I set out to pro … | Continue reading


@xenodium.com | 4 months ago

An experimental (e)shell pager

These days, my LLM interactions primarily take place via chatgpt-shell's compose UX. I've grown fond of this hybrid style of interaction. On sharing the latest incarnation, jllw asked about the possibility to port to comint shells. With jllw's great idea in mind, I set out to pro … | Continue reading


@xenodium.com | 4 months ago

LLM chat navigation

LLM chats are often handy for refining answers to a question or task, part of a bigger goal. Navigating the chat transcript, copying and pasting, can be a frequent operation in the bigger goal. If we can do it more efficiently, the better. While chatgpt-shell offered chatgpt-shel … | Continue reading


@xenodium.com | 4 months ago

LLM chat navigation

LLM chats are often handy for refining answers to a question or task, part of a bigger goal. Navigating the chat transcript, copying and pasting, can be a frequent operation in the bigger goal. If we can do it more efficiently, the better. While chatgpt-shell offered chatgpt-shel … | Continue reading


@xenodium.com | 4 months ago

Awesome elisp

A few days ago, redditor gollyned asked about best practices: developing on top of modern elisp packages. It reminded of my modern Emacs lisp libraries post, which I shared with them. While my post is roughly 4.5 years old, these days I continue to reach out to the likes of seq.e … | Continue reading


@xenodium.com | 4 months ago

Awesome elisp

A few days ago, redditor gollyned asked about best practices: developing on top of modern elisp packages. It reminded of my modern Emacs lisp libraries post, which I shared with them. While my post is roughly 4.5 years old, these days I continue to reach out to the likes of seq.e … | Continue reading


@xenodium.com | 4 months ago

ob-chatgpt-shell goes multi-model too

A week ago, I announced chatgpt-shell going multi-model. What I failed to mention is that because ob-chatgpt-shell (its org babel Emacs cousin) relies on chatgpt-shell, this babel package has now gone multi-model also. ob-chatgpt-shell follows the familiar babel form. To swap mod … | Continue reading


@xenodium.com | 4 months ago

ob-chatgpt-shell goes multi-model too

A week ago, I announced chatgpt-shell going multi-model. What I failed to mention is that because ob-chatgpt-shell (its org babel Emacs cousin) relies on chatgpt-shell, this babel package has now gone multi-model also. ob-chatgpt-shell follows the familiar babel form. To swap mod … | Continue reading


@xenodium.com | 4 months ago

LLM iterate and insert

chatgpt-shell includes a couple of mechanisms to operate on an Emacs buffer region. That is, select a region and ask the LLM robots to modify it for us. Until now, both of these mechanisms didn't quite close the loop. They could either modify current region or iterate on a separa … | Continue reading


@xenodium.com | 4 months ago

LLM iterate and insert

chatgpt-shell includes a couple of mechanisms to operate on an Emacs buffer region. That is, select a region and ask the LLM robots to modify it for us. Until now, both of these mechanisms didn't quite close the loop. They could either modify current region or iterate on a separa … | Continue reading


@xenodium.com | 4 months ago

Toggle macOS menu bar from you know where

I'm a fan of macOS's auto-hide menu bar setting. Unless I'm reaching out to a menu item, I don't typically need to have a visible menu bar, so I set auto-hide to "Always". On rare occasions, I turn this setting off (say for a screen grab). While reaching out to macOS Control Cent … | Continue reading


@xenodium.com | 4 months ago

Toggle macOS menu bar from you know where

I'm a fan of macOS's auto-hide menu bar setting. Unless I'm reaching out to a menu item, I don't typically need to have a visible menu bar, so I set auto-hide to "Always". On rare occasions, I turn this setting off (say for a screen grab). While reaching out to macOS Control Cent … | Continue reading


@xenodium.com | 4 months ago

chatgpt-shell goes offline

Since chatgpt-shell going multi-model, it was only a matter of time until we added support for local/offline models. As of version 2.0.6, chatgpt-shell has a basic Ollama implementation (llama3.2 for now). chatgpt-shell is more than a shell. Check out the demos in the previous po … | Continue reading


@xenodium.com | 4 months ago

chatgpt-shell goes offline

Since chatgpt-shell going multi-model, it was only a matter of time until we added support for local/offline models. As of version 2.0.6, chatgpt-shell has a basic Ollama implementation (llama3.2 for now). chatgpt-shell is more than a shell. Check out the demos in the previous po … | Continue reading


@xenodium.com | 4 months ago

chatgpt-shell goes multi-model

Over the last few months, I've been chipping at implementing chatgpt-shell's most requested and biggest feature: multi-model support. Today, I get to unveil the first two implementations: Anthropic's Claude and Google's Gemini. Changing course In the past, I envisioned a differen … | Continue reading


@xenodium.com | 4 months ago

chatgpt-shell goes multi-model

Over the last few months, I've been chipping at implementing chatgpt-shell's most requested and biggest feature: multi-model support. Today, I get to unveil the first two implementations: Anthropic's Claude and Google's Gemini. Changing course In the past, I envisioned a differen … | Continue reading


@xenodium.com | 4 months ago

chatgpt-shell splits up

The chatgpt-shell package started as an experiment glueing the ChatGPT API to an Emacs comint buffer. Over time, it grew into several packages within the same repository: shell-maker, ob-chatgpt-shell, dall-e-shell, ob-dall-e-shell, and of course chatgpt-shell itself. I'm splitti … | Continue reading


@xenodium.com | 5 months ago

chatgpt-shell splits up

The chatgpt-shell package started as an experiment glueing the ChatGPT API to an Emacs comint buffer. Over time, it grew into several packages within the same repository: shell-maker, ob-chatgpt-shell, dall-e-shell, ob-dall-e-shell, and of course chatgpt-shell itself. I'm splitti … | Continue reading


@xenodium.com | 5 months ago

Hide another detail

It's been 5 years since I talked about showing/hiding Emacs dired details in style, a short post showcasing hide-details-mode (built-in) and diredfl (third-party). While my dired usage increased over the years, my dired config remained largely unchanged. Today, I'll show a new di … | Continue reading


@xenodium.com | 5 months ago

Hide another detail

It's been 5 years since I talked about showing/hiding Emacs dired details in style, a short post showcasing hide-details-mode (built-in) and diredfl (third-party). While my dired usage increased over the years, my dired config remained largely unchanged. Today, I'll show a new di … | Continue reading


@xenodium.com | 5 months ago

How I batch apply and save one-liners

My significant other needed to share proof of address by providing a number of bank statements for a period of time. That's easy enough to download as pdfs from the bank, but statements typically provide more personal information than the recipient requires. For a proof of addres … | Continue reading


@xenodium.com | 6 months ago

How I batch apply and save one-liners

My significant other needed to share proof of address by providing a number of bank statements for a period of time. That's easy enough to download as pdfs from the bank, but statements typically provide more personal information than the recipient requires. For a proof of addres … | Continue reading


@xenodium.com | 6 months ago

Emacs bubble mode

From time to time, I want to grab a source code viewport of sorts and feed to an LLM for questioning. From Emacs, I normally use chatgpt-shell's chatgpt-shell-prompt-compose, which automatically grabs the active region. This led me to explore a few options to select a region, or … | Continue reading


@xenodium.com | 7 months ago

Emacs bubble mode

From time to time, I want to grab a source code viewport of sorts and feed to an LLM for questioning. From Emacs, I normally use chatgpt-shell's chatgpt-shell-prompt-compose, which automatically grabs the active region. This led me to explore a few options to select a region, or … | Continue reading


@xenodium.com | 7 months ago

Spiffing up those echo messages

Well-ingrained into every Emacs user is the echo area, a one-stop shop to receive any kind of message from the editor, located at the bottom of the frame. Posting messages to this area from elisp couldn't be simpler: (message "Hello world") If we want to get a little fancier, we … | Continue reading


@xenodium.com | 7 months ago

Spiffing up those echo messages

Well-ingrained into every Emacs user is the echo area, a one-stop shop to receive any kind of message from the editor, located at the bottom of the frame. Posting messages to this area from elisp couldn't be simpler: (message "Hello world") If we want to get a little fancier, we … | Continue reading


@xenodium.com | 7 months ago

Seek and you shall find

A couple of months ago, I introduced Ready Player Mode, an Emacs major mode used to peek at media files from my beloved text editor. The goal was simple. Treat opening media files like any other file, that is, open and go. The initial implementation served me well while reviewing … | Continue reading


@xenodium.com | 7 months ago