back

Renames

June-July

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.

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.

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.

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.

Saturday

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.

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).

Sunday

Smoothed out the Markets news drawer drag that was choppy from fighting a declarative animation—removed the conflicting .animation modifier so the gesture now tracks the finger 1:1, and gave the drawer a semi-transparent liquid-glass look with .ultraThinMaterial 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 & Greed row when the drawer is fully open so the top sliver stays as a clean horizontal ticker strip, mirroring Yahoo Finance’s layout.

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”.

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.

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.

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.

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.

Sunday (continued)

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.

Monday

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.

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.

Monday (continued)

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.

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.

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.

Later night: wired release workflows across all eight shipping apps. Added .asc/workflow.json release pipelines to spark (ship-ios + ship-mac), echo, brief, journal, healstack, epiphany, lexly, and talli so releases are one command: asc workflow run ship-ios VERSION:x.y.z. 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.

Monday

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.

Monday (next)

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.

Monday (today)

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.

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.

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.

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.

Tuesday

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.

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 asc workflow run ship-ios to get the fix plus the earlier color corrections (blue #5B9BD5 for better accessibility) onto TestFlight.

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.

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.

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 <style> block that forces system font, proper heading sizes, and paragraph spacing before parsing. Committed to GitHub and kicked off asc workflow run ship-ios VERSION:1.0.2 to ship the fix to TestFlight (build in progress; ASC shows 1.0.1 still current, 1.0.2 pending).

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.

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.

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.

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.

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.

Evening: completed Lexly’s marketing landing page split. Added /index.html as a public-facing intro site with course highlights, unified header styling between the landing page and the /app/ 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 /app/index.html 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.

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).

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 vercel deploy --prod run, not a real CI/CD pipeline. Ran vercel git connect --yes 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.

In flight: 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).

Active development: 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.

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 asc profiles inspect --entitlements 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.

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.

Tuesday (today)

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.

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

Continued work on portfolio iOS app submission paperwork and app store readiness across several projects.

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.

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.

Fixed the What’s New sheet from forcing a half-screen .presentationDetents([.medium]) 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.

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.

Eliminated choppiness in the news drawer’s drag gesture, which was causing the List to re-measure on every drag pixel: the drawer’s .frame(height:) 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.

Wednesday

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.

Tuesday

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.

Wednesday

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.

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.

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.

Wednesday

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.

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.

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.

Late evening: added a terminal dashboard to Epiphany that live-polls Upstash KV for portfolio data, built as an ink-based TUI in cli/epiphany-tui.mjs. 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.

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

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.

Thursday

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.

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.

Friday

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.

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.

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.

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.

Friday (continued)

App Group dev-portal blocker partially cleared. All three app groups (talli, epiphany, spark) were already registered at Apple; manually assigned group.com.heyitsmejosh.talli 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.

Aligned the books site typography with the portfolio’s shared font tokens: swapped body text from monospace to the new --font-body 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.

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.

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 --font-body token matching the portfolio’s sans-serif treatment.

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.

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.

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 /api/cgeb-profile and surfaces quarterly entitlement + amount in the uiConfig.

Friday (late evening)

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.

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).

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.

Saturday

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.

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).

Scaffolded a new project tonight: bank, 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.

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

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.

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 asc testflight testers for the missing 7 apps, and delete the duplicate Internal group 9ebab47c-52a0-4c23-90af-42af3a73ec79 on books-ios.

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.

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.