feat(backend): add standalone data plane

Replace the Supabase application data plane with the Node/PostgreSQL API, migrate mobile, admin, web, and MCP callers, add controlled cutover tooling, and define hardened Dokploy infrastructure.
This commit is contained in:
jjbrunton committed 2026-08-28 14:42:11 +01:00
1 parent 01bb8225ae
commit 006761d3b0
294 files changed
+16259 -6138

No files matched your search

+8 -4
View File
@@ -1,9 +1,13 @@
# System E2E
Tests assume `scripts/dev-local.sh up` is already running. Execute with
`npm run verify:e2e`; the wrapper supplies local-only Supabase credentials and
refuses remote hosts. Playwright retains traces, screenshots, and videos on
failure under ignored output directories.
`npm run verify:e2e`; application data must use the loopback standalone API and
PostgreSQL. Playwright retains traces, screenshots, and videos on failure under
ignored output directories.
Native flows live under `maestro/` and run with `npm run test:mobile:e2e` after an
iOS or Android build is installed.
iOS or Android build is installed. `login-screen-smoke.yaml` is credential-free.
`login-smoke.yaml` requires `E2E_EMAIL` and `E2E_PASSWORD` for a disposable,
onboarding-complete user in the designated hosted non-production Supabase Auth
project, with a matching standalone database profile. Never use production Auth,
a subscriber account, or a service-role key for local/E2E acceptance.
+19
View File
@@ -0,0 +1,19 @@
appId: com.sauci.app
name: Standalone-backend build reaches the Auth login screen
---
- launchApp:
clearState: true
- waitForAnimationToEnd
- tapOn:
point: "50%,25%"
- tapOn:
text: "Continue"
optional: true
- tapOn:
point: "94%,44%"
- extendedWaitUntil:
visible: "Explore intimacy together"
timeout: 30000
- assertVisible: "Sauci"
- assertVisible: "Password"
- takeScreenshot: "evidence/self-hosted-backend/ios-auth-login-current"
+32 -3
View File
@@ -1,14 +1,43 @@
appId: com.sauci.app
name: Local fixture login reaches authenticated app
name: Hosted Auth fixture reaches the standalone API-backed app
---
- launchApp:
clearState: true
- waitForAnimationToEnd
- tapOn:
point: "50%,25%"
- tapOn:
text: "Continue"
optional: true
- tapOn:
point: "94%,44%"
- extendedWaitUntil:
visible: "Explore intimacy together"
timeout: 30000
- tapOn: "Password"
- tapOn: "Enter your email"
- inputText: "e2e.alex@example.test"
- eraseText
- inputText: "${E2E_EMAIL}"
- tapOn: "Enter your password"
- inputText: "Sauci-e2e-only-2026!"
- eraseText
- setClipboard: "${E2E_PASSWORD}"
- pasteText
- tapOn: "Sauci"
- scrollUntilVisible:
element:
text: "Sign In"
direction: DOWN
- tapOn: "Sign In"
- extendedWaitUntil:
notVisible: "Sign In"
timeout: 15000
- tapOn:
text: "Not Now"
optional: true
- extendedWaitUntil:
visible: "Discover"
timeout: 15000
- assertVisible: "Adventure & Travel"
- assertVisible: "Quality Time"
- assertNotVisible: "No packs available"
- takeScreenshot: "evidence/self-hosted-backend/ios-authenticated-api-current"