Skip to main content
Auth providers are first-class objects. Hand one to cycls.Web().auth(...) for agents, or to @cycls.app(auth=...) for apps, and the rest follows: sign-in pages, protected routes, per-user storage and context.user.
Every provider supports a development and a production configuration, and Cycls picks the right one based on whether you ran deploy or run.

Clerk

The hosted default. No configuration needed to get started.
one_tap=True needs Google enabled in Clerk with custom credentials, and every agent origin listed in that OAuth client’s authorized JavaScript origins.

Any OIDC provider

Works with Auth0, WorkOS, Okta, Supabase, Keycloak and anything else that publishes a JWKS endpoint. The default mapping takes sub as the user id.

Firebase and GCP Identity Platform

Maps firebase.tenant to org_id, so multi-tenant projects get the same workspace semantics as Clerk organizations.

The user object

context.user is None when no provider is set. In apps, the same object comes from the auth dependency:

Protecting your own routes

What auth switches on

Auth switches on more than a login screen. Without a provider, an agent serves an anonymous chat and the state routers are not installed. With one, you also get:
  • per-user chats, files and key-value storage under /workspace/<user_id>/
  • share links and forking
  • team workspaces
  • connectors, since a grant belongs to a person or a team
  • plan and feature gating through user.plan and user.features

Plans

The Cycls-hosted Clerk app emits values like u:free_user and o:free_org, where the prefix says whether the plan is a user plan or an organization plan, and cycls_pass for paid subscribers. Your own tenant can emit anything.
See Monetization for quotas, plan gating and in-app purchase entitlements.

Next

Workspaces

Personal and team workspaces, and how data is partitioned.