For app builders

One founder identity. Every app you ship.

Oasis is an OpenID Connect identity provider. Add "Sign in with Oasis" to any Lovable project and every user arrives with their canonical profile, memory, and signal history — ready to write back to the hub.

01

Register your app

Ask the Oasis team to add your app to the client registry. You'll get a client_id, client_secret, and can list the redirect URIs your app uses.

02

Add the OIDC flow

Standard authorization-code + PKCE against the Oasis issuer. Verify the ID token against Oasis's JWKS and use the sub claim as the user's canonical id.

03

Write back to the hub

Use the returned access token as a bearer to call the Oasis Hub API for signals, memory, and artifacts. Everything flows into the founder's headquarters.

OIDC discovery

Point your OAuth client here

Issuer
https://iwmgwcmxndoifzphrdep.supabase.co/auth/v1
Discovery document
https://iwmgwcmxndoifzphrdep.supabase.co/auth/v1/.well-known/openid-configuration
JWKS
https://iwmgwcmxndoifzphrdep.supabase.co/auth/v1/.well-known/jwks.json
Scopes

Ask for only what you need

Request only openid email profile at the issuer — those are the scopes it mints. First-party Suite apps inherit their hub:* scopes from the Oasis app registry automatically.

ScopeWhat it grants
openidVerify who the user is (returns an ID token).
emailSee the user's email address.
profileDisplay name and avatar.
hub:signals.writeEmit activity events into the founder's Oasis feed and Founder Index.
hub:memory.readRead the founder's shared AI memory for personalization.
hub:memory.writeSave new memory entries the copilot on every app can reason over.
hub:artifacts.readList files the founder has stored in the Oasis vault.
hub:artifacts.writeSave files (pitches, assessments, decks) into the Oasis vault.
Hub API

Everything writes back to the founder's headquarters

GET/api/public/hub/v1/me

Canonical identity, display name, avatar, linked apps.

Requires openid

POST/api/public/hub/v1/signals

Record an event that flows into the activity feed and Founder Index.

Requires hub:signals.write

GET/api/public/hub/v1/memory

Read the founder's cross-app AI memory.

Requires hub:memory.read

POST/api/public/hub/v1/memory

Write a memory entry every Oasis copilot can reason over.

Requires hub:memory.write

GET/api/public/hub/v1/artifacts

List the founder's stored artifacts filtered by app or kind.

Requires hub:artifacts.read

POST/api/public/hub/v1/artifacts

Store a new artifact (deck, assessment, generated asset).

Requires hub:artifacts.write

End-to-end example

From redirect to first signal

The full flow a sister app runs the first time a founder clicks “Sign in with Oasis.” Substitute YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, and your registered redirect URI.

1 · Send the user to Oasis
Authorization URL (browser redirect)
https://iwmgwcmxndoifzphrdep.supabase.co/auth/v1/oauth/authorize
  ?response_type=code
  &client_id=YOUR_CLIENT_ID
  &redirect_uri=https://your-app.lovable.app/auth/callback
  &scope=openid%20email%20profile
  &state=<random>
  &code_challenge=<pkce-s256>
  &code_challenge_method=S256
2 · Exchange the code for tokens
POST /oauth/token
curl -X POST "https://iwmgwcmxndoifzphrdep.supabase.co/auth/v1/oauth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET" \
  -d "grant_type=authorization_code" \
  -d "code=<code from callback>" \
  -d "redirect_uri=https://your-app.lovable.app/auth/callback" \
  -d "code_verifier=<pkce-verifier>"

# → { access_token, id_token, refresh_token, expires_in, token_type: "Bearer" }
3 · Hydrate the founder's profile
GET /api/public/hub/v1/me
curl "https://startupoasis.com/api/public/hub/v1/me" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# → { canonical_id, display_name, email, avatar_url, linked_apps: [...] }
4 · Emit a signal when something meaningful happens
POST /api/public/hub/v1/signals
curl -X POST "https://startupoasis.com/api/public/hub/v1/signals" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "event_type": "compass.assessment_completed",
    "payload": { "axis": "gtm", "score": 72 },
    "weight": 1.5
  }'

# The signal flows into Foundation's Entrepreneurial Transcript,
# updates the Founder Index, and feeds the copilot's context.
5 · Store an artifact (deck, transcript, export)
POST /api/public/hub/v1/artifacts
curl -X POST "https://startupoasis.com/api/public/hub/v1/artifacts" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "pitch_deck",
    "title": "Seed round v3",
    "url": "https://your-app.lovable.app/decks/abc",
    "meta": { "audience": "investors" }
  }'
Best practices
  • Always include a stable payload.source_event_id on writes so retries don't double-count in Foundation.
  • Access tokens are short-lived. Use the refresh token server-side; never expose it to the browser.
  • Ask for the smallest scope set that works. Users can revoke your app from their Oasis headquarters.
  • Signals should describe what happened (roadmap.item_shipped), not UI actions (button_clicked).
Reference integration

Compass: matching a returning founder to their existing account

Compass is the first Suite app on Oasis sign-in. Its callback is /founder/auth/oasis/callback and its authorization request asks for openid email profile. The important part is what happens after the token exchange: never guess the account from the email alone.

Resolve the existing app account from /hub/v1/me
const me = await fetch(`${HUB}/api/public/hub/v1/me`, {
  headers: { Authorization: `Bearer ${access_token}` },
}).then((r) => r.json());

// linked_apps is written by the Oasis migration — the alias points at the
// exact user id that already holds this founder's history in your app.
const alias = (me.linked_apps ?? []).find((a) => a.source_app === "compass");
let userId = alias?.source_user_id ?? null;

if (!userId) userId = await findUserByVerifiedEmail(me.email); // fallback
if (!userId) userId = await createUser(me);                    // brand-new founder

Full checklist — button, callback, token-exchange function, session handling, and the event conventions — lives in docs/integrations/compass.md.

Building something on Lovable?

Register your app with Oasis and give your users one profile across the entire ecosystem.

Building the first-party Compass integration? The full copy-paste checklist lives at docs/integrations/compass.md.