Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
1a7a837
fix: restore images on Firebase hosting builds
ravibits Mar 26, 2026
f3b30f6
chore: add Firebase hosting config
ravibits Mar 26, 2026
7556da5
chore: add Firebase
ravibits Mar 26, 2026
34d4921
chore: optimize Firebase PR preview workflow
ravibits Mar 26, 2026
403ba82
fix: skip D2 generation on GitHub Actions builds
ravibits Mar 26, 2026
eb3c75d
docs: add website redesign design spec
ravibits Mar 27, 2026
33ef6e4
feat: add /redesign reference page for internal team review
ravibits Mar 27, 2026
4bdc88c
chore: ignore superpowers and docs/superpowers directories
ravibits Mar 27, 2026
1300f6c
fix: prerender redesign page for static Firebase hosting
ravibits Mar 27, 2026
bfbcbad
fix: serve redesign page as static HTML in public/ for Firebase hosting
ravibits Mar 27, 2026
53e41ec
fix: repair JSON block and restore redesign page for local dev
ravibits Mar 27, 2026
15c804e
Merge remote-tracking branch 'origin/main' into fix/firebase-hosting-…
ravibits Mar 30, 2026
7e507d0
docs: add docs chatbot flywheel design spec
ravibits Mar 30, 2026
b910cf1
docs: add chatbot API implementation plan (Plan A)
ravibits Mar 30, 2026
ef4423a
feat(chatbot-api): bootstrap express service skeleton
ravibits Mar 30, 2026
1fdd059
feat(chatbot-api): implement query topic classifier
ravibits Mar 30, 2026
59e56cb
feat(chatbot-api): implement llms.txt custom set fetcher with fallback
ravibits Mar 30, 2026
dc598e8
feat(chatbot-api): implement search_docs tool using llms.txt custom sets
ravibits Mar 30, 2026
cdec179
feat(chatbot-api): implement create_pylon_issue tool with confirmation
ravibits Mar 30, 2026
01b8d2f
feat(chatbot-api): wire AgentRunner with Express routes
ravibits Mar 30, 2026
c8dd436
feat(docs): integrate chatbot widget into Starlight layout
ravibits Mar 30, 2026
b5d165f
docs(chatbot-api): add service README
ravibits Mar 30, 2026
420d31e
chore: update pnpm lock file
ravibits Mar 30, 2026
c869f34
fix(chatbot-api): fix TypeScript cast in create-pylon-issue for produ…
ravibits Mar 30, 2026
e15c91b
chore: add render.yaml for chatbot-api deployment
ravibits Mar 30, 2026
fe68594
fix(chatbot-api): use (.*) instead of * for Express 5 OPTIONS route
ravibits Mar 30, 2026
c31c882
chore: install @scalekit/agentkit in docs site for widget bundling
ravibits Mar 30, 2026
442829b
fix(docs): remove is:inline so Vite bundles agentkit/react import
ravibits Mar 30, 2026
3388167
fix(chatbot-api): handle OPTIONS in CORS middleware, remove app.optio…
ravibits Mar 30, 2026
753ad1c
fix(docs): use createElement instead of calling AgentTerminal as plai…
ravibits Mar 30, 2026
f0b1458
feat(docs): replace AgentTerminal with custom styled chat widget UI
ravibits Mar 30, 2026
a523d96
feat(docs): redesign chatbot as ⌘K overlay with CSS isolation and sug…
ravibits Mar 30, 2026
e07943c
feat(chatbot): improve widget UI and agent response quality
ravibits Mar 30, 2026
bcb2954
feat(chatbot): replace llms.txt search with Algolia
ravibits Mar 30, 2026
c2027e5
feat(chatbot): add Perplexity-style sources section to AI answers
ravibits Mar 30, 2026
4095cad
fix(chatbot): fix user bubble alignment, sources layout, and typing i…
ravibits Mar 30, 2026
66e83ba
feat(chatbot): add hallucination guard and disclaimer footer
ravibits Mar 30, 2026
7d0a68c
chore: regenerate D2 diagram SVG
ravibits Mar 30, 2026
ac3c422
fix(chatbot): fix CSS scoping and agent pre-tool thinking text
ravibits Mar 30, 2026
3072e36
chore: regenerate D2 diagram SVG
ravibits Mar 30, 2026
412da1b
refactor(chatbot): replace agentkit + vanilla JS with Vercel AI SDK +…
ravibits Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .firebaserc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"projects": {
"default": "docs-scalekit-com"
}
}
36 changes: 36 additions & 0 deletions .github/workflows/firebase-hosting-pull-request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools

name: Deploy to Firebase Hosting on PR
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
permissions:
checks: write
contents: read
pull-requests: write
jobs:
build_and_preview:
if: |
github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.draft == false &&
contains(github.event.pull_request.labels.*.name, 'firebase-preview')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Node.js version divergence from Netlify production environment.

This workflow pins Node.js to version 22, but the Netlify production configuration in netlify.toml does not specify a Node.js version and relies on Netlify's default. This version divergence could lead to build inconsistencies between Firebase preview deployments and Netlify production deployments.

Recommendation: Either pin the same Node.js version in both environments or explicitly document the intentional difference.

🔧 Option 1: Add Node version to Netlify config

Update netlify.toml:

 [build]
   command = "pnpm run build"
   publish = "dist"

 [build.environment]
+  NODE_VERSION = "22"
   NODE_OPTIONS = "--max_old_space_size=6144"
🔧 Option 2: Document the version difference

Add a comment in this workflow explaining why Firebase previews use Node 22 while production may differ:

       - uses: actions/setup-node@v4
         with:
+          # Note: Netlify production uses default Node version; 
+          # Firebase previews use Node 22 for [reason]
           node-version: '22'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
node-version: '22'
- uses: actions/setup-node@v4
with:
# Note: Netlify production uses default Node version;
# Firebase previews use Node 22 for consistency with build requirements
node-version: '22'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/firebase-hosting-pull-request.yml at line 23, The workflow
pins node-version: '22' which diverges from Netlify production behavior; either
make them consistent by adding an explicit Node version to Netlify's config (set
NODE_VERSION or engine in netlify.toml to "22") or document the intentional
difference in this workflow file next to the node-version: '22' line explaining
why previews use Node 22 while production relies on Netlify defaults; update
either the netlify.toml entry or the workflow comment accordingly and ensure
references to node-version: '22' and netlify.toml are changed together.

- run: npm install -g pnpm
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider pinning the pnpm version.

The workflow installs pnpm globally without specifying a version, which could lead to dependency resolution differences if the installed pnpm version differs from the project's expected version.

📦 Proposed fix to pin pnpm version

According to the project's package.json, the expected pnpm version is 10.33.0:

-      - run: npm install -g pnpm
+      - run: npm install -g pnpm@10.33.0

Alternatively, use the official pnpm/action-setup action which automatically reads the version from package.json:

       - uses: actions/setup-node@v4
         with:
           node-version: '22'
+      - uses: pnpm/action-setup@v4
-      - run: npm install -g pnpm
       - uses: actions/cache@v4
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- run: npm install -g pnpm
- run: npm install -g pnpm@10.33.0
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/firebase-hosting-pull-request.yml at line 24, Replace the
unpinned global install step "run: npm install -g pnpm" with a pinned install or
the official setup action to ensure consistent pnpm behavior; either change it
to install a specific version (e.g., use "npm install -g pnpm@10.33.0" to match
package.json) or replace the step with the "pnpm/action-setup" GitHub Action
which will read the version from package.json automatically.

- uses: actions/cache@v4
with:
path: ~/.local/share/pnpm/store
key: ${{ runner.os }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: ${{ runner.os }}-pnpm-
- run: pnpm install
- run: pnpm build
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
repoToken: ${{ secrets.GITHUB_TOKEN }}
firebaseServiceAccount: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_DOCS_SCALEKIT_COM }}
projectId: docs-scalekit-com
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,6 @@ skills-lock.json

.windsurf/
.tmp/
.firebase/
.superpowers/
docs/superpowers/
4 changes: 2 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ export default defineConfig({
},
}),
d2({
skipGeneration: !!process.env['NETLIFY'],
skipGeneration: !!process.env['NETLIFY'] || !!process.env['GITHUB_ACTIONS'],
theme: {
default: '1', // Light theme (Neutral default)
dark: '1',
Expand Down Expand Up @@ -360,5 +360,5 @@ export default defineConfig({
},
},
},
adapter: netlify(),
adapter: netlify({ imageCDN: !!process.env.NETLIFY }),
})
319 changes: 319 additions & 0 deletions docs/superpowers/specs/2026-03-26-website-redesign-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,319 @@
# Website redesign — design spec

**Date:** 2026-03-26
**Status:** Draft — pending leadership alignment

---

## The core idea

Scalekit solves two fundamentally different authentication problems. Most auth tools treat them as one. The redesign makes this distinction the organizing principle of the entire web presence.

> "Auth used to be one problem. AI made it two."

**Inbound auth** — users, agents, and M2M clients authenticate _into_ your app, MCP server, or API.
**Outbound auth** — your AI agents authenticate _out_ to external services like Gmail, Slack, and Salesforce.

These require different products, different pricing models, and different documentation. The site reflects that.

---

## Domain strategy

| Domain | Audience | Purpose |
| ------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `scalekit.com` | Human developers | Replaces current docs.scalekit.com. Developer-first homepage + full documentation. No marketing fluff. |
| `docs.scalekit.com` | AI coding agents | Machine-readable layer over the same content. Designed for Cursor, Claude Code, Copilot, and any agent building with Scalekit. |

`scalekit.com` is the primary destination. `docs.scalekit.com` is a programmatic API over the docs — not a parallel site.

---

## Two product lines

### Auth for Agents (primary)

**Positioning:** Outbound authentication for AI workflows.

Your AI agents connect to external services — Gmail, Slack, Salesforce, Notion, and 100+ more — without managing OAuth flows, storing tokens, or handling refresh logic.

**Products:** Agent Auth
**Pricing metric:** Connected accounts + tool calls
**Primary color:** Purple (`#6366f1`)
**Target developer:** Building AI agents, autonomous workflows, or agentic B2B SaaS

### Auth for Apps (secondary)

**Positioning:** Inbound authentication for B2B applications.

Everything users and agents need to authenticate into your app — login, organizations, SSO, SCIM, MCP server security, and API auth.

**Products:** Full Stack Auth, Modular SSO, Modular SCIM, MCP Auth, API/M2M Auth
**Pricing metric:** MAUs, MAOs, SSO connections
**Primary color:** Green (`#10b981`)
**Target developer:** Building B2B SaaS apps, MCP servers, or APIs

**Why agents-primary?** The agent auth market is the growth vector. Most competing auth tools don't solve outbound agent auth at all. Making it primary is a clear positioning statement.

---

## Information hierarchy

### scalekit.com

```
/ Homepage (two-door entry, agents-primary)
/for-agents/ Auth for Agents documentation root
quickstart 10-minute Gmail agent walkthrough
overview What Agent Auth is and how it works
connected-accounts Let users connect their accounts
token-vault How token storage and refresh works
tool-calling Using tokens in agent tool calls
frameworks/ LangChain, OpenAI, Anthropic, Vercel AI, Google ADK, Mastra
providers/ 100+ OAuth provider integration guides
/for-apps/ Auth for Apps documentation root
quickstart Full stack auth in minutes
overview Products and when to use each
full-stack-auth/ Login, session, orgs, RBAC
modular-sso/ SAML/OIDC with enterprise IdPs
modular-scim/ User provisioning from Okta, Azure AD
mcp-auth/ Securing your MCP server
api-auth/ M2M tokens and API keys
/sdks/ Shared across both product lines
node / python / go / java / expo
/apis/ REST API reference (Scalar-powered)
/pricing/ Tabbed pricing — Agent Auth | App Auth
/changelog/ Engineering blog-style release notes
```

### docs.scalekit.com

```
/llms.txt Product overview optimized for LLM consumption
/llms-full.txt Full context dump — all docs in one file
/sitemap.xml Machine-readable URL index
/openapi/spec.json OpenAPI spec for programmatic access
/mcp MCP server (SSE endpoint)
Tools:
search(query) Semantic search across all docs
get_page(path) Fetch any doc page as clean markdown
list_products() List all products with descriptions
get_code_example(p, lang) Get a code example by product + language
/context/ Structured context files per topic
for-agents.md Full agent auth context for LLM consumption
for-apps.md Full app auth context for LLM consumption
sdks.md SDK reference and naming conventions
errors.md Error codes and troubleshooting
/search REST search API — GET /search?q=<query>
/pages/ Clean markdown mirror of scalekit.com
for-agents/** No sidebars, no JS, no images — pure content
for-apps/**
sdks/**
```

The `llms.txt` encodes SDK variable naming conventions (critical for correct code generation):

- Node.js: `scalekit`
- Python: `scalekit_client`
- Go: `scalekitClient`
- Java: `scalekitClient`

---

## Homepage design

### Navigation

```
⬡ Scalekit | For Agents ↓ | For Apps ↓ | SDKs & APIs | Pricing | Changelog | Sign in | [Start free →]
```

- "For Agents" appears first — primary product line
- "For Apps" is secondary but always present
- No "Enterprise" in nav — enterprise is a pricing tier, not a product
- Maximum 6 nav items excluding auth CTAs

### Hero section

**Eyebrow:** `Authentication infrastructure for AI-era applications`

**Headline:**

```
Auth used to be one problem.
AI made it two.
```

**Body copy:**

> Your app needs to authenticate the people and agents connecting to it. Your AI agents need to authenticate to the external services they connect to. These are fundamentally different problems. Scalekit solves both.

**Diagram:** The Inbound/Outbound architecture diagram sits directly below the copy — it explains the entire product in 10 seconds without words.

### Two doors (below diagram)

**Door 1 — Agent Auth (full-width primary card, purple border)**

- Label: `Outbound · Primary product`
- Headline: "Connect your agents to anything"
- Body: Token vault, delegated OAuth, auto-refresh. 100+ providers. Works with every major AI framework.
- Framework tags: LangChain · OpenAI · Anthropic · Vercel AI · Google ADK · Mastra
- Code snippet (Node.js): `scalekit.getToken({ provider: 'google', userId, scopes: ['gmail.send'] })`
- Primary CTA: "Quickstart: Agent Auth →"
- Secondary CTA: "View 100+ providers"

**Door 2 — App Auth (slim secondary card, green border)**

- Label: `Inbound · For your app`
- Headline: "Authenticate your app"
- Body: Full-stack login, organizations, RBAC, SSO, SCIM, MCP server security.
- CTA: "Quickstart: For Apps →" (right-aligned)

### Below-fold sections (in scroll order)

1. **Pricing** — tabbed (Agent Auth | App Auth), transparent numbers
2. **Security & Compliance** — four cards: certifications, data residency, reliability, token security
3. **Enterprise** — feature checklist (SSO, SCIM, admin portal, custom domain, audit logs, SLA, dedicated support)
4. **Developer Resources** — SDKs, REST API, AI coding assistant MCP callout with copy-paste config snippet
5. **Footer** — product / developer / company columns + compliance badge strip

---

## Docs experience

### Shared doc shell

Both `/for-agents/` and `/for-apps/` use the same layout:

- **Left sidebar:** Product switcher at top (toggles between For Agents ↔ For Apps), then product-specific nav tree
- **Main content:** Breadcrumb, H1, intro paragraph, content
- **Right column:** Table of contents + persistent "For AI assistants → docs.scalekit.com" widget with MCP config snippet

### For Agents sidebar structure

```
Get started
Overview · Quickstart · How it works
Core concepts
Connected accounts · Token vault · Delegated OAuth · Token refresh
Frameworks
LangChain · OpenAI Agents SDK · Anthropic · Vercel AI · Google ADK · Mastra
Providers
Google (Gmail, Drive, Calendar) · Slack · Salesforce · HubSpot · Notion · +95 more
─────────────────────────────
Also using Scalekit for: → Authenticate your app
```

### For Apps sidebar structure

```
Get started
Overview · Quickstart
Full Stack Auth
Login & session · Organizations · RBAC & permissions · Social login · Magic links
Modular add-ons
SSO (SAML / OIDC) · SCIM provisioning · MCP Auth · API & M2M Auth
─────────────────────────────
Also building agents? → Connect your agents
```

### Cross-sell bridge

Every sidebar has a persistent cross-sell prompt at the bottom pointing developers to the other product line. Developers building AI-powered B2B SaaS need both — this is the bridge.

### Code examples

All SDK code examples use the 4-language tab pattern:

- Node.js (default) · Python · Go · Java
- Variable names follow CLAUDE.md NON-NEGOTIABLE conventions

---

## Pricing design

Single pricing section on the homepage with a tab toggle:

**Tab 1 — Agent Auth** (purple)
| Tier | Price | Includes |
|------|-------|---------|
| Starter | $0 | 10 connected accounts · 5k tool calls/mo · 5 providers |
| Growth | Custom | 500 connected accounts · 100k tool calls/mo · 100+ providers · then per-unit |
| Enterprise | Custom | Unlimited · dedicated vault · custom residency · SLA |

Overages: per connected account + per tool call

**Tab 2 — App Auth** (green)
| Tier | Price | Includes |
|------|-------|---------|
| Starter | $0 | 1k MAUs · 3 MAOs · 0 SSO connections |
| Growth | Custom | 10k MAUs · 50 MAOs · 3 SSO connections · then per-unit |
| Enterprise | Custom | Unlimited MAUs/MAOs/SSO · custom domain · audit logs · SLA |

Overages: per MAU + per MAO + per SSO connection

**Metric definitions** appear below each table — these terms are not industry-standard and must be explained clearly.

---

## docs.scalekit.com — agent-readable surface

This is not a website. It is a programmatic API layer over the same content that powers `scalekit.com`.

**Who uses it:** Cursor, Claude Code, GitHub Copilot, and any AI coding agent a developer uses to build with Scalekit. Humans never need to visit it directly.

**Key surfaces:**

`llms.txt` — the entry point. Product overview, SDK naming conventions, MCP server URL, and a page index. This is what LLMs read when they need context on Scalekit.

`/mcp` — MCP server with four tools: `search`, `get_page`, `list_products`, `get_code_example`. Developers add this to their coding agent config with a single JSON snippet:

```json
{
"mcpServers": {
"scalekit-docs": {
"url": "https://docs.scalekit.com/mcp",
"type": "sse"
}
}
}
```

`/context/for-agents.md` and `/context/for-apps.md` — full product context in clean markdown. Designed to be dropped into an LLM context window directly.

`/pages/**` — clean markdown mirror of all doc pages. No sidebars, no JavaScript, no images. Pure content for agent consumption.

---

## Visual language

| Element | Value |
| ----------------- | ----------------------------------------- |
| Background | `#0a0a0f` (near black) |
| Surface | `#0d0d14` / `#080810` |
| Border | `#1e293b` |
| Text primary | `#f1f5f9` |
| Text secondary | `#64748b` |
| Agent Auth accent | `#6366f1` (purple) |
| App Auth accent | `#10b981` (green) |
| Font | System UI / monospace for code and labels |
| Theme | Dark by default — signals developer-first |

---

## What this is not

- Not a marketing site with a blog, case studies, or testimonials
- Not a "request a demo" funnel — self-serve is primary
- Not a unified pricing model — each product line has its own unit economics
- Not a rebrand — this is a restructure of what already exists

---

## Open questions for leadership alignment

1. **Pricing numbers** — direction approved, specific tier pricing TBD
2. **Domain migration** — timeline for deprecating scalekit.com as marketing site
3. **docs.scalekit.com build** — MCP server and llms.txt are new infrastructure; who owns this?
4. **"For Agents" vs "For Apps" naming** — these are working titles; does leadership want to finalize these as the canonical product line names?
5. **Self-serve vs sales-led** — design assumes self-serve is primary CTA; confirm this holds for enterprise tier
6 changes: 6 additions & 0 deletions firebase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"hosting": {
"public": "dist",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
}
}
Loading