Reactant v1.0.0
The first stable release of Reactant — an offline-first starter for web + React Native products on a Frappe backend.
Reactant is not a library you depend on; it's a repository you own. Clone it, run one personalizer, and start building. The hard parts — on-device storage, sync, an authenticated API client, and a monorepo that keeps web and native honest — ship pre-wired as versioned packages. Everything under apps/ and packages/{core,ui-web,ui-native} is yours to edit.
Highlights
- Offline-first by default. The
@8848digital/offline-kitengine (on-device storage + sync) and the@8848digital/catalystchassis (API client, React Query, auth, Frappe sync transport) come installed and wired. Boot glue lives inapps/webandapps/native/src/bootstrap.ts— you plug in your product, not the plumbing. - One codebase, two front doors. A pnpm + Turborepo workspace shares a single
@app/core(features, domain types, endpoints, design tokens) across a Next.js web app and a bare React Native app, with React and React Native versions pinned to one resolution across the tree. - Web on Next.js (App Router). The web app runs on Next.js 15 + React 19 + Tailwind. The welcome screen boots with no backend required, so a fresh clone is runnable in minutes.
- A feature convention that scales. Vertical slices (
hooks → repo → data/{local,remote}, withusecases/outboxfor writes) enforce one downward dependency direction. ESLint guards the boundary: only the DB layer may touchgetOfflineDbor run SQL. - Neutral, brandable foundation. Design tokens are placeholder values with a fixed shape — rebrand by editing values, never by hardcoding. No domain-specific naming, fonts, or icons leak into your product.
- Safe to ship. Android release builds require your upload keystore and refuse to silently fall back to the public debug key; iOS and Android declare no permissions you didn't ask for; native identity is a clearly marked, one-time checklist item.
What's included
Chassis & engine (installed)
@8848digital/offline-kit— on-device storage + sync engine.@8848digital/catalyst— API client, React Query, auth, and Frappe sync transport (depends on offline-kit).- Distributed via GitHub Packages; a read token in your user-level
~/.npmrcis the only credential you supply.
Your workspace (yours to edit)
apps/web— Next.js (App Router) + React 19 + Tailwind.apps/native— React Native 0.85 (bare).packages/core(@app/core) — features, domain types, endpoints, and design tokens, including the referenceexampleslice.packages/ui-web,packages/ui-native— intentionally empty component scaffolds; bring your own.
Tooling
- pnpm 11 workspace + Turborepo (
dev·build·lint·test). - ESLint (incl. React, React Native, a11y, and architecture-boundary rules), Prettier, Husky + lint-staged, and commitlint (Conventional Commits).
setup.mjspersonalizer — sets project name + API URL on first run, then self-deletes.- Bug and feature issue templates.
Notable changes since the internal template
Added
@app/corescaffold — tokens, endpoints, and the referenceexamplevertical slice.- Welcome app shells for both web and native, with offline glue pre-wired.
- Empty
ui-web/ui-nativecomponent packages. setup.mjspersonalizer and the monorepo tooling/config baseline.
Changed
- Web migrated from Vite + React Router to the Next.js App Router.
packages/coreREADME rewritten to match the real, neutral template.ExampleItemmoved to a slice-local type — feature-local types are now enforced, not conventional.
Fixed / hardened
- Android release builds now require a real upload keystore instead of falling back to the shared, public debug key.
- Android and iOS no longer declare location permissions by default; the iOS usage string is generic.
- Native geolocation throws when unimplemented rather than returning hardcoded coordinates.
- Removed domain-specific wording, fonts (Manrope), product icons, and dangling doc references left over from the source template.
Getting started
node setup.mjs # personalize: project name + API URL (then it self-deletes)
pnpm install # pulls @8848digital/* from GitHub Packages
pnpm --filter web dev # web at localhost:3000 — welcome screen needs no backendNative (after the React Native toolchain is set up):
pnpm --filter <your>-native start # Metro
pnpm --filter <your>-native android # or: iosRequirements
- Node 20+, pnpm 11+
- A GitHub Packages read token for the private
@8848digital/*packages (in your~/.npmrc). - Native: the React Native toolchain (Android Studio / Xcode).
- A running Frappe site with the mobile sync app.
Before you ship
- Native identity: replace the placeholder bundle id
com.example.reactant/ app nameReactantAppacrossapps/native/android/**andapps/native/ios/**. - Android signing: generate your own upload keystore and provide credentials via
keystore.properties(local) orREACTANT_UPLOAD_*env vars (CI). Unsigned release artifacts cannot be uploaded to Play. See the README for the full checklist.
Reactant v1.0.0 — clone it, personalize it, and start building.