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:doctorreports the brief’s state.yarn remove:feature <chat|create|scan>andyarn remove:integration <sentry|onesignal|posthog>, both with--dry-run.yarn check:feature-variantsandyarn check:integration-variantsprove the results in CI. See Removing features and integrations.- A
designskill. Themes are generated from seeds insrc/theme/seeds/(mono,paper,slate) withyarn theme:generate;yarn theme:fontsswaps the font pair;yarn theme:iconbuilds the icon, adaptive icon and splash from a logo;yarn check:themeruns in CI. See Design. - A guided EAS path:
eas init --account <owner> --non-interactive, an App Store Connect API key incredentials/asc.envas the iOS credential route, and a reference for everyeas buildandeas submitprompt. The doctor reports the EAS project, and the submit preflight warns about an icon with an alpha channel. nativeexpress create-appasks only for the app name and Expo account username, derives the slug, scheme and identifiers, accepts--ownerand-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.--pushrefuses to run until a human has read both tables and sethumanConfirmed, 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’sapplications.dataSafetyis a real endpoint and takes the Play Console CSV, which is written to disk on every run either way. See Privacy declarations.declarations.config.jsonfor 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 aplayConsoleOnlyblock recording the App content answers Google exposes no API for, so they are decided in the repo rather than improvised.preflight.mjslists whichever are still open.- The App Store Connect
.p8now belongs outside the repo, at~/.appstoreconnect/, with only its path in the gitignoredcredentials/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/andsrc/lib/db/repository/are gone. - Sentry is behind a crash-reporting port in
src/services/crash-reporting/.src/lib/logger.tsreports through the port, andmetro.config.jsuses Sentry’s Metro wrapper only when the package is installed. - Superwall reads
EXPO_PUBLIC_SUPERWALL_API_KEY_APPLEandEXPO_PUBLIC_SUPERWALL_API_KEY_GOOGLE, one per platform, instead ofEXPO_PUBLIC_SUPERWALL_KEY. DESIGN.md§1 is written per app by the design skill; §2 to §7 are the unchanged contract.app.config.jsreads the icon, splash and canvas colours fromsrc/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.onboardingafter 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.jsonandeas.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:doctorreports configuration and checks remote metadata when access is available. setup,conventions,uniwindandheroui-nativeskills in both.claude/skills/and.agents/skills/.store-assetsandsubmitare 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 typecheckgenerates Expo Router route types withnpx expo customize tsconfig.json.tsconfig.jsonenablesverbatimModuleSyntax.- Expo registers the app scheme, and the Google Sign-In plugin registers its URL scheme.
expo-build-propertiesconfigures the modular headers needed by Google’sAppCheckCore. - The Expo Doctor exclusion list is removed.
ScanCameraModalusesuseEffectEventfor callbacks that read current values. PaywallProvidermounts 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.jsreads this file as itsaiblock.yarn check:envchecks configured defaults. - Each EAS build profile selects its
development,previeworproductionenvironment. The production profile uses remote versioning and increments its build number. general.easProjectIdstarts empty.app.config.jsaddsextra.eas.projectIdafter 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 includesgenerations,scansandcount_monthly_usage, with anonymous access to the RPC revoked. - Avatar uploads use
avatars/{userId}.<ext>within the fixedavatarsbucket. Insert and update policies check the user’s ID.EXPO_PUBLIC_SUPABASE_BUCKET_NAMEis 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.Protectedroute guards. Supabase sessions useexpo-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_MODEwhen 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_MESSAGESvalues fall back to the configured default. - The database-status scripts use
supabase migration listfor 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-iconsand@supabase-cache-helpers/postgrest-react-query. src/components/ui/,gluestack-ui.config.jsonandtailwind.config.js.- The demo product screens, joke generator and
call-llmfunction. - Bring-your-own-key support.
seed.sql; database seeding is disabled insupabase/config.toml..cursorrules; the repository includesAGENTS.mdfor coding agents.
Last updated on