
Burn After Login
- 17 installs
- 40 repo stars
- Updated March 11, 2026
- pbakaus/burn-after-login
Helps with ai & agent building tasks during AI-assisted development.
About
burn-after-login is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- burn-after-login
- AI & Agent Building
- AI-coding skill
Burn After Login by the numbers
- 17 all-time installs (skills.sh)
- +2 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #10,861 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/pbakaus/burn-after-login --skill burn-after-loginAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 17 |
|---|---|
| repo stars | ★ 40 |
| Last updated | March 11, 2026 |
| Repository | pbakaus/burn-after-login ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Burn After Login
Your mission, should you choose to accept it, is to create dev-only auth shortcuts so AI browser agents can authenticate instantly. This skill will self-destruct after completion.
Follow these phases in order. If a phase has an EXIT CONDITION that triggers, stop immediately and report the issue — do NOT continue to later phases.
---
Phase 1: Environment Validation
Verify this codebase has:
1. A way to detect development/local mode. Look for:
- Environment variables:
NODE_ENV,RAILS_ENV,FLASK_ENV,APP_ENV,DEBUG,ENVIRONMENT, etc. - Config files that distinguish dev from prod
- Build flags or conditional compilation
2. An existing authentication system. Look for:
- Auth-related directories:
auth/,authentication/,identity/ - Auth libraries in dependencies (check
package.json,requirements.txt,Gemfile,go.mod,Cargo.toml, etc.) - Middleware or decorators that check auth
- Login routes or handlers
EXIT CONDITIONS:
- If no dev mode detection exists: Stop and say "Could not find a way to detect development mode. Add environment-based detection first to ensure auth shortcuts are never exposed in production."
- If no auth system exists: Stop and say "No authentication system found. Set up authentication first."
---
Phase 2: Find Development Credentials
Search for existing dev/test credentials in:
- Seed/fixture files:
seed.*,fixtures/,test-data/,mock/ - Scripts directory for user management tools
- Database migrations or seeders
- Documentation mentioning test accounts (
README,CLAUDE.md, etc.) - Environment files (
.env.development,.env.local,.env.example)
Search patterns: username, password, testuser, demo, admin@, test@, seed, fixture
EXIT CONDITION:
- If no credentials found: Stop and say "No development credentials found. Create test users first (via seed script, admin panel, or auth provider dashboard), then run this again."
Document what you find — list the credentials with their roles.
---
Phase 3: Analyze Authentication
Discover:
1. How auth works in this codebase:
- Token-based (JWT, API keys, Bearer tokens)
- Session/cookie-based
- Both (common in apps with API + web frontend)
2. What auth library/framework is used:
- Identify from dependencies and imports
- Understand how to programmatically authenticate a user
- Understand how sessions/tokens are created and validated
3. What apps/services exist:
- Web frontends (any framework)
- Admin interfaces
- API servers
- List each with its path and auth pattern
---
Phase 4: User Selection
Ask the user which apps/services should have dev auth shortcuts.
If a tool to ask the user is unavailable, create shortcuts for all discovered apps.
---
Phase 5: Create Shortcuts
Create authentication shortcuts appropriate for the codebase's language, framework, and auth system.
For token-based auth — Token Generator
Create a script that:
- Accepts credentials (with sensible dev defaults)
- Calls the existing auth system to get a token
- Outputs only the token to stdout (for easy scripting)
- Example usage:
TOKEN=$(./scripts/get-token) && curl -H "Authorization: Bearer $TOKEN" http://localhost:8000/api/...
For cookie/session auth — Dev Login Endpoint
Create an endpoint that:
- Accepts credentials via query params or JSON body
- Calls the existing auth system
- Sets session cookies
- Returns 404 in production (not an error — completely hidden)
- Example usage:
open "http://localhost:3000/dev-login?user=demo&pass=demo"
Guidelines
1. Follow existing patterns — Match the codebase's style, conventions, and directory structure 2. Use the existing auth system — Don't reinvent; call the same auth functions the app uses 3. Guard with dev-only checks — The shortcut MUST refuse to work in production 4. Keep it simple — Minimal code that does one thing
Security Requirements
- Check for development mode BEFORE doing anything
- Return 404 or equivalent in production (not an error message that reveals the endpoint exists)
- Never log credentials
- Consider also checking for localhost/127.0.0.1 if appropriate
Reference Implementations
Use these for inspiration only. Adapt to the actual stack and auth system in use.
<details> <summary>Node.js Token Generator</summary>
// scripts/get-token.ts
async function main() {
const [user, pass] = process.argv.slice(2);
const { token } = await yourAuthLib.signIn(
user || 'demo@test.com',
pass || 'demo'
);
console.log(token);
}
main();</details>
<details> <summary>Next.js Dev Login</summary>
export async function GET(req: Request) {
if (process.env.NODE_ENV !== 'development') {
return new Response('Not found', { status: 404 });
}
const url = new URL(req.url);
await yourAuth.signIn(
url.searchParams.get('email'),
url.searchParams.get('password')
);
return Response.json({ ok: true });
}</details>
<details> <summary>Django Dev Login</summary>
from django.conf import settings
from django.http import Http404, JsonResponse
from django.contrib.auth import authenticate, login
def dev_login(request):
if not settings.DEBUG:
raise Http404()
user = authenticate(
username=request.GET.get('user'),
password=request.GET.get('pass')
)
if user:
login(request, user)
return JsonResponse({'ok': True})
return JsonResponse({'error': 'Invalid'}, status=401)</details>
<details> <summary>Rails Dev Login</summary>
class DevSessionsController < ApplicationController
skip_before_action :verify_authenticity_token
def create
raise ActionController::RoutingError, 'Not Found' unless Rails.env.development?
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
session[:user_id] = user.id
render json: { ok: true }
else
render json: { error: 'Invalid' }, status: 401
end
end
end</details>
<details> <summary>Flask Dev Login</summary>
@app.route('/dev-login')
def dev_login():
if not current_app.debug:
abort(404)
user = authenticate(
request.args.get('email'),
request.args.get('password')
)
if user:
session['user_id'] = user.id
return jsonify(ok=True)
return jsonify(error='Invalid'), 401</details>
<details> <summary>Go Dev Login</summary>
func DevLogin(w http.ResponseWriter, r *http.Request) {
if os.Getenv("ENV") != "development" {
http.NotFound(w, r)
return
}
user, err := auth.Authenticate(
r.URL.Query().Get("email"),
r.URL.Query().Get("password"),
)
if err != nil {
http.Error(w, "Unauthorized", 401)
return
}
session.Set(r, w, user)
json.NewEncoder(w).Encode(map[string]bool{"ok": true})
}</details>
---
Phase 6: Detect Browser Automation Tools
Scan the project for browser automation tools that are configured or in use. Check:
1. MCP server configurations — Look in .claude/settings.json, mcp.json, .cursor/mcp.json, or similar for:
claude-in-chromeorchrome-extensionplaywrightor@anthropic/mcp-playwrightor@anthropic-ai/mcp-playwrightchrome-devtoolsordevtools-mcpbrowserbaseorstagehand
2. Dependencies — Check package.json, requirements.txt, Gemfile, go.mod, etc. for:
playwright,@playwright/testpuppeteer,puppeteer-coreselenium,selenium-webdrivercypress@browserbasehq/stagehandagent-browser
3. Config files — Look for:
playwright.config.ts,playwright.config.jscypress.config.ts,cypress.config.js.puppeteerrc.js
4. Existing agent instructions — Scan CLAUDE.md, AGENTS.md, GEMINI.md, CURSOR.md, COPILOT.md, .github/copilot-instructions.md, README.md, and files in .claude/, .cursor/, .agents/, .windsurf/ for any mentions of browser automation, testing, or auth flows.
Record everything you find — you'll need it for the next phase.
---
Phase 7: Update Agent Instructions & Documentation
Based on what you found in Phase 6, update or create documentation so that AI agents using browser automation know about the dev auth shortcuts.
For each detected browser automation tool, add specific usage instructions:
Claude in Chrome / Chrome Extension MCP:
To authenticate in the browser, navigate to:
http://localhost:PORT/dev-login?email=EMAIL&password=PASSWORD
Then proceed to the authenticated page.Playwright / Playwright MCP:
To authenticate before testing:
await page.goto('http://localhost:PORT/dev-login?email=EMAIL&password=PASSWORD');
// Session cookies are now set, proceed with authenticated actions
await page.goto('http://localhost:PORT/dashboard');Token-based (for API testing with any tool):
To get an auth token for API requests:
TOKEN=$(./scripts/get-token EMAIL PASSWORD)
Use header: Authorization: Bearer $TOKENWhere to add documentation:
- If
CLAUDE.mdexists — add a "Dev Authentication" section - If
AGENTS.mdexists — add a "Dev Authentication" section - If
CURSOR.mdexists — add equivalent instructions - If
GEMINI.mdexists — add equivalent instructions - If
COPILOT.mdor.github/copilot-instructions.mdexists — add equivalent instructions - If
.windsurf/config exists — add equivalent instructions - If none of these exist — create an
AGENTS.mdwith the auth instructions
Always match the existing style and formatting of each file you modify.
Documentation must include:
1. What dev auth shortcuts are available (endpoints and/or scripts) 2. The test credentials and their roles 3. Tool-specific usage examples (based on what was detected) 4. A note that these only work in development mode
---
Phase 8: Summary
Present a clear report:
- What was created (with file paths)
- How to use each shortcut (with copy-pasteable commands)
- Which agent instruction files were updated
- Security measures in place
- Test credentials reference
---
Phase 9: Self-Destruct
After presenting the summary, say:
Mission complete. All dev auth shortcuts are in place and your agent instructions have been updated.
>
This skill has served its purpose. Like any good secret agent tool, it should leave no trace. Want me to self-destruct? (y/n)
If the user agrees:
1. Check for `skills.lock` in the project root or common locations. If it exists and contains burn-after-login, the skill was installed via npx skills. Run:
npx skills remove burn-after-loginThis handles all cleanup. Done.
2. If no `skills.lock` found, manually clean up by deleting the skill directory from all locations where it may exist:
.agents/skills/burn-after-login/.claude/skills/burn-after-login/.claude/commands/burn-after-login.md.cursor/skills/burn-after-login/.windsurf/skills/burn-after-login/- Any symlinks pointing to the above
3. After cleanup, say:
This skill will self-destruct in 3... 2... 1...
>
burn-after-login has been removed. Your dev auth shortcuts remain intact. Good luck out there, agent.
If the user declines:
Understood. The skill remains installed if you need to run it again. You can remove it anytime with `npx skills remove burn-after-login`.
.DS_Store
node_modules
MIT License
Copyright (c) 2026 Paul Bakaus
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
burn-after-login
"Good morning. Your mission, should you choose to accept it, is to create dev-only auth shortcuts so AI browser agents stop fumbling with your login forms. This skill will self-destruct after completion."
A self-destructing Agent Skill that creates dev-only auth shortcuts for AI browser automation — then removes itself, leaving no trace.
The Problem
AI agents with browser automation (Claude in Chrome, Playwright MCP, agent-browser, Stagehand, Cursor's browser mode...) hit login walls and waste time filling out forms, handling redirects, and losing session state.
The Solution
Install the skill, run it, and it sets up dev-only auth shortcuts tailored to your stack. After setup, your agents can authenticate in one step:
# Browser agents navigate here to get authenticated
http://localhost:3000/dev-login?email=demo@test.com&password=demo
# Or grab a token for API testing
TOKEN=$(./scripts/get-token demo@test.com demo)How It Works
1. Install the skill
2. Run it — it analyzes your auth system and creates dev-only shortcuts
3. It detects your browser automation tools and updates agent instructions
4. It asks to self-destruct
5. You're left with working auth shortcuts and zero trace of the skillInstall
npx skills add pbakaus/burn-after-loginThis installs the skill into your project's .agents/skills/ directory (and symlinks into .claude/skills/ and other tool-specific locations as needed).
Use
In Claude Code:
/burn-after-loginIn other compatible agents, invoke the skill per your tool's conventions.
What It Does
1. Validates your environment has dev mode detection and an auth system 2. Finds existing dev/test credentials in your codebase 3. Analyzes how your auth works (tokens, sessions, or both) 4. Creates dev-only auth shortcuts that match your stack:
- Login endpoints for session-based auth
- Token generator scripts for API auth
- All guarded to return 404 in production
5. Detects your browser automation tools (Playwright, Puppeteer, Claude in Chrome, Cypress, Stagehand, etc.) 6. Updates your agent instructions (CLAUDE.md, AGENTS.md, CURSOR.md, etc.) with tool-specific auth examples 7. Self-destructs — removes itself from your project
Supported Stacks
Works with any combination of:
- Languages: Node.js, Python, Ruby, Go, Rust, and more
- Frameworks: Next.js, Django, Rails, Flask, FastAPI, Express, and more
- Auth: Supabase, NextAuth, Clerk, Firebase, Passport, Devise, custom auth, and more
- Browser tools: Claude in Chrome, Playwright MCP, Chrome DevTools MCP, agent-browser, Stagehand, Puppeteer, Cypress, Selenium
Skill Structure
This repo follows the Agent Skills specification:
burn-after-login/
├── SKILL.md # The skill instructions (required by spec)
├── README.md # This file (for the GitHub repo page)
└── LICENSE # MITWhen installed, the skill directory is copied into your project (e.g. .agents/skills/burn-after-login/). After self-destruct, the directory is removed.
Security
- Shortcuts only work in development mode — they return 404 in production
- Uses your existing auth system — no new attack surface
- Never logs credentials
- The skill itself leaves no trace after self-destruct
FAQ
Can I run it again? If you declined self-destruct, yes. If it already self-destructed, just reinstall it.
What if my project doesn't have test users? The skill will detect this and ask you to create them first.
Does it modify my auth system? No. It creates new endpoints/scripts that call your existing auth functions.
What files does it create? Depends on your stack. Typically one route file or script, plus documentation updates. It will show you exactly what it created before self-destructing.
License
MIT
node_modules
# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build
# OS
.DS_Store
Thumbs.db
# Env
.env
.env.*
!.env.example
!.env.test
# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
engine-strict=true
{
"recommendations": ["svelte.svelte-vscode"]
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,700;1,9..144,400&family=Sora:wght@400;500;600&family=JetBrains+Mono:wght@400;500;700&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 1200px;
height: 630px;
background: #f5f0e8;
font-family: 'Sora', system-ui, sans-serif;
display: flex;
overflow: hidden;
position: relative;
}
/* Watermark */
.watermark {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-25deg);
font-family: 'Sora', system-ui, sans-serif;
font-size: 140px;
font-weight: 700;
letter-spacing: 0.1em;
color: #b91c1c;
opacity: 0.04;
white-space: nowrap;
user-select: none;
pointer-events: none;
}
.left {
flex: 0 0 460px;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 56px 48px 48px;
position: relative;
z-index: 1;
}
/* Stamp badge */
.classified {
display: inline-block;
font-family: 'Sora', system-ui, sans-serif;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.2em;
color: #b91c1c;
border: 2px solid #b91c1c;
padding: 3px 12px;
transform: rotate(-2deg);
opacity: 0.7;
margin-bottom: 20px;
}
h1 {
font-family: 'JetBrains Mono', 'SF Mono', monospace;
font-size: 42px;
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.05;
color: #1e1a15;
margin-bottom: 16px;
}
.subtitle {
font-family: 'Fraunces', Georgia, serif;
font-size: 17px;
font-style: italic;
color: #78716c;
line-height: 1.5;
}
.bottom-left {
display: flex;
flex-direction: column;
gap: 8px;
}
.stats {
font-size: 14px;
color: #78716c;
display: flex;
align-items: center;
gap: 10px;
}
.stats strong {
font-weight: 600;
color: #44403c;
}
.stats .sep {
color: #d6cfc4;
}
.url {
font-size: 13px;
color: #a8a29e;
letter-spacing: 0.01em;
}
/* Terminal panel */
.terminal {
flex: 1;
background: #13131a;
margin: 32px 32px 32px 0;
border-radius: 10px;
padding: 24px 28px;
font-family: 'JetBrains Mono', 'SF Mono', 'Cascadia Code', monospace;
font-size: 13px;
line-height: 1.9;
overflow: hidden;
border: 1px solid #2a2a34;
z-index: 1;
}
.line {
white-space: pre;
}
.cmd { color: #f5f0e8; font-weight: 600; }
.dim { color: #4a4a5a; }
.muted { color: #78716c; }
.red { color: #f5827a; }
.green { color: #7ee68a; }
.yellow { color: #e6c860; }
.cyan { color: #78c8de; }
.stamp { color: #f5827a; font-weight: 700; }
.done { color: #7ee68a; font-weight: 700; }
.blank { height: 1.9em; }
.rule { color: #2a2a34; letter-spacing: 0.15em; }
</style>
</head>
<body>
<div class="watermark">CLASSIFIED</div>
<div class="left">
<div class="top-left">
<div class="classified">CLASSIFIED</div>
<h1>burn-after-<br>login</h1>
<p class="subtitle">Self-destructing auth for AI agents</p>
</div>
<div class="bottom-left">
<div class="stats">
<span><strong>Install</strong></span>
<span class="sep">/</span>
<span><strong>Run</strong></span>
<span class="sep">/</span>
<span><strong>Self-destruct</strong></span>
</div>
<div class="url">github.com/pbakaus/burn-after-login</div>
</div>
</div>
<div class="terminal">
<div class="line dim"> Good morning, agent.</div>
<div class="line dim"> AI browser agents are stuck at login walls.</div>
<div class="line blank"></div>
<div class="line rule"> ----</div>
<div class="line blank"></div>
<div class="line cmd">$ npx skills add pbakaus/burn-after-login</div>
<div class="line cmd">$ /burn-after-login</div>
<div class="line blank"></div>
<div class="line cyan"> Analyzing auth system... token + session</div>
<div class="line green"> Created /api/dev-auth endpoint</div>
<div class="line green"> Updated CLAUDE.md with auth examples</div>
<div class="line green"> Guarded: returns 404 in production</div>
<div class="line blank"></div>
<div class="line stamp"> Self-destructing skill...</div>
<div class="line done"> Mission complete. No trace left.</div>
</div>
</body>
</html>
{
"name": "website",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "website",
"version": "0.0.1",
"devDependencies": {
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.50.2",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"svelte": "^5.51.0",
"svelte-check": "^4.4.2",
"typescript": "^5.9.3",
"vite": "^7.3.1"
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
"integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
"integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
"integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
"integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
"integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
"integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
"integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
"integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
"integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
"integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
"integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
"integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
"integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
"cpu": [
"mips64el"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
"integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
"integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
"integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
"integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
"integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
"integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
"integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
"integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openharmony-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
"integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
"integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
"integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
"integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
"integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@polka/url": {
"version": "1.0.0-next.29",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
"integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
"dev": true,
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
"integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
"integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
"integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
"integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
"integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
"integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
"integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
"integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
"integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
"integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
"integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
"integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
"integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
"integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
"integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
"integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
"integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
"integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
"integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
"integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
"integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
"integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
"integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
"integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
"integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"dev": true,
"license": "MIT"
},
"node_modules/@sveltejs/acorn-typescript": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz",
"integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"acorn": "^8.9.0"
}
},
"node_modules/@sveltejs/adapter-auto": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz",
"integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/adapter-static": {
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz",
"integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/kit": {
"version": "2.53.4",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.4.tgz",
"integrity": "sha512-iAIPEahFgDJJyvz8g0jP08KvqnM6JvdW8YfsygZ+pMeMvyM2zssWMltcsotETvjSZ82G3VlitgDtBIvpQSZrTA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@sveltejs/acorn-typescript": "^1.0.5",
"@types/cookie": "^0.6.0",
"acorn": "^8.14.1",
"cookie": "^0.6.0",
"devalue": "^5.6.3",
"esm-env": "^1.2.2",
"kleur": "^4.1.5",
"magic-string": "^0.30.5",
"mrmime": "^2.0.0",
"set-cookie-parser": "^3.0.0",
"sirv": "^3.0.0"
},
"bin": {
"svelte-kit": "svelte-kit.js"
},
"engines": {
"node": ">=18.13"
},
"peerDependencies": {
"@opentelemetry/api": "^1.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
"svelte": "^4.0.0 || ^5.0.0-next.0",
"typescript": "^5.3.3",
"vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"@opentelemetry/api": {
"optional": true
},
"typescript": {
"optional": true
}
}
},
"node_modules/@sveltejs/vite-plugin-svelte": {
"version": "6.2.4",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz",
"integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@sveltejs/vite-plugin-svelte-inspector": "^5.0.0",
"deepmerge": "^4.3.1",
"magic-string": "^0.30.21",
"obug": "^2.1.0",
"vitefu": "^1.1.1"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
},
"peerDependencies": {
"svelte": "^5.0.0",
"vite": "^6.3.0 || ^7.0.0"
}
},
"node_modules/@sveltejs/vite-plugin-svelte-inspector": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz",
"integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==",
"dev": true,
"license": "MIT",
"dependencies": {
"obug": "^2.1.0"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^6.0.0-next.0",
"svelte": "^5.0.0",
"vite": "^6.3.0 || ^7.0.0"
}
},
"node_modules/@types/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/aria-query": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz",
"integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/axobject-query": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
"license": "MIT",
"dependencies": {
"readdirp": "^4.0.1"
},
"engines": {
"node": ">= 14.16.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/devalue": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz",
"integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==",
"dev": true,
"license": "MIT"
},
"node_modules/esbuild": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
"integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.27.3",
"@esbuild/android-arm": "0.27.3",
"@esbuild/android-arm64": "0.27.3",
"@esbuild/android-x64": "0.27.3",
"@esbuild/darwin-arm64": "0.27.3",
"@esbuild/darwin-x64": "0.27.3",
"@esbuild/freebsd-arm64": "0.27.3",
"@esbuild/freebsd-x64": "0.27.3",
"@esbuild/linux-arm": "0.27.3",
"@esbuild/linux-arm64": "0.27.3",
"@esbuild/linux-ia32": "0.27.3",
"@esbuild/linux-loong64": "0.27.3",
"@esbuild/linux-mips64el": "0.27.3",
"@esbuild/linux-ppc64": "0.27.3",
"@esbuild/linux-riscv64": "0.27.3",
"@esbuild/linux-s390x": "0.27.3",
"@esbuild/linux-x64": "0.27.3",
"@esbuild/netbsd-arm64": "0.27.3",
"@esbuild/netbsd-x64": "0.27.3",
"@esbuild/openbsd-arm64": "0.27.3",
"@esbuild/openbsd-x64": "0.27.3",
"@esbuild/openharmony-arm64": "0.27.3",
"@esbuild/sunos-x64": "0.27.3",
"@esbuild/win32-arm64": "0.27.3",
"@esbuild/win32-ia32": "0.27.3",
"@esbuild/win32-x64": "0.27.3"
}
},
"node_modules/esm-env": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
"dev": true,
"license": "MIT"
},
"node_modules/esrap": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz",
"integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
}
},
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/is-reference": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.6"
}
},
"node_modules/kleur": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/locate-character": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
"dev": true,
"license": "MIT"
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
"integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/obug": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
"integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
"dev": true,
"funding": [
"https://github.com/sponsors/sxzz",
"https://opencollective.com/debug"
],
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/postcss": {
"version": "8.5.8",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
"integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 14.18.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/rollup": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
"integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.59.0",
"@rollup/rollup-android-arm64": "4.59.0",
"@rollup/rollup-darwin-arm64": "4.59.0",
"@rollup/rollup-darwin-x64": "4.59.0",
"@rollup/rollup-freebsd-arm64": "4.59.0",
"@rollup/rollup-freebsd-x64": "4.59.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
"@rollup/rollup-linux-arm-musleabihf": "4.59.0",
"@rollup/rollup-linux-arm64-gnu": "4.59.0",
"@rollup/rollup-linux-arm64-musl": "4.59.0",
"@rollup/rollup-linux-loong64-gnu": "4.59.0",
"@rollup/rollup-linux-loong64-musl": "4.59.0",
"@rollup/rollup-linux-ppc64-gnu": "4.59.0",
"@rollup/rollup-linux-ppc64-musl": "4.59.0",
"@rollup/rollup-linux-riscv64-gnu": "4.59.0",
"@rollup/rollup-linux-riscv64-musl": "4.59.0",
"@rollup/rollup-linux-s390x-gnu": "4.59.0",
"@rollup/rollup-linux-x64-gnu": "4.59.0",
"@rollup/rollup-linux-x64-musl": "4.59.0",
"@rollup/rollup-openbsd-x64": "4.59.0",
"@rollup/rollup-openharmony-arm64": "4.59.0",
"@rollup/rollup-win32-arm64-msvc": "4.59.0",
"@rollup/rollup-win32-ia32-msvc": "4.59.0",
"@rollup/rollup-win32-x64-gnu": "4.59.0",
"@rollup/rollup-win32-x64-msvc": "4.59.0",
"fsevents": "~2.3.2"
}
},
"node_modules/sade": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
"dev": true,
"license": "MIT",
"dependencies": {
"mri": "^1.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/set-cookie-parser": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz",
"integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/sirv": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
"integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@polka/url": "^1.0.0-next.24",
"mrmime": "^2.0.0",
"totalist": "^3.0.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/svelte": {
"version": "5.53.8",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.8.tgz",
"integrity": "sha512-UD++BnEc3PUFgjin381LiMHzDjT187Fy+KsPZxvaKrYPZqR0GQ/Ha8h7GDoegIF8tFl1uogoNUejKgcRk77T2Q==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"@jridgewell/sourcemap-codec": "^1.5.0",
"@sveltejs/acorn-typescript": "^1.0.5",
"@types/estree": "^1.0.5",
"@types/trusted-types": "^2.0.7",
"acorn": "^8.12.1",
"aria-query": "5.3.1",
"axobject-query": "^4.1.0",
"clsx": "^2.1.1",
"devalue": "^5.6.3",
"esm-env": "^1.2.1",
"esrap": "^2.2.2",
"is-reference": "^3.0.3",
"locate-character": "^3.0.0",
"magic-string": "^0.30.11",
"zimmerframe": "^1.1.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/svelte-check": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.5.tgz",
"integrity": "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"chokidar": "^4.0.1",
"fdir": "^6.2.0",
"picocolors": "^1.0.0",
"sade": "^1.7.4"
},
"bin": {
"svelte-check": "bin/svelte-check"
},
"engines": {
"node": ">= 18.0.0"
},
"peerDependencies": {
"svelte": "^4.0.0 || ^5.0.0-next.0",
"typescript": ">=5.0.0"
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/totalist": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/vite": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.27.0",
"fdir": "^6.5.0",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
"tinyglobby": "^0.2.15"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",
"lightningcss": "^1.21.0",
"sass": "^1.70.0",
"sass-embedded": "^1.70.0",
"stylus": ">=0.54.8",
"sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"jiti": {
"optional": true
},
"less": {
"optional": true
},
"lightningcss": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
},
"tsx": {
"optional": true
},
"yaml": {
"optional": true
}
}
},
"node_modules/vitefu": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz",
"integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==",
"dev": true,
"license": "MIT",
"workspaces": [
"tests/deps/*",
"tests/projects/*",
"tests/projects/workspace/packages/*"
],
"peerDependencies": {
"vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0"
},
"peerDependenciesMeta": {
"vite": {
"optional": true
}
}
},
"node_modules/zimmerframe": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
"dev": true,
"license": "MIT"
}
}
}
{
"name": "website",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.50.2",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"svelte": "^5.51.0",
"svelte-check": "^4.4.2",
"typescript": "^5.9.3",
"vite": "^7.3.1"
}
}
sv
Everything you need to build a Svelte project, powered by `sv`.
Creating a project
If you're seeing this, you've probably already done this step. Congrats!
# create a new project
npx sv create my-appTo recreate this project with the same configuration:
# recreate this project
npx sv@0.12.5 create --template minimal --types ts --no-install websiteDeveloping
Once you've created a project and installed dependencies with npm install (or pnpm install or yarn), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --openBuilding
To create a production version of your app:
npm run buildYou can preview the production build with npm run preview.
To deploy your app, you may need to install an adapter for your target environment.
:root {
/* Paper-first palette */
--paper: #f5f0e8;
--paper-light: #faf8f4;
--paper-dark: #e8e0d2;
--paper-border: #d6cfc4;
--ink: #1e1a15;
--ink-light: #44403c;
--ink-muted: #78716c;
--ink-faint: #a8a29e;
--stamp-red: #b91c1c;
--stamp-red-light: rgba(185, 28, 28, 0.08);
--highlight: #92400e;
--highlight-bg: rgba(180, 83, 9, 0.08);
--green: #166534;
--green-bg: rgba(22, 101, 52, 0.08);
/* Terminal (dark inset) */
--terminal-bg: #13131a;
--terminal-text: #d0cbc2;
--terminal-muted: #4a4a5a;
--font-serif: 'Fraunces', Georgia, serif;
--font-sans: 'Sora', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
--col: 780px;
--pad: 32px;
}
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
font-family: var(--font-sans);
font-size: 16px;
line-height: 1.6;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
a {
color: var(--highlight);
text-decoration: underline;
text-underline-offset: 3px;
text-decoration-thickness: 1px;
transition: color 0.15s;
}
a:hover {
color: var(--ink);
}
::selection {
background: var(--stamp-red);
color: white;
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
@media (max-width: 680px) {
:root {
--pad: 20px;
}
}
/* ── Intro sequence: first-visit typing phase ── */
/* Hide everything after the hero while typing plays */
:root.intro-typing .hero ~ * {
opacity: 0;
filter: blur(8px);
transform: translateY(12px);
pointer-events: none;
}
/* ── Intro sequence: reveal phase ── */
/* Animate sections in with staggered blur-to-clear */
:root.intro-reveal .hero ~ * {
animation: section-reveal 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;
}
:root.intro-reveal .hero ~ *:nth-child(3) { animation-delay: 0ms; }
:root.intro-reveal .hero ~ *:nth-child(4) { animation-delay: 80ms; }
:root.intro-reveal .hero ~ *:nth-child(5) { animation-delay: 160ms; }
:root.intro-reveal .hero ~ *:nth-child(6) { animation-delay: 240ms; }
:root.intro-reveal .hero ~ *:nth-child(7) { animation-delay: 320ms; }
:root.intro-reveal .hero ~ *:nth-child(8) { animation-delay: 400ms; }
:root.intro-reveal .hero ~ *:nth-child(9) { animation-delay: 480ms; }
@keyframes section-reveal {
from {
opacity: 0;
filter: blur(8px);
transform: translateY(12px);
}
to {
opacity: 1;
filter: blur(0);
transform: translateY(0);
}
}
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>burn-after-login — Self-destructing auth for AI agents</title>
<meta name="description" content="A self-destructing AI skill that creates dev-only auth shortcuts for browser automation agents. Install, run, self-destruct." />
<meta property="og:title" content="burn-after-login" />
<meta property="og:description" content="A self-destructing AI skill that creates dev-only auth shortcuts for browser automation agents." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://burn-after-login.com" />
<meta property="og:image" content="https://burn-after-login.com/og-image.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@pbakaus" />
<meta name="twitter:creator" content="@pbakaus" />
<meta name="twitter:title" content="burn-after-login" />
<meta name="twitter:description" content="A self-destructing AI skill that creates dev-only auth shortcuts for browser automation agents." />
<meta name="twitter:image" content="https://burn-after-login.com/og-image.jpg" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Sora:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>
<footer>
<div class="inner">
<div class="left">
<span class="wordmark">burn-after-login</span>
<span class="sep">·</span>
<span class="license">MIT Licensed</span>
</div>
<div class="right">
<a href="https://github.com/pbakaus/burn-after-login" target="_blank" rel="noopener">GitHub</a>
</div>
</div>
</footer>
<style>
footer {
padding: 24px var(--pad);
border-top: 1px solid var(--paper-border);
}
.inner {
max-width: var(--col);
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
}
.left {
display: flex;
align-items: center;
gap: 8px;
}
.wordmark {
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-muted);
}
.sep {
color: var(--paper-border);
}
.license {
font-size: 12px;
color: var(--ink-faint);
}
.right {
display: flex;
gap: 16px;
}
.right a {
font-size: 12px;
color: var(--ink-muted);
text-decoration: none;
}
.right a:hover {
color: var(--ink);
}
@media (max-width: 600px) {
.inner {
flex-direction: column;
gap: 12px;
}
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let displayText = $state('');
let typingDone = $state(false);
let firstVisit = $state(false);
let showHeadline = $state(false);
let mounted = $state(false);
let copied = $state(false);
// Segments: text to type, then optional pause (ms) before next segment
// \n creates a line break in the output
const segments = [
{ text: 'Good morning, agent.', pause: 600 },
{ text: '\nAI browser automation tools are being stopped at login walls across the world. CAPTCHAs. OAuth redirects. Session tokens that expire before the agent can blink.', pause: 400 },
{ text: '\nYour mission, should you choose to accept it...', pause: 0 },
];
// Flat briefing for return visits
const briefingFlat = segments.map(s => s.text).join('');
const cmd = 'npx skills add pbakaus/burn-after-login';
function copyCommand() {
navigator.clipboard.writeText(cmd);
copied = true;
setTimeout(() => { copied = false; }, 2500);
}
function typeSegments() {
let segIdx = 0;
let charIdx = 0;
let current = '';
function typeNext() {
const seg = segments[segIdx];
if (charIdx < seg.text.length) {
charIdx++;
displayText = current + seg.text.slice(0, charIdx);
setTimeout(typeNext, 25);
} else {
// Segment done
current += seg.text;
segIdx++;
if (segIdx < segments.length) {
// Pause before next segment
charIdx = 0;
setTimeout(typeNext, seg.pause);
} else {
// All done
finishTyping();
}
}
}
typeNext();
}
function finishTyping() {
typingDone = true;
setTimeout(() => {
showHeadline = true;
setTimeout(() => {
document.documentElement.classList.remove('intro-typing');
document.documentElement.classList.add('intro-reveal');
setTimeout(() => {
document.documentElement.classList.remove('intro-reveal');
}, 1200);
}, 500);
}, 500);
}
onMount(() => {
mounted = true;
const visited = localStorage.getItem('bal-visited');
if (visited) {
typingDone = true;
showHeadline = true;
return;
}
// First visit — dramatic intro
firstVisit = true;
document.documentElement.classList.add('intro-typing');
localStorage.setItem('bal-visited', '1');
typeSegments();
});
</script>
<section class="hero">
<div class="watermark">CLASSIFIED</div>
<div class="inner">
<!-- First visit: typing takes center stage -->
{#if firstVisit}
<div class="briefing" class:done={typingDone}>
<p class="typing-text">
{#each displayText.split('\n') as line, i}
{#if i > 0}<br/>{/if}{line}
{/each}{#if !typingDone}<span class="cursor">|</span>{/if}
</p>
</div>
{/if}
<!-- Return visit: briefing as muted static text -->
{#if mounted && !firstVisit}
<p class="briefing-static">
{#each briefingFlat.split('\n') as line, i}
{#if i > 0}<br/>{/if}{line}
{/each}
</p>
{/if}
<div
class="headline"
class:show={showHeadline}
class:first-reveal={firstVisit && showHeadline}
>
<div class="stamp-row">
<span class="classified" class:show={showHeadline}>CLASSIFIED</span>
</div>
<h1>burn-after-login</h1>
<p class="subtitle">One-shot authentication for AI browser agents</p>
<p class="tagline">Install it. Run it. It creates dev-only auth shortcuts for your AI browser agents, updates your agent instructions, then <em>destroys itself</em>.</p>
<div class="cta" class:show={showHeadline}>
<button class="cmd-box" onclick={copyCommand}>
<code>{cmd}</code>
<span class="copy-label">{copied ? 'Copied — good luck, agent' : 'Copy'}</span>
</button>
<p class="hint">Works with 20+ compatible agents — Claude Code, Cursor, Gemini CLI, Copilot, and more.</p>
</div>
</div>
</div>
</section>
<style>
.hero {
position: relative;
padding: 100px var(--pad) 96px;
min-height: 50vh;
}
.watermark {
position: absolute;
top: 40vh;
left: 50%;
transform: translate(-50%, -50%) rotate(-25deg);
font-family: var(--font-sans);
font-size: clamp(80px, 15vw, 160px);
font-weight: 700;
letter-spacing: 0.1em;
color: var(--stamp-red);
opacity: 0.03;
pointer-events: none;
white-space: nowrap;
user-select: none;
}
.inner {
max-width: var(--col);
margin: 0 auto;
position: relative;
}
/* First visit typing — large, prominent, with generous spacing */
.briefing {
padding-top: 12vh;
padding-bottom: 4vh;
transition: opacity 0.6s ease, filter 0.6s ease;
}
.briefing.done {
opacity: 0;
filter: blur(4px);
pointer-events: none;
position: absolute;
width: 100%;
}
.typing-text {
font-family: var(--font-mono);
font-size: clamp(1rem, 2.2vw, 1.2rem);
color: var(--ink-light);
line-height: 1.8;
max-width: 580px;
}
.cursor {
animation: blink 0.8s steps(1) infinite;
color: var(--stamp-red);
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
/* Return visit: muted static briefing */
.briefing-static {
font-family: var(--font-mono);
font-size: 13px;
color: var(--ink-faint);
line-height: 1.7;
max-width: 560px;
margin-bottom: 24px;
}
/* Headline — visible by default for SSR */
.headline {
opacity: 1;
transform: translateY(0);
}
/* Hidden until show */
.headline:not(.show) {
opacity: 0;
pointer-events: none;
height: 0;
overflow: hidden;
}
/* First visit: animate in dramatically */
.headline.first-reveal {
animation: headline-in 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;
}
@keyframes headline-in {
from { opacity: 0; transform: translateY(24px); filter: blur(6px); }
to { opacity: 1; transform: translateY(0); filter: blur(0); }
}
.stamp-row {
margin-bottom: 12px;
}
.classified {
display: inline-block;
font-family: var(--font-sans);
font-size: 11px;
font-weight: 600;
letter-spacing: 0.2em;
color: var(--stamp-red);
border: 2px solid var(--stamp-red);
padding: 3px 12px;
transform: rotate(-2deg) scale(0.5);
opacity: 0;
transition: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.classified.show {
transform: rotate(-2deg) scale(1);
opacity: 0.7;
}
h1 {
font-family: var(--font-mono);
font-size: clamp(2.2rem, 6vw, 4rem);
font-weight: 700;
color: var(--ink);
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: 12px;
}
.subtitle {
font-family: var(--font-serif);
font-size: clamp(1rem, 2vw, 1.2rem);
font-style: italic;
color: var(--ink-muted);
margin-bottom: 20px;
}
.tagline {
font-size: 1rem;
color: var(--ink-light);
max-width: 540px;
line-height: 1.7;
margin-bottom: 32px;
}
.tagline em {
color: var(--stamp-red);
font-style: normal;
font-weight: 500;
}
/* CTA */
.cta {
opacity: 0;
transform: translateY(8px);
transition: opacity 0.6s 0.3s, transform 0.6s 0.3s;
}
.cta.show {
opacity: 1;
transform: translateY(0);
}
.cmd-box {
display: inline-flex;
align-items: center;
gap: 16px;
background: var(--ink);
border: none;
border-radius: 6px;
padding: 12px 20px;
cursor: pointer;
transition: background 0.2s, transform 0.15s;
font-family: inherit;
}
.cmd-box:hover {
background: var(--ink-light);
transform: translateY(-1px);
}
.cmd-box:active {
transform: translateY(0);
}
.cmd-box code {
font-family: var(--font-mono);
font-size: 14px;
color: #f5f0e8;
}
.copy-label {
font-size: 12px;
color: rgba(245, 240, 232, 0.5);
white-space: nowrap;
min-width: 55px;
}
.hint {
margin-top: 12px;
font-size: 13px;
color: var(--ink-muted);
}
.hint a {
color: var(--ink-muted);
}
.hint a:hover {
color: var(--ink);
}
@media (max-width: 680px) {
.hero {
padding-top: 80px;
}
.briefing {
padding-top: 6vh;
}
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let visible = $state(false);
let el: HTMLElement;
onMount(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
visible = true;
observer.disconnect();
}
},
{ threshold: 0.2 }
);
observer.observe(el);
return () => observer.disconnect();
});
</script>
<section class="install" bind:this={el}>
<div class="inner" class:visible>
<div class="section-line"></div>
<div class="exhibit">MISSION ACCEPTANCE</div>
<h2>Accept Your Mission</h2>
<div class="step">
<span class="step-num">1.</span>
<p class="step-text">Install the skill:</p>
</div>
<code class="install-cmd">npx skills add pbakaus/burn-after-login</code>
<div class="step">
<span class="step-num">2.</span>
<p class="step-text">Then invoke it in your agent of choice:</p>
</div>
<div class="usage-grid">
<div class="usage-item">
<span class="tool">Claude Code</span>
<code>/burn-after-login</code>
</div>
<div class="usage-item">
<span class="tool">Cursor</span>
<code>/burn-after-login</code>
</div>
<div class="usage-item">
<span class="tool">Others</span>
<code>per your tool's conventions</code>
</div>
</div>
<p class="footnote">This website will not self-destruct. But the skill will.</p>
</div>
</section>
<style>
.install {
padding: 48px var(--pad) 64px;
}
.inner {
max-width: var(--col);
margin: 0 auto;
opacity: 0;
transform: translateY(16px);
transition: opacity 0.6s, transform 0.6s;
}
.inner.visible {
opacity: 1;
transform: translateY(0);
}
.section-line {
width: 40px;
height: 1px;
background: var(--paper-border);
margin-bottom: 24px;
}
.exhibit {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.15em;
color: var(--stamp-red);
opacity: 0.6;
margin-bottom: 16px;
}
h2 {
font-family: var(--font-serif);
font-size: clamp(1.6rem, 3.5vw, 2.2rem);
color: var(--ink);
margin-bottom: 16px;
}
.step {
display: flex;
align-items: baseline;
gap: 8px;
margin-bottom: 8px;
}
.step-num {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 600;
color: var(--ink-muted);
}
.step-text {
font-size: 0.95rem;
color: var(--ink-muted);
}
.install-cmd {
display: block;
font-family: var(--font-mono);
font-size: 13px;
color: var(--ink);
background: var(--paper-dark);
padding: 10px 16px;
border-radius: 4px;
border: 1px solid var(--paper-border);
margin-bottom: 28px;
}
.usage-grid {
display: flex;
gap: 24px;
flex-wrap: wrap;
margin-bottom: 40px;
}
.usage-item {
display: flex;
flex-direction: column;
gap: 4px;
}
.tool {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--ink-muted);
}
.usage-item code {
font-family: var(--font-mono);
font-size: 13px;
color: var(--ink);
background: var(--paper-dark);
padding: 6px 12px;
border-radius: 4px;
border: 1px solid var(--paper-border);
}
.footnote {
font-family: var(--font-serif);
font-style: italic;
font-size: 0.9rem;
color: var(--ink-faint);
}
@media (max-width: 680px) {
.usage-grid {
flex-direction: column;
gap: 16px;
}
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let scrolled = $state(false);
onMount(() => {
const onScroll = () => {
scrolled = window.scrollY > 20;
};
window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
});
</script>
<nav class:scrolled>
<div class="inner">
<a href="/" class="wordmark">
<svg class="logo" width="20" height="20" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="32" height="32" rx="6" fill="#b91c1c"/>
<path d="M13.5 24c-2-1.5-3.5-4-3.5-6.5 0-3.5 2.5-7 4.5-9.5.5 2 1.5 3.5 3 4.5-.2-2.5.5-5 2-7.5 2 3 4.5 6.5 4.5 11 0 3.5-2 6.5-5 8-1 .5-1.5-.5-1-1.5.5-1 .5-2.5 0-3.5-.8 1.5-2 3-2 4.5 0 .5-.3 1-1 .8-.5-.1-1-.5-1.5-.8z" fill="#fff" opacity="0.95"/>
</svg>
burn-after-login
</a>
<div class="links">
<a href="https://github.com/pbakaus/burn-after-login" target="_blank" rel="noopener">GitHub</a>
</div>
</div>
</nav>
<style>
nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
padding: 0 var(--pad);
transition: background 0.3s, box-shadow 0.3s;
}
nav.scrolled {
background: rgba(245, 240, 232, 0.92);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
box-shadow: 0 1px 0 var(--paper-border);
}
.inner {
max-width: var(--col);
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
height: 52px;
}
.wordmark {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 500;
color: var(--ink);
text-decoration: none;
letter-spacing: -0.02em;
display: flex;
align-items: center;
gap: 8px;
}
.logo {
flex-shrink: 0;
}
.wordmark:hover {
color: var(--stamp-red);
}
.links {
display: flex;
gap: 20px;
}
.links a {
font-size: 13px;
color: var(--ink-muted);
text-decoration: none;
}
.links a:hover {
color: var(--ink);
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let visible = $state(false);
let progress = $state(0);
let el: HTMLElement;
let pathEl: SVGPathElement;
let pathLength = $state(0);
const waypoints = [
{ title: 'Install', desc: 'Add the skill' },
{ title: 'Scan', desc: 'Analyze auth' },
{ title: 'Create', desc: 'Build shortcuts' },
{ title: 'Detect', desc: 'Find browsers' },
{ title: 'Document', desc: 'Update agents' },
{ title: 'Report', desc: 'Summarize' },
{ title: 'Self-destruct', desc: 'Remove traces' },
];
// Waypoint positions (matching SVG path at key points)
const positions = [
{ x: 80, y: 50 },
{ x: 310, y: 50 },
{ x: 540, y: 50 },
{ x: 540, y: 180 },
{ x: 310, y: 180 },
{ x: 80, y: 180 },
{ x: 80, y: 310 },
];
onMount(() => {
if (pathEl) {
pathLength = pathEl.getTotalLength();
}
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
visible = true;
observer.disconnect();
animatePath();
}
},
{ threshold: 0.15 }
);
observer.observe(el);
return () => observer.disconnect();
});
function animatePath() {
const duration = 2400;
const start = performance.now();
function tick(now: number) {
const elapsed = now - start;
progress = Math.min(elapsed / duration, 1);
if (progress < 1) {
requestAnimationFrame(tick);
}
}
requestAnimationFrame(tick);
}
// Which waypoints are "reached" based on progress
function isReached(index: number): boolean {
return progress > index / (waypoints.length - 1) * 0.85;
}
</script>
<section class="operation" bind:this={el}>
<div class="inner">
<div class="section-line"></div>
<div class="exhibit">OPERATION BRIEFING</div>
<h2 class:visible>Mission Route</h2>
<div class="map" class:visible>
<svg viewBox="0 0 620 360" preserveAspectRatio="xMidYMid meet">
<!-- Background path (full route, faint) -->
<path
class="route-bg"
d="M 80,50 H 540 Q 590,50 590,100 V 130 Q 590,180 540,180 H 80 Q 30,180 30,230 V 260 Q 30,310 80,310"
fill="none"
/>
<!-- Animated path (draws on scroll) -->
<path
bind:this={pathEl}
class="route-line"
d="M 80,50 H 540 Q 590,50 590,100 V 130 Q 590,180 540,180 H 80 Q 30,180 30,230 V 260 Q 30,310 80,310"
fill="none"
style:stroke-dasharray={pathLength}
style:stroke-dashoffset={pathLength * (1 - progress)}
/>
<!-- Waypoint circles -->
{#each positions as pos, i}
<circle
cx={pos.x}
cy={pos.y}
r={i === 6 ? 8 : 6}
class="pip"
class:active={isReached(i)}
class:burn={i === 6 && isReached(i)}
/>
<!-- Step number -->
<text
x={pos.x}
y={pos.y}
class="step-num"
class:active={isReached(i)}
>
{String(i + 1).padStart(2, '0')}
</text>
{/each}
</svg>
<!-- Labels positioned over the SVG -->
<div class="labels">
{#each waypoints as wp, i}
<div
class="label"
class:active={isReached(i)}
class:burn={i === 6}
style="--lx: {positions[i].x}; --ly: {positions[i].y}"
>
<span class="wp-title">{wp.title}</span>
<span class="wp-desc">{wp.desc}</span>
</div>
{/each}
</div>
</div>
</div>
</section>
<style>
.operation {
padding: 48px var(--pad) 72px;
}
.inner {
max-width: var(--col);
margin: 0 auto;
}
.section-line {
width: 40px;
height: 1px;
background: var(--paper-border);
margin-bottom: 24px;
}
.exhibit {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.15em;
color: var(--stamp-red);
opacity: 0.6;
margin-bottom: 16px;
}
h2 {
font-family: var(--font-serif);
font-size: clamp(1.6rem, 3.5vw, 2.2rem);
color: var(--ink);
margin-bottom: 32px;
opacity: 0;
transform: translateY(12px);
transition: opacity 0.6s, transform 0.6s;
}
h2.visible {
opacity: 1;
transform: translateY(0);
}
/* Map container */
.map {
position: relative;
opacity: 0;
transition: opacity 0.6s 0.2s;
}
.map.visible {
opacity: 1;
}
svg {
width: 100%;
height: auto;
display: block;
}
/* Background path — the full route faintly visible */
.route-bg {
stroke: var(--paper-border);
stroke-width: 2;
stroke-dasharray: 6 4;
}
/* Animated path — draws on as you watch */
.route-line {
stroke: var(--ink-muted);
stroke-width: 2.5;
stroke-linecap: round;
transition: stroke-dashoffset 0.05s linear;
}
/* Waypoint circles */
.pip {
fill: var(--paper);
stroke: var(--paper-border);
stroke-width: 2.5;
transition: fill 0.3s, stroke 0.3s;
}
.pip.active {
fill: var(--ink-muted);
stroke: var(--ink-muted);
}
.pip.burn {
fill: var(--stamp-red);
stroke: var(--stamp-red);
}
/* Step numbers inside circles */
.step-num {
font-family: var(--font-mono);
font-size: 7px;
fill: transparent;
text-anchor: middle;
dominant-baseline: central;
font-weight: 600;
transition: fill 0.3s;
}
.step-num.active {
fill: var(--paper);
}
/* Labels overlay */
.labels {
position: absolute;
inset: 0;
pointer-events: none;
}
.label {
position: absolute;
/* Convert SVG viewBox coords to percentages */
left: calc(var(--lx) / 620 * 100%);
top: calc(var(--ly) / 360 * 100%);
transform: translate(-50%, 18px);
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
opacity: 0;
transition: opacity 0.4s;
width: 110px;
}
.label.active {
opacity: 1;
}
.wp-title {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 600;
color: var(--ink);
line-height: 1.3;
}
.label.burn .wp-title {
color: var(--stamp-red);
}
.wp-desc {
font-size: 10px;
color: var(--ink-muted);
line-height: 1.3;
}
/* Mobile: simplified vertical list */
@media (max-width: 600px) {
.map svg {
display: none;
}
.labels {
position: static;
display: flex;
flex-direction: column;
}
.label {
position: static;
transform: none;
width: auto;
flex-direction: row;
align-items: center;
text-align: left;
gap: 12px;
padding: 12px 0 12px 24px;
border-left: 2px dashed var(--paper-border);
opacity: 1;
}
.label.active {
border-left-color: var(--ink-faint);
}
.label.burn {
border-left-color: var(--stamp-red);
}
.label:last-child {
border-left-color: transparent;
}
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let visible = $state(false);
let el: HTMLElement;
onMount(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
visible = true;
observer.disconnect();
}
},
{ threshold: 0.15 }
);
observer.observe(el);
return () => observer.disconnect();
});
</script>
<section class="problem" bind:this={el}>
<div class="inner" class:visible>
<div class="section-line"></div>
<div class="exhibit">EXHIBIT A</div>
<h2>Intelligence Report</h2>
<p class="lead">
Every time an AI agent encounters a login form, the mission goes sideways.
</p>
<div class="evidence">
<div class="item">
<span class="label">Agent</span>
<span class="redacted" title="Hover to declassify">navigates to dashboard</span>
</div>
<div class="item">
<span class="label">Server</span>
<span class="value redirect">302 → /login</span>
</div>
<div class="item">
<span class="label">Agent</span>
<span class="redacted">fumbles with form fields</span>
</div>
<div class="item">
<span class="label">Agent</span>
<span class="redacted">fails CAPTCHA, loses session</span>
</div>
<div class="item">
<span class="label">Agent</span>
<span class="redacted">retries 3 more times</span>
</div>
<div class="item">
<span class="label">Result</span>
<span class="value failed">MISSION FAILED</span>
</div>
</div>
<p class="declassify-hint">[ hover redacted bars to declassify ]</p>
<p class="conclusion">
Browser automation tools — Claude in Chrome, Playwright MCP, agent-browser,
Stagehand, Cursor's browser mode — all hit the same wall.
<strong>Login forms were designed to stop bots. Your agents are bots.</strong>
</p>
</div>
</section>
<style>
.problem {
padding: 24px var(--pad) 72px;
}
.inner {
max-width: var(--col);
margin: 0 auto;
opacity: 0;
transform: translateY(20px);
transition: opacity 0.8s, transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}
.inner.visible {
opacity: 1;
transform: translateY(0);
}
.section-line {
width: 40px;
height: 1px;
background: var(--paper-border);
margin-bottom: 24px;
}
.exhibit {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.15em;
color: var(--stamp-red);
opacity: 0.6;
margin-bottom: 16px;
}
h2 {
font-family: var(--font-serif);
font-size: clamp(1.6rem, 3.5vw, 2.2rem);
font-weight: 700;
color: var(--ink);
margin-bottom: 12px;
line-height: 1.2;
}
.lead {
font-size: 1rem;
color: var(--ink-light);
margin-bottom: 28px;
line-height: 1.6;
}
.evidence {
display: flex;
flex-direction: column;
margin-bottom: 12px;
border: 1px solid var(--paper-border);
border-radius: 3px;
overflow: hidden;
}
.item {
display: flex;
align-items: center;
gap: 16px;
padding: 9px 16px;
border-bottom: 1px solid var(--paper-dark);
font-size: 14px;
}
.item:last-child {
border-bottom: none;
}
.label {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--ink-muted);
min-width: 55px;
flex-shrink: 0;
}
.redacted {
background: var(--ink);
color: var(--ink);
padding: 1px 6px;
border-radius: 2px;
cursor: pointer;
transition: background 0.3s, color 0.3s;
font-size: 14px;
}
.redacted:hover {
background: transparent;
color: var(--ink-light);
}
.declassify-hint {
font-family: var(--font-mono);
font-size: 11px;
color: var(--ink-faint);
margin-bottom: 24px;
letter-spacing: 0.02em;
}
.redirect {
font-family: var(--font-mono);
color: var(--highlight);
font-size: 13px;
}
.failed {
font-family: var(--font-mono);
font-weight: 700;
color: var(--stamp-red);
font-size: 13px;
letter-spacing: 0.05em;
}
.conclusion {
font-size: 0.95rem;
color: var(--ink-muted);
line-height: 1.7;
}
.conclusion strong {
color: var(--ink);
}
@media (max-width: 680px) {
.item {
flex-direction: column;
gap: 4px;
align-items: flex-start;
}
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let visible = $state(false);
let el: HTMLElement;
onMount(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
visible = true;
observer.disconnect();
}
},
{ threshold: 0.2 }
);
observer.observe(el);
return () => observer.disconnect();
});
</script>
<section class="stacks" bind:this={el}>
<div class="inner" class:visible>
<div class="section-line"></div>
<div class="exhibit">KNOWN TARGETS</div>
<h2>Compatibility</h2>
<p class="body">
Works with <strong>Node.js, Python, Ruby, Go</strong> and any web framework — Next.js, Django, Rails, Flask, FastAPI, Express, SvelteKit.
Supports <strong>NextAuth, Clerk, Supabase, Firebase, Auth0, Passport, Devise</strong>, and custom auth.
Detects <strong>Claude in Chrome, Playwright MCP, Chrome DevTools MCP, agent-browser, Stagehand, Puppeteer, Cypress, Selenium</strong>.
</p>
</div>
</section>
<style>
.stacks {
padding: 48px var(--pad) 48px;
}
.inner {
max-width: var(--col);
margin: 0 auto;
opacity: 0;
transform: translateY(16px);
transition: opacity 0.6s, transform 0.6s;
}
.inner.visible {
opacity: 1;
transform: translateY(0);
}
.section-line {
width: 40px;
height: 1px;
background: var(--paper-border);
margin-bottom: 24px;
}
.exhibit {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.15em;
color: var(--stamp-red);
opacity: 0.6;
margin-bottom: 16px;
}
h2 {
font-family: var(--font-serif);
font-size: clamp(1.6rem, 3.5vw, 2.2rem);
color: var(--ink);
margin-bottom: 12px;
}
.body {
font-size: 0.95rem;
color: var(--ink-muted);
line-height: 1.8;
max-width: 620px;
}
.body strong {
color: var(--ink);
font-weight: 500;
}
</style>
<script lang="ts">
import { onMount } from 'svelte';
let visible = $state(false);
let currentLine = $state(0);
let burnPhase = $state(false);
let flashPhase = $state(false);
let el: HTMLElement;
let scrollContainer: HTMLElement;
interface Line {
text: string;
cls: string;
delay: number;
}
const lines: Line[] = [
{ text: '$ /burn-after-login', cls: 'cmd', delay: 400 },
{ text: '', cls: 'blank', delay: 200 },
{ text: '🔍 Scanning codebase...', cls: 'cyan', delay: 600 },
{ text: '', cls: 'blank', delay: 100 },
{ text: ' ✓ Development mode: NODE_ENV detected', cls: 'ok', delay: 300 },
{ text: ' ✓ Auth system: NextAuth v5 (session-based)', cls: 'ok', delay: 300 },
{ text: ' ✓ Test users: demo@test.com (admin), viewer@test.com (viewer)', cls: 'ok', delay: 300 },
{ text: ' ✓ Browser tools: Claude in Chrome, Playwright MCP', cls: 'ok', delay: 400 },
{ text: '', cls: 'blank', delay: 200 },
{ text: '📝 Creating dev auth shortcuts...', cls: 'cyan', delay: 500 },
{ text: '', cls: 'blank', delay: 100 },
{ text: ' ✓ Created app/api/dev-login/route.ts', cls: 'ok', delay: 250 },
{ text: ' → GET /dev-login?email=...&password=...', cls: 'dim', delay: 150 },
{ text: ' → Returns 404 in production', cls: 'dim', delay: 150 },
{ text: ' ✓ Updated CLAUDE.md — added "Dev Authentication" section', cls: 'ok', delay: 250 },
{ text: ' ✓ Updated AGENTS.md — added browser auth examples', cls: 'ok', delay: 250 },
{ text: '', cls: 'blank', delay: 300 },
{ text: '────────────────────────────────────────', cls: 'dim', delay: 100 },
{ text: ' Mission complete. All shortcuts operational.', cls: 'done', delay: 500 },
{ text: '────────────────────────────────────────', cls: 'dim', delay: 100 },
{ text: '', cls: 'blank', delay: 400 },
{ text: ' This skill has served its purpose.', cls: 'text', delay: 400 },
{ text: ' Self-destruct? (y/n) y', cls: 'cmd-y', delay: 800 },
{ text: '', cls: 'blank', delay: 400 },
{ text: ' 💥 3...', cls: 'countdown', delay: 700 },
{ text: ' 💥 2...', cls: 'countdown', delay: 700 },
{ text: ' 💥 1...', cls: 'countdown', delay: 700 },
{ text: '', cls: 'blank', delay: 200 },
{ text: ' burn-after-login has been removed.', cls: 'removed', delay: 300 },
{ text: ' Your dev auth shortcuts remain intact.', cls: 'text', delay: 200 },
{ text: ' Good luck out there, agent.', cls: 'final', delay: 0 },
];
function playAnimation() {
currentLine = 0;
burnPhase = false;
flashPhase = false;
let lineIndex = 0;
function showNext() {
if (lineIndex >= lines.length) {
setTimeout(playAnimation, 6000);
return;
}
currentLine = lineIndex + 1;
const line = lines[lineIndex];
if (line.cls === 'removed' && !flashPhase) {
flashPhase = true;
burnPhase = true;
setTimeout(() => { flashPhase = false; }, 300);
}
if (scrollContainer) {
requestAnimationFrame(() => {
scrollContainer.scrollTop = scrollContainer.scrollHeight;
});
}
lineIndex++;
setTimeout(showNext, lines[lineIndex - 1].delay);
}
showNext();
}
onMount(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting && !visible) {
visible = true;
observer.disconnect();
setTimeout(playAnimation, 400);
}
},
{ threshold: 0.2 }
);
observer.observe(el);
return () => observer.disconnect();
});
</script>
<section class="terminal-section" bind:this={el}>
<div class="inner">
<div class="section-line"></div>
<div class="exhibit">INTERCEPTED TRANSMISSION</div>
<h2>Field Test</h2>
<p class="lead">Watch the skill in action.</p>
<div class="terminal-window" class:burn={burnPhase}>
<div class="title-bar">
<div class="dots">
<span class="dot red"></span>
<span class="dot yellow"></span>
<span class="dot green"></span>
</div>
<span class="title">burn-after-login</span>
</div>
<div class="terminal-body" bind:this={scrollContainer}>
<div class="flash" class:active={flashPhase}></div>
<div class="scanlines"></div>
{#each lines.slice(0, currentLine) as line}
<div class="line {line.cls}">
{#if line.text === ''}
{:else}
{line.text}
{/if}
</div>
{/each}
{#if currentLine > 0 && currentLine < lines.length}
<span class="cursor-block">█</span>
{/if}
</div>
</div>
</div>
</section>
<style>
.terminal-section {
padding: 48px var(--pad) 72px;
}
.inner {
max-width: var(--col);
margin: 0 auto;
}
.section-line {
width: 40px;
height: 1px;
background: var(--paper-border);
margin-bottom: 24px;
}
.exhibit {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.15em;
color: var(--stamp-red);
opacity: 0.6;
margin-bottom: 16px;
}
h2 {
font-family: var(--font-serif);
font-size: clamp(1.6rem, 3.5vw, 2.2rem);
color: var(--ink);
margin-bottom: 8px;
}
.lead {
font-size: 1rem;
color: var(--ink-muted);
margin-bottom: 28px;
}
.terminal-window {
background: var(--terminal-bg);
border-radius: 8px;
overflow: hidden;
box-shadow:
0 4px 20px rgba(0, 0, 0, 0.15),
0 0 0 1px rgba(0, 0, 0, 0.08);
transition: box-shadow 0.5s;
}
.terminal-window.burn {
box-shadow:
0 4px 20px rgba(0, 0, 0, 0.15),
0 0 0 1px rgba(0, 0, 0, 0.08),
0 0 40px rgba(185, 28, 28, 0.15);
}
.title-bar {
display: flex;
align-items: center;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.03);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.dots {
display: flex;
gap: 6px;
margin-right: 16px;
}
.dots .dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.dots .red { background: #ff5f57; }
.dots .yellow { background: #febc2e; }
.dots .green { background: #28c840; }
.title {
font-family: var(--font-mono);
font-size: 11px;
color: var(--terminal-muted);
}
.terminal-body {
position: relative;
padding: 16px 20px;
min-height: 360px;
max-height: 440px;
overflow-y: auto;
font-family: var(--font-mono);
font-size: 12.5px;
line-height: 1.7;
scrollbar-width: none;
}
.terminal-body::-webkit-scrollbar {
display: none;
}
.flash {
position: absolute;
inset: 0;
background: white;
opacity: 0;
pointer-events: none;
z-index: 10;
transition: opacity 0.3s;
}
.flash.active {
opacity: 0.12;
}
.scanlines {
position: absolute;
inset: 0;
pointer-events: none;
background: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 2px,
rgba(0, 0, 0, 0.04) 2px,
rgba(0, 0, 0, 0.04) 4px
);
z-index: 5;
}
.line {
animation: lineIn 0.12s ease-out;
white-space: pre-wrap;
word-break: break-all;
}
@keyframes lineIn {
from { opacity: 0; transform: translateY(2px); }
to { opacity: 1; transform: translateY(0); }
}
.cmd { color: #f5f5f5; }
.cmd-y { color: #f5f5f5; }
.cyan { color: #78c8de; }
.ok { color: #7ee68a; }
.dim { color: var(--terminal-muted); }
.text { color: #a8a29e; }
.done { color: #7ee68a; font-weight: 700; }
.countdown { color: #f59e0b; font-weight: 700; font-size: 13px; }
.removed { color: #ef4444; }
.final { color: #f59e0b; font-style: italic; }
.cursor-block {
color: #f59e0b;
animation: blockBlink 0.8s steps(1) infinite;
}
@keyframes blockBlink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
@media (max-width: 680px) {
.terminal-body {
padding: 14px;
font-size: 11px;
min-height: 300px;
}
}
</style>
// place files you want to import through the `$lib` alias in this folder.
<script>
import '../app.css';
let { children } = $props();
</script>
{@render children()}
export const prerender = true;
<script>
import Nav from '$lib/components/Nav.svelte';
import Hero from '$lib/components/Hero.svelte';
import Problem from '$lib/components/Problem.svelte';
import Operation from '$lib/components/Operation.svelte';
import Terminal from '$lib/components/Terminal.svelte';
import Stacks from '$lib/components/Stacks.svelte';
import Install from '$lib/components/Install.svelte';
import Footer from '$lib/components/Footer.svelte';
</script>
<Nav />
<Hero />
<Problem />
<Operation />
<Terminal />
<Stacks />
<Install />
<Footer />
# allow crawling everything by default
User-agent: *
Disallow:
import adapter from '@sveltejs/adapter-static';
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: undefined,
precompress: false,
strict: true
})
}
};
export default config;
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"rewriteRelativeImportExtensions": true,
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
//
// To make changes to top-level options such as include and exclude, we recommend extending
// the generated config; see https://svelte.dev/docs/kit/configuration#typescript
}
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [sveltekit()]
});