Skip to Content

Changelog

Notable changes to NativeExpress, grouped by release.

The format follows Keep a Changelog . Releases use Semantic Versioning .

[Unreleased]

Added

  • PRODUCT.md, the product brief, and a discovery phase at the start of the setup skill. One interview writes the brief, derives the app identity from the app name and Expo account username, and removes the features and integrations the brief marks out. yarn skills:doctor reports the brief’s state.
  • yarn remove:feature <chat|create|scan> and yarn remove:integration <sentry|onesignal|posthog>, both with --dry-run. yarn check:feature-variants and yarn check:integration-variants prove the results in CI. See Removing features and integrations.
  • A design skill. Themes are generated from seeds in src/theme/seeds/ (mono, paper, slate) with yarn theme:generate; yarn theme:fonts swaps the font pair; yarn theme:icon builds the icon, adaptive icon and splash from a logo; yarn check:theme runs in CI. See Design.
  • A guided EAS path: eas init --account <owner> --non-interactive, an App Store Connect API key in credentials/asc.env as the iOS credential route, and a reference for every eas build and eas submit prompt. The doctor reports the EAS project, and the submit preflight warns about an icon with an alpha channel.
  • nativeexpress create-app asks only for the app name and Expo account username, derives the slug, scheme and identifiers, accepts --owner and -y, and prints the prompt that starts the setup skill’s discovery phase.
  • A store submission pipeline covering both stores from the terminal. The App Store side runs on asc, the App Store Connect CLI, for the version record, listing text, screenshots per display slot, age rating, content rights, attaching the build, TestFlight and review submission. The Play side is a dependency-free client against the Play Developer API for the listing, track promotion with staged rollout, and review replies. See Submit to the stores.
  • privacy.config.json, one privacy declaration for both stores. It is pruned to the features and integrations the build still ships, then mapped onto Apple’s App Privacy vocabulary and Google’s Data safety vocabulary. --push refuses to run until a human has read both tables and set humanConfirmed, and the scripts hard-fail rather than publish “no data collected” for an app with accounts. Apple has no public API for this, so it goes through an Apple ID web session; Google’s applications.dataSafety is a real endpoint and takes the Play Console CSV, which is written to disk on every run either way. See Privacy declarations.
  • declarations.config.json for age rating and content rights. Content rights ships unanswered on purpose, because declaring third-party content asserts you hold the rights to it. See Age rating and content rights.
  • play.config.json, the Play listing plus a playConsoleOnly block recording the App content answers Google exposes no API for, so they are decided in the repo rather than improvised. preflight.mjs lists whichever are still open.
  • The App Store Connect .p8 now belongs outside the repo, at ~/.appstoreconnect/, with only its path in the gitignored credentials/asc.env. See Store credentials.

Changed

  • Chat, Create and Scan live under src/features/<name>/, each with its screens, components, hooks and repository. src/lib/ai/ and src/lib/db/repository/ are gone.
  • Sentry is behind a crash-reporting port in src/services/crash-reporting/. src/lib/logger.ts reports through the port, and metro.config.js uses Sentry’s Metro wrapper only when the package is installed.
  • Superwall reads EXPO_PUBLIC_SUPERWALL_API_KEY_APPLE and EXPO_PUBLIC_SUPERWALL_API_KEY_GOOGLE, one per platform, instead of EXPO_PUBLIC_SUPERWALL_KEY.
  • DESIGN.md §1 is written per app by the design skill; §2 to §7 are the unchanged contract. app.config.js reads the icon, splash and canvas colours from src/assets/images/branding.json.
  • The setup skill’s identity phase no longer asks for identifiers, and the skill hands over to the design skill once the app runs.

2.0.0  - 2026-09-05

NativeExpress 2.0 adds chat, image generation and scanning, with Uniwind, Tailwind CSS v4 and HeroUI Native for styling and components.

Breaking changes

The styling system, component library, AI functions and database schema have changed. For an existing app built on NativeExpress 1.x, follow Upgrade from v1.

Added

  • Streaming AI chat with threads, a model picker, Markdown replies and a monthly free quota. Conversations support photo attachments and image replies.
  • An image-generation screen with style presets, aspect ratios, a gallery and save/share actions.
  • A camera-based object scanner with structured results and a scan history.
  • A three-step onboarding flow with a notification primer and named paywall placements. Answers are saved locally, then attached to user_metadata.onboarding after sign-in. Existing account answers are preserved, and a failed sync keeps the local record.
  • Eleven typed product events covering onboarding, authentication, AI features, paywalls and Pro status. Their property types are defined in src/services/analytics/events.ts.
  • A check-your-inbox screen and resend action for sign-ups that require email confirmation.
  • Optional Superwall paywall presentation alongside RevenueCat. Purchase handling and subscription synchronization need the additional integration steps.
  • iPad layouts with a tablet: breakpoint, shared content width and a chat list/detail view.
  • Jest and React Native Testing Library tests, plus Maestro flows under .maestro/.
  • Store submission configuration in store.config.json and eas.json, with skills for preparing screenshots, listing assets and release checklists.
  • A setup skill covering app identity, Supabase, AI functions and optional integrations. yarn skills:doctor reports configuration and checks remote metadata when access is available.
  • setup, conventions, uniwind and heroui-native skills in both .claude/skills/ and .agents/skills/. store-assets and submit are included under .claude/skills/.
  • DESIGN.md, the app’s design reference.

Changed

  • The app uses Uniwind, Tailwind CSS v4 and HeroUI Native. Theme colors are defined in CSS, with Geist for interface text and Instrument Serif for display text.
  • The platform dependencies are Expo 57.0.20, React Native 0.86.3, React 19.2.3 and TypeScript 6.0.3. The app requires Node.js 22 or later.
  • yarn typecheck generates Expo Router route types with npx expo customize tsconfig.json. tsconfig.json enables verbatimModuleSyntax.
  • Expo registers the app scheme, and the Google Sign-In plugin registers its URL scheme. expo-build-properties configures the modular headers needed by Google’s AppCheckCore.
  • The Expo Doctor exclusion list is removed. ScanCameraModal uses useEffectEvent for callbacks that read current values.
  • PaywallProvider mounts the shared paywall UI and the optional Superwall provider. Paywall presentation is exported from @/services/paywall.
  • The app and functions share the AI registry in supabase/functions/_utils/ai.config.json. config.js reads this file as its ai block. yarn check:env checks configured defaults.
  • Each EAS build profile selects its development, preview or production environment. The production profile uses remote versioning and increments its build number.
  • general.easProjectId starts empty. app.config.js adds extra.eas.projectId after the app is linked to its own Expo project.
  • One initial migration, 20260904000000_initial_schema.sql, creates the database schema, storage buckets and access policies. It includes generations, scans and count_monthly_usage, with anonymous access to the RPC revoked.
  • Avatar uploads use avatars/{userId}.<ext> within the fixed avatars bucket. Insert and update policies check the user’s ID. EXPO_PUBLIC_SUPABASE_BUCKET_NAME is removed.
  • Shared function utilities handle authentication, typed errors, model configuration, entitlements, quota checks and storage.
  • Chat sends the newest user message and storage paths for attachments. The function loads history from the database. Retrying the same pending message reuses its row without adding usage, but sends another request to the model. Scan requests use imagePath.
  • Free usage is counted from stored user messages and scan rows. Chat inserts its user message before calling the model, so a later provider failure can still count. Successful scans add usage after processing. See Quota for the behavior.
  • Analytics, push and paywalls have service entry points under src/services/, with lint rules restricting direct vendor imports.
  • Auth navigation uses Stack.Protected route guards. Supabase sessions use expo-secure-store, with existing AsyncStorage sessions migrated on first launch.
  • Theme preference is saved and follows the operating system until the user selects a mode.
  • OneSignal’s APNs mode follows ONESIGNAL_MODE when set, otherwise the EAS build profile. Only the production profile defaults to production APNs.

Fixed

  • Chat, Create and Scan show provider-configuration errors. Pro-only requests open the paywall, and failed chat messages have a retry action.
  • Small photos retain their dimensions during upload instead of being enlarged to the cap.
  • Expired image URLs are refreshed in chat, the gallery, the home screen and scan history.
  • RevenueCat identity and logout calls are skipped until its platform key is configured. Missing purchase configuration produces a notice when the user opens a paywall.
  • Account deletion removes the user’s avatar and chat-media objects before deleting the auth user.
  • Functions return typed error codes while keeping detailed errors in their logs. Validation and provider-configuration refusals before message insertion do not add chat usage. Invalid AI_FREE_MESSAGES values fall back to the configured default.
  • The database-status scripts use supabase migration list for local and linked projects.
  • Pro checks use the configured RevenueCat entitlement on the client and server.
  • Chat streams replies incrementally through expo/fetch.
  • Chat and Scan report camera or photo-library access failures.
  • Screen titles, content gutters and safe-area backgrounds are consistent across tabs.
  • RevenueCat offering-load failures are handled without an unhandled rejection.
  • Push permission is requested through onboarding.
  • The displayed monthly usage refreshes after AI requests.
  • Relative timestamps use APIs available in Hermes.

Removed

  • GlueStack UI, NativeWind, @legendapp/motion, @expo/vector-icons and @supabase-cache-helpers/postgrest-react-query.
  • src/components/ui/, gluestack-ui.config.json and tailwind.config.js.
  • The demo product screens, joke generator and call-llm function.
  • Bring-your-own-key support.
  • seed.sql; database seeding is disabled in supabase/config.toml.
  • .cursorrules; the repository includes AGENTS.md for coding agents.
Last updated on