ScreenFine

ScreenFine changelog

App builds, web releases, infrastructure, and product changes. In reverse chronological order. Updated as we ship.

Web Shipped

Phase 1 SEO build: features, pricing, comparisons, alternatives, data report

Shipped the first wave of the strategic SEO plan. Standalone routes for Features, Pricing, Compare, and Alternatives, plus the launch issue of the ScreenFine Cost Index data series.

  • + /features hub + 3 feature pages (Fine Jar, AI Villain, Wall of Shame)
  • + /pricing standalone page with Offer schema and a worked-example billing scenario
  • + /compare/vs/ pages for Opal, Apple Screen Time, One Sec, ScreenZen, Forfeit
  • + /alternatives roundup format launched with /alternatives/opal
  • + /data hub with /data/screen-time-cost-index-2026 (Dataset schema, CC-BY-4.0)
  • + /about page + /press kit
  • + New favicon.ico and apple-touch-icon.png to fix Ahrefs 404s
  • + /sitemap.xml redirects to /sitemap-index.xml for crawler compatibility
  • + Sitemap entries gain lastmod and trailing-slash normalisation
Web Shipped

AI crawler preferences and llms.txt

Published /llms.txt (per llmstxt.org spec), /llms-full.txt (full-content version for AI ingestion), /ai.txt (Spawning AI format), and expanded /robots.txt to opt out of every major AI training crawler while explicitly allowing user-triggered citation crawlers.

  • + Training crawlers disallowed: GPTBot, ClaudeBot, anthropic-ai, Google-Extended, Applebot-Extended, CCBot, Bytespider, Meta-ExternalAgent, FacebookBot, cohere-ai, Amazonbot, omgili
  • + Citation crawlers allowed: ChatGPT-User, OAI-SearchBot, Claude-User, Claude-SearchBot, PerplexityBot
Web Fix

Performance fixes for mobile Lighthouse score

Mobile PageSpeed Insights baseline was 51 with LCP 5.7s and TBT 1020ms. Shipped fixes targeting render-blocking resources and hero LCP measurement.

  • + Google Fonts switched to non-blocking preload + media-swap pattern
  • + gtag.js deferred until requestIdleCallback or first user interaction
  • + Removed opacity-0 fade-in on the hero H1 (was delaying LCP measurement)
  • + Trimmed unused font weights (saved ~24 KB / 2 woff2 fetches)
  • + Removed empty Cloudflare Insights beacon (saved ~5 KB and one connection)
  • + Removed FAQPage JSON-LD from homepage (Google restricted FAQPage to gov + healthcare since Aug 2023)
  • + Excluded /admin/ from the sitemap; added Disallow: /admin/ to robots.txt
  • + Added security headers via Cloudflare Pages _headers (HSTS, CSP, X-Frame-Options, Permissions-Policy)
App Shipped

Build 35 ships with Squad, Focus Sessions, Coach, Fine Destinations

Five major features shipped together to TestFlight, all backed by the FamilyControls + DeviceActivityMonitor extension that was finally re-enabled this build cycle.

  • + Squad Mode: create or join a squad, leaderboard, overage notifications
  • + Focus Sessions: timed phone-down challenges with credit rewards
  • + AI Weekly Coach: personalised behavioural advice via Convex actions
  • + Fine Destinations: choose where fines go (jar, charity, savings, partner)
  • + Custom Shield Configuration extension created (targets/ShieldConfiguration/)
  • + Real screen-time tracking with 5-minute threshold intervals (200 thresholds covering 16.7h)
  • + App shielding via ManagedSettings when over the limit
  • + New app icon: hourglass + dollar symbol replacing the typographic SF
Infrastructure Shipped

FamilyControls entitlement approved

Apple granted Distribution capability for the FamilyControls entitlement. ScreenTime tracking and DeviceActivityMonitor extension can now run on production builds, not just TestFlight internal.

App Fix

TurboModule SIGSEGV fix in build 29

Build 27 was crashing on launch with a Hermes Thread 13 SIGSEGV. Root cause: @clerk/expo/token-cache called SecureStore.getItem() at module load time, dispatching to a background queue that threw NSException. Fixed by deferring every native module import to a lazy require() on first use.

  • + utils/lazyNativeModules.ts holds shared lazy getters for AsyncStorage, WebBrowser, etc.
  • + ConvexClerkProvider loaded via dynamic require() behind InteractionManager + 300ms
  • + Established the rule: every new native module added to this codebase must be lazy-loaded
App Shipped

First EAS production build (1.0.0, build 17)

First successful EAS production build. Package versions fixed for SDK 54 compatibility. FamilyControls entitlement was temporarily disabled in withScreenTime.js for this build while we waited on the Apple approval.

Want updates?

Follow the blog for longer-form posts, or subscribe to RSS to get changelog entries as they land.