@volter/twin-supabase
Supabase
Local Supabase twin: a project's Postgres database, the World's own managed Postgres, whose URL the twin hands the application; the Management API, PostgREST, Storage and Auth answer the gap. Built on @volter/world-core.
Publisher README included in @volter/twin-supabase 1.0.3. Setup gives the installation instructions for this selected version.
A local Supabase project's Postgres database: in a World it is the World's own managed Postgres, and the twin hands the application its URL. A Protocol 3 derived pack (twin-world's architecture, "Protocol 3: the derived pack"); no real Supabase is contacted.
Install the exact twin and World CLI in your app:
npm install --save-dev --save-exact @volter/world@3.0.92 @volter/twin-supabase@1.0.3
Follow Run a full stack to configure the World-owned Postgres and run your migrations and app inside the World. Keep your native Postgres client unchanged. This release does not implement Supabase's HTTP APIs or make supabase-js calls work.
For an operator calling the server directly:
bun run src/cli.ts serve --database <postgres url> # without --database the project has no database to hand out (503)
For whom
RH2 (Volter's product), whose authority store is a Supabase project's Postgres, reached over the Postgres wire alone:
"no PostgREST, no Supabase client library, no anon session" (journeys/demand.json). Its release migrates the database
and its Worker queries it; both are answered by Postgres itself, the World's database (journeys/customer-life.json
walks RH2's own statements on it).
What is served
- The database. The runtime binds the twin to the World's managed Postgres (
managedDatabase:serve --database <url>), and the application connects to that database with any Postgres client. Under the containerless backing its clock follows the World clock. Database-generated randomness belongs to the backing and is not pinned; use explicit stable fixture IDs when comparing fresh Worlds (twin-world architecture, SQL steps). - The door.
POST /_twin/app-credentials(the descriptor'scredentialDoor, called by the runtime at every boot): makes the World's projectworldthe first time and answers{ ref, database_url }, fillingSUPABASE_DB_URL. - Not served (the gap): every operation of the Management API (
api.supabase.com/v1), PostgREST (/rest/v1), Storage (/storage/v1) and Auth (/auth/v1), each answering its unit's own unknown-route error (journeys/decisions.json); Realtime and Edge Functions (their paths are not claimed, so the injector refuses them).
Units
| Unit | Spec | Serves |
|---|---|---|
supabase (src/) |
spec/openapi.json.gz, api.supabase.com's own document (170 operations) |
the door; the Management API is the gap |
supabase/rest |
rest/spec/client-ops.json, the calls @supabase/postgrest-js makes |
the gap |
supabase/storage |
storage/spec/openapi.json, storage-api's document as Supabase's docs publish it |
the gap |
supabase/auth |
auth/spec/openapi.yaml, GoTrue v2.197.0's document |
the gap |
Evidence
The vendor's documents and recordings are under each unit's spec/ (its SOURCE.md).
Set up this release
Use Node 22.6 or newer. Install the CLI, then the exact packages shown alongside:
npm install -g @volter/world@3.0.108In your app’s folder, initialize a World with this implementation:
volter world init --name my-app --twins supabase --source supabase=@volter/twin-supabaseReview the detected vendor and retain the generated bindings. The supabase service’s source must select this version:
{
"source": {
"package": "@volter/twin-supabase",
"version": "1.0.3"
}
}This is the source field, not a complete config. Keep the installed version, lockfile and generated service source in agreement. Use the release README for throwaway SDK credentials, seeds and limits.
Run your app’s own test command inside the World:
volter world up
volter world run -- npm test
volter world log
volter world downdown stops compute and retains state.
Versions and implementations
| Package / version | Publisher | Status | First use |
|---|---|---|---|
| @volter/twin-supabase1.0.3 | volter-ai | Selected default | Not measured |
Evidence for 1.0.3
Installed first use · Not measured
Installed first use was not measured for this release. HTTP coverage and publisher trust do not establish this result.
API coverage, replay and browser measurements
Counts describe the declared HTTP surface, not separate command tables or other protocols. Consult the release README for those workflows.
- Assessment scope
- packaged-customer-journey; in-process
- Declared HTTP surface
- 0 served · 330 gaps · 330 declared operations
- Exercised HTTP operation coverage
- 0 / 330 declared operations (0%)
- Journey steps
- 182 answered / 184 steps
- Replay
- Equal across 2 runs
- Journey failures
- 0
- Browser target
- Not measured
- HTTP operations exercised through Chromium
- Not measured
- Chromium journey replay
- Not measured
- Browser response observation
- Not recorded
- Application-origin CORS coverage
- Not measured
- Native cookie-jar coverage
- Not measured
- DOM coverage
- Not measured
- Source code coverage
- Not measured
- State transition coverage
- Not measured
Operations not exercised
supabase/auth:delete_admin_custom_providers_identifiersupabase/auth:delete_admin_oauth_clients_client_idsupabase/auth:delete_admin_sso_providers_ssoprovideridsupabase/auth:delete_admin_users_useridsupabase/auth:delete_admin_users_userid_factors_factoridsupabase/auth:delete_factors_factoridsupabase/auth:delete_user_identities_identityidsupabase/auth:delete_user_oauth_grantssupabase/auth:get_admin_auditsupabase/auth:get_admin_custom_providerssupabase/auth:get_admin_custom_providers_identifiersupabase/auth:get_admin_oauth_clientssupabase/auth:get_admin_oauth_clients_client_idsupabase/auth:get_admin_sso_providerssupabase/auth:get_admin_sso_providers_ssoprovideridsupabase/auth:get_admin_userssupabase/auth:get_admin_users_useridsupabase/auth:get_admin_users_userid_factorssupabase/auth:get_authorizesupabase/auth:get_callbacksupabase/auth:get_healthsupabase/auth:get_oauth_authorizations_authorization_idsupabase/auth:get_oauth_authorizesupabase/auth:get_saml_metadatasupabase/auth:get_settingssupabase/auth:get_usersupabase/auth:get_user_identities_authorizesupabase/auth:get_user_oauth_grantssupabase/auth:get_verifysupabase/auth:get_well_known_jwks_jsonsupabase/auth:post_admin_custom_providerssupabase/auth:post_admin_generate_linksupabase/auth:post_admin_oauth_clientssupabase/auth:post_admin_oauth_clients_client_id_regenerate_secretsupabase/auth:post_admin_sso_providerssupabase/auth:post_admin_userssupabase/auth:post_callbacksupabase/auth:post_factorssupabase/auth:post_factors_factorid_challengesupabase/auth:post_factors_factorid_verifysupabase/auth:post_invitesupabase/auth:post_logoutsupabase/auth:post_magiclinksupabase/auth:post_oauth_authorizations_authorization_id_consentsupabase/auth:post_oauth_clients_registersupabase/auth:post_oauth_tokensupabase/auth:post_otpsupabase/auth:post_reauthenticatesupabase/auth:post_recoversupabase/auth:post_resendsupabase/auth:post_saml_acssupabase/auth:post_signupsupabase/auth:post_ssosupabase/auth:post_tokensupabase/auth:post_verifysupabase/auth:put_admin_custom_providers_identifiersupabase/auth:put_admin_oauth_clients_client_idsupabase/auth:put_admin_sso_providers_ssoprovideridsupabase/auth:put_admin_users_useridsupabase/auth:put_admin_users_userid_factors_factoridsupabase/auth:put_usersupabase/rest:PostgrestClient.getOpenApiSpecsupabase/rest:PostgrestClient.rpcsupabase/rest:PostgrestClient.rpc_2supabase/rest:PostgrestClient.rpc_3supabase/rest:PostgrestQueryBuilder.deletesupabase/rest:PostgrestQueryBuilder.insertsupabase/rest:PostgrestQueryBuilder.selectsupabase/rest:PostgrestQueryBuilder.select_2supabase/rest:PostgrestQueryBuilder.updatesupabase/storage:delete_bucket_bucketidsupabase/storage:delete_cdn_bucketnamesupabase/storage:delete_iceberg_bucket_bucketnamesupabase/storage:delete_iceberg_v1_prefix_namespaces_namespacesupabase/storage:delete_iceberg_v1_prefix_namespaces_namespace_tables_tablesupabase/storage:delete_object_bucketnamesupabase/storage:delete_s3_bucketsupabase/storage:delete_upload_resumablesupabase/storage:delete_upload_resumable_signsupabase/storage:get_bucketsupabase/storage:get_bucket_bucketidsupabase/storage:get_healthsupabase/storage:get_iceberg_bucketsupabase/storage:get_iceberg_v1_configsupabase/storage:get_iceberg_v1_prefix_namespacessupabase/storage:get_iceberg_v1_prefix_namespaces_namespacesupabase/storage:get_iceberg_v1_prefix_namespaces_namespace_tablessupabase/storage:get_iceberg_v1_prefix_namespaces_namespace_tables_tablesupabase/storage:get_object_authenticated_bucketnamesupabase/storage:get_object_bucketnamesupabase/storage:get_object_info_authenticated_bucketnamesupabase/storage:get_object_info_bucketnamesupabase/storage:get_object_info_public_bucketnamesupabase/storage:get_object_public_bucketnamesupabase/storage:get_object_sign_bucketnamesupabase/storage:get_render_image_authenticated_bucketnamesupabase/storage:get_render_image_public_bucketnamesupabase/storage:get_render_image_sign_bucketnamesupabase/storage:get_s3supabase/storage:get_s3_bucketsupabase/storage:head_bucketsupabase/storage:head_bucket_bucketidsupabase/storage:head_healthsupabase/storage:head_iceberg_bucketsupabase/storage:head_iceberg_v1_configsupabase/storage:head_iceberg_v1_prefix_namespacessupabase/storage:head_iceberg_v1_prefix_namespaces_namespacesupabase/storage:head_iceberg_v1_prefix_namespaces_namespace_tablessupabase/storage:head_iceberg_v1_prefix_namespaces_namespace_tables_tablesupabase/storage:head_object_authenticated_bucketnamesupabase/storage:head_object_bucketnamesupabase/storage:head_object_info_authenticated_bucketnamesupabase/storage:head_object_info_bucketnamesupabase/storage:head_object_public_bucketnamesupabase/storage:head_object_sign_bucketnamesupabase/storage:head_render_image_authenticated_bucketnamesupabase/storage:head_render_image_public_bucketnamesupabase/storage:head_render_image_sign_bucketnamesupabase/storage:head_s3_bucketsupabase/storage:head_upload_resumablesupabase/storage:head_upload_resumable_signsupabase/storage:options_upload_resumablesupabase/storage:options_upload_resumable_signsupabase/storage:patch_upload_resumablesupabase/storage:patch_upload_resumable_signsupabase/storage:post_bucketsupabase/storage:post_bucket_bucketid_emptysupabase/storage:post_iceberg_bucketsupabase/storage:post_iceberg_v1_prefix_namespacessupabase/storage:post_iceberg_v1_prefix_namespaces_namespace_tablessupabase/storage:post_iceberg_v1_prefix_namespaces_namespace_tables_tablesupabase/storage:post_object_bucketnamesupabase/storage:post_object_copysupabase/storage:post_object_list_bucketnamesupabase/storage:post_object_list_v2_bucketnamesupabase/storage:post_object_movesupabase/storage:post_object_sign_bucketnamesupabase/storage:post_object_upload_sign_bucketnamesupabase/storage:post_s3_bucketsupabase/storage:post_upload_resumablesupabase/storage:post_upload_resumable_signsupabase/storage:post_vector_createindexsupabase/storage:post_vector_createvectorbucketsupabase/storage:post_vector_deleteindexsupabase/storage:post_vector_deletevectorbucketsupabase/storage:post_vector_deletevectorssupabase/storage:post_vector_getindexsupabase/storage:post_vector_getvectorbucketsupabase/storage:post_vector_getvectorssupabase/storage:post_vector_listindexessupabase/storage:post_vector_listvectorbucketssupabase/storage:post_vector_listvectorssupabase/storage:post_vector_putvectorssupabase/storage:post_vector_queryvectorssupabase/storage:put_bucket_bucketidsupabase/storage:put_object_bucketnamesupabase/storage:put_object_upload_sign_bucketnamesupabase/storage:put_s3_bucketsupabase/storage:put_upload_resumablesupabase/storage:put_upload_resumable_signsupabase:v1-Delete hostname configsupabase:v1-accept-invite-external-jit-accesssupabase:v1-activate-custom-hostnamesupabase:v1-activate-vanity-subdomain-configsupabase:v1-apply-a-migrationsupabase:v1-apply-project-addonsupabase:v1-authorize-jit-accesssupabase:v1-authorize-usersupabase:v1-bulk-create-secretssupabase:v1-bulk-delete-secretssupabase:v1-bulk-update-functionssupabase:v1-cancel-a-project-restorationsupabase:v1-check-vanity-subdomain-availabilitysupabase:v1-claim-project-for-organizationsupabase:v1-count-action-runssupabase:v1-create-a-branchsupabase:v1-create-a-functionsupabase:v1-create-a-projectsupabase:v1-create-a-sso-providersupabase:v1-create-an-organizationsupabase:v1-create-legacy-signing-keysupabase:v1-create-login-rolesupabase:v1-create-project-api-keysupabase:v1-create-project-claim-tokensupabase:v1-create-project-signing-keysupabase:v1-create-project-tpa-integrationsupabase:v1-create-restore-pointsupabase:v1-deactivate-vanity-subdomain-configsupabase:v1-delete-a-branchsupabase:v1-delete-a-functionsupabase:v1-delete-a-projectsupabase:v1-delete-a-sso-providersupabase:v1-delete-invite-external-jit-accesssupabase:v1-delete-jit-accesssupabase:v1-delete-login-rolessupabase:v1-delete-network-banssupabase:v1-delete-project-api-keysupabase:v1-delete-project-claim-tokensupabase:v1-delete-project-tpa-integrationsupabase:v1-deploy-a-functionsupabase:v1-diff-a-branchsupabase:v1-disable-preview-branchingsupabase:v1-disable-readonly-mode-temporarilysupabase:v1-enable-database-webhooksupabase:v1-exchange-oauth-tokensupabase:v1-generate-typescript-typessupabase:v1-get-a-branchsupabase:v1-get-a-branch-configsupabase:v1-get-a-functionsupabase:v1-get-a-function-bodysupabase:v1-get-a-migrationsupabase:v1-get-a-snippetsupabase:v1-get-a-sso-providersupabase:v1-get-action-runsupabase:v1-get-action-run-logssupabase:v1-get-all-projects-for-organizationsupabase:v1-get-an-organizationsupabase:v1-get-auth-service-configsupabase:v1-get-available-regionssupabase:v1-get-backup-schedulesupabase:v1-get-database-disksupabase:v1-get-database-metadatasupabase:v1-get-database-openapisupabase:v1-get-disk-utilizationsupabase:v1-get-hostname-configsupabase:v1-get-jit-accesssupabase:v1-get-jit-access-configsupabase:v1-get-legacy-signing-keysupabase:v1-get-network-restrictionssupabase:v1-get-organization-entitlementssupabase:v1-get-organization-project-claimsupabase:v1-get-performance-advisorssupabase:v1-get-pgsodium-configsupabase:v1-get-pooler-configsupabase:v1-get-postgres-configsupabase:v1-get-postgres-upgrade-eligibilitysupabase:v1-get-postgres-upgrade-statussupabase:v1-get-postgrest-service-configsupabase:v1-get-profilesupabase:v1-get-projectsupabase:v1-get-project-api-keysupabase:v1-get-project-api-keyssupabase:v1-get-project-claim-tokensupabase:v1-get-project-disk-autoscale-configsupabase:v1-get-project-function-combined-statssupabase:v1-get-project-legacy-api-keyssupabase:v1-get-project-logssupabase:v1-get-project-logs-allsupabase:v1-get-project-pgbouncer-configsupabase:v1-get-project-signing-keysupabase:v1-get-project-signing-keyssupabase:v1-get-project-tpa-integrationsupabase:v1-get-project-usage-api-countsupabase:v1-get-project-usage-request-countsupabase:v1-get-readonly-mode-statussupabase:v1-get-realtime-configsupabase:v1-get-restore-pointsupabase:v1-get-security-advisorssupabase:v1-get-services-healthsupabase:v1-get-ssl-enforcement-configsupabase:v1-get-storage-configsupabase:v1-get-vanity-subdomain-configsupabase:v1-invite-external-jit-accesssupabase:v1-list-action-runssupabase:v1-list-all-backupssupabase:v1-list-all-branchessupabase:v1-list-all-bucketssupabase:v1-list-all-functionssupabase:v1-list-all-network-banssupabase:v1-list-all-network-bans-enrichedsupabase:v1-list-all-organizationssupabase:v1-list-all-projectssupabase:v1-list-all-secretssupabase:v1-list-all-snippetssupabase:v1-list-all-sso-providersupabase:v1-list-available-restore-versionssupabase:v1-list-jit-accesssupabase:v1-list-migration-historysupabase:v1-list-organization-memberssupabase:v1-list-project-addonssupabase:v1-list-project-tpa-integrationssupabase:v1-merge-a-branchsupabase:v1-modify-database-disksupabase:v1-oauth-authorize-project-claimsupabase:v1-patch-a-migrationsupabase:v1-patch-network-restrictionssupabase:v1-pause-a-projectsupabase:v1-push-a-branchsupabase:v1-read-only-querysupabase:v1-remove-a-read-replicasupabase:v1-remove-project-addonsupabase:v1-remove-project-signing-keysupabase:v1-reset-a-branchsupabase:v1-restart-a-projectsupabase:v1-restore-a-branchsupabase:v1-restore-a-projectsupabase:v1-restore-physical-backupsupabase:v1-restore-pitr-backupsupabase:v1-revoke-tokensupabase:v1-rollback-migrationssupabase:v1-run-a-querysupabase:v1-scrape-project-metricssupabase:v1-setup-a-read-replicasupabase:v1-shutdown-realtimesupabase:v1-undosupabase:v1-update-a-branch-configsupabase:v1-update-a-functionsupabase:v1-update-a-projectsupabase:v1-update-a-sso-providersupabase:v1-update-action-run-statussupabase:v1-update-auth-service-configsupabase:v1-update-backup-schedulesupabase:v1-update-database-passwordsupabase:v1-update-hostname-configsupabase:v1-update-jit-accesssupabase:v1-update-jit-access-configsupabase:v1-update-network-restrictionssupabase:v1-update-pgsodium-configsupabase:v1-update-pooler-configsupabase:v1-update-postgres-configsupabase:v1-update-postgrest-service-configsupabase:v1-update-project-api-keysupabase:v1-update-project-legacy-api-keyssupabase:v1-update-project-signing-keysupabase:v1-update-realtime-configsupabase:v1-update-ssl-enforcement-configsupabase:v1-update-storage-configsupabase:v1-upgrade-postgres-versionsupabase:v1-upsert-a-migrationsupabase:v1-verify-dns-config
Conformance results
- decided: 0 failures · every served operation is decided with its demand; every demanded and every refreshed operation is served
- published: 0 failures · what a release publishes holds every unit: its manifest, its spec and its journeys
- cited: 0 failures · every vendor fact cited is recorded as a page that answered, each quote found on it
- refresh: 0 failures · every stored resource of a vendor-backed unit declares how it is read back, and a unit that sends events ingests the vendor's
- registered: 0 failures · a vendor-backed unit, lane or not, reaches the registered pack's state system
- allowance: 0 failures · a rate budget above the fallback rests on the vendor's documented allowance, cited in its manifest
- client: 0 failures · driven by the vendor's own client (its official SDK), served as a World runs it, the vendor's documented behaviour holds · supabase owes no client case: The demand's application uses node-postgres over the project's native Postgres connection, not a Supabase SDK (journeys/demand.json). The customer life drives that wire; recognized Supabase SDK dependencies do not establish support for Management, Auth, Storage or PostgREST, which remain explicit gaps.
- life: 0 failures · the life walked over HTTP against the pack served as a World runs it, with its scenario: every check held
- standalone: 0 failures · served by its server.ts as a World runs it, the pack answers HTTP and the boot probe, and each declared socket upgrades
Publisher, admission and provenance
- Publisher
- volter-ai/twin-packs-open
- Source commit
- ba3aa19f2b582e8c4cf941384c51cdd40ac0d0b1
- Catalog record commit
- 834ee6a370ea2a8fa9a39d009de40009d14c5cca
- Package integrity
sha512-UO5MsMinW6IeZhG92HewkmYVhlM6I4lH8EWMOhNks5Dax0IUQjYJPWdPo9TSqXj0IzDI7luE2nge+p1+5F9Fjw==- Admission mode
- Trusted internal publisher · maintainer merge
- Catalog assessment
- Bundled report checksum verified
- Assessed at
- Not recorded
- Assessment input head
- 834ee6a370ea2a8fa9a39d009de40009d14c5cca
- Evidence
- Assessment and admission
Catalog snapshot · @volter/twin-catalog@0.2.41
- Source commit
a4c5e0664985a7f5a173b58cd307b88a7ddd2795- Catalog digest
5103e721dd9632a05ec4d5348d1b9e668ee092b3edf634c0e4b08f08efb76527- Installer integrity
sha512-uadY72Kz68IvyrNGcUCyJIOXAPQJz9dsyUgG7DUpTVFgZNseWyEQ1We/cSDi4Z9gPtd11owQAJ3EtAuIutcSQw==