Stripe
Sunday (August 2)
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.
Monday (August 3)
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.
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.
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: useSupabase() destructured key from a config that returns anonKey, 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 .trim(), 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.
Tuesday (August 4)
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 /work runs kept leaving Notes.app full: note deletion had been delegated to parallel forks and never happened, plus an osascript call wasn’t finding its absolute path in every shell. Wrote a new notes-delete.sh 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 journal-refresh 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 (key instead of anonKey), 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.
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).
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 asc signing fetch before the next upload. Portfolio and app roadmaps swept and pruned to show only open items.
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 tally., TallyService remotes in Epiphany iOS + macOS still hardcoding tally., Litigate’s App Store privacy-policy URL pointing at deleted brief., Healstack with sync endpoints rejecting the real origin because CORS was set to dead dose., and Curvely/Inkpress provisioning profiles left untracked after refetch. Root cause caught: ~/Documents/Code itself is a git repo, so child repos get gitignored and a plain recursive grep returns almost nothing (17 hits with -ignore, 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.
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 com.apple.application-identifier 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 catch {} in findUserByUsername falls through to /tmp, so migration-first would’ve wiped accounts), then migration. Verified: anon select password_hash now returns 42501 permission denied.
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; asc review has no subcommand and asc web review show 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 jatrommel@gmail.com 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.
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.
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.
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.
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.
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.
Wednesday (August 5)
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.
Thursday (August 6)
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.
Evening: Added light mode support to Litigate’s web app, defaulting to device color scheme preference via inline prefers-color-scheme 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.
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.
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.
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.
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.
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.
Discovered late evening the converter hung on the first book, then found and fixed it: an h3 subheading (###) wasn’t handled by the code that only looked for ##, 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.
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.
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.
Late: synced ~/Documents/Code by rebasing onto origin/main (73 local commits, clean push).
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.
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.
Apps
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).