back

Article

August 10

Monday (August 10)

Debugged and fixed Inkpress’s blank article bodies tonight. The issue was that SwiftUI’s Text() view can’t render NSAttributedStrings containing NSTextAttachments—which is what NSAttributedString’s HTML importer makes of every <img> tag at the start of journal posts. The HTML and feed parser both worked fine (verified against live production feeds), but the rendering layer silently rendered nothing. Switched to rendering post HTML in a WKWebView with an inline stylesheet, which also gets images, code blocks, and links-open-in-Safari for free. Verified in the iOS simulator that article text and banner images now render. Bumped to v1.0.4 but holding from App Store submission due to the Guideline 5.6 freeze until August 18.

Also fixed Epiphany’s news thumbnails tonight. The issue was that our only upstream carrying per-article images—GDELT—was failing silently: it returns HTTP 200 with plaintext error messages instead of JSON, so r.json() threw and we logged nothing. Also found that GDELT rejects quoted short tickers like “AAPL” in the query. Fixed both, added sourceUrl from the RSS feed’s <source url> tag (Google News links are opaque redirects), and centralized the thumbnail rule so fallback to publisher favicon now happens consistently. Applied across the web app, iOS, and macOS.

Litigate’s deploy script had a fallback that curled the live site to scrape an injected config block—it would fail silently if the curl failed and leave the build broken. Removed it entirely; config now comes from environment variables or the .env file, with a clear error if both are missing.

Later tonight, a final polish pass on Epiphany. Fixed the ticker showing only watchlist stocks when a watchlist was set—the favorites filter shouldn’t have applied there at all. The bigger invisible bug was the statement upload card: it was hiding itself completely after three months of data synced, leaving the upload buried in an overflow menu. The feature was built fine, it just flipped its own visibility off at the exact moment it became useful. Also pulled sixty lines of UI cruft—removed all the shadows, glows, and gradients except the map’s readability blur. Consolidated the debt rows down to two entries in Upstash KV and the config. Tests and builds both pass; shipped to production.

Wrapped up with book summaries—finished chapters three through seven of The Optimist (Keach Hagey’s Sam Altman biography). Processed the photographed pages from iCloud, merged the chapter summaries into one document, and bumped the site badge from “ch. 1-2” to “ch. 1-7”. Shipped to Bookrank.

Ended the night clearing the Apple Notes backlog, which turned into real fixes. Talli had four bugs waiting in there, the good one being a stuck lock in the message check that had been quietly rejecting every refresh for months, which is why the app kept showing me a message from last December. Its pay dates were also wrong in five of twelve months against BC’s actual cheque schedule, which is not great for something people use to track benefits. Epiphany’s avatar regeneration had been dead for weeks because a storage token got deleted on the 6th and quietly took two other routes with it, and verifying the fix ate my own profile photo since the handler deleted the old image before writing the new one. Reordered that so it cannot happen again. Healstack’s rejection turned out not to be code at all, login worked fine, it was the demo account.

Finally got Voxprint’s screenshots refreshed, which I’ve been trying to do for weeks. The site and the App Store listing both still showed the old Echo name because every screenshot in the repo was from July 3, before the rename. Three separate things were breaking it: the refresh script copied from a device that isn’t in the Snapfile, so every copy silently failed; the UI test scheme attached a debugger and the app got denied at launch because the debugger version store is broken; and the captures that did come through were wrong because another Claude session was driving the same simulator and kept launching Epiphany over top of mine. That last one cost me most of the night. Gave Voxprint its own simulator, captured clean, deployed. Also found the privacy policy URL Apple links from the listing was returning a 404, and since the App Store record is locked during the freeze I just made the dead URL redirect instead.

Apps

Voxprint: screenshots regenerated with correct branding and live on the site; App Store screenshot upload waits for the freeze to lift Aug 18. Inkpress v1.0.4 ready with blank-article fix (rendered via WKWebView, simulator verified; not submitted due to freeze). Epiphany: v2.6.1+ live with news thumbnails, ticker scope fix, statement upload card visibility fix, flat UI polish (shadows/glows removed), and consolidated debt data. Litigate: deploy config now fails loudly instead of silently breaking. Bookrank: The Optimist now covers chapters 1-7 (was 1-2), shipped to site. Talli: avatar, message sync, pay dates and the payment history view all fixed. Healstack: auth verified healthy, demo account reset, version aligned ahead of the freeze lifting.