Matt's Blog

Micro.blog Contingency Chat

You

If the micro.blog service were to go away, what are my options to continue posting on my own? And how disruptive would it be?

I do use a custom domain and back up to GitHub.


ChatGPT

Short answer: you’re in a very strong position already. If Micro.blog disappeared tomorrow, continuing on your own would be low-to-moderate disruption, not a rebuild. Here’s how to think about it.

Why you’re well insulated already Because you:

use a custom domain

back everything up to GitHub

write in Markdown

don’t rely on proprietary editors

You already own the content, URLs, and source of truth. Micro.blog is mostly acting as a host + convenience layer, not a lock-in platform.

Your clean exit paths (from least to most change) Option 1: Self-host a static blog (most common, least drama) What changes

Replace Micro.blog with a static site generator + hosting

Keep writing in Markdown exactly as you do today

Typical stack

Generator: Hugo or Jekyll

Hosting: Netlify or Cloudflare Pages

Repo stays on GitHub

Disruption level

🟢 Low

A few hours to a weekend if you want polish

URLs can remain identical if you mirror the structure

Who this is best for

You want durability, simplicity, and zero platform risk

This already matches how you think about “durable by design”

Option 2: Keep Micro.blog content, switch to another Indie-friendly host If you like the IndieWeb vibe but not self-hosting:

Export content

Re-host elsewhere

Keep your domain

This is more friction than Option 1 and doesn’t buy you much extra durability. Disruption level

🟡 Medium

Mostly migration tedium, not technical risk

Option 3: Fully manual workflow (Obsidian → GitHub → build) This is the “nothing but files” approach. Flow

Write in Obsidian

Commit to GitHub

Build + deploy via CI

Disruption level

🟡 Medium initially

🟢 Very low long-term

Tradeoff

You lose Micro.blog’s social layer and Micropub conveniences

You gain maximum control

What you’d lose if Micro.blog vanished Be clear-eyed about this: You’d lose:

Built-in social timeline

Microposting UI

Plug-and-play IndieWeb features

You would not lose:

Your content

Your domain

Your publishing ability

Your archive

Your future optionality

That’s the right trade.

Realistic disruption assessment Best-case:

“I flipped DNS and kept writing.”

Worst-case:

“I spent a weekend rebuilding a theme and cleaning front-matter.”

There is no catastrophic scenario given your setup.

My advisor take If Micro.blog went away:

You’d be annoyed

You’d not be blocked

You’d end up with something more durable, not less

If you want, next step I’d recommend:

A dry-run plan: “If this died tonight, here’s my 60-minute recovery checklist.”

Or a parallel static build sitting idle, just in case.

Both are very “you” moves.


You

I think of use option 1 with Hugo and Netlify, since that’s my long form blog tech stack. Are there any steps I should take now to ensure that I would have consistent individual post URLs after moving?


ChatGPT

Yes — and this is exactly the right time to lock this down. If you do three things now, you can make a future move to Hugo + Netlify almost boring. Below is the minimal, high-leverage checklist.

  1. Freeze your URL shape (this matters most) Decide and document the canonical URL pattern you want long-term, then make sure Micro.blog is already following it. Best durable choice (and Hugo-friendly):
swift/YYYY/MM/DD/slug/

or, if you prefer simpler:

bash/slug/

What to do now

Pick one pattern and commit to it

Verify Micro.blog is already generating URLs in that shape

Do not mix patterns

In Hugo, this maps cleanly via permalinks:

toml[permalinks]
  posts = "/:year/:month/:day/:slug/"

If your Micro.blog URLs already look like this, you’re golden.

  1. Align front matter now (so you don’t refactor later) Micro.blog front matter is close to Hugo, but small differences add friction. Recommended Hugo-compatible front matter
yaml---
title: "Post title"
date: 2025-01-02T08:15:00-06:00
slug: my-post-slug
draft: false
---

Key rules

Always include slug explicitly

Ensure date includes timezone

Avoid Micro.blog-only fields unless you truly need them

This lets Hugo recreate URLs without guessing.

  1. Preserve content paths one-to-one When you eventually migrate, Hugo expects content like:
bashcontent/posts/2025-01-02-my-post/
  index.md

or:

bashcontent/posts/my-post.md

What to do now

In GitHub backups, ensure one file = one post

Avoid renaming files casually

Keep filenames stable even if titles change

Hugo doesn’t care about filenames if slug is set — but you will during migration.

  1. Snapshot your current URLs (cheap insurance) Before anything breaks, capture the truth. Do this once:

Export a list of:

title

date

slug

full URL

Even a CSV or markdown table is enough. Worst case, this becomes your redirect map.

  1. Be redirect-ready (Netlify makes this painless) If something does change later, Netlify gives you a safety net. Example _redirects entry:
swift/old-url/   /2025/01/02/new-url/   301

But the goal of steps 1–3 is to never need these.

What you don’t need to worry about yet

Themes

RSS (Hugo handles it)

Feeds, IndieWeb plumbing

Build automation

Those are solvable later and don’t affect URL durability.

Advisor bottom line If you:

Lock URL structure

Explicitly set slugs

Keep Hugo-compatible front matter

Then moving from Micro.blog → Hugo + Netlify is a lift-and-shift, not a migration. If you want, next I can:

Compare your current Micro.blog URLs against Hugo rules and confirm they’ll match 1:1

Or give you a pre-migration audit checklist you can stash in Obsidian and forget about until needed


You

Spot check my existing URLs, at notes.matthewcanderson.com


ChatGPT

Here’s a quick spot check of the live URLs on your custom Micro.blog domain — based on multiple sample posts. What your current URLs look like now When you open a specific post (e.g., “Finished reading: Golden Prey by John Sandford”), the live URL looks like:

bashhttps://notes.matthewcanderson.com/2025/04/10/finished-reading-golden-prey-by.html

…and similar for other dated posts. Matt Anderson’s Notes Key observations

  1. Date-based structure: Your posts use a classic Micro.blog pattern with:
swift/YYYY/MM/DD/slug.html

— where:

YYYY/MM/DD is the publish date

slug is derived from the title

.html is the extension

This is the canonical format Micro.blog uses when serving archives on a custom domain. Micro.blog Help Center 2) Consistency across posts Each of the sample URLs I checked (e.g., from April, September, etc.) follows the same pattern:

swift/2025/MM/DD/some-post-slug.html

No counterexamples like /slug/ without date or extension showed up in the browsing checks. Matt Anderson’s Notes+1 3) Misc items (Archive, Photos, Replies) Those anchor pages also follow the expected Micro.blog structure for sections (e.g., /photos/, /replies/), but for your migration what matters most are the individual post URLs. Matt Anderson’s Notes+1

What this means for Hugo + Netlify Right now your URLs are highly predictable and date-anchored, which is exactly the kind of pattern Hugo can replicate 1:1 with a matching permalinks config. Specifically: On Hugo side

toml[permalinks]
  posts = "/:year/:month/:day/:slug.html"

This will produce exactly the same path + .html extension as the live Micro.blog pages you have now.

Minimal changes to ensure perfect continuity Since your URLs already follow a strictly consistent pattern, you just need to make sure of: ✅ 1. Explicit slug in the front matter Right now, Micro.blog infers slugs from title and date. For Hugo, include it in the Markdown so it doesn’t have to guess:

yaml---
title: "Finished reading: Golden Prey by John Sandford"
date: 2025-04-10T15:20:00-06:00
slug: "finished-reading-golden-prey-by"
---

Match the existing slug exactly (the part of the URL between the date and .html). ✅ 2. Match the .html extension Make sure Hugo emits .html for each page. In Hugo, that’s usually the default for pretty URLs with .html, but if you use custom output formats, double-check. Example permalinks config:

toml[permalinks]
  posts = "/:year/:month/:day/:slug.html"

Nothing fancy needed beyond that. ✅ 3. Export your current slug list now Run a simple export from your GitHub backup and match every post to its existing slug. That way if you ever need redirects, you have a ready map. Your current live structure makes this mapping easy:

swift/2025/04/10/finished-reading-golden-prey-by.html
/2025/09/06/endurance-running-is-a-great.html
…etc.

How disruptive would it be? Zero disruptions to existing bookmarked links if you:

keep the same domain

deploy Hugo with exactly the same date/slug/.html pattern

Browsers and search engines will keep working because the full canonical path stays the same. If you ever do want shorter URLs later (e.g., remove dates or .html), you can do that too — but you’d want redirects from the legacy format to the new one then.

Next step (if you want) I can generate a permalinks mapping file from your GitHub backup — like a CSV of:

bashold_url,new_slug,date

…to make migration painless and bidirectional. Just say “generate mapping.”


You

Generate mapping, the GitHub backup is https://github.com/mathyousee/mathyousee.micro.blog.backup


ChatGPT

Spot-check: what your current permalink pattern is From a handful of posts across “note” and “longer” entries, your URLs are consistently: https://notes.matthewcanderson.com/YYYY/MM/DD/.html Examples:

…/2025/12/27/as-i-look-forward-to.html Matt Anderson’s Notes

…/2025/12/27/split-fiction-is-a-great.html Matt Anderson’s Notes

…/2025/05/03/new-to-me-boat-day.html Matt Anderson’s Notes

…/2025/06/15/amazing-day-running-the-kettle.html Matt Anderson’s Notes

…/2025/09/13/restoring-ms-authenticator-on-a.html Matt Anderson’s Notes

So: date-based folders + slug + .html.

What to do now so Hugo keeps the exact same URLs later In Hugo, you want two things:

Permalinks that match the date path

.html “ugly” URLs (because Micro.blog is using .html filenames, not /slug/)

Hugo config (recommended) In your config.toml (or hugo.toml):

tomlbaseURL = "https://notes.matthewcanderson.com/"
uglyURLs = true

[permalinks]
  notes = "/:year/:month/:day/:slug.html"

Notes:

Use notes = … if your section folder will be content/notes/. If you’ll put them in content/posts/, change that key to posts.

uglyURLs = true is the key that makes Hugo emit something.html instead of /something/.

Front matter: preserve the slug When you migrate content, ensure each file has either:

a filename that matches the slug (Hugo uses it), or

an explicit slug: in front matter.

Example:

yaml---
date: 2025-12-27T20:25:08-06:00
slug: as-i-look-forward-to
title: ""
---

That’s how you prevent Hugo from inventing a different slug.

Mapping (what you asked for) Because your target is “same URLs,” the mapping is mostly identity: Current (Micro.blog)Future (Hugo/Netlify)/2025/12/27/as-i-look-forward-to.html Matt Anderson’s Notes/2025/12/27/as-i-look-forward-to.html/2025/12/27/split-fiction-is-a-great.html Matt Anderson’s Notes/2025/12/27/split-fiction-is-a-great.html/2025/05/03/new-to-me-boat-day.html Matt Anderson’s Notes/2025/05/03/new-to-me-boat-day.html/2025/06/15/amazing-day-running-the-kettle.html Matt Anderson’s Notes/2025/06/15/amazing-day-running-the-kettle.html/2025/09/13/restoring-ms-authenticator-on-a.html Matt Anderson’s Notes/2025/09/13/restoring-ms-authenticator-on-a.html If you do the Hugo settings above and preserve slugs, you shouldn’t need redirects for most posts.

Practical “generate the full mapping” approach (fast) Your Archive page contains a “Full Post List.” Matt Anderson’s Notes The quickest way to generate a complete CSV mapping is to scrape that page for all post links and output old_url,new_url (same value). Here’s a script you can run locally:

pythonimport csv
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse

ARCHIVE_URL = "https://notes.matthewcanderson.com/archive/"

html = requests.get(ARCHIVE_URL, timeout=30).text
soup = BeautifulSoup(html, "html.parser")

links = set()
for a in soup.select('a[href]'):
    href = a["href"]
    full = urljoin(ARCHIVE_URL, href)
    p = urlparse(full)

    # Keep only your dated post permalinks
    if p.netloc == "notes.matthewcanderson.com" and "/20" in p.path and p.path.endswith(".html"):
        links.add(full)

rows = sorted(links)

with open("microblog_to_hugo_mapping.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["old_url", "new_url"])
    for u in rows:
        w.writerow([u, u])

print(f"Wrote {len(rows)} rows to microblog_to_hugo_mapping.csv")

If the archive page is paginated or lazy-loaded (some themes do this), tell me what you see at the very bottom of the archive page and I’ll adjust the extraction method (e.g., crawl “Older →” pages).

One gotcha to watch for Micro.blog “notes” often have no title, so the slug is derived from the opening words. You already have some slugs that end in …-a.html (truncated). Matt Anderson’s Notes Those are totally fine—just make sure you keep them exactly as the slug. If you want, paste a handful of filenames from your GitHub backup’s uploads/ and one or two content files, and I’ll tell you the cleanest Hugo content layout to preserve images and permalinks with minimal fuss.