Shoo Auth logo

Shoo Auth

Community
Firstp1ck
shoo-auth

Use when evaluating, implementing, reviewing, or debugging Shoo auth (shoo.dev) Google sign-in in browser apps, including @shoojs/react, @shoojs/auth, hosted shoo.js, Convex custom JWT integration, PKCE callbacks, session checks, and server-side id_token verification. Do not use for unrelated auth systems.

Overview

PublisherFirstp1ck
Repositorypi-coding-agent-forge
Skill nameshoo-auth
Stars
93
Forks
22
Bundled files
2
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 2 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by Firstp1ck on GitHub. Read the source before you install it.

Installation

Install the Shoo Auth AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/Firstp1ck/pi-coding-agent-forge/tree/main/pi-skill-shoo-auth/skills/shoo-auth
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Firstp1ck/pi-coding-agent-forge.git /tmp/pi-coding-agent-forge
mkdir -p .claude/skills
cp -r /tmp/pi-coding-agent-forge/pi-skill-shoo-auth/skills/shoo-auth .claude/skills/shoo-auth
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Shoo Auth in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Shoo Auth on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Shoo Auth is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Shoo Auth

Deterministic workflow for deciding when Shoo fits and for applying it safely. This draft is not enabled automatically.

Primary reference snapshot: references/shoo-docs-summary.md. Refresh the live Shoo docs before high-stakes or production decisions.

When to Use

Use this skill when the task mentions any of:

  • Shoo, shoo.dev, @shoojs/auth, @shoojs/react, window.Shoo, shoo.js, or pairwise_sub.
  • Adding minimal Google sign-in to a browser app without Google client registration.
  • Choosing between Shoo React, vanilla JS, framework-agnostic, hosted-script, or Convex integration.
  • Implementing or reviewing Shoo callback handling, PKCE flow, session/revocation checks, or server-side id_token verification.
  • Debugging Shoo audience, callback, storage, Convex JWT, or missing-PII issues.

Do not use this skill as the primary workflow for unrelated auth providers or generic OAuth/OIDC work, except to explicitly decide that Shoo is not a fit.

Do Not Use / Escalate

Do not recommend Shoo as the sole answer when requirements include:

  • Non-Google identity providers, passwords, enterprise SSO/SAML/SCIM, or rich hosted user management.
  • Server-only auth without a browser redirect flow.
  • Production authorization based only on browser-local identity, localStorage, or decoded-but-unverified JWT claims.
  • Security/compliance-critical auth where maturity, SLAs, audit evidence, or operational ownership must be established first.

When any of these apply, state the mismatch and either ask whether Shoo is still mandatory or recommend comparing established auth providers.

Inputs and Assumptions

Before changing code, determine these from the user or the project:

  • Frontend shape: React, Next.js, vanilla/static, Convex, or another browser client.
  • App origin for each environment, e.g. http://localhost:3000 and https://app.example.com.
  • Callback path and whether that path is served by the app/router.
  • Server/runtime that will verify Shoo id_tokens.
  • Whether PII (email, name, picture) is actually needed.
  • Package manager and existing auth/session conventions.

If these are missing and the repository is available, inspect manifests/routes before asking. If app origin or production verification path is unknown, ask; do not guess for production auth.

Fit Gate

Apply this gate before implementation:

  1. Identity provider: if Google-only sign-in is not acceptable, Shoo is not a fit.
  2. Client model: if the app cannot perform browser redirects and store callback state in browser storage, Shoo is likely not a fit.
  3. Identifier model: if an opaque per-origin stable ID is acceptable, use pairwise_sub/sub as the user key; if a global Google subject is required, Shoo is not a fit.
  4. PII minimization: default to no PII. Use requestPii: true only when the app genuinely needs email, name, or picture and the UI explains why.
  5. Production rule: production access control requires server verification of every Shoo id_token before trusting identity.
  6. Maturity rule: for business-critical auth, verify current docs/package status and explicitly surface adoption risk before recommending Shoo.

Workflow

1. Choose the integration path

Use the first matching path:

Project needUseNotes
React SPA or React client component@shoojs/react + useShooAuth()Primary path for React. SSR-safe hook initializes in browser.
Next.js App Router@shoojs/react plus a client callback pageAdd a page at the configured callback path so the redirect does not 404.
Convex + React@shoojs/react + createShooConvexAuth() + Convex customJwtAlso configure issuer/JWKS/ES256 and preferably audience/application ID.
Static/vanilla/no bundlerHosted script https://shoo.dev/shoo.jsUse window.Shoo.startSignIn(), getIdentity(), clearIdentity().
Framework-agnostic browser client@shoojs/authUse lower-level client methods for custom flows.
Server APIJWT verification onlyShoo sign-in is browser-oriented; the server should verify tokens, not initiate trust from localStorage.

2. Add the client integration

  • Use the repository's package manager (bun, npm, pnpm, or yarn); ask before dependency changes unless implementation was explicitly requested.
  • Default Shoo base URL is https://shoo.dev.
  • Default framework-agnostic callback path is /auth/callback; docs also show /shoo/callback for Convex/hosted examples. Keep the configured callback path consistent across client, routes, and server expectations.
  • React: call useShooAuth() in a client-side component; render sign-in when !identity.userId; call signIn() or signIn({ requestPii: true }); call clearIdentity() for sign-out.
  • Vanilla/hosted script: include https://shoo.dev/shoo.js; use window.Shoo.startSignIn({ returnTo, requestPii }); read window.Shoo.getIdentity(); clear with window.Shoo.clearIdentity().
  • Custom client: create createShooAuth({ callbackPath, shooBaseUrl }); use startSignIn(), handleCallback() or finishSignIn(), getIdentity(), clearIdentity().
  • Keep returnTo relative or same-origin unless the app has an explicit open-redirect defense.

3. Handle callback deterministically

  • Ensure the callback path is served by the SPA/router/static host.
  • For Next.js App Router, create a client callback page that calls useShooAuth() and renders a transient "Signing in…" state.
  • Prefer the high-level callback handler (useShooAuth auto handling or handleCallback) unless the app needs custom redirect control.
  • If using manual handling, remove callback params after exchange and consume return-to state once.

4. Verify tokens server-side before authorization

Never authorize from identity.userId, localStorage, or decodeIdentityClaims() alone. Server verification must check:

CheckRequired value
Issuerhttps://shoo.dev
Audienceorigin:{new URL(appOrigin).origin}
SignatureES256 against https://shoo.dev/.well-known/jwks.json
ExpirationNot expired
Core claimpairwise_sub exists and is a string

TypeScript shape with jose:

ts
import { createRemoteJWKSet, jwtVerify } from "jose";

const jwks = createRemoteJWKSet(
  new URL("/.well-known/jwks.json", "https://shoo.dev"),
);

export async function verifyShooToken(idToken: string, appOrigin: string) {
  const audience = `origin:${new URL(appOrigin).origin}`;
  const { payload } = await jwtVerify(idToken, jwks, {
    issuer: "https://shoo.dev",
    audience,
  });

  if (typeof payload.pairwise_sub !== "string") {
    throw new Error("Shoo token missing pairwise_sub");
  }

  return payload;
}

Treat email, email_verified, name, and picture as optional display/profile claims. Do not require them unless PII was requested and consented.

5. Add session/revocation handling when persistent sessions matter

  • @shoojs/auth exposes checkSession() and startSessionMonitor().
  • @shoojs/react has autoSessionMonitor enabled by default and uses a 60s default interval.
  • On login_required with reason revoked, expired, or invalid_token, clear local identity and prompt sign-in.
  • If checkSession() reports unsupported, degrade gracefully and rely on token expiration/server verification.

6. Convex path

For Convex, configure a custom JWT provider:

ts
export default {
  providers: [
    {
      type: "customJwt",
      issuer: "https://shoo.dev",
      jwks: "https://shoo.dev/.well-known/jwks.json",
      algorithm: "ES256",
      // Prefer also setting applicationID: "origin:https://your-app-origin"
    },
  ],
};

Then create a module with createShooConvexAuth({ callbackPath }), pass its useAuth to ConvexProviderWithAuth, and use identity.subject from ctx.auth.getUserIdentity() as the stable user ID.

Common Failure Map

SymptomLikely causeDeterministic check
Server rejects token for audienceAPP_ORIGIN, redirect URI origin, or Convex application ID mismatchCompare exact new URL(origin).origin values; audience must be origin:{origin}.
Callback route 404Router/static host does not serve callback pathAdd route/page at configured callback path.
No identity after redirectCallback handler did not run, state/verifier lost, storage key mismatch, or code/state absentCheck callback URL, sessionStorage PKCE state, localStorage identity key, and handler execution.
PII claims missingPII not requested or user did not consentUse requestPii: true only when needed; treat claims as optional.
Convex unauthenticatedProvider config mismatch or token not passed by adapterCheck issuer, JWKS, ES256, applicationID, and fetchAccessToken().
Works locally but fails in productionOrigin/audience or callback path differsConfigure per-environment origin and callback path explicitly.

Verification

For implementation tasks, verify at the smallest meaningful level:

  • Build/typecheck/lint/tests for the modified repository.
  • Callback path exists and does not 404.
  • A successful sign-in produces an identity whose userId/pairwise_sub is present and starts with the expected opaque ps_ form.
  • Server verification succeeds for a real Shoo token from the current app origin.
  • Negative verification rejects a token with the wrong audience, a tampered signature, or an expired token when feasible in tests.
  • Authorization decisions use server-verified payloads, not client-decoded claims.
  • Optional PII is absent by default and appears only after explicit requestPii: true/consent.
  • Convex: an authenticated query can read ctx.auth.getUserIdentity() and returns identity.subject.

Optional endpoint sanity checks:

bash
curl -fsS https://shoo.dev/.well-known/openid-configuration
curl -fsS https://shoo.dev/.well-known/jwks.json

Safety and Failure Modes

  • Shoo sign-in contacts shoo.dev and Google and changes browser storage; disclose this for manual tests.
  • Do not log, paste, persist, or commit raw id_tokens or OAuth callback URLs containing codes/state.
  • Do not store secrets or user tokens in skill memory, fixtures, or examples.
  • Do not make production auth recommendations without server verification and a maturity/risk caveat.
  • Do not present decodeIdentityClaims() as verification; it is display-only.
  • Be careful with localStorage-based identity in XSS-sensitive apps; server verification does not remove the need for normal frontend security controls.
  • Ask before enabling this draft skill or moving it into an auto-discovered skill root.

Sources and Maintenance

  • Live docs root: https://docs.shoo.dev/docs.
  • API refs: /docs/api-reference/shoo-react and /docs/api-reference/shoo-auth.
  • Verification docs: /docs/server-verification.
  • Flow docs: /docs/how-it-works.
  • Convex docs: /docs/convex.
  • Discovery/JWKS: https://shoo.dev/.well-known/openid-configuration and https://shoo.dev/.well-known/jwks.json.

If the live docs conflict with this skill, prefer the live docs and update the skill.

Pi Adapter

  • In Pi, fetch the Shoo docs directly for current claims when the decision is production/security-sensitive.
  • Before editing an unfamiliar app, use repository exploration first, then make the smallest route/config/client/server changes needed.
  • This file is a disabled draft under a non-discovered draft directory; review and ask before enabling.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Shoo Auth AI skill do?

Use when evaluating, implementing, reviewing, or debugging Shoo auth (shoo.dev) Google sign-in in browser apps, including @shoojs/react, @shoojs/auth, hosted shoo.js, Convex custom JWT integration, PKCE callbacks, session checks, and server-side id_token verification. Do not use for unrelated auth systems.

Why use Shoo Auth on TypingMind?

Because you install it once and use it with any model. Shoo Auth is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Shoo Auth in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Firstp1ck/pi-coding-agent-forge/tree/main/pi-skill-shoo-auth/skills/shoo-auth. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Shoo Auth?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Shoo Auth?

As many as you like. As long as a model supports skills, you can use Shoo Auth with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Shoo Auth AI skill free?

Yes. It is published on GitHub by Firstp1ck under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇