The web/ dashboard used to ride along inside FTStore Manager as a second tab, hidden behind a developer-mode switch. Hiding was the wrong tool: the Manager is what a normal user installs to get FTStore onto a phone, and the worker controls were one gesture away from it. FTStore Admin (admin/, app.ftstore.admin) is now its own app: - admin/FTStoreAdmin/Console/* is the moved console, unchanged in behaviour — ManagerConfig became AdminConfig, ManagerHomeView.brand became AdminTheme.brand. - It links no Swift package at all, only system frameworks. The three helpers it borrowed from NimbleKit and the engine (User-Agent, share sheet, image resize, AnyCodable) are inlined in Support/, so the IPA stays what it claims to be: a login form and nothing else. - Its Keychain service is app.ftstore.admin and its User-Agent is FTStore-Admin/…, deliberately outside web/'s APP_UA gate — the console only calls session-authenticated routes. - The optional biometric gate now re-arms whenever the app leaves the screen, not just at launch. - Sideloaded on purpose: admin-release.yml cuts a draft release from an admin-v* tag and admin-build.yml compiles every push, but there is no AltStore source and no self-update channel. The Manager loses the console, the developer-mode gate and therefore the tab bar — FTStoreManagerApp shows ManagerHomeView directly. Its camera and Face ID usage strings go with it, and ManagerLegacyConsole.purge() wipes the session an updated install would otherwise still be holding.
1.2 KiB
FTStore — project guide for Claude
See AGENTS.md for the full project guide — it is the single, canonical source of truth for working in this repo: the monorepo layout, brand constants, the commit workflow, upstream tracking, the scripted rebrand, GPL-3.0 obligations, and validation steps all live there. Read it before making changes.
Shortest possible orientation: ios/ is the Swift app — a hard fork of
Feather, meaning it is our codebase and is not merged from upstream on any
routine (upstream stays pinned in .upstream-sync.json and is synced only when
the user asks). web/ is the FTStore Admin server (the Next.js dashboard at
/admin plus the feed server, ours alone), manager/ is FTStore Manager (a
fork of ios/, not of Feather, that installs and updates the app on-device),
and admin/ is FTStore Admin — web/'s operator console as its own iOS app,
split out of the Manager so normal users never meet it.
scripts/apply-rebrand.sh acts on ios/ only and must never touch web/,
manager/ or admin/.
Both
CLAUDE.mdandAGENTS.mdare excluded fromscripts/apply-rebrand.sh, so they intentionally mention both "Feather" (upstream) and "FTStore" without being mangled.