SafariTabs.app v0.2.0

On <2026-05-07 Thu> I do several improvements to SafariTabs.app.

  1. Dragging swimlanes, so I can rearrange them to follow Spaces 3, 4, 5.
  2. Rename windows, mine are "Personal", "Work – Tech", "Work – Communications"
  3. Auto-sized swimlanes: each column takes 1/3 of the app window, capped at 1/6 of the current display — so a half-screen window always fits 3 columns and a maximised one fits 6, on any resolution.
safari-tabs.png

elpa-find-file function

· :Elisp:Emacs:

While researching internals of agent-shell I needed to quickly visit Elisp files by name. Here's the helper, which takes the file name and finds it within installed packages.

Examples:

  • (elpa-find-file "agent-shell.el")
  • (elpa-find-file "avy.el")
(defun elpa-find-file (pattern)
  "Open first file matching PATTERN in the elpa directory.
Error if multiple versions of the same package match."
  (interactive "sFile: ")
  (let* ((elpa-dir (expand-file-name "elpa" user-emacs-directory))
         (files (thread-first
                  "rg --files %s | grep -F \"%s\" | grep -v '\\.elc$'"
                  (format (shell-quote-argument elpa-dir) pattern)
                  shell-command-to-string
                  split-string))
         (pkgs (mapcar (lambda (f)
                         (let ((dir (cadr (split-string f "/elpa/"))))
                           (replace-regexp-in-string
                            "-[0-9].*?/.*\\'" "" dir)))
                       files))
         (dups (seq-filter (lambda (p)
                             (> (cl-count p pkgs :test #'string=) 1))
                           (seq-uniq pkgs))))
    (when dups
      (user-error "Multiple versions found for: %s — clean up %s"
                  (string-join dups ", ") elpa-dir))
    (unless files
      (user-error "file %s not found" pattern))
    (find-file (cl-first files))))
Support to jumping to a :line:column

Okay, almost immediately I wanted something like this - (elpa-find-file "agent-shell.el:4616"), which is essentially what visit-source.el does. But, it turned out better not integrate visit-source, but implement parsing of line directly in the function.

So, version 2:

(defun elpa-find-file (pattern)
  "Open file matching PATTERN in the elpa directory.
PATTERN may include a trailing :LINE or :LINE:COL.
Error if multiple versions of the same package match."
  (interactive "sFile: ")
  (let* ((parts (split-string pattern ":"))
         (name (car parts))
         (line (and (nth 1 parts) (string-to-number (nth 1 parts))))
         (col (and (nth 2 parts) (string-to-number (nth 2 parts))))
         (elpa-dir (expand-file-name "elpa" user-emacs-directory))
         (files (thread-first
                  "rg --files %s | grep -F \"%s\" | grep -v '\\.elc$'"
                  (format (shell-quote-argument elpa-dir) name)
                  shell-command-to-string
                  split-string))
         (pkgs (mapcar (lambda (f)
                         (let ((dir (cadr (split-string f "/elpa/"))))
                           (replace-regexp-in-string
                            "-[0-9].*?/.*\\'" "" dir)))
                       files))
         (dups (seq-filter (lambda (p)
                             (> (cl-count p pkgs :test #'string=) 1))
                           (seq-uniq pkgs))))
    (when dups
      (user-error "Multiple versions found for: %s — clean up %s"
                  (string-join dups ", ") elpa-dir))
    (unless files
      (user-error "file %s not found" name))
    (find-file (cl-first files))
    (when line
      (goto-char (point-min))
      (forward-line (1- line))
      (when col (forward-char (1- col))))))

visit-source.el

· :Emacs:Elisp:

visit-source.el is an utility Emacs package to quickly go to a file at point (under cursor). I bind (keymap-global-set "H-RET" #'visit-sourse) and can quickly go to files with line precision from anywhere, including log outputs.

Installation

grab a file visit-source.el, put it somewhere on load-path, bind to a key – I have it within ffap package:

(use-package ffap :ensure nil
  :config
  (require 'visit-source)
  ;;(setq ffap-file-finder #'visit-source)
  (setq ffap-file-finder #'find-file)
  :bind (("H-<return>" . visit-source)))
Usage

In any buffer put a point on a file-looking string and call {M-x visit-source RET} (or {H-<return>} for me).

File-looking string can be:

  • a filename
  • a filename with lines (as in exception or log output)
History

When I first find it on r/emacs comment, it was much simpler version and was intended as drop-in replacement for find-file. Then I added project awareness, so you can visit-source on a file Pavels-Emacs-Configuration-v3.org by filename, from anywhere in the project.

Initially I adopted visit-source instead of find-file {C-x C-f} but then switched to find-file-at-point that has a bit different semantics and kept visit-source at {H-RET} separately.

visit-source v0.3.0

visit-source worked in most cases, but still had some rough edges, like didn't parse when path at point ends with dots, so text like ../Pavels-Emacs-Configuration-v3.org. didn't parse, so I had to manually end sentences with "../Pavels-Emacs-Configuration-v3.org file." or "../nv directory." Yesterday I bumped into the need to visit arbitrary Org Mode link. {C-c C-o} runs OS open on it, so log files were opening with TextEdit.app for me. Surely I can reconfigure it in macOS level to associate Emacs with log files (via UI?); but visit-source looks the way for it.

Given personal tooling reneissance, with Claude Code on <2026-05-06 Wed> I asked it to refactor the code - extract helper pure functions, implement fixes, support Org Mode links, get rid of trailing punctuation, add tests.

So meet visit-source v0.3.0 – visit-source.el!

terraform-ts-mode

At work I work with Terraform, so need to edit quite a lot of tf files in GNU Emacs. There's no built-in terraform-ts-mode Emacs package and I don't want to install regexp-based terraform-mode package

Existing terraform-ts-mode is this: kgrotel/terraform-ts-mode, which claims being experimental. So it's a good opportunity to learn how to create major modes using Tree Sitter and on <2026-05-05 Tue> I built my own with Claude Code.

Installation: put terraform-ts-mode.el to load-path.

Usage:

(use-package terraform-ts-mode :ensure nil
  :init
  (add-to-list 'major-mode-remap-alist '(terraform-mode . terraform-ts-mode)))

With this knowledge, the next step is [TK: try mickeynp/combobulate package].

SafariTabs.app

We need RSS for sharing abundant vibe-coded apps post by Matt Webb mentions Tabulator app, part of Wall of Apps by Matt Sephton. All the apps there share the same minimalist design, native Swift UI, tiny and, supposedly, fast. The downside is that they are paid.

I wanted to try Tabulator, as I use seal_safari_tabs.lua with Hammerspoon. So I built SafariTabs.app (using Claude Code, a project), source code is here – velppa/SafariTabs. Version v0.1.0.

260508--safari-tabs-v0-1-0__app_macos.png

Features:

  • Fuzzy-searching for tabs
  • Keyboard navigation
  • Switching to the selected tab
  • Close tab
  • Headless mode, "safaritabs:" URL scheme

Let's see if I'm going to use it, if yes – will think about publishing a release. If you want to build it – clone the repo and ask Claude Code to build it.

Mandelbrot set explorer

23 years ago, in 2003, I spent two weeks on developing Mandelbrot set explorer using Java applets as a lab assignment. Browsers were not able to render it in any way. Today, I asked Claude Design to make it, and in 5 minutes it was ready. Feature wise it's almost exactly the same, mine version additionally showed the actual iterations when clicking on black areas. But Claude's version has bookmarks bar.

Fascinating! Check it here: https://hotter.surge.sh/mandelbrot.html

Screens:

mandelbrot_0.png mandelbrot_1.png mandelbrot_2.png mandelbrot_3.png mandelbrot_4.png mandelbrot_5.png

Trying org-tufte for public notes

On <2026-04-28 Tue> I tried to add footnotes to notes in Textpod. It works, {C-c C-x f} adds a footnote link. Then publishing works normally, just make sure footnotes heading is level down of the published note (usually h2).

But, footnotes looks ugly, and rendered at the bottom. I want sidenotes, as in Tufte CSS. I remember org-tufte exporter, so decided to try. Apparently, there's newer version exists - Zilong-Li/org-tufte. Let's try it.

(use-package org-tufte :ensure nil)

Export to plain HTML looks fine, side-notes as footnotes work fine this is side note, but in Org file it's actually a footnote! . But when exporting into Textpod – body only, + custom HTML and JS injected – it breaks.

Okay, time to some vibe-coding. New package textpod-org-tufte.el.

HTML export to Textpod

On <2026-04-27 Mon> I'm once again fascinated how bad Markdown is and how broken the export is. So for Textpod I decided to skip Markdown, and export notes directly from Org to HTML.

Problem

Markdown can't handle lists properly.

This Org Mode block:

- github :: [[https://github.com/inanimate-tech/mist][inanimate-tech/mist]]
- posts ::
  - [[https://interconnected.org/home/2026/02/12/mist][mist: Share and edit Markdown together, quickly (Interconnected)]]
  - [[https://interconnected.org/home/2026/04/10/open-mist][mist is now open source and looking for interop (Interconnected)]]

: curl https://mist.inanimate.tech/new -T file.md

is exported as this Markdown block:

-   **github:** [inanimate-tech/mist](https://github.com/inanimate-tech/mist)
-   **posts:** -   [mist: Share and edit Markdown together, quickly (Interconnected)](https://interconnected.org/home/2026/02/12/mist)
    -   [mist is now open source and looking for interop (Interconnected)](https://interconnected.org/home/2026/04/10/open-mist)

    curl https://mist.inanimate.tech/new -T file.md

which is then converted to this HTML block:



The list was rendered completely wrong.

When exporting from Org directly to HTML, it's correct - dl/dt/dd tags are used, comment rendered as verbatim text:


github
inanimate-tech/mist
posts
curl https://mist.inanimate.tech/new -T file.md

Solution

Luckily, the change in texptpod.el is this:

-   (org-export-string-as org-text 'md t)
+   (org-export-string-as org-text 'html t)

I also changed backend to preprocess internal links, they look like this:

../markdown.md // for Markdown export
../markdown.html#5B98C220-A8F4-4202-9708-82B0D000A4E9 // for HTML export

Preprocessing changes both to ?q=markdown., so search starts to /markdown. which matches both md and html extensions.

remoto.el: Browse GitHub repos without cloning

An Emacs package to browse Github without cloning the repository. Uses magit/ghub package for interacting with Github.

Installation:

(use-package remoto
  :vc (:url "https://github.com/agzam/remoto.el"))

Examples:

(remoto-browse "torvalds/linux") ;; hangs for a minute on a slow connection
(remoto-browse "https://github.com/agzam/remoto.el")
(find-file "/github:nex-crm/wuphf@main:/CHANGELOG.md")

Screenshot: img

macOS California Locations

I wanted to visually see the location of macOS names, so asked Claude to draw an interactive map. The map also features downloadable wallpapers.

Published to hotter.surge.sh: macOS California Locations.

img