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.
On <2026-04-21 Tue> I switched to ace-window from other-window and
keeping track of what has changed.
Keybindings:
{M-o}: ace-window
{§}: ace-window
{C-x o}: other-window (built-in)
{C-u C-u M-o}: delete window
{C-x }: winner-undo
Good:
{C-u M-o}: swap windows, crux package no longer needed.
window-extras package contains two functions – transpose-windows
(same as {C-u M-o}) and toggle-window-split. Will keep it for now.
Bad:
golden-ratio-mode is not triggered, because it adds after-advice
(ad-Advice-other-window). The advice itself is called
‘golden-ratio-resize-window’. For now I disabled golden-ratio mode.
Will use balance-window {C-x +} ad-hoc.
Things to try:
toggle-window-dedicated {C-x w d}
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.
I'm on vacation, in free time setting up new MacBook Pro machine.
Rewrite Textpod to Go
On <2026-04-21 Tue> I rewritten Textpod from Rust to Go.
While I'm on vacation with the new MacBook Pro M4 Pro and I have
installed only bare minimum on it, I don't have Rust toolchain but do
have Go. So, asked Claude to do rewrite. The only external
dependency is goldmark package to render Markdown as HTMLs.
JuliusBrussee/cavekit: A Claude Code plugin that turns natural
language into blueprints, blueprints into parallel build plans, and
build plans into working software with automated iteration,
validation, and cross-model peer review.
forrestchang/andrej-karpathy-skills: A single CLAUDE.md file to
improve Claude Code behavior, derived from Andrej Karpathy's
observations on LLM coding pitfalls.
Currently, when calling org-roam-dailies-goto-today, {C-c n d} for me,
Emacs switches to the daily note buffer, but moves point to
(point-min). I want to advice to first check if the buffer with
"YYYY-MM-DD.org" (for today) already exists, and if so, switch to this
buffer. Related to Org-roam.
Here's an advice function to achieve that:
(defun my-org-roam-dailies-goto-today-advice (orig-fun &rest args)
"Switch to today's daily note buffer/window if it exists, otherwise create it.
Preserves point position if buffer already exists."
(let* ((today (format-time-string "%Y-%m-%d"))
(daily-buffer-name (concat today ".org"))
(existing-buffer (get-buffer daily-buffer-name))
(existing-window (and existing-buffer
(get-buffer-window existing-buffer t))))
(cond
;; Buffer is already displayed in a window - switch to that window
(existing-window
(select-window existing-window))
;; Buffer exists but not displayed - switch to it in current window
(existing-buffer
(switch-to-buffer existing-buffer))
;; Buffer doesn't exist - create it
(t
(apply orig-fun args)))))
(advice-add 'org-roam-dailies-goto-today
:around #'my-org-roam-dailies-goto-today-advice)
This advice:
Checks for buffer by name (not file path)
If the buffer is displayed in any window (even in another frame), selects that window
If the buffer exists but isn't displayed, switches to it in the current window
Edit <2026-04-17 Fri>: check existing buffer using buffer name, not
the buffer vising a file, that depends on org-roam-dailies-directory
(I have two different, but one set of dailies).
Edit <2026-04-21 Tue>: check if the daily buffer is already opened
in existing window, if so - switch to it.
Improve public notes
Next round of improving Textpod on <2026-04-15 Wed>.
Deploy publicly –
Introduced --base-path flag, to serve notes under sub-path.
To start Textpod with sub-path, use:
textpod --token $TEXTPOD_TOKEN --base-path notes
Publish textpod.el to the repository
textpod.el is a companion Emacs package for quick publishing notes
from Org Mode documents.
textpod-org-region-to-note: Convert the Org region between BEG and END to Markdown and send to Textpod.
textpod-org-heading-to-note: Send the current heading’s subtree to Textpod.
textpod-open-current-note: Open the current heading’s Textpod note in a browser.
When creating a note, textpod.el sets TEXTPOD_ID property that's equal
to node'id.
Change separator in notes.md to ^L
Default separator \n\n---\n\n is fragile as it requires exactly two
newlines before / after the note. I often messed up notes when
editing notes.md file manually. To fix that, I replaced it with ^L
character (insert in Emacs via C-q C-l) which usually represents new
pages.
Fix attachments links
Attachement links need to respect --base-path flag.
Handling attachments
My current workflow:
Assets are stored next to Notes under assets/ directory
I can quickly search for them, then open in Emacs/qView:
An image is a link to an image file that does not have a description part (Images (The Org Manual)).
Textpod already support images. What happens when I drag-n-drop an
image file to the textarea? Textpod copies them under attachments
directory.
What I want:
When creating a public note containing an image via API (using
textpod.el), copy the asset to assets/ directory, mimicing the directory
structure in the notes.
I need another API endpoint - POST /notes/assets/<name>, accepting
binary as payload.
Okay, I implemented it, let's test.
textpod-org-heading-to-note
Prompt: Implement textpod-org-heading-to-note function, it should select
current (top) heading - the one that has TEXTPOD_ID parameter, and
call textpod-org-region-to-note on it.
The command {M-x textpod-org-heading-to-note} works!
Should the textpod id be just id?
Currently I use TEXTPOD_ID property. If using ID property, notes will
automatically become Org-roam nodes. Currently IDs are generated as
timestamps via (setq org-id-method 'ts) with nanoseconds precision.
Then it will come with seconds precision. I will need to a prefix, to
be able to quickly find them (e.g. with {M-x deadgrep}).
Wrap h3 into details on index page
To declutter the index page, h3 markdown headings (h2 Org headings)
are wrapped into <details> tag. The note page renders normally,
showing table of contents on the left sidebar.