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

Playing Hisorty

On <2026-04-23 Thu> I saw Hisorty website and played it.

Other similar quizes:

Hisorty [2026-05-03 Sun]
260503--hisorty__screenshot.png
Hisorty [2026-05-02 Sat]

Topic: computers 260502--hisorty__screenshot.png

Hisorty [2026-04-26 Sun]
260426--hisorty__screenshot.png
Hisorty [2026-04-23 Thu]
260423--hisorty__screenshot.jpg
NYT Flashback [2026-04-25 Sat]

25 points 🟥🟩🟩🟩🟩🟩🟩🟩

NYT Flashback [2026-04-18 Sat]

25 points 🟩🟩🟩🟩🟩🟩🟥🟩

TIMDLE [2026-04-26 Sun]
260426--timdle__screenshot.png
TIMDLE [2026-04-23 Thu]
260423--timdle__screenshot.jpg

Hosting static HTMLs

While I'm on vacation and Mac Mini 2024 (my home server) is turned off, I wanted to host HackerNews legible frontend (html file) on the Internet with minimum setup as possible.

Obvious choices like Cloudflare Workers, Github Pages and all their variants were ruled out as they require accounts, backed by big corps while I wanted something indy.

Playing with Surge, made me realise it's a nice way to host static html artifacts created with AI, so here it is: https://hotter.surge.sh.

Operations
(let ((default-directory "~/Developer/src/github.com/velppa/hotter.surge.sh"))
  (async-shell-command
    ;; "surge --help"
    ;; "surge files hotter.surge.sh"
    ;; "surge . hotter.surge.sh" ;; deploy
    "make deploy"
    "*hotter.surge.sh*"))

(setq surge-server (ws-file-server :dir "~/Developer/src/github.com/velppa/hotter.surge.sh" :port 9004))
(ws-stop surge-server)

Window configuration on m4pro

MacBook Pro M4 Pro has larger screen and windows in Emacs behave differently, often ending up with 6 windows at once. That's not what I want.

Time to learn Window management in Emacs.

On <2026-04-21 Tue> I switched to ace-window from other-window and keeping track of what has changed.

Keybindings:

Good:

Bad:

Things to try:

textpod.el v0.3.0

Another round of improvements of textpod.el, a companion Emacs package to Textpod.

Custom ID format - attribute name and prefix

Added two defcustom options in textpod.el:

  • textpod-id-property (default "TEXTPOD_ID") - name of the Org property used to store the note id.
  • textpod-id-prefix (default "") - prefix prepended to ids when stored, stripped before sending requests to the server.

Introduced textpod--strip-prefix helper and updated all id call sites (textpod-open-current-note, textpod-org-heading-to-note, textpod-org-region-to-note) to respect these configs.

textpod-set-id sets ID without creating a node

I need a function to create texpod id property without sending note to the server. This is needed to submit old notes so they have proper timestamp.

Added textpod-set-id: an interactive command that sets textpod-id-property on the current heading (with textpod-id-prefix) derived from a time as YYYYMMDDhhmmss, without making any HTTP request.

  • No prefix arg → uses (current-time).
  • With prefix arg → prompts via org-read-date, so the note can be back-dated before later uploading with textpod-org-heading-to-note.
Quickly getting to Textpod notes

Using Ack is possible, placing point on a file-name and pressing {H-RET} will call visit-source and go directly to the line.

ack ":ID:\s*textpod_" *.org | grep -v 2026-04-22 | head -n 20

2026-04-12.org:226::ID: textpod_20260412124048
2026-04-13.org:10::ID: textpod_20260414214110
2026-04-13.org:237::ID: textpod_20260414212612
2026-04-13.org:247::ID: textpod_20260414224720
2026-04-13.org:263::ID: textpod_20260414210103
2026-04-13.org:314::ID: textpod_20260414224944
2026-04-16.org:12::ID: textpod_20260416100352
2026-04-16.org:97::ID: textpod_20260417092822
2026-04-21.org:205::ID: textpod_20260421120000

Since I made my Textpod notes to be Org-roam notes, I can query them directly from SQLite DB.

  • (sqlite-mode-open-file "~/.config/emacs/org-roam.db")

    select id, file, title from nodes n where n.id like '"textpod_%"';

textpod_20260329123259 ~/Notes/2026-03.org Standalone HTML Galleries
textpod_20260315124829 ~/Notes/2026-03.org Build HackerNews Legible Frontend
textpod_20260415130636 ~/Notes/2026-04.org Improve public notes
textpod_20260415205822 ~/Notes/2026-04.org “Why Kim Wexler Was The Real Villain of Better Call Saul” by BreakingHub (19 min)
textpod_20260415210948 ~/Notes/2026-04.org “Linus Lays down the Law” – The PrimeTime (ThePrimeagen), 13 min
textpod_20260412124048 ~/Notes/daily/2026-04-12.org Improve HackerNews Legible Frontend
textpod_20260414214110 ~/Notes/daily/2026-04-13.org Interview about k8s setup in Amazon
textpod_20260414212612 ~/Notes/daily/2026-04-13.org kumo – local AWS emulator in Go
textpod_20260414224720 ~/Notes/daily/2026-04-13.org Snowflake MCP server
textpod_20260414210103 ~/Notes/daily/2026-04-13.org Claude Code quota exhausted / degraded quality
textpod_20260414224944 ~/Notes/daily/2026-04-13.org Trying Textpod once again
textpod_20250612070826 ~/Notes/html.org I'm betting on HTML
textpod_20260421120000 ~/Notes/daily/2026-04-21.org Rewrite Textpod to Go
textpod_20260416100352 ~/Notes/daily/2026-04-16.org Advice to org-roam-dailies-goto-today
textpod_20260417092822 ~/Notes/daily/2026-04-16.org Links <2026-04-16 Thu>
textpod_20260422124810 ~/Notes/daily/2026-04-22.org textpod.el v0.3.0

[TK: :colnames yes got broken for some reason].

My textpod.el config

The config automatically makes notes published to Textpod as Org-roam nodes.

(use-package textpod
  :config
  (setq textpod-id-property "ID"
        textpod-id-prefix "textpod_"
        textpod-token (cadr (auth-source-user-and-password "finita.myaddr.dev" "textpod"))
        ;;textpod-url "/notes"
        textpod-url "http://localhost:3000/notes"
        )
  :bind (("C-c b x" . textpod-set-id)
         ("C-c b b" . textpod-org-heading-to-note)
         ("C-c b o" . textpod-open-current-note)))

Updates:

  • <2026-04-23 Thu>: add keybindings