You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Settings sync: end-to-end validation against local Supabase #987
cargo test: 708 passed. The account and settings_sync suites cover sign-in, refresh, sign-out, delete, the keychain, merges, conflicts, newer schemas, and two-computer convergence, all with fakes.
Local Supabase stack (switchify-supabase supabase start): the ignored tests account::tests::local_stack_sign_in_refresh_and_delete and settings_sync::tests::local_stack_round_trips_the_document_and_enforces_revisions pass. They cover:
the real code email read from Mailpit
verify, then refresh after a restart, then delete through the RPC
explicit nulls surviving jsonb
create giving revision 1, with a second create getting 409
a conditional update, and a stale update being rejected
one account being unable to read another's row or update it through a forged user_id
Database: 50/50 pgTAP tests pass in switchify-supabase.
Manual, Windows, production, with the real account (dev build from main with sync; computer use drove the app and Gmail; the database was checked directly)
Settings → Account showed the email form. Requesting a code showed "We sent a code to …", and a "Switchify login code" email arrived in Gmail. Entering it gave "Signed in as …" and "Settings are up to date".
The existing shared account was used, and the Android user_preferences row was untouched.
First sync created the desktop_preferences row at revision 1 with all six sections (about 1.2 KB). Sync now with nothing changed uploaded nothing.
Changing Show crosshairs locally uploaded by itself within 20 s (revision 2).
A simulated other-computer change in the database (revision 3) was applied by Sync now, persisted to state.json, and not echoed back.
After a restart the app was still signed in, refreshed from the keychain, and synced on startup.
The keychain entry exists. No tokens, code or email address appeared in settings-sync.json or the app log.
Still to do
macOS: the same sign-in and sync flow (npm run macos:run with both SWITCHIFY_SUPABASE_* variables set).
Two real computers editing at the same time (simulated in the database so far).
Closing at the owner's request. Validation completed: automated suites (including the local-stack integration tests), database tests, and a manual Windows run against production (sign-in by emailed code, upload, remote apply without echo, restart persistence, no secrets in logs or state); docs merged in #994. The remaining items (macOS run, two real computers editing at once, sign-out on a real build) were not run before closing.
Activity
enaboapps commentedon Oct 6, 2026
Evidence so far (2026-10-05/06)
Automated
cargo test: 708 passed. Theaccountandsettings_syncsuites cover sign-in, refresh, sign-out, delete, the keychain, merges, conflicts, newer schemas, and two-computer convergence, all with fakes.supabase start): the ignored testsaccount::tests::local_stack_sign_in_refresh_and_deleteandsettings_sync::tests::local_stack_round_trips_the_document_and_enforces_revisionspass. They cover:nulls survivingjsonbuser_idManual, Windows, production, with the real account (dev build from
mainwith sync; computer use drove the app and Gmail; the database was checked directly)user_preferencesrow was untouched.desktop_preferencesrow at revision 1 with all six sections (about 1.2 KB). Sync now with nothing changed uploaded nothing.state.json, and not echoed back.settings-sync.jsonor the app log.Still to do
npm run macos:runwith bothSWITCHIFY_SUPABASE_*variables set).enaboapps commentedon Oct 7, 2026
Closing at the owner's request. Validation completed: automated suites (including the local-stack integration tests), database tests, and a manual Windows run against production (sign-in by emailed code, upload, remote apply without echo, restart persistence, no secrets in logs or state); docs merged in #994. The remaining items (macOS run, two real computers editing at once, sign-out on a real build) were not run before closing.