Notes | Sparge
Phase 6: The JEP is gone
When Phase 5 finished, 22 JEP calls remained. After Phase 6 — four child issues, seven groups, the convert pipeline as the final boss — the JEP bridge is gone. Sparge is pure Java.
Phase 5: Porting Python's HTTP enrichment pipeline to Java
Phase 5 ports the enrich pipeline — 350 lines transforming raw HTML into archive-ready output. YouTube embeds, image downloading, HTTP client replacement, and the session state that ties it together.
Phase 4: Porting 16 HTML issue detectors from BeautifulSoup to Jsoup
Phase 4 ports the scan pipeline — 780 lines, 16 issue detectors, the most-used operation in the whole tool. BeautifulSoup to Jsoup: the API is a closer match than expected.
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 detector, and a CSS selector generator. Pure text and DOM work — no subprocess boundary, no JE...
Phase 2: Porting state.py — 368 lines, 27 edge cases, one JSON file
Phase 2 ports the state layer — where Sparge tracks everything that happens to a post. The deep merge problem, stale detection, and why TDD mattered more here than anywhere else in the migration.
Phase 1: When Python's mutable dict becomes a Java record
Phase 1 of the Python-to-Quarkus migration ports the config layer. The strategy is incremental: JEP bridge established, now replacing Python module by module, starting with the parts that are safes...
Phase 0: Quarkus speaks Python (via JEP)
Phase 0 complete: Quarkus handles all 35 API endpoints, every call delegated to Python via JEP. The architecture held — until a threading constraint in CPython's GIL forced a single shared interpre...
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 one discovery that GitHub Pages won't enable itself.
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 dock icon and everything.
What I was trying to achieve: a UI that looked like something I’d actually want to use
A UI redesign that gives Sparge its identity — parchment, ink, and slate. Warm instead of cold. Archive instead of terminal.
What I was trying to achieve: an editor worth using
Sparge could review posts. What it couldn't do was edit them comfortably. The HTML editor was a plain textarea — workable for short changes, unusable for a post where the entire article body was on...
What I was trying to achieve: stop losing content on ingest
Sparge ingested HTML cleanly. What it didn't do was preserve the content that WordPress had embedded rather than written — YouTube iframes stripped silently, GitHub Gists removed without a trace.
What I was trying to achieve: learn vibe coding on a real problem
The two-panel reviewer worked. At this point I had something that solved my immediate problem — but I also had a more interesting opportunity.
What I was trying to achieve: see a post properly
I needed the archived HTML and the generated Markdown side by side, with the validation issues visible, without constantly switching files. Three things in one place. The scripts gave me none of them.
What I was trying to achieve: get my old KIE blog posts into Jekyll
Fifteen years of posts on blog.kie.org. 577 mine — on Drools, rule engines, PHREAK, backward chaining, the full arc of the KIE project. I wanted them on my own site, under my own control, published...