For a while, I tried maintaining a combined RSS feed that included posts from all my sundry blogs. I kept it at /everything.rss. It was managed as part of my WordPress blog, and since I've stopped using WordPress, I've been redirecting /everything.rss to the feed for baty.net, which is either /feed or /index.xml, depending on my blog platform of the day.
I think that instead of that, I'll piggyback off my @batybot account on Mastodon.social. I crosspost most stuff from my sites to @batybot via EchoFeed already, and Mastodon offers an rss feed for each account. Mine is https://mastodon.social/@batybot.rss.
Soon, I'll redirect requests from baty.net/everything.rss to https://mastodon.social/@batybot.rss. This doesn't offer full posts, but rather it's more like a firehose of links to everything I post. If you'd like to avoid that kind of noise, delete your subscription to /everything.rss. If you are a glutton for punishment, feel free to subscribe.
I bought the Nikon Z f thinking it would replace my Leica SL2, since the Nikon is lighter, newer, cheaper, and faster. While it is all of those things, it's still not better.
Here's what I like about the Z f:
The design is just the right amount of retro.
Autofocus is fast and accurate. Even in low light.
High ISOs are very usable.
The dials feel good.
The RAW files look good out of Capture One without much work.
It's nice having a flippy screen, even though it's the wrong style of flippy screen.
It's lighter than the SL2.
Here's what I don't love about it:
While smaller than the SL2, it's not a small camera.
The menus are too complex. I still can't find anything. Use a modern Leica for 10 minutes and you'll see what I mean.
The Auto ISO features confound me at every turn. So much so that I've set them once, and I never touch the nice, big, well-made dial for setting ISO.
There's no aperture dial on the made-for-the-Zf lenses. A huge miss. I find myself just keeping the mode set to "P" (for "Professional" right?).
Auto focus is fast and accurate, but the settings to make them fast and accurate require study. Too much study.
The battery/SD door is flimsy and horrible, and with the (almost mandatory) grip attached, I struggle to pull the card out.
I wish the dials worked like the Fuji system's dials. Yes, I know, these are more flexible, but if they don't make sense to me, I'm not using them.
If I sell the camera now, I'll lose my ass. But if I don't learn to like it more, the money might be better spent elsewhere, even at a loss.
Scrolling with the Logitech MX Master in Safari sucks out of the box. The following from this Reddit thread helped, even though it required installing 2 additional packages.
What a gross bit of software, but it’s necessary here. I’ve read that once this process is done, I can delete the app completely, but I haven’t tried that yet.
Scrolling speed: 0% (as the OP says, this is the most important option to set).
Scroll direction: Standard (I would set it on Mos, but you have to pick one here anyway).
Smooth scrolling: Off (also good to turn off, Mos will take care of it instead).
SmartShift: On (If you want it).
Sensitivity value: 95% (we’ll see, maybe I’ll take it down to 90%).
(Note that launching Mos required xattr -d com.apple.quarantine Mos.app)
General > Smooth scrolling: On.
Advanced > Step: 75.00 (at least in my resolution, anything lower than this is just not enough of a scroll per ratchet movement).
Advanced > Speed: 3.50 (didn’t try too many others, but it seems to work in conjunction with the rest).
Advanced > Duration: 3.90 (default value, haven’t played around with it yet).
Now the ratchet action works as expected from a normal mouse, but when I give it a little nudge it goes into a free-spin and scrolls fast. I don’t know how much accuracy I’m getting with the free-spin yet, but to get to the bottom of a document, it’s great. I’ll update if I keep playing with these settings.
Once I’d done this, scrolling in the MX Master has been like butter.
While tinkering with Obsidian recently, something I liked was having a daily notes template with a Dataview query showing the other files I'd added that same day. I added something similar for Denote. It's a Yasnippet:
I just run that after first creating the daily note and I get a list of links to the other Denote files from that day. There's probably a way to automate that, but this is good enough for who it's for.
I've gone back to using Espanso for text expansion. As powerful as Keyboard Maestro is, every time I reach for it I feel like I've already lost a battle somewhere. Text expansion macros are about all I use KM for these days, so it's not much of a disruption.
I bookmark Espanso's config folder in Emacs so I can jump right in any time. The expansion macros ("matches") are contained in YAML files and can be as simple as:
- trigger: "j@"
replace: "jack@baty.net
They can get pretty fancy. I don't take full advantage of all the gizmos, but I use a ton of stuff like this:
you can “study” the data later and rearrange it. But the initial “just remember this” impulse should be as close to simply throwing the data at Emacs as possible.
I've been secretly conducting an experiment called "Use Obsidian Exclusively for 30 Days". It started a week ago. I'm typing this in Emacs, in case you're wondering how it's going.
Most days, I write the same things in both paper and digital journals. Then I print the digitital one. What's wrong with me? 😄[1]
Dante Stella on over-thinking travel photography:
It is difficult for amateur photographers to accept that, on any given
trip, they will not likely take unique photos of staggering social
significance or prize-winning landscapitude. The reality is that the
photos most likely to survive generationally will be the ones with
family members in them. The rest stand a good chance of being binned.
Consistency is the last refuge of the unimaginative.
Oscar Wilde
Walking Alice this morning shortly after 3:30 AM, I thought the moon looked weird. There was only the slightest sliver lit and the rest was a deep red. Turns out there was a total lunar eclipse at 3:30 that no one told me about. That explained it.
I spun up a WordPress blog this morning because I was bored and wanted to tinker with something. It's so easy to get started, but the block and site editors still feel like a janky, confusing mess. Just make me a nice theme with a few options and access to CSS and I'm good. I deleted the site 20 minutes later. Guess I'll need to find something else to play with today.
Something weird is that my Emacs setup feels like it's both complete and just started at the same time.
Nothing feels fun right now. Most of the things I typically enjoy have become frustrating exercises. I love paper notebooks, but can't bring myself to write in them for more than a few minutes. I love film photography, but I don't feel like dealing with the constraints and the costs. I've no patience for it. I love movies, but none of them look interesting. My typewriters collect dust. It's probably just another allergic reaction to the terrible shit happening in the world right now, but I'm finding it hard to shake.
I just exported 2700 tiddlers from my TiddlyWiki as one big markdown file, split it into individual files, and renamed them using Denote's format. ¯_(ツ)_/¯. I guess I tired of searching my Denote notes, coming up empty, then having to go to the wiki and search again. I'll write some notes about it at some point.
Using ChatGPT reminds me of when they started letting us use calculators in class. Sure, I forgot how to do long division by hand, but who cares? Everything else was so much easier it was worth the trade.
It seems like this is turning into an Emacs blog.
Not that there's anything wrong with that :).
It's getting harder and harder to discover useful videos on YouTube. Every thumbnail is created using the same "Make a crazy face and point at something!" format. Every title is a despirate grab for attention. The recommendation algorithm is all over the map and usually not helpful. I rely on subscriptions to known quantities and recommendations from other people. I wish it was better.
Dave's still doing fun stuff with Tinderbox.
I decided to try something new and I created a "quote"-type post.
I've been meaning to do something similar, but haven't gotten around to it. I'd probably not be so fancy. I also like the <cite> block in quotes, as seen above. That would be even more involved. Right now I have a bookmarklet that copies a Markdown-formatted version and I tweak it by hand as needed.
I'm thinking about migrating all of the content from the wiki into individual text (.md or .org) files and freezing the wiki. I love the thing, but I would like to focus my attention on Emacs/Org/etc. right now.
The more time I spend in Emacs' Dired mode, the more I want to tweak things. I wrote about a few of these last year.
One other thing I wanted was to hide any hidden (.dot) files in Dired listings. The simplest way to do this would be to set dired-listing-switches from -al to -l instead. But that would always hide them. I wanted to toggle them on and off, like I can in Finder on macOS using CMD-Shift-..
I poked around the Emacs documentation and a handful of Reddit posts and cobbled together something that worked. I figured I might as well share it. I assume there are smarter ways to do this, but here are the relevant bits from my config.
(use-package dired
:init
(require 'dired-x) ;; I think this is required for dired-omit-mode
:bind
(:map dired-mode-map
("s->" . dired-omit-mode)) ;; toggle using Command-Shift-. same as macOS Finder
:hook
(dired-mode . (lambda () (dired-omit-mode))) ;; hide .dot files by default
:config
(setq dired-omit-files ;; hide .dot files when in dired-omit-mode
(concat dired-omit-files "\\|^\\..+$")))
This configuration means that every time I create a dired buffer, the .dot files are hidden. What I haven't figured out is how to toggle it globally. Sometimes I want to show hidden files by default instead, for a while. It's not hard to toggle them, but it would be nice to "turn them on" until I want to "turn them off" again. This works well enough for now, though.
Long story, short: I'm using both Howm and Denote for notes in Emacs. But why? Below are some quick notes about why (with some "how" thrown in).
Denote is such a pleasure to work with. It's simple, powerful, and sensible. There are no dependencies or gotchas.
Howm is clever and interesting and fun. It offers a useful new take on both writing and reading notes. As a long-time fan of the Noguchi filing method, Howm resonated with me immediately.
For a couple of months, I was using both packages independently. My thought was that I'd use Howm for quick, "fleeting" notes and Denote for my personal notes, projects, and "topic journals". This worked well enough, but it meant that every new note required a decision. Plus, looking for notes meant searching 2 places. My dream has always been "Everything in one place" so keeping them separate wasn't ideal.
The trick for me was learning a way to make my Howm notes look just like Denote notes, and then manage them all using Denote. Here's a summary of what that involved.
Both Howm and Denote can be configured to use any kind of note format (e.g. Org mode, Markdown, etc.).
Recent versions of Howm have some built-in configuration for using Org mode files. This sets some basic configuration. Here's how to do that:
That's not exactly Denote's format, but the proper date string means that Denote will at least recognize it as a Denote file.
The next change was to modify the default header format to use a real #+title: because by default it uses a top-level heading ("*"):
(setopt howm-view-title-header "#+title:")
Doing that really messes with the Howm-menu and other howm lists. Buried in the comments in issue #33, I found functions (by @mmarshall540) that work around this nicely.
;; Advise `howm-view-item-basename' so that if its return value
;; includes "--", only the text before is returned.
(defun my/howm-basename-chop (str)
"Advice for `howm-view-item-basename'.
Takes a file's basename, STR, and returns only the portion before
\"--\"."
(let ((dashes-pos (string-match "--" str)))
(cond (dashes-pos (substring str 0 dashes-pos))
(t str))))
(advice-add 'howm-view-item-basename :filter-return
'my/howm-basename-chop)
;; Advise `howm-view-item-summary' so that it removes the "#+title: "
;; portion of note titles.
(defvar howm-view-title-regexp)
(defun my/howm-cut-title (str)
"Remove `howm-view-title-header' plus whitespace from STR."
(let ((begin (when (string-match howm-view-title-regexp str)
(match-beginning 2))))
(if begin (substring str begin) str)))
(advice-add 'howm-view-item-summary :filter-return 'my/howm-cut-title)
With that, note listings in Howm look perfect. Note that the best fix for all this is to simply always use Denote for creating files, but I'd already configured things before I decided to combine both sets of notes. Besides, now I can create notes using either method. For any files created using Howm, I do need to rename them, but that's easy enough in a Dired buffer using denote-dired-rename-marked-files-using-front-matter once in a while (or from within the buffer while taking the note, if I think of it).
Also in that thread is a function (also from mmarshall540) for converting existing Howm notes to use #+title: instead of "*" or "=". This worked great for me. here's the comment.
The final change was to make howm-directory and denote-directory the same directory.
That seems like a lot, but it's easier than it looks.
Now my Howm Menu and note lists look like they're supposed to, even though they're actually full Denote-style files and have #+title: in the first line.
Howm Recent Files
Why am I doing this again? Well, because I get the best of both worlds this way. I create notes using Denote as normal, but then I can review them easily using Howm. And I also get all the same Howm tricks with >>> and <<< links.
I haven't worked out when or if to use the Howm TODO features. They're cool, but I'm pretty invested in my Org agenda. I'm testing the idea of using Howm TODOs for "someday/maybe" tasks, using the "~" notation in Howm. This surfaces the someday stuff without distracting from my gotta-do stuff.
Still noodlin' on all this. It would be cool if someone better at this stuff than me would create a howm-denote.el package or something that encapsulated all this in an easy, consistent way.
I like having a felt pad on my desk, but I don't like how it sometimes causes mouse movements to become choppy.
My favorite mouse is the Logitech MX Master. Maybe other mouses work better on felt, but I want to use this one, so I decided to buy a mouse pad. Then I remembered I have a 3D printer.
I downloaded this model and an hour later I had a custom-sized simple mouse pad and it works great.
Ladybird is a brand-new browser & web engine. Driven by a web standards first approach, Ladybird aims to render the modern web with good performance, stability and security.
From its humble beginnings as an HTML viewer for the SerenityOS hobby operating system project, Ladybird has since grown into a cross-platform browser supporting Linux, macOS, and other Unix-like systems.
Ladybird is currently in heavy development. We are targeting a first Alpha release for early adopters in 2026.
I'd like to not create these daily journal posts, and instead create several individial posts. The problem is that so much of what I write here in journal posts is not Postworthy. So, I'll keep doing this, I guess.
A week ago, I toyed with the idea of using Gnus for reading Email in Emacs.
As expected, I hated it at first. But then...
Gnus is a newsreader that can be coerced into pretending it's an email client. There's no getting around this masquerade and it feels awkward. On the other hand, it's a powerful news reader pretending to be an email client.
I don't manage a ton of email, so experiments with how I deal with it aren't high risk. Still, my recent email fiasco made me nervous. It also what got me looking into using Gnus.
Most of the time, I read email on my desktop Mac. I've been using Notmuch for this. The problem is that the Notmuch database is then tied to that computer. I was eventually able to configure muchsync so that I could read everything on my laptop (MBP) as well. It was working, but felt fragile and the process would often fail for various reasons.
The other place I manage email is of course on my phone. Notmuch isn't an option there, so I use Apple Mail. As I wrote in I think I have to go back to Mu4e, Notmuch wasn't fitting my workflow as well as I'd have liked. As I was looking at returning to Mu4e, I figured I'd play with Gnus.
Gnus solves the sync problem because it feeds directly off the IMAP server (Fastmail, in my case). Using Gnus, not only do I not worry about syncing between Macs, I don't even need to sync to my desktop Mac, at all[1].
Long story short, I've stuck with Gnus for the past week and I'm kind of digging it. Once one gets past the weird terminology (Groups, Articles, Dormant, Ticked, etc.) it's actually very powerful.
I cobbled together my configuration from a half-dozen Stack Exchange answers and blog posts[2], with some tweaks from me. It ain't pretty, but it's working. I'm not even sure what some of it is doing, but here's most of it:
(use-package gnus
:bind
(("C-c o g" . gnus)
(:map gnus-group-mode-map
;; I like seeing all mailboxes, not just those with unread messages
("o" . my/gnus-group-list-subscribed-groups))
(:map gnus-summary-mode-map
;; Move message to "Archive" folder
("C-c a" . my/gnus-summary-archive)))
:custom
;; Archive outgoing email in Sent Items folder, mark it as read
;; UPDATE: Do I need this? Fastmail saves Sent items automatically
;; (gnus-message-archive-method '(nnimap "personal"))
;; (gnus-message-archive-group "Sent Items")
(gnus-message-archive-group (format-time-string "sent.%Y")) ;; keep local copy
(gnus-gcc-mark-as-read t)
(gnus-search-use-parsed-queries t) ;; standardize searches
(gnus-auto-select-next nil)
(gnus-paging-select-next nil)
(gnus-summary-stop-at-end-of-message t)
(gnus-mime-display-multipart-related-as-mixed t)
(gnus-auto-select-first nil)
(gnus-summary-display-arrow nil)
(gnus-thread-sort-functions
'(gnus-thread-sort-by-most-recent-date
(not gnus-thread-sort-by-number)))
(gnus-show-threads t)
(gnus-sum-thread-tree-false-root nil) ;; use subject
(gnus-sum-thread-tree-root nil)
(gnus-sum-thread-tree-indent " ")
(gnus-sum-thread-tree-vertical "│")
(gnus-sum-thread-tree-leaf-with-other "├─► ") ;; fancy
(gnus-sum-thread-tree-single-leaf "╰─► ")
;; |2025-03-06 (Thu)| Sender Name | Subject |
(gnus-summary-line-format (concat
"%0{%U%R%z%}"
"%3{│%}%1{%&user-date;%}%3{│%}" ;; date
"%ub:" ;; indicate (+) if known (bbdb)
"%4{%-20,20f%}" ;; name
" "
"%3{│%}"
" "
"%1{%B%}"
"%s\n"))
(gnus-user-date-format-alist '((t . "%Y-%m-%d (%a)")
gnus-thread-sort-functions '(gnus-thread-sort-by-date)))
:config
(setq gnus-select-method '(nnnil ""))
(setq gnus-secondary-select-methods '((nnimap "personal"
(nnimap-address "imap.fastmail.com")
(nnimap-server-port 993)
(nnimap-stream ssl)
(nnmail-expiry-target "nnimap+personal:Trash")))))
;; Send email via Fastmail's SMTP:
(use-package smtpmail
:custom
(send-mail-function 'smtpmail-send-it)
(smtpmail-default-smtp-server "smtp.fastmail.com")
(smtpmail-stream-type 'ssl)
(smtpmail-smtp-service 465))
I've configured BBDB (Insidious Big Brother Database) for contact management.
(use-package bbdb :ensure t
:config
;; initialization for both Gnus and Notmuch
(bbdb-initialize 'gnus 'message 'notmuch)
(bbdb-mua-auto-update-init 'gnus 'message 'notmuch)
;; When invoking bbdb interactively
(setq bbdb-mua-update-interactive-p '(query . create))
;; Check every address in a message and not only the first
(setq bbdb-message-all-addresses t)
;; use ; on a message to invoke bbdb
(add-hook 'gnus-summary-mode-hook
(lambda ()
(define-key gnus-summary-mode-map (kbd ";") 'bbdb-mua-edit-field)))
(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
(add-hook 'gnus-startup-hook 'bbdb-insinuate-notmuch)
(setq bbdb-complete-name-allow-cycling t))
Using BBDB is neat because when I'm viewing a message, a small window pops up at the bottom with that person's info. One nice feature is that, in the list of messages (Summary view), a "+" symbol is displayed before the name of people who are already in BBDB. (This is via %ub in the format string). Plus, Notmuch and Gnus can share the contact database. BBDB was initially developed by Jamie Zawinski.
In 1991, I wrote this program, "The Insidious Big Brother Database", which was an address-book and note-taking system that was tightly integrated with the Emacs mail and news readers. It was pretty popular until 1997 or so when even the last hold-outs stopped reading their mail in Emacs.
Well, not everyone stopped :).
I'm still very clumsy using Gnus, but it's been a blast to learn and play with. Part of the attraction is that it's built into Emacs and needs nothing else to work. It's nice not having to deal with sync or external dependencies. I admit that I also like that it's really really old and feels almost rebellious to use.
That said, I am still syncing and keeping the Notmuch database up to date, because I like having a local copy of all my email. Also, who knows how long I'll be using Gnus? ↩︎
I went down a rabbit hole with the built-in Remember mode in Emacs today.
Persistent Scratch with remember-note
The Emacs *scratch* buffer is handy. It's always available and easy to get to. However, by default it doesn't persist between runs of Emacs. So, when I quit Emacs, anything in the scratch buffer is lost. Sometimes I get burned by this, so I thought I'd fix it using the persistent-scratch package.
While looking for details about the package, I spotted a couple comments about using the built-in remember-notes function instead.
Return the notes buffer, creating it if needed, and maybe switch to it.
This buffer is for notes that you want to preserve across Emacs sessions.
The notes are saved in ‘remember-data-file’.
OK, I tried it and it works great.
My remember-notes file/buffer
I now have a persistent Org mode file as my scratchpad, and I can easily capture new notes as org headings to it using remember.
New frame defaults
Now that I had a nice, persistent scratchpad, I wanted it to be the default buffer for new frames and at startup. Easy enough:
;; Persistent notes (like persistent-scratch, but built-in)
(setq initial-buffer-choice 'remember-notes
remember-data-file "~/Documents/Notes/remember-notes"
remember-notes-initial-major-mode 'org-mode
remember-notes-auto-save-visited-file-name t
remember-in-new-frame t))
(defun my/switch-to-scratch-buffer (f)
(with-selected-frame f
(remember-notes t)))
(add-hook 'after-make-frame-functions #'my/switch-to-scratch-buffer)
I'm not sure all of that is necessary now that I've learned about remember-in-new-frame but it works as-is, so I'll leave it.
Remember mode via Raycast for system-wide capture
I'd created a keymap (C-c o n) for bringing up the remember-notes buffer while in Emacs, but thought it would be nice having a system-wide option. I've never understood how to configure =org-protocol= so I cheated and created a Raycast script:
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Remember
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/emacs.png
# Documentation:
# @raycast.description Open Emacs remember in new frame
# @raycast.author Jack Baty
# @raycast.authorURL https://baty.net
emacsclient -e "(remember-other-frame)"
Now I can trigger Raycast, type part of "Remember" (usually just "R" is enough) and it brings up a new Emacs frame containing the remember buffer. I type or paste whatever, and hit C-c C-c which adds the note to the remember file and kills the frame. Handy!
Creating emails via Remember mode
While reading the Remember manual, I spotted the option to save Remember notes as emails. WUT?!
By default, this uses an mbox file, ~/Mail/remember, which I can use Mutt to view.
neomutt -f ~/Mail/remember
My remember notes as emails in Neomutt
Crazy, right? Yeah, I'm not going to view my captured notes in Mutt, but it's cool that I could. But it got me thinking about my urge to put everything into Notmuch. Notmuch indexes Maildir-formatted emails, not mboxes. What if I converted the mbox to Maildir and used Emacs to read the notes where I'm already reading my emails? Plus super fast search and tagging, etc.?!
I've not gotten to that yet, but it's something to think about.
Now what?
This whole thing started because I wanted to make my scratch buffer persistent. Instead, I've ended up with a whole new capture setup for quick notes.
Why not use Org-capture or Howm-remember or a million possible other things for this? Fair question. The answer is that I didn't know anything about Remember mode when I woke up this morning, and now I do. It remains to be seen whether I should have used Org-capture for this, but it was fun learning how to do it this way.
It's possible we've, er, forgotten about Remember mode too soon.