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.

mist – collaborative Markdown editor

Mist is an online collaborative Markdown editor, with comment support. Downside: documents live for 99 hours.

author
Matt Webb (https://interconnected.org)
website
mist
github
inanimate-tech/mist
posts
curl https://mist.inanimate.tech/new -T file.md
md-publish-file function

Wrap that into md-publish-file Elisp function, interactively picking the file.

Here's an md-publish-file function that uploads a Markdown file to mist:

(defun md-publish-file (file)
  "Upload FILE to mist.inanimate.tech and return the URL.
Interactively, prompt for a Markdown file."
  (interactive
   (list (read-file-name "Markdown file to publish: "
                         nil nil t nil
                         (lambda (name)
                           (string-match-p "\\.md\\'" name)))))
  (unless (file-exists-p file)
    (user-error "File does not exist: %s" file))
  (let* ((output (shell-command-to-string
                  (format "curl -s https://mist.inanimate.tech/new -T %s"
                          (shell-quote-argument (expand-file-name file)))))
         (url (string-trim output)))
    (if (string-match-p "^https://mist\\.inanimate\\.tech/" url)
        (progn
          (kill-new url)
          (message "Published to: %s (copied to kill ring)" url)
          url)
      (error "Upload failed: %s" output))))

This function:

  • Prompts for a .md file interactively
  • Uploads it using curl
  • Copies the URL to the kill ring
  • Returns and displays the URL