TellWang
Dashboard

Auth

Every Wok ships with authentication wired into the database from the first request. Users, sessions, and row-level security exist before you write any app code.

Email and password

Sign-up, sign-in, email verification, password reset, and session management work from the first request. There is nothing to install or configure — the accounts table, the sessions, and the policies protecting them are created with the Wok.

Password and token attempts are rate-limited per validated client address. TellWang accepts Cloudflare forwarding headers only from Cloudflare's published networks, falls back to the socket peer for direct domains, and overwrites the private address header before Auth sees it. A browser cannot evade the limit with a forged forwarding header; that header selection is platform-managed and cannot be replaced with a GOTRUE_* environment value.

Row-level security

Tables are protected by RLS policies, so the auto REST API is safe to call from the client — a user only ever sees their own rows. Wang writes the policies as it builds the schema, so a table is protected the moment it exists; you can refine them in SQL.

policy.sql
-- Each user sees only their own orders
create policy "own_orders" on orders
  for select using (auth.uid() = user_id);

Sessions & tokens

Sign-in returns a JWT scoped to the user, and the client library — @supabase/supabase-js, which a Wok's REST API is compatible with — attaches it to every later call automatically. Server-side code verifies it against the Wok's signing key. Anon and service-role keys are issued per Wok and rotate on demand.

auth.ts
const { data, error } = await tw.auth.signInWithPassword({
  email: "ops@acme.com", password,
});
// subsequent tw.from(...) calls run as this user, under RLS

Sign in with Google

One call turns on Google sign-in for a Wok. It uses TellWang's own Google client, so there is no client ID, client secret, or redirect URI to create — and the consent screen asks only for identity, because sign-in needs no Google API permissions.

Terminal
lollipop enable-google-login --wok-id $WOK

The response includes the sign-in path to point your Google button at. Agents can do the same through the enable_google_login tool. Pass --return-path to choose where a visitor lands after signing in, and --scopes only if the app also needs a Google API such as Calendar — those are checked against what TellWang's client is approved for.

Other providers

Every Wok can also sign people in with Apple, GitHub, Azure, Bitbucket, Discord, Facebook, LinkedIn, Notion, Slack, Spotify, Twitch, Twitter, or Zoom. These use your own OAuth application rather than TellWang's, so you supply the client ID and secret from that provider once:

Terminal
lollipop set-env --wok-id $WOK --vars '{"GOTRUE_EXTERNAL_GITHUB_ENABLED":"true",
        "GOTRUE_EXTERNAL_GITHUB_CLIENT_ID":"...",
        "GOTRUE_EXTERNAL_GITHUB_SECRET":"...",
        "GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI":"https://<wok-id>.tellwang.com/auth/v1/callback"}'

Use the provider's name in place of GITHUB, and register that same callback URL with the provider. The values are live when the call returns. Secrets are encrypted at rest and never readable back — reading environment variables returns their names, never their values. The API reference covers the HTTP form.

OAuth for app capabilities

When an app needs to call Google APIs itself, its Wok declares a separate connection policy. Wang and MCP clients can save that policy with configure_google_app_connection, or turn on sign-in alone with enable_google_login, which needs no Google API scopes at all — the consent screen then asks only for identity. The app chooses which organization roles may connect or disconnect, whether authenticated app users can own connections, and whether public Google sign-in is allowed. Public signup is off by default and requires a per-user policy. When it is enabled, TellWang's managed Google client handles consent and returns a short-lived, one-use login handoff to that Wok. Apps may also bring their own Google client. Client secrets and refresh tokens stay encrypted in the control plane, while a trusted edge function receives only a current short-lived access token.