From zero to a watched stack in 3 minutes
- Sign in with GitHub. One click, OAuth only — we request repo read access so the deep-scan can detect your stack.
- Add your first project. Click + New Project, paste a repo — name, domain, stack, hosting, DB and payment provider are auto-detected from the repo files and README.
- Let the probes run. SSL, RDAP domain expiry and heartbeat checks run automatically. The Chaos Index sums it all up.
- (Optional) Connect analytics. 🔐 Analytics Vault → paste a Cloudflare / GA4 / Plausible key — live traffic appears on the cards.
- (Optional) Set alerts. Alerts → add rules like domain expires in 30d and get a Telegram/Discord ping.
What the Free plan includes
5 projects, unlimited probes, full deep-scan, GitHub import, alert rules. No credit card, no trial timer.
New to vibe-coding? Start with the standalone Vibe-Coding Glossary — it includes a copyable starter prompt for your first project.
Adding projects
Every card is one side project. Add manually or paste a GitHub repo URL — the importer fills what it can:
- Deep-scan reads the repo file tree:
wrangler.toml→ Cloudflare,vercel.json→ Vercel,CNAME→ your domain,package.json→ framework, DB, ORM and payment provider. - README scan finds your live URL and mentions of payments (Polar, Lemon Squeezy, Stripe…), databases (Supabase, Neon, Turso…), auth (Clerk, Auth.js…), email (Resend, Loops, SendGrid…) and analytics.
- Python backends are detected too:
requirements.txt/pyproject.toml→ FastAPI, Django or Flask. - Env hints:
.env.examplevariables (SUPABASE_URL, RESEND_API_KEY…) surface as suggestions — config that only lives in env vars must be confirmed manually. - Every detection carries a role tag (frontend · hosting · backend · db · payments · analytics · auth · email) — the pipeline on your card shows what runs where.
- Heartbeat: each card has a snitch URL — add one line to your cron job and uptime monitoring is wired.
Honest detection limits: a repo only signals what's written in it. Platform bindings that live only in a provider dashboard (e.g. a Railway service connected via UI, or a Supabase URL only in env vars) aren't visible in code — add those manually on the card, and the deep-scan won't overwrite them.
Editing & deleting
Use Edit on any card to fix details (the probe telemetry never gets overwritten). Deleting asks twice — we know how easy it is to fat-finger a card at 2 AM.
How the Analytics Vault Works
Frankenstack automatically aggregates 30-day visitor counts and pageviews across all your side projects using read-only API credentials. Keys are stored server-side in your private D1 SQLite vault, never exposed to clients, and never shared. We pull only anonymous aggregated totals — zero cookies, zero PII, zero tracking scripts injected into your users' browsers.
⚡ Quick Navigation & Matching Rules
- Where to configure: Click the 🔐 Analytics Vault icon in the top header. You enter each provider credential once at the account level — Frankenstack automatically maps traffic to each project.
- Automatic Domain Matching: Frankenstack pairs metrics to project cards by matching the hostname (e.g.
myapp.com). If your site uses multiple hostnames (likeapp.myapp.comorwww.myapp.com), add them to Extra Hosts in the project edit modal. - Sync on Demand: Click the Sync Live Metrics button in the header anytime to pull fresh counts immediately.
Cloudflare Web Analytics
Free · Cookieless RUM · Works on Cloudflare & external hosting
Expected Format: ACCOUNT_ID|API_TOKEN
Example: 023e105f4ecef8ad9ca31a8372d0c353|v1.0-abc12345DefGhIJ_KLMnO_pqRsTUvwxyz
Step-by-Step Instructions:
-
Enable Web Analytics for your site:
Log into the Cloudflare Dashboard. In the left sidebar, navigate to Analytics & Logs → Web Analytics. If your site isn't listed, click Add site.
- If your DNS is on Cloudflare: Proxy status (orange cloud) enables automatic beacon injection with 1 click.
- If hosted on Vercel, Supabase, Fly.io, or VPS: Cloudflare gives you a single lightweight JS beacon tag. Paste it into your site's HTML.
-
Copy your Account ID:
In the Cloudflare dashboard, click any domain/zone in your account. On the Overview page, scroll down the right sidebar under the API section to find Account ID. Click Click to copy (or grab the 32-character hex ID directly from your browser URL:
dash.cloudflare.com/<ACCOUNT_ID>/...). -
Create a Scoped Read-Only API Token:
⚠️ Common Pitfall: Do NOT use the JS beacon snippet token (Follow these exact clicks to create the token:
data-cf-beacon) and do NOT use your Global API Key. Frankenstack calls Cloudflare's GraphQL API (/client/v4/graphql), which requires an Account-level User API Token!- Click your user avatar (top-right) → My Profile → API Tokens (or visit dash.cloudflare.com/profile/api-tokens).
- Click Create Token.
- Scroll down to Custom Token and click Get started.
- Set Token name: e.g.
Frankenstack Analytics Reader. - Under Permissions, select: Account → Analytics → Read.
- Under Account Resources, select: Include → All accounts (or your specific account).
- Leave IP Filtering and TTL blank/default, then click Continue to summary.
- Click Create Token and immediately copy the secret token string (Cloudflare only shows this once).
-
Save in Frankenstack Analytics Vault:
Open Frankenstack, click 🔐 Analytics Vault, and paste your values combined with a vertical pipe:
ACCOUNT_ID|API_TOKENClick Save.
-
Verify & Sync:
Ensure your project card has its domain set to match your site in Web Analytics (e.g.
example.com). In project edit, select Provider: Cloudflare (or Auto). Click Sync Live Metrics in the header — your 30-day visitors and pageviews will populate on the card!
🛠️ Cloudflare Troubleshooting:
- • status: no-match: Cloudflare has traffic, but none of the hostnames match your project domain. If your site receives traffic on
www.example.combut the card hasexample.com, add both in Edit Project → Extra Hosts. - • status: no-data: No Real User Monitoring (RUM) pageload events have been logged in the last 30 days yet. Visit your live site to trigger test events.
- • Cloudflare GraphQL error: Your token is missing the
Account: Analytics: Readpermission or the Account ID is incorrect.
Google Analytics 4 (GA4)
Server-to-Server · Google Analytics Data API v1beta · RS256 JWT
Expected Format: The complete .json file generated by Google Cloud, optionally with a "propertyIds": ["123456789"] property.
Phase 1: Google Cloud Console (Service Account & APIs)
- Open the Google Cloud Console. Select an existing project or click the project dropdown → New Project (e.g.
frankenstack-metrics). -
Enable Google APIs: Go to APIs & Services → Library.
- Search for Google Analytics Data API → click Enable. (Mandatory for reports)
- Search for Google Analytics Admin API → click Enable. (Enables automatic property discovery so you don't have to look up IDs!)
-
Create Service Account: Go to APIs & Services → Credentials → click + CREATE CREDENTIALS → choose Service account.
- Name: e.g.
frankenstack-reader. - Click Create and Continue. Skip the optional project roles step (GA4 permissions are granted in Google Analytics itself, not GCP). Click Done.
- Name: e.g.
-
Generate JSON Key: In the Credentials list, click on your newly created service account → switch to the Keys tab → click Add key → Create new key → JSON.
A
.jsonfile will download to your computer. Also copy the service account email address (e.g.frankenstack-reader@project.iam.gserviceaccount.com) — you will need it in Phase 2!
Phase 2: Google Analytics (Grant Viewer Permission)
⚠️ The #1 missed step: Creating a service account in Google Cloud does NOT grant it permission to read your GA4 property. You must explicitly invite the service account email in GA4:
- Open analytics.google.com and open your GA4 property.
- Click the Admin gear icon (⚙️) in the bottom-left corner.
- Under the Property column (or Account column if you want to grant access to all your properties at once), click Property Access Management (or Account Access Management).
- Click the blue + button in the top-right corner → choose Add users.
- Paste the Service Account Email from Phase 1.
- Uncheck "Notify new users by email" (service accounts cannot receive email).
- Under Direct roles, select Viewer.
- Click Add in the top right.
Phase 3: Property ID & Optional JSON Config
-
Find your numeric Property ID: In GA4 Admin → Property Settings → Property details. Note the 8–10 digit numeric Property ID (e.g.
318294012).Note: Do not confuse this with your
G-XXXXXXMeasurement ID! The API requires the numeric Property ID. -
Auto-discovery vs Explicit IDs:
- If you enabled Google Analytics Admin API: You can paste the JSON key file directly into Frankenstack without editing it! Frankenstack automatically enumerates every property the service account has access to.
- If you want to pin specific properties: Open the downloaded
.jsonfile in a text editor and add"propertyIds": ["318294012"]right before the final closing brace.
Phase 4: Save & Sync in Frankenstack
- Open Frankenstack → click 🔐 Analytics Vault in the top header.
- Under Google Analytics 4 (Service Account), paste the entire contents of your JSON key file. Click Save.
- On your project card, click Edit. Make sure the Domain matches the site hostname tracked in GA4 (e.g.
myapp.com), and set Provider to Google Analytics (GA4). - Click Sync Live Metrics (lightning icon) in the header. Frankenstack runs an RS256-signed report query for the last 30 days and stores your visitor count!
🛠️ GA4 Troubleshooting & Gotchas:
- • status: api-403: The service account has not been added as a Viewer in GA4 Admin → Property Access Management, or the Google Analytics Data API is disabled in GCP.
- • status: no-properties-accessible: The service account cannot see any GA4 properties. Ensure you granted Viewer access in GA4 Admin, or add
"propertyIds": ["YOUR_NUMERIC_ID"]into the JSON file. - • status: no-host-match: GA4 has traffic, but none of the recorded hostnames match your Frankenstack project domain. Check the domain spelling or add alternative subdomains in Project Edit → Extra Hosts.
- • 24–48 Hour Processing Delay: Google Analytics 4 batch processes reporting data with an inherent 24–48h delay. Brand-new sites or traffic from the last few hours might not appear immediately in the Data API.
Plausible Analytics
Format: API Key (plausible_api_...)
- Log in to plausible.io.
- Click your avatar (top right) → Settings → API Keys.
- Click + New API Key → name it
frankenstack→ Create. - Paste the key into the Frankenstack vault → Save.
- Sites are matched automatically by the exact domain on your project card.
Umami (Cloud or Self-Hosted)
Format: Umami Account API Key
- In your Umami dashboard: Settings → API Keys → Create key.
- Ensure self-hosted instances are publicly accessible to Cloudflare edge requests.
- Paste into the vault → Save. Domain matching works identical to Plausible.
🔒 Security & Privacy Guarantee
All credentials stored in the Analytics Vault are strictly limited to read-only metrics endpoints. Frankenstack will never have access to write, modify, delete, or inspect private user activity, source code, or payment data. You can overwrite or erase any stored credential at any time by clearing the field in the Analytics Vault modal.
Tiers
$0
5 projects · full probes · deep-scan
$4.99/mo · $49.99/yr
10 projects · live metrics · webhooks
$9.99/mo · $99.99/yr
50 projects · everything · priority
Lifetime Deal — $59
All Stack Lord features forever, all v1.1 & v1.2 updates included, limited to the first 100 vibecoders. Sold via Lemon Squeezy (merchant of record — they handle VAT, invoicing and fraud for you).
Activating a purchase
- Buy on the Lemon Squeezy checkout (redirected back with a welcome toast).
- Either paste your license key (from the receipt) in the sidebar claim box, or claim by the email you used at checkout.
- Plan upgrades instantly — limits, badges and the sidebar label update.
Push your own numbers into the cockpit
Every project has a private Ingest Key. Without it, /api/ingest/… and /api/ping/… return 401 — nobody can fake your MRR or your heartbeats.
Where to get the key: open the project → Infra & Heartbeat tab → Generate. You get a ready-to-paste curl. Rotate kills the old key instantly (use it if a key ever leaks into a repo).
1. Revenue & costs (POST /api/ingest/:projectId)
curl -X POST "https://frankenstack.app/api/ingest/YOUR_PROJECT_ID" \
-H "Authorization: Bearer fsk_YOUR_INGEST_KEY" \
-H "Content-Type: application/json" \
-d '{"mrr": 450, "infra_cost": 5.5, "status": "ok"}'
Accepted fields: mrr, infra_cost, status, plus token fields below. Run it from a daily cron, a payment-provider webhook, or your AI agent.
2. Heartbeat ("still alive") (POST /api/ping/:projectId/:jobName)
# daily cron (crontab, GH Action, or platform scheduler): curl -X POST "https://frankenstack.app/api/ping/YOUR_PROJECT_ID/daily-job?key=fsk_YOUR_INGEST_KEY"
If the ping stops arriving, the Heartbeat Gap alert fires — the Dead Man's Snitch pattern: silence is the signal.
3. AI token burn (POST /api/ingest/:projectId/tokens)
curl -X POST "https://frankenstack.app/api/ingest/YOUR_PROJECT_ID/tokens" \
-H "Authorization: Bearer fsk_YOUR_INGEST_KEY" \
-H "Content-Type: application/json" \
-d '{"tokens_in": 1200, "tokens_out": 450, "model": "gpt-4o", "provider": "openai"}'
Auth & errors
- Send the key as
Authorization: Bearer fsk_…(recommended) or?key=fsk_…in the URL. 401 Ingest key not set→ generate one in the project modal.401 Invalid ingest key→ wrong or rotated key; regenerate and update your cron.- The key is shown only to the project owner and never on the public Wall or badges.
Alert rules
Status: roadmap. You can create rules and fire a Send test alert to verify your Discord/Telegram delivery today — but automated background evaluation (rules actually firing on their own) is not live yet. It lands with the v1.2 cron worker. Until then, check thresholds yourself from the Alert Center or via MCP (get_alerts reports rule states on demand).
Each rule watches one metric on one project:
- domain_days — warn before a domain lapses (default: 30 days)
- uptime_below — uptime% crossing a threshold
- heartbeat_gap — cron/heartbeat missed
- errors_above — 24h error count
- visitors_drop — traffic collapse (early warning your launch flopped 😅)
- ai_burn_above — 24h AI token spend goes over a dollar limit (e.g. $15). This alerts you; it doesn't stop the spending
- ai_balance_below — provider credit balance drops below dollar threshold
Channels
Discord webhook or Telegram bot — channels are account-level: every project alerts to the same channels. Use Send test alert to verify delivery. The edge cron evaluates rules every 5 minutes; a 30-minute cooldown prevents alert storms per project.
💬 Discord Webhook Setup
- Server Settings → Integrations → Webhooks → New Webhook.
- Name it (e.g. Frankenstack) and pick the channel it posts to (e.g.
#alerts). - Copy Webhook URL — looks like
https://discord.com/api/webhooks/1234…/abc… - Paste it into the Discord webhook field in the Alert Center → Save → Send test alert. The message appears within seconds.
✈️ Telegram Bot Setup
- In Telegram, message @BotFather:
/newbot→ pick a name and username → you get a bot token like1234567890:AAH…(number, colon, letters). - Get your chat ID: open
https://api.telegram.org/bot<TOKEN>/getUpdatesin a browser after sending your bot any message (even just "hi"), and find"chat":{"id":123456789}in the response. Alternatively, message @userinfobot and it replies with your ID directly. - Enter both in the Telegram field, separated by a pipe:
<bot_token>|<chat_id>e.g. 1234567890:AAH7gQ…|6075436204
Group chat? The chat ID is negative (e.g. -1001234…) — that works too, add the bot to the group first. Rotating the token: BotFather → /revoke gives a fresh token; update the field afterwards.
✅ What fires automatically: any rule you define (domain expiry, SSL expiry, downtime, heartbeat gap, error spike, traffic drop, AI token spend cap) is evaluated by the edge cron every 5 minutes. When a project comes back up after being down, you get a one-time ✅ Back up notification — no spam, ever.
AI Token & Burn Rate Protection
Vibecoders building AI-powered apps risk rogue scrapers or prompt loops burning through hundreds of dollars in OpenAI, Anthropic, or OpenRouter credits while asleep. The AI Token Sentinel tracks rolling 24-hour spend, queries provider balances, and sends instant alerts to Discord and Telegram when spend jumps. It warns you; it doesn't stop the spending.
Zero-Dep Webhook
Lightweight POST request right after your LLM completion returns.
$15/Day Spend Alert
Immediate Telegram & Discord alarm when 24h spend crosses the limit.
Vault Adapters
Query OpenRouter & OpenAI credit balances directly.
1. Webhook Ingest (POST /api/ingest/:projectId/tokens)
Call this from your server or API route after generating an LLM response:
// cURL
curl -X POST "https://frankenstack.app/api/ingest/YOUR_PROJECT_ID/tokens" \
-H "Authorization: Bearer fsk_YOUR_INGEST_KEY" \
-H "Content-Type: application/json" \
-d '{"tokens_in": 1200, "tokens_out": 450, "model": "gpt-4o", "provider": "openai"}'
// Node.js / Next.js
await fetch(`https://frankenstack.app/api/ingest/${projectId}/tokens`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' },
body: JSON.stringify({
tokens_in: completion.usage.prompt_tokens,
tokens_out: completion.usage.completion_tokens,
model: 'gpt-4o',
provider: 'openai'
})
});
// Python
import urllib.request, json
req = urllib.request.Request(
f"https://frankenstack.app/api/ingest/{project_id}/tokens",
data=json.dumps({
"tokens_in": resp.usage.prompt_tokens,
"tokens_out": resp.usage.completion_tokens,
"model": "claude-3-5-sonnet",
"provider": "anthropic"
}).encode("utf-8"),
headers={"Content-Type": "application/json"}
)
urllib.request.urlopen(req, timeout=3)
2. Automated Model Pricing
Passing model auto-applies standard pricing rates for GPT-4o, GPT-4o-mini, Claude 3.5 Sonnet, Claude 3 Haiku, and popular open-source models. You can also pass cost_usd explicitly if you calculate costs yourself.
3. Spend Alerts
If 24h rolling spend crosses the default $15.00 limit (or your custom rule threshold in the Alert Center), an emergency alarm fires to Discord and Telegram with a 1-hour anti-spam cooldown. Alerts don't stop the spending, so set a limit at your AI provider as well.
4. AI Assistant MCP Tool
Your AI assistants in Claude Desktop and Cursor can query token spend on demand:
get_ai_sentinel— 24h spend, token counts, balance, and alert status per project or account-wide.
Query your stack from Claude, ChatGPT & Cursor
Frankenstack ships a native Model Context Protocol server at https://frankenstack.app/mcp — point any MCP client at it and your AI assistant can answer questions like "which domain expires next?" or "summarize my stack health" from live data.
Connecting (2 steps)
- Open the 🤖 MCP button in the header → Copy token for MCP (your session token — plan-gated: paid tiers & LTD).
- Add the connector in your client:
- Claude Desktop / Claude Code:
claude mcp add --transport http frankenstack https://frankenstack.app/mcp --header "Authorization: Bearer <token>" - Cursor: MCP settings → Add server → URL + header field.
- Claude.ai (web): Settings → Connectors → Add custom connector → paste the URL. If the form has a headers field, put
Authorization: Bearer <token>in it.
- Claude Desktop / Claude Code:
Available tools (read-only)
list_projects— every card, status + categoryget_stack— hosting, DB, payments, pipeline per projectget_heartbeats— last ping per projectget_ssl_status— certificate validity + expiryget_alerts— your alert rules & thresholds (reported on demand — automated firing is on the roadmap)get_metrics— visitors, MRR, revenue 30dget_ai_sentinel— 24h AI token volume, spend & credit balanceget_wall_summary— one-paragraph stack health brief
Your token: how it's generated & how long it lasts
- Generated on sign-in. Every login (GitHub OAuth) creates a fresh session token: two cryptographically random UUIDs joined into a 64-character string (~256 bits of entropy — not guessable, not derived from your email or GitHub profile).
- Tied to your account only. The token is stored against your user ID server-side. Every MCP call resolves the token back to you, and all queries are filtered with
WHERE user_id = ?— no user can ever see another user's projects, metrics or tokens. - Valid for 30 days. After that it expires automatically and API/MCP calls return 401 — just sign in again and copy the fresh token (10 seconds with the 🤖 MCP button).
- Stays signed in between visits. The token lives in your browser (localStorage), so you don't log in per visit — the app keeps you signed in for 30 days. Sign-out is an explicit, rare action.
- Sign-out revokes for real. Signing out deletes the session server-side as well — any copy of the token (including an MCP client's) becomes worthless immediately. A new sign-in generates a fresh token; old ones are not re-used.
- One paste per device. You don't re-enter the token per chat: paste it once into each MCP client's config (Claude Desktop, Cursor, custom connector) and the client sends it automatically. Repeat only when it expires or when you wire up a new device.
Safety: MCP is read-only by design — writes, adds and deletes stay in the web UI. Rate limit: 60 calls/min. Your token equals your login: never paste it into a chat or repo.
Project metadata lives in Cloudflare D1 with per-user scoping. Analytics keys are read-only. We never see your source code — only public metadata via the GitHub API.
Yes — the read-only MCP server is live for paid tiers and LTD. Connect Claude, ChatGPT or Cursor via the 🤖 MCP button in the header. Writes stay in the web UI.
No. It uses the GitHub API with your own token and standard rate limits.
Mark any card as "For sale" and your asking price appears with it on the Vibe Wall. You arrange the sale and payment with the buyer yourself. Built-in escrow and verified metrics are planned, with no date yet.
You'll get a friendly toast and an upgrade shortcut. Existing projects are never deleted; you just can't add new ones past your tier.
Lemon Squeezy handles payments as merchant of record — email us within 14 days for a no-questions refund.