Blog Migration Tool

Your blog archive,
beautifully migrated.

Convert hundreds of HTML posts to clean Markdown — with enrichment, validation, and full pipeline visibility. Post by post. Every issue surfaced.

577Posts processed
12HTML issue checks
0Issues remaining
Mac · Win · LinuxPlatforms

Everything your migration needs.

A complete pipeline from raw HTML to published Markdown.

⬇

Ingest from anywhere.

Live blog URL or local directory. Automatic platform detection for Blogger and WordPress. Images downloaded, localised, and Wayback-fallback'd during ingest.

Post list showing pipeline states
⚑

12 HTML checks. Zero surprises.

Broken images, tracking pixels, external refs, WordPress chrome, malformed code blocks — every issue surfaced before you generate Markdown. Dismiss what you've reviewed.

Issues panel
◈

Stage, review, publish.

Edit Markdown in the split-pane editor with autosync scroll. Stage your changes alongside the current version, review the diff, accept or reject — never lose work.

Split pane editor

Development diary.

May 17, 2026

Archive Quality: Three Pipeline Bugs and What Caused Them

The Quarkus server is done. The Electron packaging is done. With the migration tool itself complete, I turn...

enrichment
April 21, 2026

Phase 6: The JEP is gone

When Phase 5 finished, the JEP call count was 22. After six weeks of incremental porting, the number is zer...

Quarkus
April 17, 2026

Phase 5: Porting Python's HTTP enrichment pipeline to Java

Phase 5 is enrich.py — 350 lines that transform a raw blog post HTML file into an archive-ready version. Yo...

Quarkus
April 15, 2026

Phase 4: Porting 16 HTML issue detectors from BeautifulSoup to Jsoup

Phase 4 is the scan pipeline — scan_html.py, 780 lines, 16 issue detectors, the most-used operation in the ...

Quarkus
April 15, 2026

Phase 3: BeautifulSoup to Jsoup — porting DOM manipulation

Phase 3 ports the HTML manipulation layer: a DRL code reformatter, an XML pretty-printer, a code block fixe...

Quarkus
April 15, 2026

Phase 2: Porting state.py — 368 lines, 27 edge cases, one JSON file

state.py is where Sparge tracks everything that happens to a post: when the HTML was last scanned, what iss...

Quarkus
April 15, 2026

Phase 1: When Python's mutable dict becomes a Java record

Sparge is a blog migration tool — it ingests HTML posts from live blog URLs, enriches them, and converts th...

Quarkus
April 15, 2026

Phase 0: Quarkus speaks Python (via JEP)

Phase 0 is done. Quarkus is handling all 35 API endpoints, every call delegated to Python via JEP.

Quarkus
April 13, 2026

v1.0.0, the CI obstacle course, and the Quarkus plan

v1.0.0 is tagged. Getting there took four tag pushes, three Windows CI failures each masking the next, and ...

Release
April 10, 2026

Sparge Goes Native

Sparge is now a desktop app. Not a web server you start from a terminal — an actual .app you open, with a d...

Electron
April 9, 2026

The Archive Room

A UI redesign that gives Sparge its identity — parchment, ink, and slate. Warm instead of cold. Archive ins...

Design
April 5, 2026

The Edit Experience

Sparge could review posts. What it couldn't do was edit them comfortably. The HTML editor was a plain texta...

UI
April 5, 2026

Content Fidelity

Sparge ingested HTML cleanly. What it didn't do was preserve the content that WordPress had embedded rather...

Pipeline
April 4, 2026

Sparge Is Born

The two-panel reviewer worked. At this point I had something that solved my immediate problem — but I also ...

Launch
April 3, 2026

Two Apps, One Tool

I needed the archived HTML and the generated Markdown side by side, with the validation issues visible, wit...

Architecture
April 1, 2026

KIE Archive: Day Zero

Fifteen years of posts on blog.kie.org. 577 mine — on Drools, rule engines, PHREAK, backward chaining, the ...

Archive
Read all posts →