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.