<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://journal.heyitsmejosh.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://journal.heyitsmejosh.com/" rel="alternate" type="text/html" /><updated>2026-08-09T21:08:19-07:00</updated><id>https://journal.heyitsmejosh.com/feed.xml</id><title type="html">nulljosh</title><subtitle>Notes, thoughts, and project updates</subtitle><author><name>Joshua Trommel</name></author><entry><title type="html">Releases</title><link href="https://journal.heyitsmejosh.com/2026/08/06/releases/" rel="alternate" type="text/html" title="Releases" /><published>2026-08-06T12:00:00-07:00</published><updated>2026-08-06T12:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/08/06/releases</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/08/06/releases/"><![CDATA[<p><img src="/assets/2026-08-06-releases.svg" alt="August 6" /></p>

<h2 id="thursday-august-6">Thursday (August 6)</h2>

<p>Voxprint macOS 1.3.6 shipped live today — Apple approved the rename build I pushed five days ago. iOS 1.3.6 is still waiting in review (submitted Aug 3), so the Mac version sneaked through first. Updated the App Store landing page to point at voxprint.heyitsmejosh.com and fixed a stray marketingUrl reference that was still pointing at the old echo domain.</p>

<p>Finished Inkpress’s overdue redesign tonight. The icon had become a invisible hairline sketch on dark—swapped it for a bold amber nib glyph. Added a real loading spinner to the feed view so it doesn’t feel frozen during background syncs. Built out a landing page at inkpress.heyitsmejosh.com on Cloudflare Pages (DNS verified, live), so it actually has a storefront now instead of just an App Store link.</p>

<p>Migrated Healstack from Vercel to Cloudflare Pages. The wrangler config had gotten tangled trying to be both at once, so stripped out the Vercel-only settings and redeployed. Restyled the landing page to match the Lexly design system (header, hero, features, status grid).</p>

<p>Completed the Lexly masterclass integration—built the converter script and shipped all 15 book summaries live. Found and fixed a converter bug on the first run (h3 subheadings weren’t handled, fell into an infinite loop instead of erroring). Widened the check to catch any heading level and reran clean.</p>

<p>Litigate got light-mode support with manual override toggle (detects system preference via <code class="language-plaintext highlighter-rouge">prefers-color-scheme</code>). Designed a minimalist gavel SVG for the favicon and PWA manifest that reads clean in both themes. Fixed a stray sign-in screen that still said “Brief” instead of “Litigate” on both iOS and macOS—the app renamed July 18 but the Text() view got missed.</p>

<p>Swept through roadmap consolidations across seven repos (epiphany, sparkjar, lexly, litigate, uprighty, nyc, talli), merging duplicate entries and pruning stale items. Verified Sparkjar’s Vercel production already has the right env vars wired, and confirmed the consolidation passes didn’t miss anything actionable.</p>

<p>Added seven new skills to dotfiles: mail-sweep, wrapup, architecture-svg, duolingo, git-sweep, localization-sweep, and trakt. The trakt skill was built earlier with a stdlib-only Python OAuth device-code client; the others scaffold the next batch of automations.</p>

<h2 id="friday-august-7">Friday (August 7)</h2>

<p>Renamed the Uprighty app to Bookrank tonight after App Store Connect rejected “Uprighty” as a duplicate. Tried and landed on “Bookrank” after cycling through Shelved, Stacked, Booknook, Bookline, and Litshelf (all taken). Propagated the rename everywhere: ASC app record (appInfoLocalizations), GitHub repo from <code class="language-plaintext highlighter-rouge">nulljosh/uprighty</code> to <code class="language-plaintext highlighter-rouge">nulljosh/bookrank</code> with local git remote updated, domain moved from <code class="language-plaintext highlighter-rouge">spine.heyitsmejosh.com</code> to <code class="language-plaintext highlighter-rouge">bookrank.heyitsmejosh.com</code> (Cloudflare CNAME added and old one deleted), repo CNAME file, README, metadata JSON (supportUrl/privacyPolicyUrl), iOS/macOS CFBundleDisplayName/CFBundleName, and regenerated the Xcode project via xcodegen. Updated the portfolio site index.html link. All changes committed and pushed across uprighty/bookrank repo, nulljosh.github.io, and the Code meta-repo. Deliberately left the local folder at <code class="language-plaintext highlighter-rouge">~/Documents/Code/uprighty</code> (not renamed).</p>

<p>Spent the evening fixing Epiphany’s bank-statement upload feature. The Blob store had been set as public by default, but the code needs private access for sensitive statements — and Vercel won’t let you change a store’s permissions after it’s created. Created a new private Blob store and repointed the code to use its token explicitly via <code class="language-plaintext highlighter-rouge">EPIPHANY2_READ_WRITE_TOKEN</code>. Also verified the deploy pipeline was actually working end-to-end (push-to-Vercel confirmed via the API), since earlier reports that it was “still broken” made me wonder if deploys were even firing at all.</p>

<p>Filed two stray Apple Notes into the system tonight: a personal note about money owed with Mom got moved into the wiki’s personal-accounts page, and a vague “Lexly Mac OS Issues” note was expanded and logged into Lexly’s roadmap. Cleared out the Notes inbox completely after that.</p>

<p>Later in the night, fixed Epiphany’s avatar lookup returning 500 errors — the Blob store SDK’s keys() method wasn’t being called correctly. Also tightened up the search suggestion dropdown appearance over busy map terrain (changed from ultra-thin to regular material for readability). Went through and pruned nine completed items from the roadmap to keep the backlog manageable.</p>

<p>Fixed the portfolio memoji avatar tonight—been bothering me for months that it looked fuzzy. Turned out the source was just a 128px screenshot; swapped it for a proper 512px cutout with the background removed and now it reads sharp. First pass cropped a bit too tight and clipped the chin—recropped with padding around the face and it’s right now.</p>

<h2 id="saturday-august-8">Saturday (August 8)</h2>

<p>Cleared the Apple Notes inbox—11 items archived. Fixed two critical bugs that had blocked shipping: Voxprint iOS 1.3.6 and Bookrank iOS 1.0 were stuck in review with phantom rejections, so I cancelled and resubmitted each via the API (now WAITING_FOR_REVIEW). Verified two other things that looked like bugs but weren’t: Portfolio’s animoji is actually live, and Sparkjar’s old TestFlight icon is just a stale build. Shipped Lexly’s branded splash and login logo (native SwiftUI), and wired up Epiphany’s Yelp location hours as open/closed badges across the app and web (live now). Also checked personal finances and filed an idea to the wiki.</p>

<h2 id="sunday-august-9">Sunday (August 9)</h2>

<p>Added error handling and diagnostic logging to Epiphany’s avatar upload flow—the KV and Blob store calls were missing try/catch blocks. This is a diagnostics pass on yesterday’s 500-error fix, so the real root cause should surface more clearly if it happens again. Fixed the ship-mac workflow after the ASC CLI renamed a parameter (<code class="language-plaintext highlighter-rouge">--pkg-path</code> became <code class="language-plaintext highlighter-rouge">--ipa-path</code>), and added <code class="language-plaintext highlighter-rouge">--overwrite</code> to avoid stuck uploads. Verified that Litigate’s RLS policy for case documents already has the <code class="language-plaintext highlighter-rouge">WITH CHECK</code> guard we were looking for, so no code fix was needed there—just marked it done in the roadmap.</p>

<p>Spent the evening processing book summaries for the Bookrank site. Finished three new chapters of “The Optimist” (Sam Altman/OpenAI biography)—prologue, chapter 1, and chapter 2—and published them live with a badge. Discovered that “Data Science For Dummies” had silently sat incomplete for weeks; the memory note claimed it was done, but chapter 20 was never summarized and 175 raw photos were still sitting in the backlog untouched. Cleaned and summarized chapter 20, so that book is now genuinely complete. Started “AI in Business For Dummies” and summarized the introduction chapter. Had to trace through the folder history (spine→uprighty→bookrank repo renames) and re-clone the project locally since the original wasn’t on disk anymore.</p>

<p>Finished clearing the entire book-photo backlog tonight. Wrapped up three new books for the site: AI in Business (chapters 1–2 with badge live), Accounting for Canadians (intro through chapter 3 with badge live), and macOS Tahoe (intro plus chapters 1–2 with badge live). The queue is genuinely clear now except for one book that’s still waiting to have its chapters photographed.</p>

<p>Spent the late evening debugging App Store Connect review statuses. Found a real bug in the asc-login script—it was asking for a 2FA code before ever contacting Apple, which is backwards. Rewrote it to call asc web auth login directly and let Apple’s prompt drive the flow. Upgraded the asc CLI to the latest version, but login kept failing with an SRP signin error even after the fix; suspect it’s a cached terminal session and needs a fresh tab to resolve. Investigated four apps with genuine App Review rejection reasons (Transcriptly, Wiretext, NYC Survive, Curvely) that aren’t exposed via the public API—they all need dashboard access to see the actual rejection text. Tried fixing Curvely’s empty release notes but discovered Apple doesn’t allow first-version apps to set What’s New (no prior version to diff against), so that’s not a bug to fix.</p>

<p>Earlier tonight: Epiphany’s map search suggestion dropdown now has an opaque backing so the map terrain doesn’t bleed through and make the suggestions unreadable. Also closed out the stale Echo-to-Voxprint web copy item in the roadmap. Late evening: Inkpress v1.0.3 shipped. The 2026-08-06 icon redesign and loading indicator had never shipped—bumped to v1.0.3 (build 202608092030) and rebuilt the stale App Store screenshot (seeded 4 demo feeds into the sim: journal, Daring Fireball, The Verge, Hacker News; captured on iPhone 14 Plus at full 1284×2778 pixels in light mode). Fixed two blockers: the icon 1024px file had an alpha channel, which failed Apple’s ITMS-90717 validation (flattened it onto opaque #161412), and added encryption compliance flags to the build + Info.plist. Fixed a stale CLAUDE.md note about the scheme name (was <code class="language-plaintext highlighter-rouge">-scheme Inkpress</code>, real scheme is <code class="language-plaintext highlighter-rouge">Journal-iOS</code>). Submitted v1.0.3 for review. Simulator shut down and quit.</p>

<p>Rewrote Newsline tonight — turned it from a website into a dependency that other people’s code can call. Added query params to the API (<code class="language-plaintext highlighter-rouge">/api/stories</code> now filters by view, outlet, bias, blindspot, plus full-text search and limit), and built an MCP server at <code class="language-plaintext highlighter-rouge">/mcp</code> with two methods (<code class="language-plaintext highlighter-rouge">get_news</code> and <code class="language-plaintext highlighter-rouge">get_blindspots</code>) to integrate with Claude and other agents. Wrote the API docs (OpenAPI spec) and security policy. Surfaced three production bugs while testing against live feeds: the CDN was caching query-string variants as the same response (responses now go no-store to avoid collision), filtering was happening <em>after</em> the 120-item cap so low-volume outlets had nothing left to return (reordered to filter first), and the feed parser was only matching RSS <code class="language-plaintext highlighter-rouge">&lt;item&gt;</code> elements, never Atom <code class="language-plaintext highlighter-rouge">&lt;entry&gt;</code>—Daring Fireball had been silently contributing zero items since it was added. Also added HTML entity decoding for titles. Pruned five feeds that weren’t returning anything (Reuters, AP, MSNBC, CTV, Washington Post); 17 outlets now remain, each verified live against real feed pulls.</p>

<p>Also recovered Cadence’s source code tonight from a Vercel deployment snapshot and migrated it to Cloudflare Pages Functions—the stats view and heatmap are now working on the new platform. Lexly got a forgot-password reset flow wired in. Nimble’s web app moved to Cloudflare Pages too, and I fixed a payload-key bug in the answer proxy.</p>

<p>Finished the Newsline distribution push later tonight. Published the MCP server to the official registry as <code class="language-plaintext highlighter-rouge">io.github.nulljosh/newsline</code> (status active, remote streamable-http). Added GitHub topics to the repo and rewrote its description to say “MCP server + JSON API” so people discovering it know it’s a dependency, not just a website. Advertised both the API and the MCP server on the site itself (footer with curl + <code class="language-plaintext highlighter-rouge">claude mcp add</code> lines, links to llms.txt and openapi.yaml for docs). Also drafted Show HN and r/mcp posts and opened a PR to the official awesome-mcp-servers list on GitHub (opted into their fast-track PR review, should see feedback within a day or two).</p>

<p>Audited all projects under ~/Documents/Code for password-recovery and email-verification gaps. Added forgot-password flows to Lexly and Litigate—both now send email reset links and verify the token before allowing a password change. Sparkjar added optional signup verification emails (soft gate, existing accounts grandfathered, login never blocked). BCGD’s dashboard auth screen got rewritten to support password recovery for admin sign-in. All code pushed. Lexly deployed live to Cloudflare Pages (project <code class="language-plaintext highlighter-rouge">lexly-heyitsmejosh</code>, verified at lexly.heyitsmejosh.com/app/; forgot-password flow working). Litigate deployed live to Cloudflare Pages (project <code class="language-plaintext highlighter-rouge">litigate</code>, verified at litigate.heyitsmejosh.com). Sparkjar deployed to Vercel production (verify-email endpoint returns 302 as expected). Critical finding: sparkjar has no SMTP env vars on Vercel and never has—both the password-reset and new email-verification flows ship successful responses but silently no-op on sending. Fix is Resend (epiphany already uses it), not SMTP: needs RESEND_API_KEY env var, sparkjar domain added to Resend + DKIM/SPF records in Cloudflare. Logged to sparkjar/roadmap.md. Not fixed this session.</p>

<p>Late evening audit of every app’s authentication state. Found that Sparkjar was assumed to be the last one needing password recovery and email verification, but it’s actually the most complete—it has both implemented, though mail.js silently no-ops on Vercel without SMTP environment variables. Epiphany, Healstack, Litigate, and Roost already have both features working. The real remaining work is Talli (has neither forgot-password nor email verification built yet) and Lexly (signup and login UI only, no recovery or verification paths). Added three roadmap items: sparkjar needs SMTP_HOST/USER/PASS/FROM verification in prod, Talli needs both features built, and Lexly the same.</p>

<h2 id="apps">Apps</h2>

<p>Bookrank: Data Science For Dummies completed (chapter 20 added), The Optimist summary added (prologue + ch. 1–2 with badge), AI in Business intro started. Voxprint macOS 1.3.6 shipped live, iOS 1.3.6 resubmitted after fixing stuck review, roadmap Echo→Voxprint web copy item closed. Inkpress v1.0.3 WAITING_FOR_REVIEW (shipped icon redesign + loading indicator + refreshed App Store screenshot + icon alpha flatten + encryption compliance). Healstack migrated to Cloudflare Pages with refreshed landing. Lexly integrated 15 masterclass summaries (converter infinite-loop bug fixed) + branded splash/login logo shipped + forgot-password reset flow added (Vercel deploy pending). Litigate added light mode + gavel icon + fixed Brief→Litigate sign-in text + verified RLS policy already had WITH CHECK guard + forgot-password reset flow added (deploy pending). Sparkjar added optional email verification on signup (soft gate, existing accounts grandfathered, login never blocked; requires SMTP env vars to send). BCGD dashboard rewrote auth to support password recovery (build clean). Bookrank renamed from Uprighty (ASC duplicate rejection), domain/repo/app-display-names/metadata all updated, iOS 1.0 resubmitted after fixing stuck review. Epiphany’s bank-statement upload fixed (private Blob store provisioned), avatar 500 error fixed with diagnostic logging added, search suggestions now opaque with improved readability over map, Yelp location hours now showing as open/closed badges across iOS/macOS/web, ship-mac workflow fixed for ASC CLI API change. Newsline v0.3.0: turned into API + MCP server dependency (query params for filtering, openapi.yaml + security docs), three production bugs fixed (CDN cache collisions, filter-before-cap reordering, Atom entry parsing + entity decoding), 5 dead feeds pruned (Reuters/AP/MSNBC/CTV/WaPo), 17 outlets verified live. Cadence recovered from Vercel backup and migrated to Cloudflare Pages Functions (stats + heatmap working). Nimble web migrated to Cloudflare Pages, answer-proxy payload key fixed. Roadmaps consolidated across seven repos, nine completed items pruned. Seven new skills added. Apple Notes inbox cleared (11 items).</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="daily" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Stripe</title><link href="https://journal.heyitsmejosh.com/2026/07/31/week/" rel="alternate" type="text/html" title="Stripe" /><published>2026-07-31T12:00:00-07:00</published><updated>2026-07-31T12:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/07/31/week</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/07/31/week/"><![CDATA[<p><img src="/assets/2026-07-31-week.svg" alt="Week of July 31" /></p>

<h2 id="sunday-august-2">Sunday (August 2)</h2>

<p>Finished the NYC autoplay fix. The directive-engine patch from the night before wasn’t the whole story: two other systems were also hardcoding colonist jobs and perpetuating tasks automatically, so removed both. Nimble’s landing page restyled to match the Maybulb design system, Lexly’s profile panel rebuilt Duolingo-style with a larger avatar and icon grid, and Talli’s Bennies tracker moved from its own panel into the Status tab. Fixed a Talli CI regression where the benefit parser had grown three new types since the guard test was written, which had been breaking the GitHub Actions pipeline. Cleared Sparkjar’s stuck review by cancelling the stale submission and filing a fresh one against the existing valid build, getting both iOS and Mac back to waiting-for-review.</p>

<h2 id="monday-august-3">Monday (August 3)</h2>

<p>Audited half the portfolio’s roadmaps and found several items already done but still open in the tracker. Consolidated design tokens so Talli and the portfolio both draw blue accents from the shared system rather than hardcoding them. Scaffolded Facebook OAuth in Epiphany following the Google pattern. Found Epiphany’s Stripe production key had been silently mangled in a debug session, fixed it, and switched the paid tier from a monthly subscription to a $1 one-time purchase gating People search and Daily Brief. Rolled Stripe out to three more apps: Healstack’s CSV export unlock, Sparkjar’s unlimited-posts-and-pinning tier, and Talli’s payment-history unlock with YTD total and bar chart. Caught a Sparkjar auto-deploy that had been silently stuck, keeping the old version live even after pushes, and had to trigger Vercel manually to publish. Backfilled TMDB artwork for 191 of 193 Quotable entries after the iTunes Search API source died, and pushed Curvely’s privacy policy to unblock its first App Store submission.</p>

<p>Submitted four apps for review tonight, each still shipping under its old name. Curvely had been Grapher, Voxprint’s store copy still said Echo, Wiretext cleared 34 submission blockers in one sweep, and Uprighty’s app bundle still called itself Spine. Caught and fixed them one by one before hitting submit.</p>

<p>Later that evening, chasing down deeper branding issues turned into finding a much bigger problem. Voxprint’s splash screen still said Echo (the Sources code had never gotten renamed), Uprighty needed an entitlements file that was missing entirely (iOS target was TestFlight-ineligible), and Sparkjar turned out to have hardcoded a dead domain in every native client — the old spark.heyitsmejosh.com is gone, sparkjar. is live, and every attempted login was hitting a hostname that returns nothing. That domain mismatch was the real reason Sparkjar got rejected, not code. Finished with Sign-in-with-Apple on Sparkjar: both the server endpoint and the iOS client were stubs (server didn’t verify the identity token, client just returned an error message), so getting it to actually work meant implementing the full flow on both sides. Found at wrap time that several items filed as “needs Joshua” weren’t actually blocked — the orphaned Epiphany Mac app record that had been written off as impossible to delete went away in a single CLI call once we tried the actual API. Chased some Talli bugs marked as “needs a device” into the simulator: one was real (a progress bar rendering unconditionally made an empty track appear when the countdown was nil), one turned out to be correct already (the gap everyone thought was bad padding was just the floating tab bar’s safe-area clearance), and the automation was lying (the axe tool reported successful taps that landed off-screen on a 3× device because it uses points not pixels). Found at the very end that two bugs were just found by looking rather than reading: NYC shipped a debug FPS/node-count overlay for live players (showsFPS/showsNodeCount unconditional, now gated behind #if DEBUG and rebuilt), and Talli’s red test suite turned out to be testing a schema the app had abandoned months ago, not a code breakage — fixed by deriving the test keys from data instead of hardcoding them. Synced NYC’s in-app title screen and web page to read “NYC Survive” matching the App Store name (was “TIMES SQUARE / SURVIVAL SIMULATOR” and “Times Square Survival” respectively), build verified, not resubmitted since 1.0.0 is already WAITING_FOR_REVIEW and the screenshots show gameplay not the title screen. Finished debugging Sparkjar’s rejection — the dead-host domain issue was only a symptom. Production auth was fully broken: <code class="language-plaintext highlighter-rouge">useSupabase()</code> destructured <code class="language-plaintext highlighter-rouge">key</code> from a config that returns <code class="language-plaintext highlighter-rouge">anonKey</code>, so every auth path silently skipped Supabase, used Vercel’s temp storage (wiped between requests), and threw accounts away. Four stacked bugs (also bad env formatting without <code class="language-plaintext highlighter-rouge">.trim()</code>, unapplied migration, anon-key RLS policy) all had to be fixed. The one-word typo in the destructure was the root cause the whole time.</p>

<h2 id="tuesday-august-4">Tuesday (August 4)</h2>

<p>Finished ingesting the Apple Notes inbox across the portfolio roadmaps and Obsidian wiki—21 notes fully cleared, all filed into the respective project pages. Found and fixed the root cause of why prior <code class="language-plaintext highlighter-rouge">/work</code> runs kept leaving Notes.app full: note deletion had been delegated to parallel forks and never happened, plus an <code class="language-plaintext highlighter-rouge">osascript</code> call wasn’t finding its absolute path in every shell. Wrote a new <code class="language-plaintext highlighter-rouge">notes-delete.sh</code> in dotfiles that makes deletion a verified main-thread step, so the sweep can’t report done while the inbox is still full. Disabled both the <code class="language-plaintext highlighter-rouge">journal-refresh</code> and another cloud routine that kept failing—they were polling dead repo names and ancestors that no longer exist (dose, brief, spark, lingo, books), so no point keeping them. NYC’s iOS 1.0 and macOS 1.0 are both submitted for review now. Sparkjar’s Supabase auth was completely broken: the destructure grabbed the wrong property (<code class="language-plaintext highlighter-rouge">key</code> instead of <code class="language-plaintext highlighter-rouge">anonKey</code>), so every login silently switched to temporary storage and threw accounts away; fixed that plus four stacked bugs (env formatting, unapplied migration, RLS config, then rebuilt from scratch). The fixes are committed and ready for rebuild+resubmit. Polished a few more rough edges: Curvely’s display name, Epiphany’s hiding the paper-trading autopilot, Talli’s progress bar only showing when there’s actually something to count.</p>

<p>Late evening follow-up work landed across several repos. Nimble’s landing page got a bulb icon redesign to replace the magnifying glass and extracted the design system tokens. Healstack added a real public landing page for signed-out visitors (was showing the login form to everyone). Litigate moved the CASE-0001 ATIP response drafts out of the repo and into the legal folder, then added a real public landing page instead of a bare login screen. Voxprint updated the landing page to show the new app name (Echo had been rebranded to Voxprint weeks ago but the live site still said Echo). Portfolio site now points to voxprint.heyitsmejosh.com and records what the Notes inbox ingest actually resolved (closing items marked complete). Lexly cleaned up stale roadmap notes (cursive font issue and dark icon issue both turned out to be a stale Pages deploy, not actual bugs).</p>

<p>Final wrap session: verified Litigate’s old Cloudflare Pages deployments weren’t leaking case prose—four were empty shells, two were auth-gated and got deleted (roadmap item closed). Curvely and Inkpress both needed the ITMS-90886 entitlements fix (application-identifier wired via CODE_SIGN_ENTITLEMENTS in project.yml), verified via real Release archives and noted that provisioning profiles are now invalidated pending <code class="language-plaintext highlighter-rouge">asc signing fetch</code> before the next upload. Portfolio and app roadmaps swept and pruned to show only open items.</p>

<p>Dead-hostname sweep found and fixed seven mid-life app renames that had never been wired through to all the places they appear: watch + widget targets in Talli pointing at dead <code class="language-plaintext highlighter-rouge">tally.</code>, TallyService remotes in Epiphany iOS + macOS still hardcoding <code class="language-plaintext highlighter-rouge">tally.</code>, Litigate’s App Store privacy-policy URL pointing at deleted <code class="language-plaintext highlighter-rouge">brief.</code>, Healstack with sync endpoints rejecting the real origin because CORS was set to dead <code class="language-plaintext highlighter-rouge">dose.</code>, and Curvely/Inkpress provisioning profiles left untracked after refetch. Root cause caught: <code class="language-plaintext highlighter-rouge">~/Documents/Code</code> itself is a git repo, so child repos get gitignored and a plain recursive grep returns almost nothing (17 hits with <code class="language-plaintext highlighter-rouge">-ignore</code>, 40 without). All seven fixed, all build clean. Provisioning profiles refetched for Curvely and Inkpress. Litigate’s privacy URL needs an ASC metadata push (scheduled as a follow-up). Talli’s watch/widget fixes need a version bump + resubmit to reach users.</p>

<p>Entitlements sweep completed: wiretext, fengshui, quotable, nimble, uprighty, and the portfolio all had missing or mis-placed entitlements, all verified on real Release archives and fixed. Found three latent bugs: nimble’s DEVELOPMENT_TEAM was misplaced in project.yml causing the iOS archive to fail outright, quotable had no DEVELOPMENT_TEAM at all, and uprighty’s macOS needs <code class="language-plaintext highlighter-rouge">com.apple.application-identifier</code> instead of the iOS key. Lexly’s “some lessons don’t load” was finally root-caused as the stale-deploy bug for the third time — fixes existed in git from 07-21, 07-28, and 07-29 but never reached production; all 41 packs are now 200 live. Hygiene pass pruned fictional roadmap lines, fixed dead deploy scripts, and deleted the stale nulljosh-portfolio Pages project across 11 repos. Epiphany shipped macOS statement upload + map autocomplete (iOS + macOS), moved statements to Vercel Blob (4MB → 25MB free tier), and fixed app icon alpha transparency. Sparkjar’s security fix went deeper than expected: the anon_read_users RLS leak returned every user’s bcrypt password_hash, password_salt, email, and reset_token — the anon key ships in web/iOS/macOS clients. Fixed by moving those reads to service-role, revoking blanket anon SELECT, and re-granting only public columns. Code deployed first (bare <code class="language-plaintext highlighter-rouge">catch {}</code> in findUserByUsername falls through to /tmp, so migration-first would’ve wiped accounts), then migration. Verified: <code class="language-plaintext highlighter-rouge">anon select password_hash</code> now returns 42501 permission denied.</p>

<p>Two new blockers filed: Lexly macOS 1.1.1 was REJECTED 2026-08-04 (submission a91ea668, state UNRESOLVED_ISSUES, 2026-08-02 submit date). iOS 1.1.3 unaffected. Rejection text is Resolution Center only; <code class="language-plaintext highlighter-rouge">asc review</code> has no subcommand and <code class="language-plaintext highlighter-rouge">asc web review show</code> hits 2FA wall. Stale-deploy theory ruled out (app bundles its catalog locally, site staleness can’t cause app rejection). Leading hypothesis: review demo account <code class="language-plaintext highlighter-rouge">jatrommel@gmail.com</code> was flagged 2.1 on the old standalone Mac record; merged record likely declares the same credentials. Epiphany’s deploy wiring is unverified (.vercel/project.json missing locally, same drift class just fixed in nimble). The Blob statement change is server-side and won’t deploy without the config file.</p>

<p>Nightly wrap session dispatched six parallel agents across the backlog and found something worth remembering: three complaints that had been bouncing around for weeks—font styling, icon quality, journal-portfolio sync—all traced back to the same pattern. A deploy step that silently never ran. Lexly had been serving a two-week-old build because Cloudflare Pages wasn’t connected to git. Curvely shipped a pre-rename build. The portfolio sync script had edited files and left them uncommitted. Six agents running in parallel drained a third of the session budget in four minutes, which is the real lesson there—nice for batching, harsh on tokens.</p>

<p>Later: Two rename decisions were reviewed and finalized. Nimble keeps its name despite the maybulb.com studio conflict—it’s a known risk, revisit only if App Review rejects. Wiretext’s rename to Charwork is still approved but deliberately parked, not urgent, work on it later. Both roadmaps updated.</p>

<p>Late evening (August 4): Ran a comprehensive wrap sweep across 18 repositories. Entitlements sweep finished across Curvely, Fengshui, Inkpress, Nimble, Quotable, Uprighty, and Wiretext—all missing or misplaced ITMS-90886 entitlements fixed and verified on Release archives. Dead-hostname sweep completed, fixing seven apps that had hardcoded old domain names: Talli watch+widget pointing at tally., Epiphany iOS/macOS pointing at tally., Litigate’s privacy policy pointing at brief., Healstack CORS origin set to dead dose., Curvely and Inkpress provisioning profiles refetched. Found and closed three latent build bugs: Nimble’s DEVELOPMENT_TEAM was misplaced, Quotable had no DEVELOPMENT_TEAM at all, and Uprighty’s macOS needs the wrong entitlements key. Roadmap prune across all touched repos. Portfolio: removed duplicate 2026 year entry in work list and converted the memoji avatar from PNG to scalable SVG.</p>

<p>Epiphany’s app icon got a design pass—took it from lime green back to the system blue, updated the favicon to match, regenerated all PNG sizes, and queued the build for v2.5.4 on ASC.</p>

<p>Built the Duolingo skill scaffold tonight with SKILL.md and progress.md ready for execution — no commits to Code repos yet, sitting in ~/.claude/skills/duolingo/ pending further work. Final evening pass: roadmap hygiene sweep across 28 repos, pruning stale and duplicate items against current ASC state and code. Gitignore updated to ignore provisioning profiles and signing certificates across repos with native iOS/macOS targets (curvely, epiphany, fengshui, healstack, inkpress, lexly, litigate, nimble, quotable, sparkjar, talli, uprighty, wiretext, voxprint). Deploy infrastructure verified and fixed (project.json wiring across nimble, vercel CLI integration across sparkjar and talli). Notes-delete.sh script finalized in dotfiles to prevent Notes.app mailbox refill during future /work runs.</p>

<h2 id="wednesday-august-5">Wednesday (August 5)</h2>

<p>Wrapped up Epiphany v2.5.4 tonight. The statement upload feature that shipped earlier now lives in Vercel Blob instead of KV, freeing up KV quota, and macOS finally got the same upload UI that iOS had. Fixed the app icon alpha transparency issue that ASC validation catches silently, then bumped the icon color from lime-green back to system blue to match the design tokens everywhere else. Took the build through ASC and got v2.5.4 build 9 into review.</p>

<h2 id="thursday-august-6">Thursday (August 6)</h2>

<p>Updated the portfolio avatar from a terrifying SVG silhouette back to the original Animoji PNG — a quick UI fix, nothing more. Refreshed Sparkjar’s landing page layout: moved the screenshot section out of the hero grid and into a dedicated section after features, giving the hero simpler text-only design and letting the screenshot span full width between features and how-it-works. Created a new /wrapup skill, identical to /night for end-of-session wrapping.</p>

<p>Evening: Added light mode support to Litigate’s web app, defaulting to device color scheme preference via inline <code class="language-plaintext highlighter-rouge">prefers-color-scheme</code> detection. The tweaks panel still allows manual override to Auto/Dark/White. Designed and deployed a minimalist gavel SVG icon (works in both themes) for the PWA manifest and browser favicon.</p>

<p>Late evening: Migrated Healstack to Cloudflare Pages (was on Vercel), restyled the landing page to match the Lexly design system. Finished Uprighty’s Good Feng Shui chapter summaries—eight more chapters written (2, 12-19) and deduplicated, completing the book summary section.</p>

<p>Night wrap (first pass): Processed 160 HEIC screenshots from four “For Dummies” book pages (Good Feng Shui, macOS Tahoe, Accounting, AI in Business) into summaries synced to Uprighty’s site. Data Science book (214 HEICs) deferred—weekly token budget hit 83%, picked it back up next week once the counter resets.</p>

<p>Completed Healstack’s migration to Cloudflare Pages, fixing the wrangler config to clear out Vercel-only settings (the repo had tried to run as both at once and gotten tangled). Litigate got proper light-mode support with manual theme override toggle, plus a minimalist gavel SVG for the favicon and PWA manifest that reads clean in both themes.</p>

<p>Night wrap (second pass): Finished the Data Science For Dummies summary tonight—214 HEICs converted to all 20 chapters plus a merged masterclass-style JSON, synced to uprighty. The full backlog is now complete (375 of 375 HEICs processed and deleted from iCloud). Drafted the masterclass integration plan for Lexly—15 summaries ready to import via a converter script, fully scoped with zero uncertainty, deferred to next session.</p>

<p>Turned out there was time to just do it: built the converter script and integrated all 15 book summaries into Lexly as masterclasses, with validator support to keep them honest.</p>

<p>Discovered late evening the converter hung on the first book, then found and fixed it: an h3 subheading (<code class="language-plaintext highlighter-rouge">###</code>) wasn’t handled by the code that only looked for <code class="language-plaintext highlighter-rouge">##</code>, so it fell into an infinite loop instead of erroring. Widened the check to catch any heading level and reran — all 15 books converted clean and deployed live.</p>

<p>Final nightly wrap: verified Voxprint’s App Store marketingUrl now points to voxprint.heyitsmejosh.com instead of the stale echo domain, and confirmed Sparkjar’s Vercel production already has the correct APPLE_CLIENT_ID env var wired. Swept roughly 200 open roadmap items across 20 projects for any quick wins that could ship tonight—found none were safely one-shot; everything remaining needs dashboard access, 2FA, design decisions, or dedicated deep-dive sessions. Kicked off a cleanup pass consolidating duplicate and stale roadmap + documentation entries across repos, letting the docstring refactor run in the background to avoid merge conflicts.</p>

<p>Afternoon follow-up: consolidated roadmap entries across Epiphany, Sparkjar, and other repos, merging duplicates from earlier passes and finalizing status markers. Verified Voxprint’s marketing URL and Sparkjar’s environment configuration are both correct. Fixed Litigate’s stale sign-in screen text that still said “Brief” instead of “Litigate” (app renamed July 18 but the welcome Text() was missed on both iOS and macOS), verified build clean.</p>

<p>Late: synced ~/Documents/Code by rebasing onto origin/main (73 local commits, clean push).</p>

<p>Wrapped up Inkpress tonight with three long-overdue fixes. The icon had been a low-contrast hairline design on dark that nobody could see—replaced it with a bold amber nib glyph. Added a proper loading indicator to the EntryListView so background feed refreshes don’t leave the interface feeling frozen. Built and shipped a real landing page at inkpress.heyitsmejosh.com (Cloudflare Pages with DNS CNAME verified), so the app finally has a storefront instead of just an App Store link. All three shipped live.</p>

<p>Talli got a quick fix tonight: the messages list had been rendering avatars with initials floating to the top-right corner instead of centered in the circle. Turned out the ZStack(alignment: .topTrailing) was intended to position the unread-count dot, but it was pushing all child content into that corner. Fixed by centering the ZStack and using offset() just for the dot positioning.</p>

<h2 id="apps">Apps</h2>

<p>Epiphany icon redesigned (lime green → system blue), Stripe fixed to $1 one-time unlock, statement uploads migrated to Vercel Blob. Healstack migrated to Cloudflare Pages + landing page restyled, Sparkjar and Talli shipped payment gates. Sparkjar landing page refreshed with full-width screenshots. Curvely, Voxprint, Wiretext, and Uprighty all submitted for review (renamed branding issues tracked down and fixed). Sparkjar Sign-in-with-Apple complete + auth bugs fixed (ready to rebuild+resubmit). Litigate added light mode + gavel icon. Uprighty Good Feng Shui chapter summaries completed (8 final chapters added), backlog fully complete (375/375 HEICs), and all 15 book summaries shipped into Lexly as masterclasses (converter infinite-loop bug found and fixed). Portfolio avatar reverted. Quotable nearly fully illustrated. NYC iOS + macOS submitted. Portfolio roadmaps and Obsidian wiki fully synced with Apple Notes inbox. Inkpress icon redesigned for contrast + loading indicator added + landing page shipped to inkpress.heyitsmejosh.com. Talli messages list avatar alignment fixed (08-06). 80+ commits across 28 repos in the entitlements + hostname sweep + roadmap prune pass (08-04).</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="weekly" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Repeat</title><link href="https://journal.heyitsmejosh.com/2026/07/29/repeat/" rel="alternate" type="text/html" title="Repeat" /><published>2026-07-29T23:00:00-07:00</published><updated>2026-07-29T23:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/07/29/repeat</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/07/29/repeat/"><![CDATA[<p>Three weeks, mostly App Store paperwork. Confirmed Epiphany already supported Interactive Brokers, fixed a Lexly build bug breaking course taps, and restyled the portfolio site with a warmer serif-and-sans look. Talli’s widget was drifting out of sync with the app version, fixed to read it from build settings instead of a hardcoded number.</p>

<p>The big renames landed: Books to Spine to Uprighty, Brief to Casewright to Litigate, Grapher to Curvely, Echo to Voxprint (Apple rejected “Echo” as too generic). Un-paywalled all of Lexly’s courses since the Stripe gate never worked. Journal and Inkpress finally split into what they should always have been, a blog and a separate RSS reader, connected only in that Inkpress can subscribe to the blog’s feed like any other.</p>

<p>Closed out account-deletion support everywhere it was missing, moved twelve apps off Vercel onto Cloudflare Pages, and unified several apps’ iOS and Mac builds under single App Store listings. Found and fixed a real security bug: Litigate’s live site was serving real court documents to anyone, unauthenticated, behind a CSS overlay that never actually protected anything. Moved it behind a proper Supabase auth gate. Took down an old personal page that had been ranking on Google.</p>

<p>Uprighty shipped v1.0 with all book summaries complete. Two RCMP ATIP letters came back on the 2021 case confirming no body-worn camera footage existed and the 911 tape was destroyed under retention policy; filed into Litigate, follow-up request queued. Rebuilt the Feng Shui reading app from scratch after the original was lost. Finished the BCGD merge doc, nearly everything from the original site was already shipped, just needed a track repair page.</p>

<p>Closed the stretch with i18n work on Talli and Quotable, a git hygiene pass that pushed six repos’ worth of deferred commits, and a batch of App Store rejections that turned out to be stale thumbnails and orphaned IAP references rather than real bugs.</p>

<p>Spent tonight finally killing the Times Square game’s colonist autoplay bug. The root cause wasn’t what I thought — it wasn’t just the deleted directive engine, but two other systems that had been flying under the radar: the game startup was hardcoding two colonists to gatherer jobs with zero player input, and the job system was re-assigning fresh tasks forever once any job was set, regardless of how the player got it there. Removed both, plus cleaned out a massive dead autopilot block in the web version that had been accumulating junk for months (survivalActions, infrastructureActions, auto-quest generation). Deployed to production after native verification.</p>

<h2 id="sunday-2026-08-02">Sunday (2026-08-02)</h2>

<p>Wrapped up the autoplay fix properly—turns out the directive-engine fix alone wasn’t enough, and I’d left two other systems that were also hardcoding colonist jobs and auto-perpetuating tasks. Got that deployed and confirmed working. Refreshed Nimble’s landing page to match the Maybulb design system with a splash screen and fixed the header. Redesigned Lexly’s profile panel to Duolingo’s style, bigger avatar and icon grid. Talli’s Bennies tracker now lives in the Status tab instead of as its own panel. BCGD macOS build is attached to ASC. Fixed a stale CI regression test in Talli that had gone out of sync with the actual profile schema—the parser had grown three new benefit types but the guard test was still checking for the original four, which broke the GitHub Actions pipeline. Updated the assertions and verified the full test suite passes.</p>

<p>Fixed Sparkjar’s iOS and Mac resubmission: the build had been rejected because the review submission was still pointing to a leftover deleted in-app purchase item that no longer existed. Cancelled the stale submission and created a fresh review submission using the existing valid build, then resubmitted. Both iOS and Mac are back to WAITING_FOR_REVIEW now.</p>

<h2 id="monday-2026-08-03">Monday (2026-08-03)</h2>

<p>Audited half the app portfolio to sync roadmaps with reality—found that Lexly’s masterclass reader and Sparkjar’s iOS submission switch were already done weeks ago but never checked off. Consolidated Talli and the portfolio to pull blue accents from a shared design system instead of hardcoding them. Built an architecture-svg skill for documenting app structure (drew diagrams for Fengshui and others), scaffolded Facebook OAuth in Epiphany following the Google pattern, and updated a few stale notes about signing certificates and DNS verification scopes. Added Daring Fireball to Newsline’s feeds, refreshed Lexly’s avatar picker to SwiftUI with bottom navigation, and regenerated Sparkjar’s app icons.</p>

<p>Fixed Epiphany’s Stripe setup—discovered the production API key got mangled during an earlier debug session, so the webhook had been silently failing. Straightened that out, and switched the paid tier from a stale $9.99/month subscription to a simple $1 one-time purchase (People search and Daily Brief features now gated behind that).</p>

<p>Attempted to roll out Stripe + Apple/Facebook/Google OAuth across all the other shipped apps, but hit two hard blockers: most apps have no premium feature defined, so there’s nothing to gate Stripe behind; and social auth registration requires interactive developer-console work (Google Cloud, Meta, Apple Developer) that’s not something I can provision. Scoped it down to a roadmap note documenting the audit and blockers instead of shipping half-built infrastructure. Turned out healstack and sparkjar did have workable gates once decided—shipped Healstack’s $1 one-time CSV export unlock and Sparkjar’s “Spark Pro” unlimited-posts-and-pinning tier. Caught a stuck auto-deploy on sparkjar that had silently kept the old version live even though the code was pushed; had to manually run <code class="language-plaintext highlighter-rouge">vercel --prod</code> to get it out. Worth investigating that git-push integration for that project. Finished the Stripe rollout by shipping Talli’s payment-history unlock (YTD total + bar chart in the home view, free tier keeps monthly amount). Found an interesting gotcha along the way: Talli’s Express monolith had the raw-body-eating global <code class="language-plaintext highlighter-rouge">json()</code> middleware mounted early, which would’ve sabotaged Stripe webhook signature verification—had to mount the webhook handler with <code class="language-plaintext highlighter-rouge">raw()</code> before that line, order matters. Added Google/Apple/Facebook sign-in buttons to Healstack’s auth form too, wired but waiting on actual provider registrations. Tried to bang out the OAuth provider registrations via browser automation but Chrome extension died mid-session, so shelved it for later.</p>

<p>Finally tackled Quotable’s missing poster art — the iTunes Search API source had died, so I signed up for a TMDB developer account, got the API key, and backfilled artwork for 191 of the 193 quote entries. Only Game of Thrones and Star Trek TV are still missing images (minor follow-up), but the game looks fully illustrated now.</p>

<p>Pushed Curvely’s privacy policy page and App Store metadata to unblock its first submission.</p>

<p>Ended the night killing a small daily annoyance. Every morning I open a shell and re-authenticate the App Store Connect web session, typing my Apple password and a two-factor code. Turns out the session is usually still alive, so half those logins were for nothing, and the password was already sitting in my keychain the whole time. Now it is one command that checks first and only asks for the code if it actually expired. The code itself I still have to type, since Apple sends it to the device as a popup rather than a text I could read.</p>

<h2 id="apps">Apps</h2>

<p>Uprighty 1.0 live. Litigate’s leak closed. Lexly and Sparkjar unblocked. Voxprint renamed and resubmitted. Wiretext, Wordroot, and Nimble got first App Store builds. Journal and Inkpress are two unrelated repos again. Nimble’s web restyled to Maybulb design system with splash screen. Talli’s Bennies dashboard now in Status tab. NYC’s autoplay fully fixed. Lexly profile redesigned. BCGD macOS build live on ASC. Curvely privacy + metadata set.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[Three weeks, mostly App Store paperwork. Confirmed Epiphany already supported Interactive Brokers, fixed a Lexly build bug breaking course taps, and restyled the portfolio site with a warmer serif-and-sans look. Talli’s widget was drifting out of sync with the app version, fixed to read it from build settings instead of a hardcoded number.]]></summary></entry><entry><title type="html">Merge</title><link href="https://journal.heyitsmejosh.com/2026/07/18/week/" rel="alternate" type="text/html" title="Merge" /><published>2026-07-18T12:00:00-07:00</published><updated>2026-07-18T12:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/07/18/week</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/07/18/week/"><![CDATA[<p><img src="/assets/2026-07-18-week.svg" alt="Week of July 18" /></p>

<h2 id="friday-july-18">Friday (July 18)</h2>

<p>Fixed the resume. The old version claimed enrollment at UVic, which isn’t accurate – self-taught, applying there, not enrolled. Removed the false claim, reordered to lead with eight production apps instead of burying them under older retail and hardware-repair history, trimmed non-technical jobs, and regenerated the PDF via headless Chrome.</p>

<p>Then ran an App Store Connect icon audit across all PNGs: all passed the 1024x1024 no-alpha checks. Shipped eight app builds to clear placeholder icons (BCGD, Books iOS and Mac, Spark Mac, portfolio iOS, Healstack iOS). Fixed Casewright’s macOS icon by stripping the alpha channel and adding a missing DocumentsTabView.swift file that was blocking every archive. Closed out the Casewright-to-Litigate rename: removed the red exclamation badge that was baked into the icon artwork, regenerated all icon variants from the cleaned SVG source, uploaded build 3 to ASC.</p>

<p>Portfolio homepage got an animated Memoji avatar. Extracted the face from a contact-poster screenshot using Python and PIL blue-channel chroma-key, built a CSS gradient bubble to house it, and layered the face on top with a looping bob-and-tilt animation. Renders cleanly in both light and dark mode.</p>

<p>Finished summarizing Becoming Steve Jobs chapters 11 and 12, covering the Apple retail launch, the iTunes Music Store deal, and Jobs’s 2004 cancer diagnosis. Also read and summarized Apple: The First 50 Years chapters 11-13. Built the /market skill for pulling today’s top WSJ and Bloomberg videos and synthesizing a briefing from their transcripts.</p>

<h2 id="saturday-july-18">Saturday (July 18)</h2>

<p>ASC record consolidation. Unified Spark and Books Mac targets under their iOS bundle IDs so new Mac builds land in the single app record instead of a separate entry. Fixed two longstanding Books Mac upload blockers: the app-sandbox entitlement was declared in a .entitlements file but never wired into the Xcode target, and LSApplicationCategoryType was missing. Both Mac builds validated clean. Removed the now-orphaned “Spark Mac” and “Books Mac” app records via browser automation.</p>

<p>Renamed Books to Spine: Xcode project (BooksApp to Spine), targets, source directory, site CNAME, GitHub repo, READMEs, CLAUDEs. Found “Spine” is already taken on the App Store, so tried twelve alternate names until “Spinelist” cleared the availability check. The ASC app record (id 6792376485, bundle com.heyitsmejosh.spine) is live with both iOS and macOS platforms registered, waiting on a build upload.</p>

<h2 id="sunday-july-19">Sunday (July 19)</h2>

<p>Lexly unpaywalled. All seven course categories are free now – the prior Stripe checkout gate never actually worked, and Apple’s rejection asked for an honest answer about paid features. Pro tier reframed as a perks layer (unlimited streak freezes) rather than a content gate. Added an iOS Settings view and moved Sign Out into it. Both iOS and macOS builds submitted to App Review as v1.1.1.</p>

<p>Rebuilt Inkpress from scratch after its “minimum functionality” rejection. It’s now a proper multi-feed RSS reader: users can add or remove any RSS or Atom feed, see an aggregated timeline, and manage subscriptions. Seeds itself with journal.heyitsmejosh.com/feed.xml on first launch, but that feed is fully removable like any other.</p>

<p>Finalized the Litigate rename and the canlii-app merge. Brief-to-Casewright-to-Litigate chain closed: the CanLII case-law search got folded in as a fifth tab, icon artwork cleaned, screenshots added. Also wired SwiftLint compile-time linting into five apps (epiphany, talli, healstack, lexly, litigate) and fixed a Talli Xcode Cloud build-tool-plugin blocker that had been breaking headless CI archives.</p>

<h2 id="monday-july-20">Monday (July 20)</h2>

<p>Finished the Apple: The First 50 Years book summary. Processed the remaining chapter batches covering chapters 16-50: the iPhone and Woz years, the NeXT era and Jobs’s return, the iMac and early 2000s, iTunes and the digital revolution, and Apple Silicon through Apple Intelligence. Full summary committed and live on spine.heyitsmejosh.com.</p>

<p>Ran a /work sweep across fifteen projects and caught ten real bugs to fix: Echo’s Pro paywall was hardcoded true everywhere and silently gating paid features, Epiphany’s Markets news drawer was fetching on every tab switch instead of only when the drawer opened, Sparkjar’s ship-ios pipeline was pointing at the wrong ExportOptions.plist destination, Talli and the portfolio site had stale app icons, Litigate had drifting support and marketing URLs in ASC, and Healstack’s App Review demo account was broken. All ten fixed.</p>

<p>Ran a full account-deletion compliance audit across all shipped apps per App Store Guideline 5.1.1(v). Three apps were missing delete-account capability (Healstack, Lexly, Sparkjar). Fixed all three: wired a shared <code class="language-plaintext highlighter-rouge">delete-account</code> Supabase Edge Function into Healstack and Lexly, and added a new <code class="language-plaintext highlighter-rouge">delete-account</code> action to Sparkjar’s auth handler with a native UI reachable from the profile view. All three build-verified and pushed.</p>

<h2 id="tuesday-july-21">Tuesday (July 21)</h2>

<p>Biggest hosting move yet: 12 repos, 13 domains migrated from Vercel to Cloudflare Pages in one session – nulljosh.github.io, litigate, bcgd, echo, nyc, etyma, grapher, wiretext, life, roost, inkpress, and lexly. All sites verified live with DNS confirmed. The four apps with live payments or real auth complexity (Epiphany, Sparkjar, Healstack, Talli) are staying on Vercel until they get proper Workers/KV rewrites.</p>

<p>Separated the journal and Inkpress repos cleanly. They had gotten tangled from a naming accident; they’re now two independent codebases. Inkpress can subscribe to journal.heyitsmejosh.com/feed.xml like any other feed but has no forced connection.</p>

<p>Shipped three app submissions: Litigate iOS 1.0.1 build 4 (support URL fix, account deletion, display name corrected from “Casewright”), Healstack 1.0 (medical device declaration cleared via ASC web dashboard, then submitted for review), and Inkpress 1.0.2 (pricing and availability configured, submitted). Built Echo Mac metadata from scratch and got Echo Mac 1.3.3 into review. Rewrote the wiki index with all current app names after finding it had gone stale with a dozen outdated references including “spark”, “news-app”, “brief”, “dose”, and “lingo”.</p>

<h2 id="wednesday-july-22">Wednesday (July 22)</h2>

<p>Fixed a dark-mode halo around the portfolio’s Memoji avatar. Non-premultiplied alpha on the transparent edge pixels was blending light RGB values against the dark background during browser downscaling, creating a visible glow in Chrome on macOS but invisible in Safari. Premultiplying the alpha channel – storing (0,0,0,0) on transparent pixels instead of (255,255,255,0) – fixed it.</p>

<p>Submitted Talli 3.5.8 for review. Discovered that the What’s New sheet was still showing “3.5.6” despite the app being on 3.5.8 because the version string was hardcoded. Changed it to read from the bundle version at runtime so it can never drift again. Submitted Echo iOS 1.3.3 after fixing a button-state freeze that was blocking reviewers. Investigated Litigate’s rejection and found the real cause: Sign in with Apple was backed by a Supabase provider that was never enabled in the Supabase dashboard. Removed the button and resubmitted rather than fixing the configuration. Filed Apple support tickets for two orphaned Mac app records (Echo Transcribe Mac, Lexly Mac) that the dashboard refuses to let us delete.</p>

<p>Did a native SwiftUI rewrite of the Spine iOS app. It had been a WKWebView wrapper with off-center layout and raw markdown rendering. Rebuilt it with real SwiftUI views, bundled the JSON and markdown data directly into the app so it works offline, and fixed both the layout and markdown problems. Updated the sync script so bundled data stays in sync as the site updates.</p>

<p>Folded four standalone repos (abraham, video-speed-ext, bank, code-meta) into the labs monorepo where they belong. Deleted the archived braingraph repo, which had already been merged into notes. Repo count dropped from 27 active to 22.</p>

<p>Completed the Calculus for Dummies summary pipeline – all 22 chapters across four batches from iCloud photos, merged into a single file, synced to the Spine site, badge added. Inkpress 1.0.2 was approved by Apple App Review and is now live. Started IBS For Dummies (Introduction and Chapter 1, 13 of roughly 323 pages) before usage limits stopped progress.</p>

<h2 id="apps-summary">Apps Summary</h2>

<p><strong>In review:</strong> Talli v3.5.8 (submitted 07-22), Echo v1.3.3 iOS (submitted 07-22), Echo v1.3.3 Mac (submitted 07-21), Lexly v1.1.1 iOS + Mac (submitted 07-19), Litigate v1.0.1 build 4 (resubmitted 07-22, Sign-in-with-Apple removed), Healstack v1.0 (submitted 07-21), Inkpress v1.0.2 (approved 07-22, live).</p>

<p><strong>Live:</strong> Epiphany v2.6.1 (Pro tier, Yelp venues, Stripe fixes), Sparkjar v2.2.0 (Mac live; iOS provisioning fixed 07-18), Newsline v0.2.0 (15-outlet RSS reader, Cloudflare Worker), Nimble (Gemma proxy), Spine (Cloudflare Pages; book summaries including Calculus for Dummies now live).</p>

<p><strong>Cloudflare (as of 07-21):</strong> 12 apps, 13 domains moved. Remaining on Vercel: Epiphany, Sparkjar, Healstack, Talli.</p>

<p><strong>Pending:</strong> Spinelist ASC record ready (bundle com.heyitsmejosh.spine), no build uploaded yet. BCGD icon redesigned 07-22, ASC upload pending. Portfolio iOS icon fixed, submission pending.</p>

<p><strong>Blockers:</strong> Sparkjar bundle ID rename (deferred to preserve provisioning-profile fix). Epiphany SnapTrade phantom holdings disabled; Twitter/X dev account deleted, sign-in buttons removed. Orphaned Mac records (Echo Transcribe Mac case 102949488998, Lexly Mac case 102949489427) pending Apple support.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Renames</title><link href="https://journal.heyitsmejosh.com/2026/07/03/june-july/" rel="alternate" type="text/html" title="Renames" /><published>2026-07-03T09:00:00-07:00</published><updated>2026-07-03T09:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/07/03/june-july</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/07/03/june-july/"><![CDATA[<p><img src="/assets/2026-07-03-week.svg" alt="June-July" /></p>

<p>Epiphany finally shipped to the App Store early in the month, closing out months of revision, and got a Spend Analysis dashboard and finer spending categories soon after. Its long-standing SnapTrade phantom-holdings bug got fixed by deduping accounts on refresh. Dose was renamed Healstack and Lingo went through two more names before landing on Lexly, each rename dragging a branding and icon cleanup pass behind it. Talli hit v3.5.0, then kept moving through translated locales, an app-icon and appearance-picker pass, and its own widget.</p>

<p>The apps monorepo came apart this month, back to standalone repos, with the smaller experiments (nimble, nyc, grapher, wiretext) folded into one labs repo instead of living as loose scaffolds. Widget extensions and a shared FloatingTabBar/haptics treatment rolled out across epiphany, spark, talli, dose, and brief in a coordinated sweep. Spark added iOS, macOS, and watchOS companions, got its own Mac App Store record, and archived its first Mac release build. Auth week brought GitHub OAuth and Sign in with Apple across epiphany, dose, and spark. Brief migrated its case data to Supabase and finalized multi-user support. Echo split its landing page from the app and fixed an in-app-purchase mismatch. A new project, Etyma, got scaffolded as an etymology app with a Wiktionary parsing pipeline.</p>

<p>Talli’s build pipeline was the month’s real puzzle: Xcode Cloud jobs failed for days, first traced to a missing distribution certificate, then to a stale App Group identifier getting silently reverted on every build, and finally to an account-level blocker, App Store Connect’s paid-apps agreement stuck pending bank and tax details, which turned off automatic signing account-wide. Worked around it by building and uploading to TestFlight locally instead. Docker got installed and Shannon, an AI pentesting tool, got wired up as a new skill, though its first run needs more debugging before it’s trustworthy.</p>

<p>Reconnected with Jayda for the first time in about ten years, three days together with a couple of drives to catch the sunset. Fun, but a reminder of how much I value my own space and peace now. School plans changed: going to UVIC for computer science instead of the paralegal route. June ran hot, 30C most days. Development keeps compounding, the review and testing loop getting smoother each month. Three projects are properly shipped now and the shift is toward polishing and monetizing rather than just building.</p>

<h2 id="saturday">Saturday</h2>

<p>Landed a real batch of Epiphany fixes tonight. Dev auto-login (for testing) was silently failing through a fragile Xcode scheme-override approach—swapped it out for a proper gitignored .xcconfig-based setup that actually works. Found a UI bug where Settings and Markets tabs were hiding content like the Delete Account button behind the floating tab bar at the bottom, fixed the tab bar positioning. Tracked down why autopilot does nothing in paper-mode tests: the engine was floor()’ing whole-share stock quantities, which silently no-op’d any order below ~$150 notional. Fixed it to handle fractional BTC trades down to $0.01 test caps. Cleaned up leftover “Monica” (the old app name) references lingering in the iOS widget target, plus the annual Xcode nags that reset every build—App Category, widget version sync, missing asset placeholder.</p>

<p>Still pending: the Markets drawer drag gesture is choppy and needs its own tuning pass. Live trading remains blocked on getting a real brokerage with actual trade permission (SnapTrade and Wealthsimple are both intentionally read-only).</p>

<h2 id="sunday">Sunday</h2>

<p>Smoothed out the Markets news drawer drag that was choppy from fighting a declarative animation—removed the conflicting <code class="language-plaintext highlighter-rouge">.animation</code> modifier so the gesture now tracks the finger 1:1, and gave the drawer a semi-transparent liquid-glass look with <code class="language-plaintext highlighter-rouge">.ultraThinMaterial</code> and a hairline border rim. Later polished the settle behavior to pop-free (moved drag state so the spring reset animates instead of snapping), made list rows clear the peek drawer on tap, and hid the Fear &amp; Greed row when the drawer is fully open so the top sliver stays as a clean horizontal ticker strip, mirroring Yahoo Finance’s layout.</p>

<p>Found and fixed a portfolio math bug: the net-worth calculator was dropping uninvested cash sitting in investment accounts—showed $229 when the accounts actually summed to $415.78. Now it tallies all account balances correctly. Fixed the “Cash” account subtitle which was double-counting holdings, and stripped the redundant brokerage prefix from account names so “Wealthsimple Trade TFSA” renders as just “TFSA”.</p>

<p>Diagnosed two gaps that explain sparse UI: commodity and crypto detail views lack chart/news/ranges because the data models only carry price + percent-change—it’s a backend data shape issue, not UI wiring (the infrastructure for news and ranges is already there). The autopilot simulator appears to do nothing because paper trades only run during market hours, and the visible “live failed” rows are stale read-only Wealthsimple probes; real live trading is blocked waiting for a broker with actual trade permission (Alpaca or IBKR, not SnapTrade or WS). Both gaps are documented in the roadmap as design constraints, not bugs.</p>

<p>Later in the week wrapped up loose app icon work: stripped the alpha channel from Healstack’s iOS marketing icon (App Store rejects alpha), upscaled Nimble’s app icon to the full 1024x1024 marketing size. Cleaned up the labs repo by removing wiretext and grapher, which are now standalone projects. Fixed the portfolio site’s mobile navigation—stopped it from squishing, realigned the nav and home button font pairing, and smoothed out theme-toggle spacing. Documented a terminal/tmux shortcuts cheatsheet in dotfiles notes for quick reference.</p>

<p>Evening: patched npm audit vulnerabilities (undici, nodemailer, mathjs, uuid) across epiphany, grapher, spark, and wiretext. Talli got a build number bump for the pending v2.3.3 iOS re-upload. Healstack’s build 2 uploaded to ASC, validating the alpha-channel fix.</p>

<p>Late night: discovered the Lexly iOS build uploaded on Friday (202607030001) was broken—xcodegen flattened the course resource folders into a flat structure, so every course showed “Couldn’t load” on tap. Fixed it by adding a bundle-root fallback in ContentStore that walks the directory tree to find course-data.json files even when nested, then swapped out the bad Pre-Calc 12 SF Symbol (some variant wasn’t rendering). Verified the fix in simulator across login flow, courses list, and masterclass drill. Uploaded the fixed build 202607060001 to App Store Connect. Added README screenshots showing the three main flows. Mac rebuild and 2FA submission are the last steps before shipping.</p>

<h2 id="sunday-continued">Sunday (continued)</h2>

<p>Shipped Brief iOS 1.0.1 to App Store Connect. Created a new ASC app entry “Brief by Josh” (app id 6787857503), uploaded the iPhone-only build, configured all metadata (description, support/privacy URLs, app category), set pricing to free, content rating to 17+ for litigation case content, and filled in the review details for a legal-tool app. Added a proper privacy policy page to the Brief landing blurb at brief.heyitsmejosh.com and restructured the homepage to lead with the app link. Scrubbed real case data (client names, settlement amounts, case details) from the public README and all App Store screenshots so the project can ship without exposing personal legal information, then rewrote git history to clean up commit messages that leaked those details. Submission for review is queued; demo screenshots and the final review ceremony are tomorrow.</p>

<h2 id="monday">Monday</h2>

<p>Added eight new stock tickers to Epiphany’s markets list: DELL, PENG, DRAM, SNDK, IREN, MU, NBIS, CRDO. Wired them into the server’s DEFAULT_SYMBOLS constant so they roll out to iOS, macOS, and watchOS. All 397 tests pass after the change. Pushed and Vercel auto-deployed. Polished asset deployment across several projects: Quotable got a Pages deploy concurrency fix to cancel superseded runs instead of queueing them (same pattern rolled out to the portfolio and Healstack). Fixed Talli’s stale PaidStatus tests after the paidMonths refactor and debugged the blank Messages tab—had to decode the actual server shape of {id, text, timestamp} messages instead of the previous assumptions.</p>

<p>Lexly’s fixed build (202607060001) uploaded to App Store Connect. Echo got its model-download watchdog hardened: added a 3-retry loop and capped iOS auto-model at the base version to avoid stalls. Echo iOS 1.3.3 b8 submitted for App Review and is now waiting for review. Updated the project portfolio (nulljosh.github.io) to point Nimble at its own domain (nimble.heyitsmejosh.com), added Healstack and Quotable to the projects table, and wired all the Pages deploy cancellation logic for cleaner CI runs.</p>

<h2 id="monday-continued">Monday (continued)</h2>

<p>Late night: fixed a critical bug in the Journal app where blank entries loaded no content from Atom feeds—the parser wasn’t handling CDATA sections properly. Renamed the app from “Journal” to “Inkpress” in App Store Connect and on GitHub (repo now nulljosh/inkpress), resolving the naming collision with Apple’s native Journal app, set the display name, and bumped iOS to 1.0.1 build 2, submitting it for App Review to replace the broken 1.0 build.</p>

<p>Also renamed Brief’s app to “Casewright” in App Store Connect and GitHub (repo now nulljosh/casewright), set the display name, and iOS 1.0.1 is already Waiting for Review.</p>

<p>Pulled additional ticker work across the evening: added MRNA to Epiphany’s stock universe alongside the new AI and memory-sector tickers wired into the server default symbols. Fixed Talli’s stale PaidStatus tests after the paidMonths refactor and debugged the blank Messages tab by decoding the actual server {id, text, timestamp} shape. Hardened Echo’s model download with a 3-retry loop and a watchdog timer, capping iOS auto-model at the base version to avoid stalls. Pushed Lexly’s fixed build 202607060001 to App Store Connect. Rolled out deploy concurrency improvements across Quotable, the portfolio, and Healstack to cancel superseded Pages runs instead of queueing them.</p>

<p>Later night: wired release workflows across all eight shipping apps. Added <code class="language-plaintext highlighter-rouge">.asc/workflow.json</code> release pipelines to spark (ship-ios + ship-mac), echo, brief, journal, healstack, epiphany, lexly, and talli so releases are one command: <code class="language-plaintext highlighter-rouge">asc workflow run ship-ios VERSION:x.y.z</code>. ExportOptions.plist added to echo, brief, epiphany-iOS, and healstack-macOS to automate App Store export and upload in the workflow pipeline. This makes it possible to ship a new version without leaving the terminal.</p>

<h2 id="monday-1">Monday</h2>

<p>Debugged the Inkpress iOS app’s dark-mode rendering issue where entry content disappeared (black text on black background when dark mode was enabled). Fixed the theme-aware CSS to properly invert colors with the dark-mode toggle, rebuilt and bumped to 1.0.1 build b3 (2026-07-060130). Old b2 submission cancelled and b3 resubmitted for App Review via the asc release workflow.</p>

<h2 id="monday-next">Monday (next)</h2>

<p>Lexly shipped to the App Store: Mac rebuild 202607060002 uploaded with both iOS and Mac fixes attached to v1.1.0, submitted for review. Casewright (formerly Brief) iOS 1.0.1 moved to production builds—case picker bug fix landed in b1d5c7a, resolving the clipped-behind-banner layout that was hidden by the classification banner. Finished the ML for Dummies book summary, completing chapters 13–20 with a full reading pass.</p>

<h2 id="monday-today">Monday (today)</h2>

<p>Portfolio redesign wrapped up: dark mode landed on the sage.me theme with proper CSS inversion, then added non-blocking font loading and performance tweaks, shipping live tonight. Also scaffolded a companion iOS app that mirrors the site’s content and design—full Swift port with the same sage theme tokens, building green in Xcode. Added technical whitepapers to talli, wiretext, and lexly. Casewright’s case picker got one more layout polish pass to clean up the positioning.</p>

<p>Fixed bcgd.heyitsmejosh.com by redeploying: the hero image (truck.png) was served as 0 bytes on Vercel, likely from a stale or incomplete build artifact. Redeployed src/web from bcgd/ and verified the image now serves at 664KB—rendering properly on the live site.</p>

<p>Late night: pushed Epiphany 2.5.2 and Talli 2.4.4 to TestFlight and submitted both to the App Store for review. Talli’s prior submission (v2.4.2) was cancelled and replaced with the new v2.4.4 release.</p>

<p>Tonight: completed portfolio iOS app first-submission paperwork via asc CLI. App Privacy manifest published, all 10 blockers cleared except availability (one dashboard click remaining, then can submit for review). ASC app id 6788180394.</p>

<h2 id="tuesday">Tuesday</h2>

<p>BCGD web site got rethemed to match bcgaragedoors.ca’s brand identity: light background with a teal accent (#1B5959), Barlow Condensed for headings and Open Sans for body text. Redeployed live on Vercel. Scaffolded a native iOS companion app with a 4-tab layout (Dashboard, Services, Inventory, Settings) in SwiftUI, using xcodegen for project generation and targeting local persistence via CoreData. Built clean on first pass. Added a portfolio vibe-token reference to bcgd so the web site can inherit the sage theme system from heyitsmejosh.com.</p>

<p>Talli got a xcstrings cleanup pass to remove drifted translations for zh and pa locales on the report.fileNow identifier, keeping the locale catalog clean before the next submission cycle. Tracked down a critical bug in the Messages tab where it appeared blank: the src/api.js message parser was silently dropping message entries that had no newline-separated date prefix, so any message without the timestamp on its own line got filtered out. Fixed by checking for the date format and keeping single-line entries intact. Kicked off a new Talli iOS build (v2.4.5) via <code class="language-plaintext highlighter-rouge">asc workflow run ship-ios</code> to get the fix plus the earlier color corrections (blue #5B9BD5 for better accessibility) onto TestFlight.</p>

<p>Expanded Epiphany’s asset universe with ten major bank stocks: RY, TD, BMO, BNS, CM (Canada), JPM, BAC, WFC, GS, MS (US). Added to DEFAULT_SYMBOLS in the server so they roll out across iOS, macOS, and watchOS. All 397 tests pass; pushed and auto-deployed. Updated Epiphany’s TestFlight beta description (was internal QA notes, now real tester-facing copy). Prepared a new App Store screenshot set at ios/fastlane/screenshots/en-US/ (iPhone 11 Pro Max + 14 Plus, 5 screens each) to replace the stale generic set, but upload is blocked because 2.5.2 is WAITING_FOR_REVIEW (ASC locks screenshot edits mid-review); next: cancel the submission, upload the new screenshots, then resubmit.</p>

<p>Evening: explored Era Context MCP server for personal finance management. Completed onboarding questionnaire to unlock platform capabilities. Platform exposes read+write access to connected third-party accounts across five capability tiers (See, Organize, Automate, Optimize, upcoming). Knowledge module stores facts with optional expiry dates for auto-verification. No code commits—pure exploration and configuration.</p>

<p>Night: fixed Inkpress iOS EntryDetailView.swift where entry content was rendering unstyled (12pt Times New Roman, no spacing between paragraphs). NSAttributedString’s HTML importer has no built-in CSS, so wrapped content in a <code class="language-plaintext highlighter-rouge">&lt;style&gt;</code> block that forces system font, proper heading sizes, and paragraph spacing before parsing. Committed to GitHub and kicked off <code class="language-plaintext highlighter-rouge">asc workflow run ship-ios VERSION:1.0.2</code> to ship the fix to TestFlight (build in progress; ASC shows 1.0.1 still current, 1.0.2 pending).</p>

<p>Late night: diagnosed Echo iOS 1.3.3 App Store rejection (Guideline 2.1(b) App Completeness)—the “Echo Pro” in-app purchase was never submitted for review, leaving a dead purchase button. Resubmitted v1.3.3 via ASC CLI and web UI. Open risk: the IAP still shows READY_TO_SUBMIT and may not have been bundled into the new submission, creating the potential for a repeat rejection.</p>

<p>Investigated five broken App Store Connect app icons (Books Mac, books-ios, Spark Mac, Sparkjar, Healstack) by checking their ASC asset validity. Root cause: all on-disk icon assets are actually valid, but no distribution provisioning profiles exist yet for com.heyitsmejosh.spark, .spark.mac, .dose, .books, or .books.mac. Distribution certificates exist but profiles don’t—blocking both archive/export and ASC build uploads. Confirmed this diagnosis by attempting archive/export for Healstack and books-ios; both failed at export with “no provisioning profile” and certificate mismatch errors. Found and removed a stale untracked Dose.xcodeproj in healstack/ios left over from the Dose→Healstack rename, which was silently blocking agvtool/asc xcode version edit. Deferred the full asc-signing-setup provisioning-profile generation to the next step to stay lean on budget.</p>

<p>Fixed the portfolio iOS app icon (nulljosh.github.io): had corner-rounding baked into the 1024x1024 PNG itself (a recurring bug pattern), causing it to look shrunk/padded in ASC. Regenerated it full-bleed edge-to-edge (no baked-in rounding, since iOS applies its own mask) via rsvg-convert from icon.svg with rx removed. File changed on disk but not yet committed/pushed.</p>

<p>Night wrap: fixed the last blocker on the App Store Connect icon investigation. Spark iOS and Spark Widgets App IDs had the App Groups capability enabled but the actual App Group resource (group.com.jt.spark) was never linked to them—only Spark Mac had it linked. Registered and linked the App Group manually via developer.apple.com’s App ID capability config (Apple’s public API doesn’t expose App Group linking, so this had to be done through the web UI directly). All 4 Spark App IDs (iOS, iOS Widgets, Mac, Mac Widgets) now have the App Group properly linked. Spark iOS/Mac builds are ready to archive/export/upload next session—signing and profiles are already set up.</p>

<p>Final tally: 4 of 5 broken App Store Connect icons fixed this session (Healstack, books-ios, Books Mac, portfolio icon), with Spark iOS/Mac now unblocked and ready to ship as the next actionable step.</p>

<p>Evening: completed Lexly’s marketing landing page split. Added <code class="language-plaintext highlighter-rouge">/index.html</code> as a public-facing intro site with course highlights, unified header styling between the landing page and the <code class="language-plaintext highlighter-rouge">/app/</code> shell, and verified that native iOS/macOS SwiftUI already matches the web’s accent color (#5B9BD5), closing out the visual parity roadmap item. App now lives at <code class="language-plaintext highlighter-rouge">/app/index.html</code> with the landing at the domain root. Also auto-generate pixel-art signup avatars instead of prompting users to pick or create one during registration.</p>

<p>Late night: tackled the provisioning profile blocker head-on. Created and installed 8 missing App Store distribution provisioning profiles across spark/healstack/books bundle IDs (main + widget/extension targets) using asc-signing-setup. Shipped three of the five blocked builds: Healstack v2.3.4 (build VALID on ASC, processed), books-ios (fixed ITMS-90474 iPad-orientation rejection by adding UISupportedInterfaceOrientations to Info.plist, re-uploaded), and Books Mac (fixed App Sandbox entitlement + LSApplicationCategoryType Info.plist issues that were blocking pkg upload via altool, since asc CLI doesn’t support .pkg directly). Root cause is now clear: Spark iOS and Spark Mac remain blocked because their App Groups entitlement (group.com.jt.spark) was never registered as an actual App Group resource on developer.apple.com—this is a web-portal-only step with no API/CLI path, needs 2 minutes of manual registration before those two can ship. Distribution profiles and signing are already set up and ready to go once the App Group exists. Portfolio iOS icon fixed and pushed earlier tonight (was baking in corner-rounding).</p>

<p>Discovered and fixed a workspace-wide infra issue: Lexly’s Vercel project had no GitHub auto-deploy wired up—every previous “deploy” was a manual <code class="language-plaintext highlighter-rouge">vercel deploy --prod</code> run, not a real CI/CD pipeline. Ran <code class="language-plaintext highlighter-rouge">vercel git connect --yes</code> to fix it, then checked all other locally-linked Vercel projects and fixed the same issue across epiphany, grapher, healstack, journal, spark, talli, and wiretext. All 8 repos now auto-deploy to Vercel on push to main. nulljosh.github.io (portfolio) needs checking as a follow-up.</p>

<p><strong>In flight:</strong> Epiphany v2.6.0 (live + App Store). Talli v3.5.1 (iOS/Mac Waiting for Review). Echo v1.3.3 (iOS resubmitted after rejection, IAP bundling risk pending verification). Healstack v2.3.4 (build VALID on ASC, ready to submit). Spark v2.1.0 (Mac live, iOS blocked by missing manual App Group registration at developer.apple.com, profiles ready). books-ios/books-mac (icon issues resolved by fixing orientation/entitlements, rebuilds ready). Inkpress v1.0.2 (iOS build in progress to TestFlight). Lexly v1.1.0 (iOS/Mac submitted for review, landing page + app shell split shipped with unified header styling, native color parity confirmed). Casewright v1.0.1 (iOS production-ready). Portfolio iOS app v1.0.0 (ASC id 6788180394, icon fixed, submission imminent).</p>

<p><strong>Active development:</strong> BCGD (web retheme live, iOS app scaffolded); Portfolio (iOS app icon fixed, submission imminent); Icon provisioning profile blocker root-caused across 5 apps (next: asc-signing-setup); Echo Mac build + upload pending; Era Context integration (onboarding done, capabilities unlocking). All test suites passing.</p>

<p>Attempted to ship Spark iOS after linking its App Group in the Apple Developer web UI, but the entitlement still comes back empty on freshly regenerated provisioning profiles (verified via <code class="language-plaintext highlighter-rouge">asc profiles inspect --entitlements</code> twice, after deleting and recreating the profiles both times)—the App Group link shown as saved in the web UI apparently didn’t actually persist for the iOS App ID, or Apple’s backend needs longer than expected to propagate. This is unresolved; genuinely blocked, not a quick fix. Next session: re-verify the App ID’s Configure App Groups modal actually shows group.com.jt.spark checked, and if it does, wait longer before regenerating profiles, or try re-toggling the capability off/on.</p>

<p>Final honest tally for the night: 4 of 5 icons fixed and shipped (Healstack, books-ios, Books Mac, portfolio icon). Spark iOS/Mac remain blocked—the App Group UI step was completed but did not actually resolve the underlying issue as expected.</p>

<h2 id="tuesday-today">Tuesday (today)</h2>

<p>Epiphany got a targeted fix: the portfolio duplicate accounts bug that was showing the same account twice on refresh is now fixed via account deduping, and the Markets drawer gained two features—news thumbnails for each stock/crypto alongside headlines, and a stocks-only gains filter to focus on winners during market hours. The duplicate-accounts issue had been sitting since SnapTrade integration and was causing confusion in net-worth calculations. Both fixes pushed and auto-deployed to production.</p>

<p>Wired up Google OAuth login on Epiphany’s web dashboard, expanding the auth options alongside GitHub and Sign in with Apple.</p>

<p>Continued work on portfolio iOS app submission paperwork and app store readiness across several projects.</p>

<p>Fixed choppiness in Epiphany’s Markets ticker: the auto-scroll marquee was reformatting currency values and rebuilding the entire ticker array on every single animation frame (60fps), fighting with the List’s own scrolling. Precomputed the formatted items once whenever the underlying data changes, so the per-frame closure now only computes the scroll offset. Verified with a clean xcodebuild.</p>

<p>Debugged and fixed a regression where the ticker went completely blank: an EmptyView was blocking the onAppear callback that populated the items on screen load. Removed the guard and now the items populate correctly.</p>

<p>Fixed the What’s New sheet from forcing a half-screen <code class="language-plaintext highlighter-rouge">.presentationDetents([.medium])</code> regardless of content size, which was wasting space on short sheets. Now it self-sizes to actual content height via GeometryReader so short items render in a compact sheet and longer ones expand as needed.</p>

<p>Tightened up the Markets drawer layout with a placeholder icon when news images are unavailable and reduced the padding on market list rows (smaller favorite-star gutter, less vertical spacing) to better match native iOS Stocks app.</p>

<p>Eliminated choppiness in the news drawer’s drag gesture, which was causing the List to re-measure on every drag pixel: the drawer’s <code class="language-plaintext highlighter-rouge">.frame(height:)</code> was bound directly to drag translation and sat on top of the List, forcing a full layout recalculation mid-drag. Moved the List to a fixed max height and now only the outer clip animates, so layout never thrashes during the drag.</p>

<h2 id="wednesday">Wednesday</h2>

<p>Nightly wrap and app verification. Confirmed Echo iOS 1.3.3 and Inkpress 1.0.1 both correctly in WAITING_FOR_REVIEW status on the App Store (no action needed). Fixed Talli’s corrupted submission: an earlier stale failed build run had accidentally submitted wrong version v2.4.4 (a downgrade from v3.5.2) to Apple review. Cancelled that submission and re-shipped the correct version v3.5.3 to the App Store. Also caught that Inkpress’s pending review (v1.0.1) was missing a dark-mode fix already sitting in an uploaded but unsubmitted build; cancelled v1.0.1’s review and submitted v1.0.2 instead, which has the fix. All three apps now WAITING_FOR_REVIEW: Talli v3.5.3, Echo v1.3.3, Inkpress v1.0.2. Updated journal and notes wiki with current ship status.</p>

<h2 id="tuesday-1">Tuesday</h2>

<p>Epiphany’s venue detail cards now display a native MKLookAroundScene preview when available, giving users a street-level look at the location directly in the app (no API key needed). Built on top of earlier Markets fixes this week: the ticker’s blank-entry regression is fixed, the What’s New sheet now self-sizes instead of forcing a half-screen height, and the news drawer’s drag gesture is smooth with placeholder icons when images are missing. All fixes pushed and auto-deployed to production. The portfolio app submission is on track with most blockers cleared. Continued polishing across Markets: tightened list row padding to match iOS Stocks, refined the ticker performance by precomputing formatted currency instead of rebuilding on every animation frame, and verified all 90+ venue detail tests pass after the Look Around integration.</p>

<h2 id="wednesday-1">Wednesday</h2>

<p>Fixed Lexly’s masterclass styling: the blue hover state for flashcard interactions had regressed to purple (likely a CSS override somewhere), swapped it back to the intended accent blue (#5B9BD5). Also reworded the feedback-loop flashcard prompt for clarity. Changes committed and pushed to production.</p>

<p>Added a left-to-right underline sweep animation on link hover to the portfolio site, giving link interactions a polished, animated feel that transitions smoothly when hovering over navigation links.</p>

<p>Shipped the Nimble landing page live at nimble.heyitsmejosh.com (GitHub Pages, DNS repointed from Vercel to nulljosh.github.io) after the original Next.js source proved unrecoverable (nulljosh/apps monorepo deleted, Vercel had only minified output). Rebuilt the Nimble web app from scratch as a single-file HTML port of the Swift QueryEngine, embedding offline math, DuckDuckGo/Wikipedia integration, and a Gemma proxy for advanced queries. Deployed to Vercel at web-one-chi-47.vercel.app and wired the landing page’s “Launch app” button to point at it. The nimble repo now consolidates web, iOS, and macOS sources under one roof. Refreshed the README and architecture.svg to document the Gemma proxy flow, and set the GitHub repo description and homepage link.</p>

<h2 id="wednesday-2">Wednesday</h2>

<p>Epiphany got a batch of commits pushed. Landscape orientation went back and forth: first reverted while it needed a per-screen layout pass, then re-enabled once the SwiftUI layouts were confirmed to reflow properly in the simulator, so landscape is now live on iOS. Also shipped Sign in with X (Twitter) OAuth to complement GitHub + Apple OAuth on the web dashboard (still blocked on setting TWITTER_CLIENT_ID/SECRET in Vercel). Scaffolded a Claude Design System project for the portfolio (heyitsmejosh.com) documenting component tokens: color palette, typography scales, link states, list sections, and header/bio card — created 5 example component cards authored by hand from the tokens-sage.css values since the URL importer rejected the page as too simple.</p>

<p>Talli’s icon rebrand wrapped up tonight: finished the orange-to-blue color shift by recoloring the tally-mark icon source to #5B9BD5 on a #1a1a1a background, then regenerated all iOS AppIcon variants (light, dark, and tinted) plus LaunchIcon PNGs, fixing the brown/orange TestFlight app icon and the launch/login screens. Hit an Apple export rejection on the large app icons—they carried an alpha channel, which Apple doesn’t allow. Flattened AppIcon.png and AppIcon-dark.png to opaque RGB, keeping the blue tint without transparency, re-archived, and re-uploaded to App Store Connect. Also hardened the scraper by moving the JUNK_RX accessibility filter into the shared uniqueTrimmed function, stopping skip-nav boilerplate (“Skip to main content”, “Accessibility Statement”) from leaking into the iOS Status Messages and Messages tab. Bumped Talli docs to v3.5.4, with all changes committed and pushed on branch fix/blue-rebrand-icon-scraper. Build uploaded to TestFlight, pending verification.</p>

<p>Echo iOS 1.3.3 was rejected by App Review on July 7 (Guideline 2.1(b) App Completeness)—the “Echo Pro” in-app purchase was submitted but may not have been bundled into the app submission, creating a dead purchase button. The rejection reason details live only in App Store Connect’s Resolution Center, not exposed via the CLI. Resubmitted the same build and will verify IAP bundling this weekend.</p>

<p>Late evening: added a terminal dashboard to Epiphany that live-polls Upstash KV for portfolio data, built as an ink-based TUI in <code class="language-plaintext highlighter-rouge">cli/epiphany-tui.mjs</code>. Bumped the version 2.6.0 to 2.6.1, updated README.md and CLAUDE.md, committed and pushed (3e89ab7). The dashboard streams real-time holdings, net worth, and performance metrics to the terminal, making it easy to check portfolio status without opening the app or web dashboard.</p>

<p>Lexly: scaffolded Stripe Pro checkout and webhook handling (code committed, awaiting test API key for deployment).</p>

<p>Night wrap: updated the books library tracking page with new due date (July 29, 2026) and removed four returned library books (Isaac Newton, Machine Learning for Dummies, Agentic AI for Dummies, Exercise Science for Dummies) plus PC for Dummies (personal copy, not a checkout). The library checklist now reflects five outstanding checkouts: Living Well in a Down Economy, AI Investing for Dummies, Sobriety for Dummies, IBS for Dummies, and Apple: The First 50 Years.</p>

<h2 id="thursday">Thursday</h2>

<p>Spark’s YC RFS Inspiration feature expanded to iOS and macOS. The web version scrapes Y Combinator’s Requests for Startups via a new type=rfs route with a 12-hour in-memory cache (zero additional function cost, staying under the Vercel Hobby 12-function cap), displaying entries in a carousel strip linking to ycombinator.com/rfs. Native iOS and macOS companions now mirror this feature with a new fetchRfs() API method, an RFSEntry model, and an Inspiration section in each platform’s IdeaBaseView linking to the YC RFS page. Cross-platform feature now complete: web + iOS + macOS all ship the same RFS carousel. Both commits pushed.</p>

<p>Refined Spark’s body font treatment: switched from the monospace –font token to a new shared –font-body CSS variable (system sans stack) to better match the portfolio’s typography. Updated the shared tokens.css on nulljosh.github.io to export this new –font-body token, so spark, wiretext, and grapher can all opt into sans-serif body text instead of remaining monospace-only. Rolled out the same sans-font fix to books and notes sites as well, swapping their body font-family from monospace to the shared –font-body variable while keeping Geist monospace for intentional small accents only.</p>

<h2 id="friday">Friday</h2>

<p>Echo Transcription iOS 1.3.3 rejection required a root-cause fix: the “Unlock Echo Pro” in-app purchase button was unresponsive (App Review Guideline 2.1b App Completeness). The paywall sheet was attached only to ContentView and couldn’t present over the Settings sheet; moved it to the window level so it surfaces regardless of which tab is active. Built and uploaded build 9 to TestFlight, then resubmitted 1.3.3 for App Review. Also dropped the Echo Pro price from $7.99 to $3.99.</p>

<p>Casewright (formerly Brief) icon had a fake-looking red “!” badge baked into the artwork design; removed it and regenerated all platform PNG variants. Portfolio iOS app icon rescaled to full-bleed (removed baked-in corner rounding so iOS can apply its own mask). Echo Mac icon regenerated with proper macOS margins (824px artwork centered on 1024px transparent canvas) and uploaded build 1.3.3 for Mac. Books iOS archived and beginning ASC upload.</p>

<p>Echo iOS 1.3.3 resubmission confirmed: review submission state shows READY_FOR_REVIEW with build 9. Healstack v2.3.4 build uploaded with ASC icon now live (was placeholder for weeks). books-ios 1.0 build uploaded with ASC icon live, though the icon has the recurring canvas-scaling bug (artwork too small on the tile). Echo Mac 1.3.3 uploaded as the first proper Mac build with the fixed icon. Documented in ~/Documents/Code/roadmap.md: Talli Mac + Epiphany Mac export failures (missing App Group entitlements in provisioning profiles), Books Mac export blocked, and a recurring icon-scaling bug that affects multiple projects—plan to merge Books Mac + books-ios and Spark Mac + Sparkjar into universal app records, then root-cause the recurring issue.</p>

<p>Blocked: Talli and Epiphany Mac exports fail due to missing App Group entitlements in provisioning profiles; Books Mac export also blocked by profile issues; Sparkjar has no candidate build ready yet.</p>

<h2 id="friday-continued">Friday (continued)</h2>

<p>App Group dev-portal blocker partially cleared. All three app groups (talli, epiphany, spark) were already registered at Apple; manually assigned <code class="language-plaintext highlighter-rouge">group.com.heyitsmejosh.talli</code> to Talli Mac’s two App IDs (tally.mac, tally.mac.widgets) via developer.apple.com web UI. Six more assignments remain this weekend: Epiphany Mac (2 IDs) and Spark (4 IDs) need their respective groups linked. Documented with deep links in ~/Documents/Code/roadmap.md line 58.</p>

<p>Aligned the books site typography with the portfolio’s shared font tokens: swapped body text from monospace to the new <code class="language-plaintext highlighter-rouge">--font-body</code> CSS variable (system sans stack) to improve readability. Spark also adopted the sans-body treatment across iOS and macOS to match. Updated the books library tracking page with current due date (July 29, 2026) and removed four returned/owned books from the checklist, leaving five active checkouts.</p>

<p>Echo Mac icon regenerated with proper macOS margins (824px art centered on 1024px transparent canvas) and uploaded build 1.3.3. Lexly added Stripe Pro checkout and webhook scaffolding (waiting on test API key for deployment). Braingraph fixed an edge-spring force explosion bug (NaN causing blank canvas) and added a memory graph viewer plus build script.</p>

<p>Evening update (2026-07-10): Nimble’s Gemma answer proxy deployed live to Cloudflare Worker with gemma-4-31b-it, header-based auth, thought-part filtering, and real worker URLs verified working end-to-end. Spark’s Gemma daily auto-generated ideas feature wired up with server-side enrichment fallback—the cron job runs 6h apart at 9am to stay within Hobby function limits, generating fresh idea suggestions with AI enrichment. Deployed both to production. Body font refinements completed on Spark to use shared <code class="language-plaintext highlighter-rouge">--font-body</code> token matching the portfolio’s sans-serif treatment.</p>

<p>Nightly wrap (2026-07-10): Braingraph shipped as a new memory-graph web app—force-directed canvas visualization of Claude Code memory with sage portfolio vibe and Inter typography, built with memory-graph engine and deployed to github.com/nulljosh/braingraph (private). Roadmap documented for companion iOS/macOS app. Obsidian vault migrated into the Obsidian iCloud container (~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Code) with a symlink at the old iCloud Drive path so scripts keep working; iPhone Obsidian app now syncs properly. All Friday commits tracked and summarized; next focus on completing remaining six App Group portal assignments (Epiphany Mac ×2, Spark ×4) to unblock Spark iOS and Epiphany Mac shipping.</p>

<p>Created TestFlight internal groups for six apps (Casewright, Healstack, books-ios, Portfolio, Lexly, NYC Survive) to enable automatic build distribution to phone devices. All future builds across these projects now auto-distribute to TestFlight testers on commit, eliminating manual upload steps and keeping QA in sync with latest development builds.</p>

<p>Talli gained CGEB (Canada Groceries and Essentials Benefit) tracking on the web Status tab with a payment schedule timeline, pulling from the July 3, 2026 notice. The API now routes auto-generated profiles for <code class="language-plaintext highlighter-rouge">/api/cgeb-profile</code> and surfaces quarterly entitlement + amount in the uiConfig.</p>

<h2 id="friday-late-evening">Friday (late evening)</h2>

<p>BCGD iOS app verified in simulator: tested all four tabs (Dashboard, Services, Inventory, Settings) and confirmed the CoreData-backed interface works end-to-end. Added screenshots to the README showing each tab’s layout and functionality. Generated a 1024px app icon asset catalog for ASC submission. ASC ship pending: bundle ID (com.heyitsmejosh.bcgd) registered, icon added to Xcode—blocked on ASC web login to create the app record. User finishing this weekend: will create app record “BC Garage Doors” via asc CLI, then archive+upload the build to complete the flow.</p>

<p>Late in the evening: folded quotable, wiretext, grapher, etyma, and braingraph into the labs monorepo via subtree merge, pushed to GitHub, and archived the five old repos (GitHub now at 15 active repos). Vercel site repointing for grapher/wiretext/etyma still pending; live sites stay online throughout. Five standalone repos consolidated into one, streamlining maintenance while preserving full commit history. Newsline RSS clustering v0 shipped with bias-bar frontend (deploy blocked on wrangler auth).</p>

<p>Root (etyma) shipped as a Lookup-style v1: live Wiktionary lookup + etymology chain + word of the day across web + native iOS. iOS build succeeded and is ready for submission. NYC got a simplification pass: 3-pill toolbar, lean colonist panel, removed dead SAVE button + debug FPS overlay. Spark fixed a sign-in overlay bug where the Create Account form was appearing behind the sign-in panel, blocking auth flow.</p>

<h2 id="saturday-1">Saturday</h2>

<p>Wrapped up the labs consolidation: quotable, wiretext, grapher, etyma, and braingraph all folded into the monorepo via subtree merge, full commit history preserved, and the five standalone repos archived on GitHub (now 15 active repos, down from 20). Vercel repointing still pending for the now-internal sites; live URLs stay online throughout. The consolidation trades flexibility for maintenance burden reduction—smaller experiments live in labs/subdirectories instead of separate repos, making the portfolio ecosystem leaner.</p>

<p>Pushed the GitHub cleanup to the journal notes, updated the roadmap to reflect the labs migration, and merged the nightly summary into the week’s entry. NYC controls polishing wrapped tonight: 3-pill toolbar with lean colonist panel, removed the dead SAVE button that had no backend, and added an FPS debug overlay to catch performance issues before they ship. Quotable got poster and album-art flashing on correct answers with the portfolio’s sage vibe tokens (dropped the purple-tint background).</p>

<p>Scaffolded a new project tonight: <strong>bank</strong>, a neobank sandbox with mock ledger and Alpaca paper trading support, landing at heyitsmejosh.com/bank. Added basic web UI showing balance, a trade form, and activity feed. This one’s exploratory—testing the shape of finance UX with fake data before any real integration work.</p>

<p>Newsline v0 shipped: RSS clustering worker + bias-bar frontend. Deploy is still blocked on wrangler authentication.</p>

<p>Tonight’s commit wave across 10 repos (22 commits total) clears a lot of loose ends: the labs consolidation was weeks in the making, NYC simplification finally ships the toolbar work, and three new-ish projects (Root, Bank, Newsline) have their baseline scaffolds ready. The shift is moving away from monorepo friction toward focused project work.</p>

<p>Debugged TestFlight testers tonight: only 4 of 11 apps show up (Echo, Talli, Epiphany, Inkpress). Root cause is that trommatic@icloud.com is an email-invite beta tester (state INVITED) which requires manual accept per app via email link, not an auto-appearing ASC team-user internal tester. books-ios had a duplicate Internal group wired up 2026-07-10 (second invite invalidated the first email link). Fix: add self as ASC team-user internal tester (permanent solution—apps auto-appear on all testers without manual email accepts), resend fresh email invites via <code class="language-plaintext highlighter-rouge">asc testflight testers</code> for the missing 7 apps, and delete the duplicate Internal group 9ebab47c-52a0-4c23-90af-42af3a73ec79 on books-ios.</p>

<p>Evening update: fixed Epiphany’s TestFlight beta app description—created the missing en-US betaAppLocalization record via asc CLI. Only en-CA existed previously, which was causing English-language testers to see French copy.</p>

<p>Night: the braingraph repo got merged into notes as a brain/ subdirectory, retiring the standalone repo. The memory graph now redacts PII at build time (blocklist plus scrub with a self-check assertion), picked up scroll-wheel zoom, and shipped live tonight at brain.heyitsmejosh.com as a Cloudflare Worker with the custom domain attached and build tooling correctly excluded from serving. Notes also gained a macOS app target that builds green. Now both regions have proper localized beta descriptions.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Fold</title><link href="https://journal.heyitsmejosh.com/2026/05/29/may/" rel="alternate" type="text/html" title="Fold" /><published>2026-05-29T09:00:00-07:00</published><updated>2026-05-29T09:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/05/29/may</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/05/29/may/"><![CDATA[<p><img src="/assets/2026-05-29-week.svg" alt="May" /></p>

<p>Tally got a full visual overhaul early in the month, new fonts, a parchment palette, a desktop layout that finally uses the viewport, then kept iterating: an iOS redesign, cross-platform message read-state sync, an internationalization pass with a real translation pipeline, shipping as v3.4.0 then v3.4.1. Fuse shipped Google Calendar integration. Grapher, a Desmos-style calculator with no external dependencies, landed from scratch.</p>

<p>Brief, the legal case tool, was the anchor of the month. It went from a web layout experiment to a native Swift app in a week, then to a full redesign (v6, then v6.2.0), a third case activated, and CASE-0002 completed end to end. Charters shipped its own liquid glass redesign and went live on iOS the same week. Two new apps, Echo (on-device Whisper transcription) and Beep (a native transit companion), shipped from scratch on a single Saturday.</p>

<p>Mid-month brought the biggest structural move: school, cadence, epiphany, and bcgd all folded into one apps monorepo, and the journal moved off GitHub Pages onto Vercel. A shared CFA-inspired design system (cream, red, yellow, charcoal) rolled out across every web app in the same stretch. Epiphany had its own sprint on top of that: migrated off a retired stock data endpoint onto a stable API, added a Gotham-style map pass, cached news, twelve FRED economic series, live flight tracking via OpenSky, and Buy/Hold/Sell calls on stock detail pages. Life, the therapy document, got another editing and parity pass across web and iOS. Echo and Tally both reached their App Store submission lines by the end of the month.</p>

<p>Started sorting out school plans — landed on UVIC for computer science (originally looked at Capilano for paralegal studies, but CS is the path). Pre-calc test prep stayed the recurring background task all month, alongside the usual gym routine.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Connected</title><link href="https://journal.heyitsmejosh.com/2026/04/26/april/" rel="alternate" type="text/html" title="Connected" /><published>2026-04-26T13:00:00-07:00</published><updated>2026-04-26T13:00:00-07:00</updated><id>https://journal.heyitsmejosh.com/2026/04/26/april</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/04/26/april/"><![CDATA[<p><img src="/assets/2026-04-05-week.svg" alt="April" /></p>

<p>A month of platform-building. Epiphany (renamed from Opticon, then briefly Monica) got a knowledge graph, live flights and wildfires on the map, and an AI chat panel. Spark and Tally each got a full Apple sweep: Mac, watch, and widgets on top of the existing iOS and web apps. Arthur, a small from-scratch language model, got compressed down to a size that actually fits on a normal computer and went live in the browser. Then, mid-month, the codebase itself became the project: a slow slide from thirty-plus repos down to ten, then back up as new apps (Quest, wiretext, claude-usage, fuse) got built and folded into a monorepo, then split back out again by the end of June.</p>

<p>Built a gamified RPG task manager called Quest in one sitting, then merged it straight into the NYC colony sim: colonists now perform your real-life tasks, walking to a building, working, and earning XP for it. Added a wallpaper mode so the whole thing can run as a living desktop background. Life, the therapy document for Amanda, kept expanding, new sections, corrected details, six new visualization views. BC Garage Doors got a real dashboard for my dad’s shop, job pipeline, low-stock alerts, PIN auth.</p>

<p>Cadence, a git-history tracker, went from scaffold to v1.0 this month too. There’s something recursive about building a tool that tracks your own building.</p>

<p>On the personal side: gym a few times a week, hit a few personal bests. Had a two-hour call with Alex that turned into the biggest disagreement we’ve ever had, about whether hitting kids builds character. Hard to hear, especially next to what I’ve seen across three generations of my own family. Snow Leopard pass ran across the whole codebase this month, cleaning up dead repos and stray files. Applied nowhere new yet, but the ground was clearing for it. Wednesday, April 16: still going to therapy, gym three to four times a week since December, finishing Pre-Calc at LEC, aiming for UVic comp sci on Vancouver Island. Friday and Saturday that week were rougher, not much code, some real pain in there worth naming honestly rather than smoothing over. Spent an evening with my brother that left me sitting with something about where I rank in a room once someone’s girlfriend walks in — the kind of quiet hierarchy nobody says out loud but everyone understands.</p>

<p>State of things at month’s end: fine. Gym almost every day. School manageable. AI spend self-limited to a few hundred a month, worth it for the frontier models even with rough tooling. Steady, mostly solo, one weekly call with a friend. Not complaining.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Boot</title><link href="https://journal.heyitsmejosh.com/2026/02/20/week/" rel="alternate" type="text/html" title="Boot" /><published>2026-02-20T12:00:00-08:00</published><updated>2026-02-20T12:00:00-08:00</updated><id>https://journal.heyitsmejosh.com/2026/02/20/week</id><content type="html" xml:base="https://journal.heyitsmejosh.com/2026/02/20/week/"><![CDATA[<p><img src="/assets/2026-02-20-week.svg" alt="The Operating System and the Dream" /></p>

<p>Finished the second phase of my custom operating system this week. Phase 1 was the boot sequence. Phase 2 is everything that makes it a real OS: a timer ticking a hundred times per second, a keyboard driver that turns raw key presses into actual characters, formatted text output built from nothing, and a working command line with help, clear, echo, time, and reboot. Backspace works. Reboot actually reboots. Every piece of it written from scratch, no libraries. It boots up in a virtual machine and drops you at a prompt.</p>

<p>The financial terminal turned into more of a situation monitor. Wrote a paper documenting every algorithm in the trading simulator. Went from fifty-eight to a hundred tradeable assets. Added the ability to send trade signals to real brokers. Switched to a map-first layout with redesigned pins. Built <a href="https://github.com/nulljosh">Dose</a>, a personal substance tracker and reference guide, from scratch in one sitting. Merged the health tracker and the AI doctor into Dose, killed the snake game, and moved trading docs into the main project. Three fewer repos to think about.</p>

<p>Wednesday was an eighteen-hour session. Fixed a week-long bug where a missing config value was blocking login before anything else could run. Licensed all thirty projects under MIT. Shipped two programming languages as open source with browser playgrounds. <a href="https://github.com/nulljosh/tally">Tally</a> got BC government blue, a public benefits screener covering ten programs, and tighter security.</p>

<p>Had the dream again. Same one since I was five, once or twice a month. Always corridors. Chasing a faceless figure. When I catch them they turn around and it’s me. Then they start chasing me. No exit, just the reversal. The Jungian read is the shadow self – you chase it to close the gap, but the gap is internal. The corridor is transition, always between places, never arrived. What I can’t rationalize is the consistency across twenty years. It was there at five. Logging it.</p>

<p>The fastest way to not think about yourself is to build something complicated enough to require all your attention.</p>

<p>Been going to the gym a few times this week. Hit a personal best. The discipline is compounding.</p>

<p>Fixed the morning call system after finding out it had been silently crashing because the scheduler was pointed at an old file location. Renamed Callie to Fony. Recovered three projects from their live sites after the source code went missing during consolidation. The AI model finished three hundred training rounds with near-zero error – and still outputs garbage. Something is wrong with how the data is being fed in. Near-zero loss after three hundred rounds and the output is still noise. That gap between metric and result is where the actual work is, and it is not a small gap.</p>]]></content><author><name>Joshua Trommel</name></author><category term="journal" /><category term="monthly" /><summary type="html"><![CDATA[]]></summary></entry></feed>