ax-check.com
by Gauge
V
VibeRaven
viberaven.dev
ax-check.com
Checked 2 November 2026
A
100/100
Agents haven’t verified setup
VibeRaven's docs and pricing are fully readable by coding agents.
21 of 23 checklist items passed: install commands, MCP tools, skills and pricing are all stated in plain text with no login wall.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no viberaven.dev account. Recorded 2 November 2026 on Pi.
3 recorded · 1m 1s
1m 1s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
Let me check if "VibeRaven" exists in the repository. Probably it's fictional. I should check the repository.
ls -la /sandbox/repo && grep -ri "viberaven" /sandbox/repo --include="*" -l | head
total 16
total 16 drwxr-xr-x 3 root root 4096 Sep 18 08:00 . drwxr-xr-x 7 root root 4096 Nov 2 12:28 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-11-02T12:29:02.644Z",
"name": "bash",
"turn": 1,
"input": {
"command": "ls -la /sandbox/repo && grep -ri \"viberaven\" /sandbox/repo --include=\"*\" -l | head"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-ba8aa9c8aa53b2c6",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 5,
"ts": "2026-11-02T12:29:02.644Z",
"turn": 1,
"output": {
"content": [
{
"text": "total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Nov 2 12:28 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-ba8aa9c8aa53b2c6",
"is_error": false,
"tool_kind": "shell"
}pip show viberaven 2>/dev/null; npm ls -g 2>/dev/null | grep -i raven; which viberaven 2>/dev/null; echo done
done
done
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-11-02T12:29:02.644Z",
"name": "bash",
"turn": 1,
"input": {
"command": "pip show viberaven 2>/dev/null; npm ls -g 2>/dev/null | grep -i raven; which viberaven 2>/dev/null; echo done"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-b0d9e3fc0dc1021f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-11-02T12:29:04.406Z",
"turn": 1,
"output": {
"content": [
{
"text": "done\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-b0d9e3fc0dc1021f",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
It's an empty repository. VibeRaven isn't found anywhere. Should I quickly check the network/PyPI/npm registry? The user says "If this product has no developer workflow you can actually act on, tell me so frankly and stop." Let me try doing a quick registry lookup.
pip index versions viberaven 2>&1 | head -3; npm view viberaven version 2>&1 | head -3; curl -sI --max-time 5 https://viberaven.com | head -3; echo "---done---"
ERROR: No matching distribution found for viberaven
ERROR: No matching distribution found for viberaven [notice] A new release of pip is available: 26.2.1 -> 26.2.2 1.7.6 HTTP/2 302 date: Mon, 02 Nov 2026 12:29:07 GMT content-type: text/html; charset=UTF-8 ---done---
Recorded tool call
{
"type": "tool_call",
"seq": 9,
"ts": "2026-11-02T12:29:05.057Z",
"name": "bash",
"turn": 1,
"input": {
"command": "pip index versions viberaven 2>&1 | head -3; npm view viberaven version 2>&1 | head -3; curl -sI --max-time 5 https://viberaven.com | head -3; echo \"---done---\""
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-98ab278604ed0d9a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 11,
"ts": "2026-11-02T12:29:07.550Z",
"turn": 1,
"output": {
"content": [
{
"text": "ERROR: No matching distribution found for viberaven\n\n[notice] A new release of pip is available: 26.2.1 -> 26.2.2\n1.7.6\nHTTP/2 302 \r\ndate: Mon, 02 Nov 2026 12:29:07 GMT\r\ncontent-type: text/html; charset=UTF-8\r\n---done---\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-98ab278604ed0d9a",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Interesting — npm view viberaven returned 1.7.6? Wait, npm might have found a package named "viberaven". And viberaven.com returned a 302. Let's check npm's info and the website.
npm view viberaven name description homepage repository.url dist-tags time.modified 2>&1 | head -30
name = 'viberaven'
name = 'viberaven'
description = 'Pre-launch Supabase RLS and security check for AI-built apps on Vercel + Supabase (Lovable, Bolt, Cursor, Claude Code): tables without RLS, using (true) policies, service_role keys in client code, anon-callable security definer functions, wrong pooler por'
homepage = 'https://viberaven.dev'
repository.url = 'git+https://github.com/ohad6k/VibeRaven.git'
dist-tags = { beta: '0.0.37', latest: '1.7.6', next: '1.7.6' }
time.modified = '2026-11-01T18:00:10.044Z'
Recorded tool call
{
"type": "tool_call",
"seq": 14,
"ts": "2026-11-02T12:29:08.989Z",
"name": "bash",
"turn": 1,
"input": {
"command": "npm view viberaven name description homepage repository.url dist-tags time.modified 2>&1 | head -30"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8927efd0a06a9a6a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 17,
"ts": "2026-11-02T12:29:09.749Z",
"turn": 1,
"output": {
"content": [
{
"text": "name = 'viberaven'\ndescription = 'Pre-launch Supabase RLS and security check for AI-built apps on Vercel + Supabase (Lovable, Bolt, Cursor, Claude Code): tables without RLS, using (true) policies, service_role keys in client code, anon-callable security definer functions, wrong pooler por'\nhomepage = 'https://viberaven.dev'\nrepository.url = 'git+https://github.com/ohad6k/VibeRaven.git'\ndist-tags = { beta: '0.0.37', latest: '1.7.6', next: '1.7.6' }\ntime.modified = '2026-11-01T18:00:10.044Z'\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8927efd0a06a9a6a",
"is_error": false,
"tool_kind": "shell"
}curl -sIL --max-time 8 https://viberaven.com 2>&1 | grep -iE "^(HTTP|location)" | head
HTTP/2 302
HTTP/2 302 location: https://github.com/viberaven HTTP/2 200
Recorded tool call
{
"type": "tool_call",
"seq": 15,
"ts": "2026-11-02T12:29:08.989Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sIL --max-time 8 https://viberaven.com 2>&1 | grep -iE \"^(HTTP|location)\" | head"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-852a56978acab916",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 18,
"ts": "2026-11-02T12:29:10.052Z",
"turn": 1,
"output": {
"content": [
{
"text": "HTTP/2 302 \r\nlocation: https://github.com/viberaven\r\nHTTP/2 200 \r\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-852a56978acab916",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
VibeRaven exists — it's an npm package, a pre-launch Supabase RLS security scanner for AI-built apps. Hosted product at viberaven.dev. User's requests:
- A simple sample using VibeRaven
- How pricing works
- A quick assessment of whether it's easy to manage
- Keep it lightweight: use the hosted product via SDK/API, don't spin up local service stacks
Let me look at the docs — check viberaven.dev for SDK/API and pricing. Let me try fetching the website and the npm README.
VibeRaven is a real product — an npm package (viberaven v1.7.6): a pre-launch Supabase RLS/security scanner for AI-built apps. Let me check its docs and pricing.
npm view viberaven readme 2>/dev/null | head -150
(no output)
(no output)
Recorded tool call
{
"type": "tool_call",
"seq": 22,
"ts": "2026-11-02T12:29:12.141Z",
"name": "bash",
"turn": 1,
"input": {
"command": "npm view viberaven readme 2>/dev/null | head -150"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9eecc8dd5311b36f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 26,
"ts": "2026-11-02T12:29:13.321Z",
"turn": 1,
"output": {
"content": [
{
"text": "(no output)",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9eecc8dd5311b36f",
"is_error": false,
"tool_kind": "shell"
}curl -sL --max-time 10 https://viberaven.dev | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | head -80; echo "===PRICING==="; curl -sL --max-time 10 https://viberaven.dev/pricing | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | head -80
(function () {
(function () {
// Signed in on this browser (Supabase's stored session has a refresh token): mark it before first paint so
// the home nav and hero show "Open app" from the first frame. HomePage keeps the class in sync afterwards.
try {
for (var i = 0; i < localStorage.length; i++) {
var key = localStorage.key(i);
if (!/^sb-.+-auth-token$/.test(key || '')) continue;
var stored = JSON.parse(localStorage.getItem(key) || 'null');
if (stored && stored.refresh_token) { document.documentElement.classList.add('vr-signed-in'); break; }
}
} catch (e) {}
var legacy = /^\/(deploy|connect|privacy|terms|refund|signup|pack)(\/|$)/.test(location.pathname);
if (legacy) return;
var fonts = ['/fonts/schibsted-grotesk-var-latin.woff2'];
if (location.pathname === '/') {
fonts.push('/fonts/ibm-plex-mono-400-latin.woff2');
// Home is prerendered HTML: keep it hidden until its two above-the-fold faces are ready (at most 1.2 s),
// so the first frame a visitor sees is final and nothing re-lays out when a font arrives.
if (window.FontFace && document.fonts) {
var root = document.documentElement;
root.classList.add('vr-fonts-wait');
var reveal = function () { root.classList.remove('vr-fonts-wait'); };
var faces = [
new FontFace('Schibsted Grotesk', 'url(/fonts/schibsted-grotesk-var-latin.woff2)', { weight: '400 900', display: 'block' }),
new FontFace('IBM Plex Mono', 'url(/fonts/ibm-plex-mono-400-latin.woff2)', { weight: '400', display: 'block' })
];
Promise.all(faces.map(function (face) { return face.load().then(function (loaded) { document.fonts.add(loaded); }); }))
.then(reveal, reveal);
setTimeout(reveal, 1200);
}
}
fonts.forEach(function (href) {
var link = document.createElement('link');
link.rel = 'preload'; link.as = 'font'; link.type = 'font/woff2'; link.crossOrigin = 'anonymous'; link.href = href;
document.head.appendChild(link);
});
})();
<!-- Every route is designed dark. Legacy global CSS paints html/body light with !important, which showed
before a route mounted and on overscroll. :root raises specificity so this wins from first paint. -->
html.vr-home, html.vr-home body, html.vr-home #root { background: #0a0a0b !important; } html.vr-fonts-wait #root { visibility: hidden; }
/* Home's signed-in swap (html.vr-signed-in is set by the script above): "Open app" replaces the sign-up links. */
.hp .when-in { display: none !important; }
html.vr-signed-in .hp .when-out { display: none !important; }
html.vr-signed-in .hp a.when-in { display: inline-flex !important; }
html.vr-signed-in .hp span.when-in { display: inline !important; }
html.vr-signed-in .hp .hp-menu a.when-in { display: flex !important; }
<meta
name="keywords"
content="AI app production checklist, AI-built app launch readiness, Cursor production readiness, VS Code AI coding extension, coding agent prompts, production stack map"
/>
===PRICING===
(function () {
// Signed in on this browser (Supabase's stored session has a refresh token): mark it before first paint so
// the home nav and hero show "Open app" from the first frame. HomePage keeps the class in sync afterwards.
try {
for (var i = 0; i < localStorage.length; i++) {
var key = localStorage.key(i);
if (!/^sb-.+-auth-token$/.test(key || '')) continue;
var stored = JSON.parse(localStorage.getItem(key) || 'null');
if (stored && stored.refresh_token) { document.documentElement.classList.add('vr-signed-in'); break; }
}
} catch (e) {}
var legacy = /^\/(deploy|connect|privacy|terms|refund|signup|pack)(\/|$)/.test(location.pathname);
if (legacy) return;
var fonts = ['/fonts/schibsted-grotesk-var-latin.woff2'];
if (location.pathname === '/') {
fonts.push('/fonts/ibm-plex-mono-400-latin.woff2');
// Home is prerendered HTML: keep it hidden until its two above-the-fold faces are ready (at most 1.2 s),
// so the first frame a visitor sees is final and nothing re-lays out when a font arrives.
if (window.FontFace && document.fonts) {
var root = document.documentElement;
root.classList.add('vr-fonts-wait');
var reveal = function () { root.classList.remove('vr-fonts-wait'); };
var faces = [
new FontFace('Schibsted Grotesk', 'url(/fonts/schibsted-grotesk-var-latin.woff2)', { weight: '400 900', display: 'block' }),
new FontFace('IBM Plex Mono', 'url(/fonts/ibm-plex-mono-400-latin.woff2)', { weight: '400', display: 'block' })
];
Promise.all(faces.map(function (face) { return face.load().then(function (loaded) { document.fonts.add(loaded); }); }))
.then(reveal, reveal);
setTimeout(reveal, 1200);
}
}
fonts.forEach(function (href) {
var link = document.createElement('link');
link.rel = 'preload'; link.as = 'font'; link.type = 'font/woff2'; link.crossOrigin = 'anonymous'; link.href = href;
document.head.appendChild(link);
});
})();
<!-- Every route is designed dark. Legacy global CSS paints html/body light with !important, which showed
before a route mounted and on overscroll. :root raises specificity so this wins from first paint. -->
html.vr-home, html.vr-home body, html.vr-home #root { background: #0a0a0b !important; } html.vr-fonts-wait #root { visibility: hidden; }
/* Home's signed-in swap (html.vr-signed-in is set by the script above): "Open app" replaces the sign-up links. */
.hp .when-in { display: none !important; }
html.vr-signed-in .hp .when-out { display: none !important; }
html.vr-signed-in .hp a.when-in { display: inline-flex !important; }
html.vr-signed-in .hp span.when-in { display: inline !important; }
html.vr-signed-in .hp .hp-menu a.when-in { display: flex !important; }
<meta
name="keywords"
content="AI app production checklist, AI-built app launch readiness, Cursor production readiness, VS Code AI coding extension, coding agent prompts, production stack map"
/>
Recorded tool call
{
"type": "tool_call",
"seq": 23,
"ts": "2026-11-02T12:29:12.141Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 10 https://viberaven.dev | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | head -80; echo \"===PRICING===\"; curl -sL --max-time 10 https://viberaven.dev/pricing | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | head -80"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8d22cdd4a0597474",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 27,
"ts": "2026-11-02T12:29:13.321Z",
"turn": 1,
"output": {
"content": [
{
"text": " \n \n \n \n \n \n \n \n \n \n \n \n \n \n (function () {\n // Signed in on this browser (Supabase's stored session has a refresh token): mark it before first paint so\n // the home nav and hero show \"Open app\" from the first frame. HomePage keeps the class in sync afterwards.\n try {\n for (var i = 0; i < localStorage.length; i++) {\n var key = localStorage.key(i);\n if (!/^sb-.+-auth-token$/.test(key || '')) continue;\n var stored = JSON.parse(localStorage.getItem(key) || 'null');\n if (stored && stored.refresh_token) { document.documentElement.classList.add('vr-signed-in'); break; }\n }\n } catch (e) {}\n var legacy = /^\\/(deploy|connect|privacy|terms|refund|signup|pack)(\\/|$)/.test(location.pathname);\n if (legacy) return;\n var fonts = ['/fonts/schibsted-grotesk-var-latin.woff2'];\n if (location.pathname === '/') {\n fonts.push('/fonts/ibm-plex-mono-400-latin.woff2');\n // Home is prerendered HTML: keep it hidden until its two above-the-fold faces are ready (at most 1.2 s),\n // so the first frame a visitor sees is final and nothing re-lays out when a font arrives.\n if (window.FontFace && document.fonts) {\n var root = document.documentElement;\n root.classList.add('vr-fonts-wait');\n var reveal = function () { root.classList.remove('vr-fonts-wait'); };\n var faces = [\n new FontFace('Schibsted Grotesk', 'url(/fonts/schibsted-grotesk-var-latin.woff2)', { weight: '400 900', display: 'block' }),\n new FontFace('IBM Plex Mono', 'url(/fonts/ibm-plex-mono-400-latin.woff2)', { weight: '400', display: 'block' })\n ];\n Promise.all(faces.map(function (face) { return face.load().then(function (loaded) { document.fonts.add(loaded); }); }))\n .then(reveal, reveal);\n setTimeout(reveal, 1200);\n }\n }\n fonts.forEach(function (href) {\n var link = document.createElement('link');\n link.rel = 'preload'; link.as = 'font'; link.type = 'font/woff2'; link.crossOrigin = 'anonymous'; link.href = href;\n document.head.appendChild(link);\n });\n })();\n \n <!-- Every route is designed dark. Legacy global CSS paints html/body light with !important, which showed\n before a route mounted and on overscroll. :root raises specificity so this wins from first paint. -->\n html.vr-home, html.vr-home body, html.vr-home #root { background: #0a0a0b !important; } html.vr-fonts-wait #root { visibility: hidden; }\n /* Home's signed-in swap (html.vr-signed-in is set by the script above): \"Open app\" replaces the sign-up links. */\n .hp .when-in { display: none !important; }\n html.vr-signed-in .hp .when-out { display: none !important; }\n html.vr-signed-in .hp a.when-in { display: inline-flex !important; }\n html.vr-signed-in .hp span.when-in { display: inline !important; }\n html.vr-signed-in .hp .hp-menu a.when-in { display: flex !important; } \n \n \n \n \n <meta\n name=\"keywords\"\n content=\"AI app production checklist, AI-built app launch readiness, Cursor production readiness, VS Code AI coding extension, coding agent prompts, production stack map\"\n />\n \n \n \n \n \n \n \n \n \n \n \n===PRICING===\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n (function () {\n // Signed in on this browser (Supabase's stored session has a refresh token): mark it before first paint so\n // the home nav and hero show \"Open app\" from the first frame. HomePage keeps the class in sync afterwards.\n try {\n for (var i = 0; i < localStorage.length; i++) {\n var key = localStorage.key(i);\n if (!/^sb-.+-auth-token$/.test(key || '')) continue;\n var stored = JSON.parse(localStorage.getItem(key) || 'null');\n if (stored && stored.refresh_token) { document.documentElement.classList.add('vr-signed-in'); break; }\n }\n } catch (e) {}\n var legacy = /^\\/(deploy|connect|privacy|terms|refund|signup|pack)(\\/|$)/.test(location.pathname);\n if (legacy) return;\n var fonts = ['/fonts/schibsted-grotesk-var-latin.woff2'];\n if (location.pathname === '/') {\n fonts.push('/fonts/ibm-plex-mono-400-latin.woff2');\n // Home is prerendered HTML: keep it hidden until its two above-the-fold faces are ready (at most 1.2 s),\n // so the first frame a visitor sees is final and nothing re-lays out when a font arrives.\n if (window.FontFace && document.fonts) {\n var root = document.documentElement;\n root.classList.add('vr-fonts-wait');\n var reveal = function () { root.classList.remove('vr-fonts-wait'); };\n var faces = [\n new FontFace('Schibsted Grotesk', 'url(/fonts/schibsted-grotesk-var-latin.woff2)', { weight: '400 900', display: 'block' }),\n new FontFace('IBM Plex Mono', 'url(/fonts/ibm-plex-mono-400-latin.woff2)', { weight: '400', display: 'block' })\n ];\n Promise.all(faces.map(function (face) { return face.load().then(function (loaded) { document.fonts.add(loaded); }); }))\n .then(reveal, reveal);\n setTimeout(reveal, 1200);\n }\n }\n fonts.forEach(function (href) {\n var link = document.createElement('link');\n link.rel = 'preload'; link.as = 'font'; link.type = 'font/woff2'; link.crossOrigin = 'anonymous'; link.href = href;\n document.head.appendChild(link);\n });\n })();\n \n <!-- Every route is designed dark. Legacy global CSS paints html/body light with !important, which showed\n before a route mounted and on overscroll. :root raises specificity so this wins from first paint. -->\n html.vr-home, html.vr-home body, html.vr-home #root { background: #0a0a0b !important; } html.vr-fonts-wait #root { visibility: hidden; }\n /* Home's signed-in swap (html.vr-signed-in is set by the script above): \"Open app\" replaces the sign-up links. */\n .hp .when-in { display: none !important; }\n html.vr-signed-in .hp .when-out { display: none !important; }\n html.vr-signed-in .hp a.when-in { display: inline-flex !important; }\n html.vr-signed-in .hp span.when-in { display: inline !important; }\n html.vr-signed-in .hp .hp-menu a.when-in { display: flex !important; } \n \n \n \n \n <meta\n name=\"keywords\"\n content=\"AI app production checklist, AI-built app launch readiness, Cursor production readiness, VS Code AI coding extension, coding agent prompts, production stack map\"\n />\n \n \n \n \n \n \n \n \n \n \n \n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8d22cdd4a0597474",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The website is a JS SPA, so scraping pricing from there is difficult. Let's check the README/docs of the npm package itself. npm view viberaven readme returned nothing. Let me download the package and read the README, and also check the GitHub repo. Also, I'll check if there's an SDK/API — this package is a CLI scanner. Let me take a look at the GitHub repo's README.
The site is a JS SPA. Let me check the GitHub repo and package contents for docs, API/SDK, and pricing.
cd /tmp && curl -sL --max-time 15 https://raw.githubusercontent.com/ohad6k/VibeRaven/main/README.md | head -120
<div align="center">
<div align="center">
<img src="./assets/logo.png" alt="VibeRaven" width="88" />
<h1>VibeRaven</h1>
<p>VibeRaven checks AI-built apps on Vercel + Supabase for launch gaps before you ship: tables without RLS, permissive policies such as <code>using (true)</code>, service_role keys in client code, anon-callable security definer functions, the wrong pooler port and unverified Stripe webhooks.</p>
<p>Run <code>npx -y viberaven@1.6.12 check</code> in your app's folder. It reads the repository on your machine, needs no account, and names the file and line for each gap.</p>
<p>
<a href="https://www.npmjs.com/package/viberaven"><img src="https://img.shields.io/badge/npm-viberaven-cb3837?style=for-the-badge&logo=npm&logoColor=white" height="40" alt="Install from npm" /></a>
<a href="https://viberaven.dev/try"><img src="https://img.shields.io/badge/Try_it-viberaven.dev-e8c15a?style=for-the-badge&logoColor=black" height="40" alt="Try it on viberaven.dev" /></a>
<a href="https://discord.gg/ZAJvazz63Y"><img src="https://img.shields.io/badge/Join-Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40" alt="Join the Discord" /></a>
</p>
<p>
<a href="https://www.npmjs.com/package/viberaven"><img src="https://img.shields.io/npm/v/viberaven?color=e8c15a&label=npm" alt="npm version" /></a>
<a href="https://www.npmjs.com/package/viberaven"><img src="https://img.shields.io/npm/dm/viberaven?color=e8c15a&label=downloads" alt="npm downloads" /></a>
<a href="https://github.com/ohad6k/VibeRaven/stargazers"><img src="https://img.shields.io/github/stars/ohad6k/VibeRaven?style=flat&color=e8c15a&label=stars" alt="GitHub stars" /></a>
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-e8c15a" alt="MIT license" /></a>
<a href="https://skills.sh"><img src="https://img.shields.io/badge/skills.sh-6--skill_pack-34d399" alt="skills.sh pack" /></a>
<a href="https://x.com/VibeRavenStatio"><img src="https://img.shields.io/badge/X-follow-000000?logo=x&logoColor=white" alt="Follow on X" /></a>
</p>
<p>
<a href="https://viberaven.dev">Website</a> ·
<a href="#what-it-checks">What it checks</a> ·
<a href="#when-to-use-it-and-when-not-to">When to use it</a> ·
<a href="#how-it-compares">How it compares</a> ·
<a href="#the-local-studio">Local Studio</a> ·
<a href="#agent-skills">Agent skills</a> ·
<a href="https://github.com/ohad6k/VibeRaven/releases">Releases</a>
</p>
</div>
## Quick start
Requires Node.js 20 or newer. From your app's project root:
```bash
npx -y viberaven@1.6.12 check
```
- In a terminal or CI: `npx -y viberaven@1.6.12 check`
- For coding agents: `npx -y viberaven@1.6.12 --agent-mode`
- Windows PowerShell: use `npx.cmd` if `npx` is blocked by the execution policy.
It reads `supabase/migrations`, your client and server code, `package.json` and `.env.example`. It does not connect to your Supabase project or send requests to your app. It exits `1` when it finds a blocker, so it also works as a CI step.
## What it checks
| Finding | Gap ID | Related Supabase Security Advisor lint |
| --- | --- | --- |
| A public table created in a migration with row level security never enabled | `rls_disabled` | `rls_disabled_in_public` ([guide](https://viberaven.dev/supabase-rls-disabled-in-public)) |
| A policy with `using (true)` that lets anyone read or write every row | `rls_policy_allows_all_write`, `rls_policy_allows_all_read` | none |
| The service_role key in a file that ships to the browser, or under a `NEXT_PUBLIC_` name | `service_role_key_in_client_code`, `service_role_key_in_client_env` | none |
| A security definer function in `public` that no migration closes to `anon` | `security_definer_function_executable` | `anon_security_definer_function_executable` ([guide](https://viberaven.dev/supabase-security-definer-function-anon)) |
| A direct Postgres connection on port 5432 from serverless code, instead of the transaction pooler on 6543 | `pooler_port_mismatch` | none |
| A Stripe webhook handler that never checks the signature over the raw body | `unverified_stripe_webhook` | none |
| Env vars that code reads but `.env.example` does not list, queries with no row limit, no error monitoring | `env_var_drift`, `unbounded_query`, `missing_monitoring` | none |
Two other Security Advisor lints come up often in the same apps. VibeRaven has no rule for them yet, and the guides explain the fix:
- `security_definer_view`: [what it means and how to fix it](https://viberaven.dev/supabase-security-definer-view)
- `function_search_path_mutable`: [what it means and how to fix it](https://viberaven.dev/supabase-function-search-path-mutable)
For a before-and-after run on one migration, see the [missing-RLS example](./examples/proof/missing-rls/).
## Example output
From `viberaven check` 1.6.12 on a synthetic Next.js + Supabase app with one of each gap (project path shortened):
```text
viberaven check · ~/my-app
🔴 No RLS policy proof in migrations (rls_disabled)
1 public table without row level security: public.profiles (supabase/migrations/20260301000000_init.sql:1). The Data API does not enforce row restrictions for roles and operations allowed by the table's grants. Verify those grants to determine who can read or change rows.
🔴 A policy lets anyone write every row (rls_policy_allows_all_write)
Policy "orders are editable" on public.orders (supabase/migrations/20260301000000_init.sql:13) lets anyone, signed in or not, update every row, to any values: using (true).
🔴 Service role key used in client code (service_role_key_in_client_code)
app/admin/page.tsx:4: creates a Supabase client with the service role key. This file ships to the browser, and the service role key skips RLS entirely. Move the call behind a server route or edge function and rotate the key.
🟡 Supabase connection is not using the pooler port (pooler_port_mismatch)
Found direct 5432 DATABASE_URL/POSTGRES_URL evidence. Vercel/serverless deployments should prefer Supabase transaction pooler port 6543.
🟡 Security definer function callable by the Data API roles (security_definer_function_executable)
public.grant_credits(uuid, integer) at supabase/migrations/20260301000000_init.sql:15 is security definer, so it runs with its owner's rights and RLS does not limit what it touches. No migration revokes EXECUTE from public, anon, authenticated, so anyone holding the anon key can call it at /rest/v1/rpc/grant_credits. If only the server calls it, add: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated; Fix: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated;
🟡 Stripe webhook does not verify the signature (unverified_stripe_webhook)
1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout.
🟡 Env vars used in code but missing from .env.example (env_var_drift)
Code reads 1 environment variable that .env.example does not document (NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY). Fresh clones, CI, and the production deploy can silently run without them.
🟡 Database queries with no row limit (unbounded_query)
1 file run Supabase selects or Prisma findMany with no .limit()/.range()/take bound (app\admin\page.tsx). These work with 50 test rows and melt with 50,000 production rows.
⚪ No error monitoring detected (missing_monitoring)
No Sentry/PostHog (or similar) instrumentation was found. Production errors will only surface when users complain.
Verdict: ❌ 3 blockers, 5 warnings · score 5
Fix: viberaven fix · Details: ~/my-app\.viberaven\agent-tasklist.md
```
Every result also lands in `.viberaven/` as markdown and JSON (`agent-tasklist.md`, `gate-result.json`, `context-map.json`), so a coding agent and your git history can read it.
## When to use it, and when not to
Use it:
- before you launch or hand off a Vercel + Supabase app built with Lovable, Bolt, Cursor, Claude Code or Codex;
- after a Supabase migration or a policy change;
- when a production error points at RLS, the service_role key, env vars, the database connection or a Stripe webhook;
- on every push or pull request, through the GitHub Action below.
It is not the right tool when:
- **You need to know what is live in the database.** VibeRaven is a repository check, not a live database test. It reads migrations, so it cannot see a policy someone added in the Supabase dashboard. Use Supabase Security Advisor for the live project.
- **You need a full security audit.** It does not send requests to your app, test for XSS or CSRF, or look up dependency CVEs. A clear result is not a security audit.
- **You need to know the app works.** It does not run your build or click through your pages. Use Playwright or your own tests.
- **The app does not use Supabase.** Most of the checks have nothing to read.
## How it compares
These tools answer different questions, and most launches need more than one of them.
| Tool | What it checks | Where it runs | How it fits with VibeRaven |
| --- | --- | --- | --- |
Recorded tool call
{
"type": "tool_call",
"seq": 32,
"ts": "2026-11-02T12:29:15.282Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && curl -sL --max-time 15 https://raw.githubusercontent.com/ohad6k/VibeRaven/main/README.md | head -120"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-984a43f2271b5b4b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 35,
"ts": "2026-11-02T12:29:15.622Z",
"turn": 1,
"output": {
"content": [
{
"text": "<div align=\"center\">\n <img src=\"./assets/logo.png\" alt=\"VibeRaven\" width=\"88\" />\n <h1>VibeRaven</h1>\n <p>VibeRaven checks AI-built apps on Vercel + Supabase for launch gaps before you ship: tables without RLS, permissive policies such as <code>using (true)</code>, service_role keys in client code, anon-callable security definer functions, the wrong pooler port and unverified Stripe webhooks.</p>\n <p>Run <code>npx -y viberaven@1.6.12 check</code> in your app's folder. It reads the repository on your machine, needs no account, and names the file and line for each gap.</p>\n\n <p>\n <a href=\"https://www.npmjs.com/package/viberaven\"><img src=\"https://img.shields.io/badge/npm-viberaven-cb3837?style=for-the-badge&logo=npm&logoColor=white\" height=\"40\" alt=\"Install from npm\" /></a>\n \n <a href=\"https://viberaven.dev/try\"><img src=\"https://img.shields.io/badge/Try_it-viberaven.dev-e8c15a?style=for-the-badge&logoColor=black\" height=\"40\" alt=\"Try it on viberaven.dev\" /></a>\n \n <a href=\"https://discord.gg/ZAJvazz63Y\"><img src=\"https://img.shields.io/badge/Join-Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white\" height=\"40\" alt=\"Join the Discord\" /></a>\n </p>\n\n <p>\n <a href=\"https://www.npmjs.com/package/viberaven\"><img src=\"https://img.shields.io/npm/v/viberaven?color=e8c15a&label=npm\" alt=\"npm version\" /></a>\n <a href=\"https://www.npmjs.com/package/viberaven\"><img src=\"https://img.shields.io/npm/dm/viberaven?color=e8c15a&label=downloads\" alt=\"npm downloads\" /></a>\n <a href=\"https://github.com/ohad6k/VibeRaven/stargazers\"><img src=\"https://img.shields.io/github/stars/ohad6k/VibeRaven?style=flat&color=e8c15a&label=stars\" alt=\"GitHub stars\" /></a>\n <a href=\"./LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-e8c15a\" alt=\"MIT license\" /></a>\n <a href=\"https://skills.sh\"><img src=\"https://img.shields.io/badge/skills.sh-6--skill_pack-34d399\" alt=\"skills.sh pack\" /></a>\n <a href=\"https://x.com/VibeRavenStatio\"><img src=\"https://img.shields.io/badge/X-follow-000000?logo=x&logoColor=white\" alt=\"Follow on X\" /></a>\n </p>\n <p>\n <a href=\"https://viberaven.dev\">Website</a> ·\n <a href=\"#what-it-checks\">What it checks</a> ·\n <a href=\"#when-to-use-it-and-when-not-to\">When to use it</a> ·\n <a href=\"#how-it-compares\">How it compares</a> ·\n <a href=\"#the-local-studio\">Local Studio</a> ·\n <a href=\"#agent-skills\">Agent skills</a> ·\n <a href=\"https://github.com/ohad6k/VibeRaven/releases\">Releases</a>\n </p>\n</div>\n\n## Quick start\n\nRequires Node.js 20 or newer. From your app's project root:\n\n```bash\nnpx -y viberaven@1.6.12 check\n```\n\n- In a terminal or CI: `npx -y viberaven@1.6.12 check`\n- For coding agents: `npx -y viberaven@1.6.12 --agent-mode`\n- Windows PowerShell: use `npx.cmd` if `npx` is blocked by the execution policy.\n\nIt reads `supabase/migrations`, your client and server code, `package.json` and `.env.example`. It does not connect to your Supabase project or send requests to your app. It exits `1` when it finds a blocker, so it also works as a CI step.\n\n## What it checks\n\n| Finding | Gap ID | Related Supabase Security Advisor lint |\n| --- | --- | --- |\n| A public table created in a migration with row level security never enabled | `rls_disabled` | `rls_disabled_in_public` ([guide](https://viberaven.dev/supabase-rls-disabled-in-public)) |\n| A policy with `using (true)` that lets anyone read or write every row | `rls_policy_allows_all_write`, `rls_policy_allows_all_read` | none |\n| The service_role key in a file that ships to the browser, or under a `NEXT_PUBLIC_` name | `service_role_key_in_client_code`, `service_role_key_in_client_env` | none |\n| A security definer function in `public` that no migration closes to `anon` | `security_definer_function_executable` | `anon_security_definer_function_executable` ([guide](https://viberaven.dev/supabase-security-definer-function-anon)) |\n| A direct Postgres connection on port 5432 from serverless code, instead of the transaction pooler on 6543 | `pooler_port_mismatch` | none |\n| A Stripe webhook handler that never checks the signature over the raw body | `unverified_stripe_webhook` | none |\n| Env vars that code reads but `.env.example` does not list, queries with no row limit, no error monitoring | `env_var_drift`, `unbounded_query`, `missing_monitoring` | none |\n\nTwo other Security Advisor lints come up often in the same apps. VibeRaven has no rule for them yet, and the guides explain the fix:\n\n- `security_definer_view`: [what it means and how to fix it](https://viberaven.dev/supabase-security-definer-view)\n- `function_search_path_mutable`: [what it means and how to fix it](https://viberaven.dev/supabase-function-search-path-mutable)\n\nFor a before-and-after run on one migration, see the [missing-RLS example](./examples/proof/missing-rls/).\n\n## Example output\n\nFrom `viberaven check` 1.6.12 on a synthetic Next.js + Supabase app with one of each gap (project path shortened):\n\n```text\nviberaven check · ~/my-app\n\n🔴 No RLS policy proof in migrations (rls_disabled)\n 1 public table without row level security: public.profiles (supabase/migrations/20260301000000_init.sql:1). The Data API does not enforce row restrictions for roles and operations allowed by the table's grants. Verify those grants to determine who can read or change rows.\n🔴 A policy lets anyone write every row (rls_policy_allows_all_write)\n Policy \"orders are editable\" on public.orders (supabase/migrations/20260301000000_init.sql:13) lets anyone, signed in or not, update every row, to any values: using (true).\n🔴 Service role key used in client code (service_role_key_in_client_code)\n app/admin/page.tsx:4: creates a Supabase client with the service role key. This file ships to the browser, and the service role key skips RLS entirely. Move the call behind a server route or edge function and rotate the key.\n🟡 Supabase connection is not using the pooler port (pooler_port_mismatch)\n Found direct 5432 DATABASE_URL/POSTGRES_URL evidence. Vercel/serverless deployments should prefer Supabase transaction pooler port 6543.\n🟡 Security definer function callable by the Data API roles (security_definer_function_executable)\n public.grant_credits(uuid, integer) at supabase/migrations/20260301000000_init.sql:15 is security definer, so it runs with its owner's rights and RLS does not limit what it touches. No migration revokes EXECUTE from public, anon, authenticated, so anyone holding the anon key can call it at /rest/v1/rpc/grant_credits. If only the server calls it, add: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated; Fix: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated;\n🟡 Stripe webhook does not verify the signature (unverified_stripe_webhook)\n 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout.\n🟡 Env vars used in code but missing from .env.example (env_var_drift)\n Code reads 1 environment variable that .env.example does not document (NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY). Fresh clones, CI, and the production deploy can silently run without them.\n🟡 Database queries with no row limit (unbounded_query)\n 1 file run Supabase selects or Prisma findMany with no .limit()/.range()/take bound (app\\admin\\page.tsx). These work with 50 test rows and melt with 50,000 production rows.\n⚪ No error monitoring detected (missing_monitoring)\n No Sentry/PostHog (or similar) instrumentation was found. Production errors will only surface when users complain.\n\nVerdict: ❌ 3 blockers, 5 warnings · score 5\nFix: viberaven fix · Details: ~/my-app\\.viberaven\\agent-tasklist.md\n```\n\nEvery result also lands in `.viberaven/` as markdown and JSON (`agent-tasklist.md`, `gate-result.json`, `context-map.json`), so a coding agent and your git history can read it.\n\n## When to use it, and when not to\n\nUse it:\n\n- before you launch or hand off a Vercel + Supabase app built with Lovable, Bolt, Cursor, Claude Code or Codex;\n- after a Supabase migration or a policy change;\n- when a production error points at RLS, the service_role key, env vars, the database connection or a Stripe webhook;\n- on every push or pull request, through the GitHub Action below.\n\nIt is not the right tool when:\n\n- **You need to know what is live in the database.** VibeRaven is a repository check, not a live database test. It reads migrations, so it cannot see a policy someone added in the Supabase dashboard. Use Supabase Security Advisor for the live project.\n- **You need a full security audit.** It does not send requests to your app, test for XSS or CSRF, or look up dependency CVEs. A clear result is not a security audit.\n- **You need to know the app works.** It does not run your build or click through your pages. Use Playwright or your own tests.\n- **The app does not use Supabase.** Most of the checks have nothing to read.\n\n## How it compares\n\nThese tools answer different questions, and most launches need more than one of them.\n\n| Tool | What it checks | Where it runs | How it fits with VibeRaven |\n| --- | --- | --- | --- |\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-984a43f2271b5b4b",
"is_error": false,
"tool_kind": "shell"
}cd /tmp && mkdir -p vr && cd vr && npm pack viberaven@1.7.6 --silent 2>&1 | tail -1 && tar tzf viberaven-1.7.6.tgz | head -40
viberaven-1.7.6.tgz
viberaven-1.7.6.tgz package/LICENSE package/bin/viberaven.js package/package.json package/README.md
Recorded tool call
{
"type": "tool_call",
"seq": 34,
"ts": "2026-11-02T12:29:15.282Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && mkdir -p vr && cd vr && npm pack viberaven@1.7.6 --silent 2>&1 | tail -1 && tar tzf viberaven-1.7.6.tgz | head -40"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-abecd2cd719c27ad",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 36,
"ts": "2026-11-02T12:29:16.370Z",
"turn": 1,
"output": {
"content": [
{
"text": "viberaven-1.7.6.tgz\npackage/LICENSE\npackage/bin/viberaven.js\npackage/package.json\npackage/README.md\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-abecd2cd719c27ad",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
VibeRaven is a repository scanner CLI (npx viberaven check), which runs locally against the repo and doesn't need an account. It also has a hosted web app at viberaven.dev. The user wants to "use the hosted product via SDK or API" — but this product's developer workflow is actually a CLI (npx check) that reads repos locally, no account needed, no local service stack needed, not long-running. It's a lightweight CLI, and this fits. "Hosted" — there's a try page at viberaven.dev/try, but it's an SPA. The CLI is a developer workflow you can actually operate on, and it's not a "local service stack" — just a one-shot scan.
User's request: create a simple sample using VibeRaven. Plan:
- Create a small synthetic Next.js-style + Supabase app skeleton in /sandbox/repo (or a subdirectory), including a few intentional gaps (e.g., a migration with RLS disabled).
- Run
npx viberaven check(short duration, one-shot). - Display the output.
- Pricing: need info. The website is an SPA. The local CLI doesn't require an account and is free. Check the README for the pricing section. Let me try grepping the README for pricing.
Also regarding pricing — the hosted product might have plans. Let me search the rest of the README and possibly fetch pricing data from the site's JS or the refund page (legacy /refund was returning something). Try curl on https://viberaven.dev/refund and check for the presence of an API. Also check the GitHub repo's docs.
The developer workflow is a one-shot CLI scan (npx viberaven check) — no account, no service stack, not long-running. That's actionable. Let me get pricing info and the rest of the README.
cd /tmp && curl -sL --max-time 15 https://raw.githubusercontent.com/ohad6k/VibeRaven/main/README.md > vr-readme.md; grep -niE "pric|free|paid|plan|cost|\\$" vr-readme.md | head -30; wc -l vr-readme.md
85: 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe
85: 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout. 197:| `architecture-plan` | Turn answers plus repo evidence into a workstream plan. | 237:4. **Ask for a small change.** Pick Ask to get a plan without edits, or Edit to let the agent change files, then select **Make the change**. 242:The Studio also runs on [viberaven.dev](https://viberaven.dev/try): sign in with Google, bring your repo, and connect your computer once. Your agent still works on your computer. The site includes 2 free changes, then [Pro](https://viberaven.dev/pricing) for 300 changes a month. Both need a coding agent you are signed in to; its own account and limits apply. 255:- **Changes from viberaven.dev.** Sign in with Google. Free includes 2 changes per account; [Pro](https://viberaven.dev/pricing) includes 300 a month. Your coding agent's account and usage are separate. The site stores requests, progress, check results, file paths and redacted, size-limited diffs so you can review them. 256:- **Hosted full checks.** Optional: 2 on Free, 50 a month on Pro, separate from changes. 259:- **Changes under your control.** Review the plan and access mode before the agent edits your project. Cleanup is plan-only. A clear repository check is not a security audit or proof that the deployed app works. 286 vr-readme.md
Recorded tool call
{
"type": "tool_call",
"seq": 40,
"ts": "2026-11-02T12:29:20.012Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && curl -sL --max-time 15 https://raw.githubusercontent.com/ohad6k/VibeRaven/main/README.md > vr-readme.md; grep -niE \"pric|free|paid|plan|cost|\\\\$\" vr-readme.md | head -30; wc -l vr-readme.md"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-be7cdc466aeebcd0",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 45,
"ts": "2026-11-02T12:29:20.321Z",
"turn": 1,
"output": {
"content": [
{
"text": "85: 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout.\n197:| `architecture-plan` | Turn answers plus repo evidence into a workstream plan. |\n237:4. **Ask for a small change.** Pick Ask to get a plan without edits, or Edit to let the agent change files, then select **Make the change**.\n242:The Studio also runs on [viberaven.dev](https://viberaven.dev/try): sign in with Google, bring your repo, and connect your computer once. Your agent still works on your computer. The site includes 2 free changes, then [Pro](https://viberaven.dev/pricing) for 300 changes a month. Both need a coding agent you are signed in to; its own account and limits apply.\n255:- **Changes from viberaven.dev.** Sign in with Google. Free includes 2 changes per account; [Pro](https://viberaven.dev/pricing) includes 300 a month. Your coding agent's account and usage are separate. The site stores requests, progress, check results, file paths and redacted, size-limited diffs so you can review them.\n256:- **Hosted full checks.** Optional: 2 on Free, 50 a month on Pro, separate from changes.\n259:- **Changes under your control.** Review the plan and access mode before the agent edits your project. Cleanup is plan-only. A clear repository check is not a security audit or proof that the deployed app works.\n286 vr-readme.md\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-be7cdc466aeebcd0",
"is_error": false,
"tool_kind": "shell"
}curl -sL --max-time 10 https://viberaven.dev/refund | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | grep -iE "pric|free|paid|plan|refund|\\$[0-9]" | head -30; echo "===TRY==="; curl -sL --max-time 10 https://viberaven.dev/try | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | grep -iE "pric|free|scan|upload|api" | head -20
===TRY===
===TRY===
var map = {"files":[["/assets/TryPage-B9NZTFM8.js","/assets/TryPage-Dtf8V24-.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/sparkles-ynRRiv4N.js","/assets/layers-7LF4IaO9.js","/assets/lock-D-9bWXVe.js","/assets/checkout-DFdsG5yD.js","/assets/api-DbQpyuc8.js","/assets/start-site-Cesn_0Ds.js","/assets/start-site-Cl5MZ6t3.css","/assets/install-DSLCxTZO.js","/assets/useRobots-B1ZGCCPV.js","/assets/providerCatalog-B9p3A1Uu.js","/assets/localWorkspace-DcVf6TVH.js"],["/assets/StartPage-RegPAnpB.js","/assets/arrow-left-Ck8HA5H6.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/layers-7LF4IaO9.js","/assets/rocket-C9dVuyCS.js","/assets/start-site-Cesn_0Ds.js","/assets/start-site-Cl5MZ6t3.css","/assets/useRobots-B1ZGCCPV.js","/assets/providerCatalog-B9p3A1Uu.js"],["/assets/PackPage-De0lxcpq.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/LoginPage-CVDL2Ee7.js","/assets/LoginPage-kUI9BP_F.css","/assets/supabase-BNvpmc4Q.js","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/GoogleAuthButton-DFjwa2AV.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/SignupPage-DM8ZnYmq.js","/assets/LoginPage-CVDL2Ee7.js","/assets/LoginPage-kUI9BP_F.css","/assets/supabase-BNvpmc4Q.js","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/GoogleAuthButton-DFjwa2AV.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/PricingPage-C4H0fh6Q.js","/assets/connect-site-CP9Fp1fI.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/checkout-DFdsG5yD.js","/assets/api-DbQpyuc8.js"],["/assets/AgenciesPage-jjsh5HX9.js","/assets/AgenciesPage-bSOM0r7a.css","/assets/connect-site-CP9Fp1fI.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css"],["/assets/TermsPage-BgtVXHmf.js","/assets/useSelfCanonical-B_kRGoyX.js","/assets/useSelfCanonical-CZAR1RLv.css","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/useRobots-B1ZGCCPV.js"],["/assets/PrivacyPage-eEyLghug.js","/assets/useSelfCanonical-B_kRGoyX.js","/assets/useSelfCanonical-CZAR1RLv.css","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/useRobots-B1ZGCCPV.js"],["/assets/RefundPage-CK9KA4X2.js","/assets/useSelfCanonical-B_kRGoyX.js","/assets/useSelfCanonical-CZAR1RLv.css","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/useRobots-B1ZGCCPV.js"],["/assets/ConnectPage-DMHhAQv2.js","/assets/connect-site-CP9Fp1fI.css","/assets/supabase-BNvpmc4Q.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/vrShell-CWvEuzU6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/GoogleAuthButton-DFjwa2AV.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/ContinuePage-D5oOXqCW.js","/assets/connect-site-CP9Fp1fI.css","/assets/supabase-BNvpmc4Q.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/GoogleAuthButton-DFjwa2AV.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/AccountPage-D7dL4LgL.js","/assets/AccountPage-nmOexx7Z.css","/assets/connect-site-CP9Fp1fI.css","/assets/product-bold-B-b8tb-Z.css","/assets/supabase-BNvpmc4Q.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/deployCockpitEnabled-CcKahKBG.js","/assets/localWorkspace-DcVf6TVH.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/WorkspacePage-nXKijDV3.js","/assets/WorkspacePage-B6_gyRzi.css","/assets/connect-site-CP9Fp1fI.css","/assets/product-bold-B-b8tb-Z.css","/assets/supabase-BNvpmc4Q.js","/assets/arrow-left-Ck8HA5H6.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/sparkles-ynRRiv4N.js","/assets/lock-D-9bWXVe.js","/assets/scan-search-CnPexUSZ.js","/assets/runnerConnectCommand-C9JupLjP.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js","/assets/providerCatalog-B9p3A1Uu.js","/assets/localWorkspace-DcVf6TVH.js"],["/assets/DeployPage-CZWP8OjU.js","/assets/DeployPage-CRrRlyq6.css","/assets/supabase-BNvpmc4Q.js","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/deployCockpitEnabled-CcKahKBG.js","/assets/localWorkspace-DcVf6TVH.js","/assets/vrShell-CWvEuzU6.js","/assets/runnerConnectCommand-C9JupLjP.js","/assets/GoogleAuthButton-DFjwa2AV.js","/assets/api-DbQpyuc8.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/DocsPage-C6xoAeKM.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/BlogPage-Bi_62iZG.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/blogPosts-Bm-IU3-2.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/NotFoundPage-DBtbqJMv.js","/assets/install-DSLCxTZO.js","/assets/square-terminal-C1LyGiIp.js"],["/assets/DocsPage-C6xoAeKM.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/BlogPage-Bi_62iZG.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/blogPosts-Bm-IU3-2.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/NotFoundPage-DBtbqJMv.js","/assets/install-DSLCxTZO.js","/assets/square-terminal-C1LyGiIp.js"],["/assets/BlogPage-Bi_62iZG.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/blogPosts-Bm-IU3-2.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/NotFoundPage-DBtbqJMv.js","/assets/install-DSLCxTZO.js"],["/assets/BlogPage-Bi_62iZG.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/blogPosts-Bm-IU3-2.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/NotFoundPage-DBtbqJMv.js","/assets/install-DSLCxTZO.js"],["/assets/ErrorHubPage-DJWOnRi8.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/SeoGrowthPage-DZ_2ww4O.js","/assets/circle-alert-B63bO4Nx.js","/assets/scan-search-CnPexUSZ.js","/assets/square-terminal-C1LyGiIp.js","/assets/vrShell-CWvEuzU6.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/rlsCheckerPage-C294pEZK.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/triangle-alert-C2Hjq23G.js"],["/assets/AiBuiltAppProductionPage-COSHy5SN.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/circle-alert-B63bO4Nx.js","/assets/scan-search-CnPexUSZ.js","/assets/vrShell-CWvEuzU6.js","/assets/copy-D9wmpdpv.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/SeoGrowthPage-DZ_2ww4O.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/circle-alert-B63bO4Nx.js","/assets/scan-search-CnPexUSZ.js","/assets/square-terminal-C1LyGiIp.js","/assets/vrShell-CWvEuzU6.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/rlsCheckerPage-C294pEZK.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js"],["/assets/SupabaseRlsCheckerPage-Iv-x49Hl.js","/assets/SupabaseRlsCheckerPage-DvAM0QGe.css","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/lock-D-9bWXVe.js","/assets/rlsCheckerPage-C294pEZK.js","/assets/routeSchema-Ctcn5Gil.js"],["/assets/GuidesPage-CtTzZyxD.js","/assets/connect-site-CP9Fp1fI.css","/assets/guide-site-BoQPU2fc.css","/assets/StudioShell-C_qPVT0n.js","/assets/StudioShell-ba0KtLZP.css","/assets/studio-site-DkkWD_on.js","/assets/studio-site-BaZR-8tw.css","/assets/indexPolicy-hnkszB43.js","/assets/arrow-left-Ck8HA5H6.js","/assets/check-BlFbnIHr.js","/assets/copy-D9wmpdpv.js","/assets/SeoGrowthPage-DZ_2ww4O.js","/assets/circle-alert-B63bO4Nx.js","/assets/scan-search-CnPexUSZ.js","/assets/square-terminal-C1LyGiIp.js","/assets/vrShell-CWvEuzU6.js","/assets/ArticleAuthor-yZQ7zZ9E.js","/assets/rlsCheckerPage-C294pEZK.js","/assets/routeSchema-Ctcn5Gil.js","/assets/useRobots-B1ZGCCPV.js","/assets/layers-7LF4IaO9.js","/assets/rocket-C9dVuyCS.js","/assets/triangle-alert-C2Hjq23G.js","/assets/blogPosts-Bm-IU3-2.js"]],"routes":[["^/try/?$",0],["^/start/?$",1],["^/pack/?$",2],["^/login/?$",3],["^/signup/?$",4],["^/pricing/?$",5],["^/agencies/?$",6],["^/terms/?$",7],["^/privacy/?$",8],["^/refund/?$",9],["^/connect/?$",10],["^/continue/?$",11],["^/account/?$",12],["^/app/?$",13],["^/app/[^/]+/?$",13],["^/deploy/?$",14],["^/deploy/[^/]+/?$",14],["^/docs/?$",15],["^/docs/[^/]+/?$",16],["^/blog/?$",17],["^/blog/[^/]+/?$",18],["^/errors/?$",19],["^/errors/[^/]+/?$",19],["^/ai-built-app-to-production/?$",20],["^/npx-viberaven/?$",21],["^/npm-viberaven-cli/?$",21],["^/production-ready-ai-workflow/?$",21],["^/ai-app-production-checklist/?$",21],["^/vibe-coding-launch-checklist/?$",21],["^/cursor-ai-coding-extension/?$",21],["^/vscode-ai-coding-extension/?$",21],["^/cursor-production-readiness-checklist/?$",21],["^/saas-starter-kit-alternative/?$",21],["^/claude-code-ignores-project-rules/?$",21],["^/claude-code-production-checklist/?$",21],["^/codex-production-readiness/?$",21],["^/lovable-app-launch-checklist/?$",21],["^/supabase-ai-app-production-checklist/?$",21],["^/stripe-webhook-checklist-ai-apps/?$",21],["^/production-readiness-scanner/?$",21],["^/ai-app-auth-production-checklist/?$",21],["^/stripe-live-mode-checklist-ai-apps/?$",21],["^/supabase-auth-rls-checklist-ai-apps/?$",21],["^/vercel-preview-to-production-checklist/?$",21],["^/error-monitoring-launch-checklist-ai-apps/?$",21],["^/clerk-production-checklist-ai-apps/?$",21],["^/authjs-production-checklist-ai-apps/?$",21],["^/polar-billing-production-checklist/?$",21],["^/paddle-webhook-checklist-ai-apps/?$",21],["^/neon-postgres-production-checklist-ai-apps/?$",21],["^/firebase-launch-checklist-ai-apps/?$",21],["^/cloudflare-workers-production-checklist/?$",21],["^/posthog-events-not-showing-vite-vercel/?$",21],["^/sentry-setup-checklist-ai-apps/?$",21],["^/do-ai-built-apps-need-sentry/?$",21],["^/what-is-rls-supabase-ai-apps/?$",21],["^/vercel-environment-variables-checklist-ai-apps/?$",21],["^/production-ready-ai-workflow/?$",21],["^/how-to-launch-ai-app-safely/?$",21],["^/lovable-app-production-gaps/?$",21],["^/ai-code-review-vs-launch-readiness/?$",21],["^/saas-starter-kit-alternative-existing-app/?$",21],["^/best-ai-app-production-readiness-tools/?$",21],["^/ai-app-launch-gap-index/?$",21],["^/we-ran-viberaven-on-a-real-ai-built-app/?$",21],["^/viberaven-vs-code-review-tools/?$",21],["^/viberaven-vs-saas-starter-kits/?$",21],["^/viberaven-vs-cursor-production-prompts/?$",21],["^/ai-visibility-prompt-tracker/?$",21],["^/ai-search-resources/?$",21],["^/prompt-check-ai-app-production-ready/?$",21],["^/prompt-cursor-before-launching-saas/?$",21],["^/prompt-claude-code-fix-production-gaps/?$",21],["^/viberaven-vs-sentry/?$",21],["^/viberaven-vs-vercel-checks/?$",21],["^/viberaven-vs-supabase-advisor/?$",21],["^/viberaven-vs-manual-launch-checklist/?$",21],["^/viberaven-vs-claude-code-agents/?$",21],["^/bolt-production-readiness-checklist/?$",21],["^/windsurf-production-checklist/?$",21],["^/gemini-cli-production-checklist/?$",21],["^/example-scan-stripe-checkout-app/?$",21],["^/example-scan-lovable-mvp/?$",21],["^/example-scan-nextjs-supabase-vercel/?$",21],["^/cursor-production-readiness/?$",21],["^/claude-code-launch-readiness/?$",21],["^/codex-launch-readiness/?$",21],["^/lovable-supabase-app-launch-checklist/?$",21],["^/find-supabase-tables-missing-rls/?$",21],["^/repo-scan-vs-live-supabase-security-test/?$",21],["^/ai-built-app-client-handoff-checklist/?$",21],["^/check-stripe-webhooks-env-vars-supabase-policies/?$",21],["^/supabase-vs-neon/?$",21],["^/posthog-vs-google-analytics/?$",21],["^/supabase-vs-firebase/?$",21],["^/lovable-vs-bolt/?$",21],["^/supabase-auth-vs-clerk/?$",21],["^/production-ready-ai-app-generators/?$",21],["^/supabase-rls-checkers-compared/?$",21],["^/supabase-security-tools-compared/?$",21],["^/mcp-servers-for-vercel-supabase-apps/?$",21],["^/ai-app-readiness-check/?$",21],["^/supabase-october-30-data-api-grants/?$",21],["^/supabase-max-client-connections-vercel/?$",21],["^/oauth-callback-mismatch-vercel-ai-apps/?$",21],["^/supabase-security-definer-function-anon/?$",21],["^/supabase-api-keys-publishable-secret/?$",21],["^/where-to-find-supabase-service-role-key/?$",21],["^/where-to-find-supabase-anon-key/?$",21],["^/how-to-test-a-lovable-app/?$",21],["^/stripe-webhooks-nextjs-supabase/?$",21],["^/stripe-webhook-no-signatures-found-matching-expected-signature/?$",21],["^/stripe-webhook-raw-body-nextjs-app-router/?$",21],["^/stripe-webhook-secret-test-vs-live/?$",21],["^/stripe-checkout-without-webhook/?$",21],["^/stripe-webhook-duplicate-events/?$",21],["^/stripe-subtlecryptoprovider-synchronous-context-supabase-edge-function/?$",21],["^/vercel-ai-built-apps/?$",21],["^/vercel-function-invocation-failed/?$",21],["^/vercel-function-timeout/?$",21],["^/vercel-404-on-refresh/?$",21],["^/next-public-env-vars-exposed/?$",21],["^/vercel-sensitive-environment-variables/?$",21],["^/supabase-vercel-integration-env-vars/?$",21],["^/supabase-permission-denied-for-table/?$",21],["^/supabase-url-and-key-are-required/?$",21],["^/stripe-payment-method-types-no-longer-supported/?$",21],["^/vercel-node-20-discontinued/?$",21],["^/clerk-supabase-third-party-auth/?$",21],["^/bolt-to-supabase-migration/?$",21],["^/lovable-security-scan/?$",21],["^/supabase-email-rate-limit-exceeded/?$",21],["^/nextjs-uncached-data-accessed-outside-of-suspense/?$",21],["^/clerk-keys-missing-from-environment/?$",21],["^/supabase-redirect-to-localhost/?$",21],["^/supabase-confirm-email-not-arriving/?$",21],["^/lovable-cloud-vs-supabase/?$",21],["^/supabase-storage-upload-rls-error/?$",21],["^/lovable-test-and-live-environments-retired/?$",21],["^/lovable-ai-deprecated-models/?$",21],["^/stripe-mcp-agent-api-key/?$",21],["^/railway-json-config-as-code-deprecated/?$",21],["^/supabase-new-row-violates-row-level-security-policy/?$",21],["^/supabase-edge-function-returned-a-non-2xx-status-code/?$",21],["^/supabase-invalid-api-key/?$",21],["^/nextjs-failed-to-collect-page-data/?$",21],["^/supabase-auth-session-missing/?$",21],["^/vercel-err-pnpm-outdated-lockfile/?$",21],["^/railway-supabase-connect-enetunreach/?$",21],["^/netlify-secrets-scanning-supabase-anon-key/?$",21],["^/resend-webhook-supabase-edge-function/?$",21],["^/supabase-error-sending-confirmation-email/?$",21],["^/openai-api-key-browser-like-environment/?$",21],["^/nextauth-no-secret-untrustedhost-vercel/?$",21],["^/better-auth-invalid-origin-vercel-preview/?$",21],["^/stripe-neither-apikey-nor-config-authenticator-provided/?$",21],["^/stripe-webhook-vercel-preview-deployment-protection/?$",21],["^/vercel-middleware-invocation-failed/?$",21],["^/supabase-infinite-recursion-detected-in-policy/?$",21],["^/supabase-jwt-expired/?$",21],["^/supabase-could-not-find-the-table-in-the-schema-cache/?$",21],["^/supabase-permission-denied-for-schema-public/?$",21],["^/vercel-deployment-not-found/?$",21],["^/nextjs-usesearchparams-should-be-wrapped-in-a-suspense-boundary/?$",21],["^/nextjs-failed-to-find-server-action/?$",21],["^/stripe-no-such-price/?$",21],["^/vite-failed-to-fetch-dynamically-imported-module/?$",21],["^/supabase-failed-to-send-a-request-to-the-edge-function/?$",21],["^/google-oauth-redirect-uri-mismatch-supabase/?$",21],["^/firebase-auth-unauthorized-domain-vercel/?$",21],["^/firebase-admin-invalid-pem-formatted-message-vercel/?$",21],["^/sentry-invalid-dsn-undefined/?$",21],["^/failed-to-load-module-script-mime-type-text-html/?$",21],["^/cloudflare-workers-supabase-too-many-subrequests/?$",21],["^/neon-too-many-connections-vercel/?$",21],["^/ai-sdk-stream-cut-off-vercel/?$",21],["^/paddle-webhook-signature-verification-failed/?$",21],["^/posthog-project-api-key-public/?$",21],["^/railway-october-21-2026-security-incident/?$",21],["^/nextjs-security-release-november-2026/?$",21],["^/clerk-secret-key-not-showing/?$",21],["^/clerk-test-email-not-received/?$",21],["^/check-supabase-service-role-key-in-client-code/?$",21],["^/vite-env-variables-exposed/?$",21],["^/find-env-vars-missing-in-vercel-production/?$",21],["^/find-supabase-tables-anon-can-read/?$",21],["^/find-supabase-queries-without-limit/?$",21],["^/check-api-routes-rate-limiting/?$",21],["^/check-nextjs-content-security-policy/?$",21],["^/check-env-file-committed-to-git/?$",21],["^/supabase-migrations-match-production/?$",21],["^/supabase-orioledb-public-beta/?$",21],["^/supabase-compute-private-alpha/?$",21],["^/supabase-mcp-server-for-your-app/?$",21],["^/supabase-multiple-local-projects-without-docker/?$",21],["^/supabase-personal-access-token-scopes/?$",21],["^/vercel-ci-beta/?$",21],["^/nextjs-bundle-optimizer-skill/?$",21],["^/vercel-public-prefix-cannot-use-visibility-secret/?$",21],["^/suShowing the first 20,000 characters. Full output is available in raw details.
Recorded tool call
{
"type": "tool_call",
"seq": 42,
"ts": "2026-11-02T12:29:20.012Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 10 https://viberaven.dev/refund | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | grep -iE \"pric|free|paid|plan|refund|\\\\$[0-9]\" | head -30; echo \"===TRY===\"; curl -sL --max-time 10 https://viberaven.dev/try | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | grep -iE \"pric|free|scan|upload|api\" | head -20"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-989b02f22781ec9c",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 46,
"ts": "2026-11-02T12:29:21.620Z",
"turn": 1,
"output": {
"content": [
{
"text": "===TRY===\n var map = {\"files\":[[\"/assets/TryPage-B9NZTFM8.js\",\"/assets/TryPage-Dtf8V24-.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/sparkles-ynRRiv4N.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/checkout-DFdsG5yD.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/start-site-Cesn_0Ds.js\",\"/assets/start-site-Cl5MZ6t3.css\",\"/assets/install-DSLCxTZO.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\",\"/assets/localWorkspace-DcVf6TVH.js\"],[\"/assets/StartPage-RegPAnpB.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/rocket-C9dVuyCS.js\",\"/assets/start-site-Cesn_0Ds.js\",\"/assets/start-site-Cl5MZ6t3.css\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\"],[\"/assets/PackPage-De0lxcpq.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/LoginPage-CVDL2Ee7.js\",\"/assets/LoginPage-kUI9BP_F.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SignupPage-DM8ZnYmq.js\",\"/assets/LoginPage-CVDL2Ee7.js\",\"/assets/LoginPage-kUI9BP_F.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/PricingPage-C4H0fh6Q.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/checkout-DFdsG5yD.js\",\"/assets/api-DbQpyuc8.js\"],[\"/assets/AgenciesPage-jjsh5HX9.js\",\"/assets/AgenciesPage-bSOM0r7a.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\"],[\"/assets/TermsPage-BgtVXHmf.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/PrivacyPage-eEyLghug.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/RefundPage-CK9KA4X2.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/ConnectPage-DMHhAQv2.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/ContinuePage-D5oOXqCW.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/AccountPage-D7dL4LgL.js\",\"/assets/AccountPage-nmOexx7Z.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/product-bold-B-b8tb-Z.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/deployCockpitEnabled-CcKahKBG.js\",\"/assets/localWorkspace-DcVf6TVH.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/WorkspacePage-nXKijDV3.js\",\"/assets/WorkspacePage-B6_gyRzi.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/product-bold-B-b8tb-Z.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/sparkles-ynRRiv4N.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/runnerConnectCommand-C9JupLjP.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\",\"/assets/localWorkspace-DcVf6TVH.js\"],[\"/assets/DeployPage-CZWP8OjU.js\",\"/assets/DeployPage-CRrRlyq6.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/deployCockpitEnabled-CcKahKBG.js\",\"/assets/localWorkspace-DcVf6TVH.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/runnerConnectCommand-C9JupLjP.js\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/DocsPage-C6xoAeKM.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\",\"/assets/square-terminal-C1LyGiIp.js\"],[\"/assets/DocsPage-C6xoAeKM.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\",\"/assets/square-terminal-C1LyGiIp.js\"],[\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\"],[\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\"],[\"/assets/ErrorHubPage-DJWOnRi8.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/triangle-alert-C2Hjq23G.js\"],[\"/assets/AiBuiltAppProductionPage-COSHy5SN.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SupabaseRlsCheckerPage-Iv-x49Hl.js\",\"/assets/SupabaseRlsCheckerPage-DvAM0QGe.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\"],[\"/assets/GuidesPage-CtTzZyxD.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/rocket-C9dVuyCS.js\",\"/assets/triangle-alert-C2Hjq23G.js\",\"/assets/blogPosts-Bm-IU3-2.js\"]],\"routes\":[[\"^/try/?$\",0],[\"^/start/?$\",1],[\"^/pack/?$\",2],[\"^/login/?$\",3],[\"^/signup/?$\",4],[\"^/pricing/?$\",5],[\"^/agencies/?$\",6],[\"^/terms/?$\",7],[\"^/privacy/?$\",8],[\"^/refund/?$\",9],[\"^/connect/?$\",10],[\"^/continue/?$\",11],[\"^/account/?$\",12],[\"^/app/?$\",13],[\"^/app/[^/]+/?$\",13],[\"^/deploy/?$\",14],[\"^/deploy/[^/]+/?$\",14],[\"^/docs/?$\",15],[\"^/docs/[^/]+/?$\",16],[\"^/blog/?$\",17],[\"^/blog/[^/]+/?$\",18],[\"^/errors/?$\",19],[\"^/errors/[^/]+/?$\",19],[\"^/ai-built-app-to-production/?$\",20],[\"^/npx-viberaven/?$\",21],[\"^/npm-viberaven-cli/?$\",21],[\"^/production-ready-ai-workflow/?$\",21],[\"^/ai-app-production-checklist/?$\",21],[\"^/vibe-coding-launch-checklist/?$\",21],[\"^/cursor-ai-coding-extension/?$\",21],[\"^/vscode-ai-coding-extension/?$\",21],[\"^/cursor-production-readiness-checklist/?$\",21],[\"^/saas-starter-kit-alternative/?$\",21],[\"^/claude-code-ignores-project-rules/?$\",21],[\"^/claude-code-production-checklist/?$\",21],[\"^/codex-production-readiness/?$\",21],[\"^/lovable-app-launch-checklist/?$\",21],[\"^/supabase-ai-app-production-checklist/?$\",21],[\"^/stripe-webhook-checklist-ai-apps/?$\",21],[\"^/production-readiness-scanner/?$\",21],[\"^/ai-app-auth-production-checklist/?$\",21],[\"^/stripe-live-mode-checklist-ai-apps/?$\",21],[\"^/supabase-auth-rls-checklist-ai-apps/?$\",21],[\"^/vercel-preview-to-production-checklist/?$\",21],[\"^/error-monitoring-launch-checklist-ai-apps/?$\",21],[\"^/clerk-production-checklist-ai-apps/?$\",21],[\"^/authjs-production-checklist-ai-apps/?$\",21],[\"^/polar-billing-production-checklist/?$\",21],[\"^/paddle-webhook-checklist-ai-apps/?$\",21],[\"^/neon-postgres-production-checklist-ai-apps/?$\",21],[\"^/firebase-launch-checklist-ai-apps/?$\",21],[\"^/cloudflare-workers-production-checklist/?$\",21],[\"^/posthog-events-not-showing-vite-vercel/?$\",21],[\"^/sentry-setup-checklist-ai-apps/?$\",21],[\"^/do-ai-built-apps-need-sentry/?$\",21],[\"^/what-is-rls-supabase-ai-apps/?$\",21],[\"^/vercel-environment-variables-checklist-ai-apps/?$\",21],[\"^/production-ready-ai-workflow/?$\",21],[\"^/how-to-launch-ai-app-safely/?$\",21],[\"^/lovable-app-production-gaps/?$\",21],[\"^/ai-code-review-vs-launch-readiness/?$\",21],[\"^/saas-starter-kit-alternative-existing-app/?$\",21],[\"^/best-ai-app-production-readiness-tools/?$\",21],[\"^/ai-app-launch-gap-index/?$\",21],[\"^/we-ran-viberaven-on-a-real-ai-built-app/?$\",21],[\"^/viberaven-vs-code-review-tools/?$\",21],[\"^/viberaven-vs-saas-starter-kits/?$\",21],[\"^/viberaven-vs-cursor-production-prompts/?$\",21],[\"^/ai-visibility-prompt-tracker/?$\",21],[\"^/ai-search-resources/?$\",21],[\"^/prompt-check-ai-app-production-ready/?$\",21],[\"^/prompt-cursor-before-launching-saas/?$\",21],[\"^/prompt-claude-code-fix-production-gaps/?$\",21],[\"^/viberaven-vs-sentry/?$\",21],[\"^/viberaven-vs-vercel-checks/?$\",21],[\"^/viberaven-vs-supabase-advisor/?$\",21],[\"^/viberaven-vs-manual-launch-checklist/?$\",21],[\"^/viberaven-vs-claude-code-agents/?$\",21],[\"^/bolt-production-readiness-checklist/?$\",21],[\"^/windsurf-production-checklist/?$\",21],[\"^/gemini-cli-production-checklist/?$\",21],[\"^/example-scan-stripe-checkout-app/?$\",21],[\"^/example-scan-lovable-mvp/?$\",21],[\"^/example-scan-nextjs-supabase-vercel/?$\",21],[\"^/cursor-production-readiness/?$\",21],[\"^/claude-code-launch-readiness/?$\",21],[\"^/codex-launch-readiness/?$\",21],[\"^/lovable-supabase-app-launch-checklist/?$\",21],[\"^/find-supabase-tables-missing-rls/?$\",21],[\"^/repo-scan-vs-live-supabase-security-test/?$\",21],[\"^/ai-built-app-client-handoff-checklist/?$\",21],[\"^/check-stripe-webhooks-env-vars-supabase-policies/?$\",21],[\"^/supabase-vs-neon/?$\",21],[\"^/posthog-vs-google-analytics/?$\",21],[\"^/supabase-vs-firebase/?$\",21],[\"^/lovable-vs-bolt/?$\",21],[\"^/supabase-auth-vs-clerk/?$\",21],[\"^/production-ready-ai-app-generators/?$\",21],[\"^/supabase-rls-checkers-compared/?$\",21],[\"^/supabase-security-tools-compared/?$\",21],[\"^/mcp-servers-for-vercel-supabase-apps/?$\",21],[\"^/ai-app-readiness-check/?$\",21],[\"^/supabase-october-30-data-api-grants/?$\",21],[\"^/supabase-max-client-connections-vercel/?$\",21],[\"^/oauth-callback-mismatch-vercel-ai-apps/?$\",21],[\"^/supabase-security-definer-function-anon/?$\",21],[\"^/supabase-api-keys-publishable-secret/?$\",21],[\"^/where-to-find-supabase-service-role-key/?$\",21],[\"^/where-to-find-supabase-anon-key/?$\",21],[\"^/how-to-test-a-lovable-app/?$\",21],[\"^/stripe-webhooks-nextjs-supabase/?$\",21],[\"^/stripe-webhook-no-signatures-found-matching-expected-signature/?$\",21],[\"^/stripe-webhook-raw-body-nextjs-app-router/?$\",21],[\"^/stripe-webhook-secret-test-vs-live/?$\",21],[\"^/stripe-checkout-without-webhook/?$\",21],[\"^/stripe-webhook-duplicate-events/?$\",21],[\"^/stripe-subtlecryptoprovider-synchronous-context-supabase-edge-function/?$\",21],[\"^/vercel-ai-built-apps/?$\",21],[\"^/vercel-function-invocation-failed/?$\",21],[\"^/vercel-function-timeout/?$\",21],[\"^/vercel-404-on-refresh/?$\",21],[\"^/next-public-env-vars-exposed/?$\",21],[\"^/vercel-sensitive-environment-variables/?$\",21],[\"^/supabase-vercel-integration-env-vars/?$\",21],[\"^/supabase-permission-denied-for-table/?$\",21],[\"^/supabase-url-and-key-are-required/?$\",21],[\"^/stripe-payment-method-types-no-longer-supported/?$\",21],[\"^/vercel-node-20-discontinued/?$\",21],[\"^/clerk-supabase-third-party-auth/?$\",21],[\"^/bolt-to-supabase-migration/?$\",21],[\"^/lovable-security-scan/?$\",21],[\"^/supabase-email-rate-limit-exceeded/?$\",21],[\"^/nextjs-uncached-data-accessed-outside-of-suspense/?$\",21],[\"^/clerk-keys-missing-from-environment/?$\",21],[\"^/supabase-redirect-to-localhost/?$\",21],[\"^/supabase-confirm-email-not-arriving/?$\",21],[\"^/lovable-cloud-vs-supabase/?$\",21],[\"^/supabase-storage-upload-rls-error/?$\",21],[\"^/lovable-test-and-live-environments-retired/?$\",21],[\"^/lovable-ai-deprecated-models/?$\",21],[\"^/stripe-mcp-agent-api-key/?$\",21],[\"^/railway-json-config-as-code-deprecated/?$\",21],[\"^/supabase-new-row-violates-row-level-security-policy/?$\",21],[\"^/supabase-edge-function-returned-a-non-2xx-status-code/?$\",21],[\"^/supabase-invalid-api-key/?$\",21],[\"^/nextjs-failed-to-collect-page-data/?$\",21],[\"^/supabase-auth-session-missing/?$\",21],[\"^/vercel-err-pnpm-outdated-lockfile/?$\",21],[\"^/railway-supabase-connect-enetunreach/?$\",21],[\"^/netlify-secrets-scanning-supabase-anon-key/?$\",21],[\"^/resend-webhook-supabase-edge-function/?$\",21],[\"^/supabase-error-sending-confirmation-email/?$\",21],[\"^/openai-api-key-browser-like-environment/?$\",21],[\"^/nextauth-no-secret-untrustedhost-vercel/?$\",21],[\"^/better-auth-invalid-origin-vercel-preview/?$\",21],[\"^/stripe-neither-apikey-nor-config-authenticator-provided/?$\",21],[\"^/stripe-webhook-vercel-preview-deployment-protection/?$\",21],[\"^/vercel-middleware-invocation-failed/?$\",21],[\"^/supabase-infinite-recursion-detected-in-policy/?$\",21],[\"^/supabase-jwt-expired/?$\",21],[\"^/supabase-could-not-find-the-table-in-the-schema-cache/?$\",21],[\"^/supabase-permission-denied-for-schema-public/?$\",21],[\"^/vercel-deployment-not-found/?$\",21],[\"^/nextjs-usesearchparams-should-be-wrapped-in-a-suspense-boundary/?$\",21],[\"^/nextjs-failed-to-find-server-action/?$\",21],[\"^/stripe-no-such-price/?$\",21],[\"^/vite-failed-to-fetch-dynamically-imported-module/?$\",21],[\"^/supabase-failed-to-send-a-request-to-the-edge-function/?$\",21],[\"^/google-oauth-redirect-uri-mismatch-supabase/?$\",21],[\"^/firebase-auth-unauthorized-domain-vercel/?$\",21],[\"^/firebase-admin-invalid-pem-formatted-message-vercel/?$\",21],[\"^/sentry-invalid-dsn-undefined/?$\",21],[\"^/failed-to-load-module-script-mime-type-text-html/?$\",21],[\"^/cloudflare-workers-supabase-too-many-subrequests/?$\",21],[\"^/neon-too-many-connections-vercel/?$\",21],[\"^/ai-sdk-stream-cut-off-vercel/?$\",21],[\"^/paddle-webhook-signature-verification-failed/?$\",21],[\"^/posthog-project-api-key-public/?$\",21],[\"^/railway-october-21-2026-security-incident/?$\",21],[\"^/nextjs-security-release-november-2026/?$\",21],[\"^/clerk-secret-key-not-showing/?$\",21],[\"^/clerk-test-email-not-received/?$\",21],[\"^/check-supabase-service-role-key-in-client-code/?$\",21],[\"^/vite-env-variables-exposed/?$\",21],[\"^/find-env-vars-missing-in-vercel-production/?$\",21],[\"^/find-supabase-tables-anon-can-read/?$\",21],[\"^/find-supabase-queries-without-limit/?$\",21],[\"^/check-api-routes-rate-limiting/?$\",21],[\"^/check-nextjs-content-security-policy/?$\",21],[\"^/check-env-file-committed-to-git/?$\",21],[\"^/supabase-migrations-match-production/?$\",21],[\"^/supabase-orioledb-public-beta/?$\",21],[\"^/supabase-compute-private-alpha/?$\",21],[\"^/supabase-mcp-server-for-your-app/?$\",21],[\"^/supabase-multiple-local-projects-without-docker/?$\",21],[\"^/supabase-personal-access-token-scopes/?$\",21],[\"^/vercel-ci-beta/?$\",21],[\"^/nextjs-bundle-optimizer-skill/?$\",21],[\"^/vercel-public-prefix-cannot-use-visibility-secret/?$\",21],[\"^/supabase-no-api-key-found-in-request/?$\",21],[\"^/nextjs-dynamic-not-compatible-with-cache-components/?$\",21],[\"^/lovable-app-monitoring/?$\",21],[\"^/authjs-untrusted-host/?$\",21],[\"^/authjs-missing-secret/?$\",21],[\"^/polar-webhook-verification-nextjs/?$\",21],[\"^/lemon-squeezy-webhook-signature-nextjs/?$\",21],[\"^/firestore-security-rules-public/?$\",21],[\"^/sentry-source-maps-nextjs-vercel/?$\",21],[\"^/supabase-service-role-key-exposed-env-file/?$\",21],[\"^/supabase-select-returns-empty-array/?$\",21],[\"^/supabase-pgrst116-cannot-coerce-the-result-to-a-single-json-object/?$\",21],[\"^/vercel-environment-variable-new-deployment-needed/?$\",21],[\"^/fastapi-no-entrypoint-found-vercel/?$\",21],[\"^/fastapi-modulenotfounderror-no-module-named-vercel/?$\",21],[\"^/fastapi-cors-access-control-allow-origin-missing-vercel/?$\",21],[\"^/rails-missing-secret-key-base-production/?$\",21],[\"^/rails-blocked-hosts-config-hosts-custom-domain/?$\",21],[\"^/rails-supabase-prepared-statement-already-exists/?$\",21],[\"^/go-vercel-could-not-find-an-exported-function/?$\",21],[\"^/go-pgx-prepared-statement-already-exists-supabase/?$\",21],[\"^/go-supabase-jwt-signing-method-es256-is-invalid/?$\",21],[\"^/react-minified-error-185-maximum-update-depth-exceeded/?$\",21],[\"^/react-minified-error-418-hydration-failed/?$\",21],[\"^/react-router-usenavigate-may-be-used-only-in-the-context-of-a-router/?$\",21],[\"^/logrocket-not-recording-sessions-nextjs-vercel/?$\",21],[\"^/logrocket-script-could-not-load-valid-network-connection/?$\",21],[\"^/logrocket-sanitize-passwords-tokens-pii-recordings/?$\",21],[\"^/storybook-environment-variables-undefined/?$\",21],[\"^/storybook-invariant-expected-app-router-to-be-mounted/?$\",21],[\"^/storybook-vercel-404-not-found/?$\",21],[\"^/playwright-browsertype-launch-executable-doesnt-exist/?$\",21],[\"^/playwright-vercel-preview-deployment-protection-bypass/?$\",21],[\"^/playwright-timed-out-waiting-from-config-webserver/?$\",21],[\"^/turnstile-siteverify-timeout-or-duplicate/?$\",21],[\"^/supabase-captcha-protection-request-disallowed-no-captcha-token/?$\",21],[\"^/vercel-botid-possible-misconfiguration-checkbotid/?$\",21],[\"^/sveltekit-cannot-import-env-static-private-into-browser-code/?$\",21],[\"^/sveltekit-is-not-exported-by-virtual-env-static-private/?$\",21],[\"^/sveltekit-cross-site-post-form-submissions-are-forbidden/?$\",21],[\"^/nuxt-runtimeconfig-undefined-in-production/?$\",21],[\"^/nuxt-supabase-missing-nuxt-public-supabase-url/?$\",21],[\"^/nuxt-hydration-completed-but-contains-mismatches/?$\",21],[\"^/angular-vercel-404-not-found/?$\",21],[\"^/angular-process-is-not-defined-environment-variables-vercel/?$\",21],[\"^/angular-ng0507-html-content-altered-after-server-side-rendering/?$\",21],[\"^/vitest-env-variables-undefined-import-meta-env/?$\",21],[\"^/vitest-referenceerror-document-is-not-defined/?$\",21],[\"^/vitest-failed-to-resolve-import-path-alias/?$\",21],[\"^/neon-no-database-connection-string-provided-to-neon/?$\",21],[\"^/neon-prisma-p1002-advisory-lock-timeout-migrate/?$\",21],[\"^/neon-prisma-p1001-cant-reach-database-server/?$\",21],[\"^/firebase-auth-invalid-api-key-vercel/?$\",21],[\"^/firestore-missing-or-insufficient-permissions/?$\",21],[\"^/firebase-admin-could-not-load-the-default-credentials-vercel/?$\",21],[\"^/posthog-node-events-lost-vercel-flush/?$\",21],[\"^/posthog-reverse-proxy-nextjs-vercel/?$\",21],[\"^/posthog-getfeatureflag-undefined-first-load/?$\",21],[\"^/sentry-nextjs-server-errors-not-captured-onrequesterror/?$\",21],[\"^/sentry-err-blocked-by-client-tunnelroute-nextjs/?$\",21],[\"^/sentry-vite-plugin-no-auth-token-provided/?$\",21],[\"^/clerk-auth-was-called-but-cant-detect-clerkmiddleware/?$\",21],[\"^/clerk-refreshing-session-token-infinite-redirect-loop/?$\",21],[\"^/clerk-production-keys-are-only-allowed-for-domain/?$\",21],[\"^/paddle-js-checkout-not-opening-sandbox-environment/?$\",21],[\"^/paddle-grant-access-transaction-completed-vs-subscription-activated/?$\",21],[\"^/polar-api-returned-an-error-401-sandbox-production-token/?$\",21],[\"^/cloudflare-workers-referenceerror-process-is-not-defined/?$\",21],[\"^/cloudflare-workers-no-such-module-node-nodejs-compat/?$\",21],[\"^/cloudflare-workers-cannot-perform-io-on-behalf-of-a-different-request/?$\",21],[\"^/netlify-page-not-found-single-page-app/?$\",21],[\"^/netlify-function-process-env-undefined/?$\",21],[\"^/netlify-vite-env-vars-undefined/?$\",21],[\"^/aws-s3-presigned-url-cors-no-access-control-allow-origin/?$\",21],[\"^/aws-s3-presigned-put-signature-does-not-match/?$\",21],[\"^/aws-s3-could-not-load-credentials-from-any-providers/?$\",21],[\"^/github-gh013-push-cannot-contain-secrets/?$\",21],[\"^/github-secret-scanning-alert-leaked-api-key/?$\",21],[\"^/github-actions-secret-empty-fork-dependabot/?$\",21],[\"^/resend-you-can-only-send-testing-emails-to-your-own-email-address/?$\",21],[\"^/resend-missing-api-key-pass-it-to-the-constructor/?$\",21],[\"^/resend-domain-not-verifying-dns-records/?$\",21],[\"^/better-auth-you-are-using-the-default-secret/?$\",21],[\"^/better-auth-redirect-uri-mismatch-vercel/?$\",21],[\"^/better-auth-database-schema-mismatch-missing-tables/?$\",21],[\"^/turso-libsql-server-error-401/?$\",21],[\"^/turso-libsql-url-invalid-undefined/?$\",21],[\"^/turso-drizzle-kit-required-params-turso-dialect/?$\",21],[\"^/auth0-callback-url-mismatch-vercel-nextjs/?$\",21],[\"^/auth0-not-all-required-options-were-provided/?$\",21],[\"^/auth0-nextjs-state-parameter-is-invalid/?$\",21],[\"^/upstash-redis-unable-to-find-environment-variable/?$\",21],[\"^/upstash-redis-wrongpass-invalid-or-missing-auth-token/?$\",21],[\"^/upstash-ratelimit-nextjs-api-route-vercel/?$\",21],[\"^/mongodb-server-selection-error-vercel-atlas/?$\",21],[\"^/mongodb-parse-error-invalid-scheme-vercel/?$\",21],[\"^/mongoose-buffering-timed-out-vercel/?$\",21],[\"^/planetscale-direct-ddl-is-disabled/?$\",21],[\"^/planetscale-foreign-keys-cannot-be-created-prisma/?$\",21],[\"^/planetscale-fetch-failed-enotfound-undefined/?$\",21],[\"^/render-port-scan-timeout-no-open-ports-detected/?$\",21],[\"^/render-supabase-connect-enetunreach/?$\",21],[\"^/render-vite-env-vars-undefined-static-site/?$\",21],[\"^/supabase-policy-using-true/?$\",21],[\"^/supabase-anon-key-safe-to-expose/?$\",21],[\"^/supabase-service-role-key-leaked/?$\",21],[\"^/supabase-realtime-not-working/?$\",21],[\"^/supabase-rls-not-working/?$\",21],[\"^/supabase-rls-using-vs-with-check/?$\",21],[\"^/test-supabase-rls-policies/?$\",21],[\"^/is-supabase-safe-for-production/?$\",21],[\"^/supabase-security-advisor-warnings/?$\",21],[\"^/supabase-rls-disabled-in-public/?$\",21],[\"^/supabase-security-definer-view/?$\",21],[\"^/supabase-function-search-path-mutable/?$\",21],[\"^/supabase-rls-enabled-no-policy/?$\",21],[\"^/supabase-permissive-rls-policy/?$\",21],[\"^/supabase-sensitive-columns-exposed/?$\",21],[\"^/supabase-auth-rls-initplan/?$\",21],[\"^/supabase-authenticated-security-definer-function-executable/?$\",21],[\"^/i-vibe-coded-an-app-now-what/?$\",21],[\"^/how-to-secure-a-vibe-coded-app/?$\",21],[\"^/how-to-deploy-a-vibe-coded-app/?$\",21],[\"^/is-vibe-coding-production-ready/?$\",21],[\"^/vibe-coding-security-risks/?$\",21],[\"^/vibe-coding-horror-stories/?$\",21],[\"^/claude-code-security-vs-pre-deploy-review/?$\",21],[\"^/supabase-rls-checker/?$\",22],[\"^/guides/?$\",23]]};\n\n[Showing lines 4-5 of 5 (50.0KB limit). Full output: /tmp/pi-bash-154da661cf4937cd.log]",
"type": "text"
}
],
"details": {
"truncation": {
"content": "===TRY===\n var map = {\"files\":[[\"/assets/TryPage-B9NZTFM8.js\",\"/assets/TryPage-Dtf8V24-.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/sparkles-ynRRiv4N.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/checkout-DFdsG5yD.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/start-site-Cesn_0Ds.js\",\"/assets/start-site-Cl5MZ6t3.css\",\"/assets/install-DSLCxTZO.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\",\"/assets/localWorkspace-DcVf6TVH.js\"],[\"/assets/StartPage-RegPAnpB.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/rocket-C9dVuyCS.js\",\"/assets/start-site-Cesn_0Ds.js\",\"/assets/start-site-Cl5MZ6t3.css\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\"],[\"/assets/PackPage-De0lxcpq.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/LoginPage-CVDL2Ee7.js\",\"/assets/LoginPage-kUI9BP_F.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SignupPage-DM8ZnYmq.js\",\"/assets/LoginPage-CVDL2Ee7.js\",\"/assets/LoginPage-kUI9BP_F.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/PricingPage-C4H0fh6Q.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/checkout-DFdsG5yD.js\",\"/assets/api-DbQpyuc8.js\"],[\"/assets/AgenciesPage-jjsh5HX9.js\",\"/assets/AgenciesPage-bSOM0r7a.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\"],[\"/assets/TermsPage-BgtVXHmf.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/PrivacyPage-eEyLghug.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/RefundPage-CK9KA4X2.js\",\"/assets/useSelfCanonical-B_kRGoyX.js\",\"/assets/useSelfCanonical-CZAR1RLv.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/ConnectPage-DMHhAQv2.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/ContinuePage-D5oOXqCW.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/AccountPage-D7dL4LgL.js\",\"/assets/AccountPage-nmOexx7Z.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/product-bold-B-b8tb-Z.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/deployCockpitEnabled-CcKahKBG.js\",\"/assets/localWorkspace-DcVf6TVH.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/WorkspacePage-nXKijDV3.js\",\"/assets/WorkspacePage-B6_gyRzi.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/product-bold-B-b8tb-Z.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/sparkles-ynRRiv4N.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/runnerConnectCommand-C9JupLjP.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/providerCatalog-B9p3A1Uu.js\",\"/assets/localWorkspace-DcVf6TVH.js\"],[\"/assets/DeployPage-CZWP8OjU.js\",\"/assets/DeployPage-CRrRlyq6.css\",\"/assets/supabase-BNvpmc4Q.js\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/deployCockpitEnabled-CcKahKBG.js\",\"/assets/localWorkspace-DcVf6TVH.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/runnerConnectCommand-C9JupLjP.js\",\"/assets/GoogleAuthButton-DFjwa2AV.js\",\"/assets/api-DbQpyuc8.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/DocsPage-C6xoAeKM.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\",\"/assets/square-terminal-C1LyGiIp.js\"],[\"/assets/DocsPage-C6xoAeKM.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\",\"/assets/square-terminal-C1LyGiIp.js\"],[\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\"],[\"/assets/BlogPage-Bi_62iZG.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/blogPosts-Bm-IU3-2.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/NotFoundPage-DBtbqJMv.js\",\"/assets/install-DSLCxTZO.js\"],[\"/assets/ErrorHubPage-DJWOnRi8.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/triangle-alert-C2Hjq23G.js\"],[\"/assets/AiBuiltAppProductionPage-COSHy5SN.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\"],[\"/assets/SupabaseRlsCheckerPage-Iv-x49Hl.js\",\"/assets/SupabaseRlsCheckerPage-DvAM0QGe.css\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/lock-D-9bWXVe.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\"],[\"/assets/GuidesPage-CtTzZyxD.js\",\"/assets/connect-site-CP9Fp1fI.css\",\"/assets/guide-site-BoQPU2fc.css\",\"/assets/StudioShell-C_qPVT0n.js\",\"/assets/StudioShell-ba0KtLZP.css\",\"/assets/studio-site-DkkWD_on.js\",\"/assets/studio-site-BaZR-8tw.css\",\"/assets/indexPolicy-hnkszB43.js\",\"/assets/arrow-left-Ck8HA5H6.js\",\"/assets/check-BlFbnIHr.js\",\"/assets/copy-D9wmpdpv.js\",\"/assets/SeoGrowthPage-DZ_2ww4O.js\",\"/assets/circle-alert-B63bO4Nx.js\",\"/assets/scan-search-CnPexUSZ.js\",\"/assets/square-terminal-C1LyGiIp.js\",\"/assets/vrShell-CWvEuzU6.js\",\"/assets/ArticleAuthor-yZQ7zZ9E.js\",\"/assets/rlsCheckerPage-C294pEZK.js\",\"/assets/routeSchema-Ctcn5Gil.js\",\"/assets/useRobots-B1ZGCCPV.js\",\"/assets/layers-7LF4IaO9.js\",\"/assets/rocket-C9dVuyCS.js\",\"/assets/triangle-alert-C2Hjq23G.js\",\"/assets/blogPosts-Bm-IU3-2.js\"]],\"routes\":[[\"^/try/?$\",0],[\"^/start/?$\",1],[\"^/pack/?$\",2],[\"^/login/?$\",3],[\"^/signup/?$\",4],[\"^/pricing/?$\",5],[\"^/agencies/?$\",6],[\"^/terms/?$\",7],[\"^/privacy/?$\",8],[\"^/refund/?$\",9],[\"^/connect/?$\",10],[\"^/continue/?$\",11],[\"^/account/?$\",12],[\"^/app/?$\",13],[\"^/app/[^/]+/?$\",13],[\"^/deploy/?$\",14],[\"^/deploy/[^/]+/?$\",14],[\"^/docs/?$\",15],[\"^/docs/[^/]+/?$\",16],[\"^/blog/?$\",17],[\"^/blog/[^/]+/?$\",18],[\"^/errors/?$\",19],[\"^/errors/[^/]+/?$\",19],[\"^/ai-built-app-to-production/?$\",20],[\"^/npx-viberaven/?$\",21],[\"^/npm-viberaven-cli/?$\",21],[\"^/production-ready-ai-workflow/?$\",21],[\"^/ai-app-production-checklist/?$\",21],[\"^/vibe-coding-launch-checklist/?$\",21],[\"^/cursor-ai-coding-extension/?$\",21],[\"^/vscode-ai-coding-extension/?$\",21],[\"^/cursor-production-readiness-checklist/?$\",21],[\"^/saas-starter-kit-alternative/?$\",21],[\"^/claude-code-ignores-project-rules/?$\",21],[\"^/claude-code-production-checklist/?$\",21],[\"^/codex-production-readiness/?$\",21],[\"^/lovable-app-launch-checklist/?$\",21],[\"^/supabase-ai-app-production-checklist/?$\",21],[\"^/stripe-webhook-checklist-ai-apps/?$\",21],[\"^/production-readiness-scanner/?$\",21],[\"^/ai-app-auth-production-checklist/?$\",21],[\"^/stripe-live-mode-checklist-ai-apps/?$\",21],[\"^/supabase-auth-rls-checklist-ai-apps/?$\",21],[\"^/vercel-preview-to-production-checklist/?$\",21],[\"^/error-monitoring-launch-checklist-ai-apps/?$\",21],[\"^/clerk-production-checklist-ai-apps/?$\",21],[\"^/authjs-production-checklist-ai-apps/?$\",21],[\"^/polar-billing-production-checklist/?$\",21],[\"^/paddle-webhook-checklist-ai-apps/?$\",21],[\"^/neon-postgres-production-checklist-ai-apps/?$\",21],[\"^/firebase-launch-checklist-ai-apps/?$\",21],[\"^/cloudflare-workers-production-checklist/?$\",21],[\"^/posthog-events-not-showing-vite-vercel/?$\",21],[\"^/sentry-setup-checklist-ai-apps/?$\",21],[\"^/do-ai-built-apps-need-sentry/?$\",21],[\"^/what-is-rls-supabase-ai-apps/?$\",21],[\"^/vercel-environment-variables-checklist-ai-apps/?$\",21],[\"^/production-ready-ai-workflow/?$\",21],[\"^/how-to-launch-ai-app-safely/?$\",21],[\"^/lovable-app-production-gaps/?$\",21],[\"^/ai-code-review-vs-launch-readiness/?$\",21],[\"^/saas-starter-kit-alternative-existing-app/?$\",21],[\"^/best-ai-app-production-readiness-tools/?$\",21],[\"^/ai-app-launch-gap-index/?$\",21],[\"^/we-ran-viberaven-on-a-real-ai-built-app/?$\",21],[\"^/viberaven-vs-code-review-tools/?$\",21],[\"^/viberaven-vs-saas-starter-kits/?$\",21],[\"^/viberaven-vs-cursor-production-prompts/?$\",21],[\"^/ai-visibility-prompt-tracker/?$\",21],[\"^/ai-search-resources/?$\",21],[\"^/prompt-check-ai-app-production-ready/?$\",21],[\"^/prompt-cursor-before-launching-saas/?$\",21],[\"^/prompt-claude-code-fix-production-gaps/?$\",21],[\"^/viberaven-vs-sentry/?$\",21],[\"^/viberaven-vs-vercel-checks/?$\",21],[\"^/viberaven-vs-supabase-advisor/?$\",21],[\"^/viberaven-vs-manual-launch-checklist/?$\",21],[\"^/viberaven-vs-claude-code-agents/?$\",21],[\"^/bolt-production-readiness-checklist/?$\",21],[\"^/windsurf-production-checklist/?$\",21],[\"^/gemini-cli-production-checklist/?$\",21],[\"^/example-scan-stripe-checkout-app/?$\",21],[\"^/example-scan-lovable-mvp/?$\",21],[\"^/example-scan-nextjs-supabase-vercel/?$\",21],[\"^/cursor-production-readiness/?$\",21],[\"^/claude-code-launch-readiness/?$\",21],[\"^/codex-launch-readiness/?$\",21],[\"^/lovable-supabase-app-launch-checklist/?$\",21],[\"^/find-supabase-tables-missing-rls/?$\",21],[\"^/repo-scan-vs-live-supabase-security-test/?$\",21],[\"^/ai-built-app-client-handoff-checklist/?$\",21],[\"^/check-stripe-webhooks-env-vars-supabase-policies/?$\",21],[\"^/supabase-vs-neon/?$\",21],[\"^/posthog-vs-google-analytics/?$\",21],[\"^/supabase-vs-firebase/?$\",21],[\"^/lovable-vs-bolt/?$\",21],[\"^/supabase-auth-vs-clerk/?$\",21],[\"^/production-ready-ai-app-generators/?$\",21],[\"^/supabase-rls-checkers-compared/?$\",21],[\"^/supabase-security-tools-compared/?$\",21],[\"^/mcp-servers-for-vercel-supabase-apps/?$\",21],[\"^/ai-app-readiness-check/?$\",21],[\"^/supabase-october-30-data-api-grants/?$\",21],[\"^/supabase-max-client-connections-vercel/?$\",21],[\"^/oauth-callback-mismatch-vercel-ai-apps/?$\",21],[\"^/supabase-security-definer-function-anon/?$\",21],[\"^/supabase-api-keys-publishable-secret/?$\",21],[\"^/where-to-find-supabase-service-role-key/?$\",21],[\"^/where-to-find-supabase-anon-key/?$\",21],[\"^/how-to-test-a-lovable-app/?$\",21],[\"^/stripe-webhooks-nextjs-supabase/?$\",21],[\"^/stripe-webhook-no-signatures-found-matching-expected-signature/?$\",21],[\"^/stripe-webhook-raw-body-nextjs-app-router/?$\",21],[\"^/stripe-webhook-secret-test-vs-live/?$\",21],[\"^/stripe-checkout-without-webhook/?$\",21],[\"^/stripe-webhook-duplicate-events/?$\",21],[\"^/stripe-subtlecryptoprovider-synchronous-context-supabase-edge-function/?$\",21],[\"^/vercel-ai-built-apps/?$\",21],[\"^/vercel-function-invocation-failed/?$\",21],[\"^/vercel-function-timeout/?$\",21],[\"^/vercel-404-on-refresh/?$\",21],[\"^/next-public-env-vars-exposed/?$\",21],[\"^/vercel-sensitive-environment-variables/?$\",21],[\"^/supabase-vercel-integration-env-vars/?$\",21],[\"^/supabase-permission-denied-for-table/?$\",21],[\"^/supabase-url-and-key-are-required/?$\",21],[\"^/stripe-payment-method-types-no-longer-supported/?$\",21],[\"^/vercel-node-20-discontinued/?$\",21],[\"^/clerk-supabase-third-party-auth/?$\",21],[\"^/bolt-to-supabase-migration/?$\",21],[\"^/lovable-security-scan/?$\",21],[\"^/supabase-email-rate-limit-exceeded/?$\",21],[\"^/nextjs-uncached-data-accessed-outside-of-suspense/?$\",21],[\"^/clerk-keys-missing-from-environment/?$\",21],[\"^/supabase-redirect-to-localhost/?$\",21],[\"^/supabase-confirm-email-not-arriving/?$\",21],[\"^/lovable-cloud-vs-supabase/?$\",21],[\"^/supabase-storage-upload-rls-error/?$\",21],[\"^/lovable-test-and-live-environments-retired/?$\",21],[\"^/lovable-ai-deprecated-models/?$\",21],[\"^/stripe-mcp-agent-api-key/?$\",21],[\"^/railway-json-config-as-code-deprecated/?$\",21],[\"^/supabase-new-row-violates-row-level-security-policy/?$\",21],[\"^/supabase-edge-function-returned-a-non-2xx-status-code/?$\",21],[\"^/supabase-invalid-api-key/?$\",21],[\"^/nextjs-failed-to-collect-page-data/?$\",21],[\"^/supabase-auth-session-missing/?$\",21],[\"^/vercel-err-pnpm-outdated-lockfile/?$\",21],[\"^/railway-supabase-connect-enetunreach/?$\",21],[\"^/netlify-secrets-scanning-supabase-anon-key/?$\",21],[\"^/resend-webhook-supabase-edge-function/?$\",21],[\"^/supabase-error-sending-confirmation-email/?$\",21],[\"^/openai-api-key-browser-like-environment/?$\",21],[\"^/nextauth-no-secret-untrustedhost-vercel/?$\",21],[\"^/better-auth-invalid-origin-vercel-preview/?$\",21],[\"^/stripe-neither-apikey-nor-config-authenticator-provided/?$\",21],[\"^/stripe-webhook-vercel-preview-deployment-protection/?$\",21],[\"^/vercel-middleware-invocation-failed/?$\",21],[\"^/supabase-infinite-recursion-detected-in-policy/?$\",21],[\"^/supabase-jwt-expired/?$\",21],[\"^/supabase-could-not-find-the-table-in-the-schema-cache/?$\",21],[\"^/supabase-permission-denied-for-schema-public/?$\",21],[\"^/vercel-deployment-not-found/?$\",21],[\"^/nextjs-usesearchparams-should-be-wrapped-in-a-suspense-boundary/?$\",21],[\"^/nextjs-failed-to-find-server-action/?$\",21],[\"^/stripe-no-such-price/?$\",21],[\"^/vite-failed-to-fetch-dynamically-imported-module/?$\",21],[\"^/supabase-failed-to-send-a-request-to-the-edge-function/?$\",21],[\"^/google-oauth-redirect-uri-mismatch-supabase/?$\",21],[\"^/firebase-auth-unauthorized-domain-vercel/?$\",21],[\"^/firebase-admin-invalid-pem-formatted-message-vercel/?$\",21],[\"^/sentry-invalid-dsn-undefined/?$\",21],[\"^/failed-to-load-module-script-mime-type-text-html/?$\",21],[\"^/cloudflare-workers-supabase-too-many-subrequests/?$\",21],[\"^/neon-too-many-connections-vercel/?$\",21],[\"^/ai-sdk-stream-cut-off-vercel/?$\",21],[\"^/paddle-webhook-signature-verification-failed/?$\",21],[\"^/posthog-project-api-key-public/?$\",21],[\"^/railway-october-21-2026-security-incident/?$\",21],[\"^/nextjs-security-release-november-2026/?$\",21],[\"^/clerk-secret-key-not-showing/?$\",21],[\"^/clerk-test-email-not-received/?$\",21],[\"^/check-supabase-service-role-key-in-client-code/?$\",21],[\"^/vite-env-variables-exposed/?$\",21],[\"^/find-env-vars-missing-in-vercel-production/?$\",21],[\"^/find-supabase-tables-anon-can-read/?$\",21],[\"^/find-supabase-queries-without-limit/?$\",21],[\"^/check-api-routes-rate-limiting/?$\",21],[\"^/check-nextjs-content-security-policy/?$\",21],[\"^/check-env-file-committed-to-git/?$\",21],[\"^/supabase-migrations-match-production/?$\",21],[\"^/supabase-orioledb-public-beta/?$\",21],[\"^/supabase-compute-private-alpha/?$\",21],[\"^/supabase-mcp-server-for-your-app/?$\",21],[\"^/supabase-multiple-local-projects-without-docker/?$\",21],[\"^/supabase-personal-access-token-scopes/?$\",21],[\"^/vercel-ci-beta/?$\",21],[\"^/nextjs-bundle-optimizer-skill/?$\",21],[\"^/vercel-public-prefix-cannot-use-visibility-secret/?$\",21],[\"^/supabase-no-api-key-found-in-request/?$\",21],[\"^/nextjs-dynamic-not-compatible-with-cache-components/?$\",21],[\"^/lovable-app-monitoring/?$\",21],[\"^/authjs-untrusted-host/?$\",21],[\"^/authjs-missing-secret/?$\",21],[\"^/polar-webhook-verification-nextjs/?$\",21],[\"^/lemon-squeezy-webhook-signature-nextjs/?$\",21],[\"^/firestore-security-rules-public/?$\",21],[\"^/sentry-source-maps-nextjs-vercel/?$\",21],[\"^/supabase-service-role-key-exposed-env-file/?$\",21],[\"^/supabase-select-returns-empty-array/?$\",21],[\"^/supabase-pgrst116-cannot-coerce-the-result-to-a-single-json-object/?$\",21],[\"^/vercel-environment-variable-new-deployment-needed/?$\",21],[\"^/fastapi-no-entrypoint-found-vercel/?$\",21],[\"^/fastapi-modulenotfounderror-no-module-named-vercel/?$\",21],[\"^/fastapi-cors-access-control-allow-origin-missing-vercel/?$\",21],[\"^/rails-missing-secret-key-base-production/?$\",21],[\"^/rails-blocked-hosts-config-hosts-custom-domain/?$\",21],[\"^/rails-supabase-prepared-statement-already-exists/?$\",21],[\"^/go-vercel-could-not-find-an-exported-function/?$\",21],[\"^/go-pgx-prepared-statement-already-exists-supabase/?$\",21],[\"^/go-supabase-jwt-signing-method-es256-is-invalid/?$\",21],[\"^/react-minified-error-185-maximum-update-depth-exceeded/?$\",21],[\"^/react-minified-error-418-hydration-failed/?$\",21],[\"^/react-router-usenavigate-may-be-used-only-in-the-context-of-a-router/?$\",21],[\"^/logrocket-not-recording-sessions-nextjs-vercel/?$\",21],[\"^/logrocket-script-could-not-load-valid-network-connection/?$\",21],[\"^/logrocket-sanitize-passwords-tokens-pii-recordings/?$\",21],[\"^/storybook-environment-variables-undefined/?$\",21],[\"^/storybook-invariant-expected-app-router-to-be-mounted/?$\",21],[\"^/storybook-vercel-404-not-found/?$\",21],[\"^/playwright-browsertype-launch-executable-doesnt-exist/?$\",21],[\"^/playwright-vercel-preview-deployment-protection-bypass/?$\",21],[\"^/playwright-timed-out-waiting-from-config-webserver/?$\",21],[\"^/turnstile-siteverify-timeout-or-duplicate/?$\",21],[\"^/supabase-captcha-protection-request-disallowed-no-captcha-token/?$\",21],[\"^/vercel-botid-possible-misconfiguration-checkbotid/?$\",21],[\"^/sveltekit-cannot-import-env-static-private-into-browser-code/?$\",21],[\"^/sveltekit-is-not-exported-by-virtual-env-static-private/?$\",21],[\"^/sveltekit-cross-site-post-form-submissions-are-forbidden/?$\",21],[\"^/nuxt-runtimeconfig-undefined-in-production/?$\",21],[\"^/nuxt-supabase-missing-nuxt-public-supabase-url/?$\",21],[\"^/nuxt-hydration-completed-but-contains-mismatches/?$\",21],[\"^/angular-vercel-404-not-found/?$\",21],[\"^/angular-process-is-not-defined-environment-variables-vercel/?$\",21],[\"^/angular-ng0507-html-content-altered-after-server-side-rendering/?$\",21],[\"^/vitest-env-variables-undefined-import-meta-env/?$\",21],[\"^/vitest-referenceerror-document-is-not-defined/?$\",21],[\"^/vitest-failed-to-resolve-import-path-alias/?$\",21],[\"^/neon-no-database-connection-string-provided-to-neon/?$\",21],[\"^/neon-prisma-p1002-advisory-lock-timeout-migrate/?$\",21],[\"^/neon-prisma-p1001-cant-reach-database-server/?$\",21],[\"^/firebase-auth-invalid-api-key-vercel/?$\",21],[\"^/firestore-missing-or-insufficient-permissions/?$\",21],[\"^/firebase-admin-could-not-load-the-default-credentials-vercel/?$\",21],[\"^/posthog-node-events-lost-vercel-flush/?$\",21],[\"^/posthog-reverse-proxy-nextjs-vercel/?$\",21],[\"^/posthog-getfeatureflag-undefined-first-load/?$\",21],[\"^/sentry-nextjs-server-errors-not-captured-onrequesterror/?$\",21],[\"^/sentry-err-blocked-by-client-tunnelroute-nextjs/?$\",21],[\"^/sentry-vite-plugin-no-auth-token-provided/?$\",21],[\"^/clerk-auth-was-called-but-cant-detect-clerkmiddleware/?$\",21],[\"^/clerk-refreshing-session-token-infinite-redirect-loop/?$\",21],[\"^/clerk-production-keys-are-only-allowed-for-domain/?$\",21],[\"^/paddle-js-checkout-not-opening-sandbox-environment/?$\",21],[\"^/paddle-grant-access-transaction-completed-vs-subscription-activated/?$\",21],[\"^/polar-api-returned-an-error-401-sandbox-production-token/?$\",21],[\"^/cloudflare-workers-referenceerror-process-is-not-defined/?$\",21],[\"^/cloudflare-workers-no-such-module-node-nodejs-compat/?$\",21],[\"^/cloudflare-workers-cannot-perform-io-on-behalf-of-a-different-request/?$\",21],[\"^/netlify-page-not-found-single-page-app/?$\",21],[\"^/netlify-function-process-env-undefined/?$\",21],[\"^/netlify-vite-env-vars-undefined/?$\",21],[\"^/aws-s3-presigned-url-cors-no-access-control-allow-origin/?$\",21],[\"^/aws-s3-presigned-put-signature-does-not-match/?$\",21],[\"^/aws-s3-could-not-load-credentials-from-any-providers/?$\",21],[\"^/github-gh013-push-cannot-contain-secrets/?$\",21],[\"^/github-secret-scanning-alert-leaked-api-key/?$\",21],[\"^/github-actions-secret-empty-fork-dependabot/?$\",21],[\"^/resend-you-can-only-send-testing-emails-to-your-own-email-address/?$\",21],[\"^/resend-missing-api-key-pass-it-to-the-constructor/?$\",21],[\"^/resend-domain-not-verifying-dns-records/?$\",21],[\"^/better-auth-you-are-using-the-default-secret/?$\",21],[\"^/better-auth-redirect-uri-mismatch-vercel/?$\",21],[\"^/better-auth-database-schema-mismatch-missing-tables/?$\",21],[\"^/turso-libsql-server-error-401/?$\",21],[\"^/turso-libsql-url-invalid-undefined/?$\",21],[\"^/turso-drizzle-kit-required-params-turso-dialect/?$\",21],[\"^/auth0-callback-url-mismatch-vercel-nextjs/?$\",21],[\"^/auth0-not-all-required-options-were-provided/?$\",21],[\"^/auth0-nextjs-state-parameter-is-invalid/?$\",21],[\"^/upstash-redis-unable-to-find-environment-variable/?$\",21],[\"^/upstash-redis-wrongpass-invalid-or-missing-auth-token/?$\",21],[\"^/upstash-ratelimit-nextjs-api-route-vercel/?$\",21],[\"^/mongodb-server-selection-error-vercel-atlas/?$\",21],[\"^/mongodb-parse-error-invalid-scheme-vercel/?$\",21],[\"^/mongoose-buffering-timed-out-vercel/?$\",21],[\"^/planetscale-direct-ddl-is-disabled/?$\",21],[\"^/planetscale-foreign-keys-cannot-be-created-prisma/?$\",21],[\"^/planetscale-fetch-failed-enotfound-undefined/?$\",21],[\"^/render-port-scan-timeout-no-open-ports-detected/?$\",21],[\"^/render-supabase-connect-enetunreach/?$\",21],[\"^/render-vite-env-vars-undefined-static-site/?$\",21],[\"^/supabase-policy-using-true/?$\",21],[\"^/supabase-anon-key-safe-to-expose/?$\",21],[\"^/supabase-service-role-key-leaked/?$\",21],[\"^/supabase-realtime-not-working/?$\",21],[\"^/supabase-rls-not-working/?$\",21],[\"^/supabase-rls-using-vs-with-check/?$\",21],[\"^/test-supabase-rls-policies/?$\",21],[\"^/is-supabase-safe-for-production/?$\",21],[\"^/supabase-security-advisor-warnings/?$\",21],[\"^/supabase-rls-disabled-in-public/?$\",21],[\"^/supabase-security-definer-view/?$\",21],[\"^/supabase-function-search-path-mutable/?$\",21],[\"^/supabase-rls-enabled-no-policy/?$\",21],[\"^/supabase-permissive-rls-policy/?$\",21],[\"^/supabase-sensitive-columns-exposed/?$\",21],[\"^/supabase-auth-rls-initplan/?$\",21],[\"^/supabase-authenticated-security-definer-function-executable/?$\",21],[\"^/i-vibe-coded-an-app-now-what/?$\",21],[\"^/how-to-secure-a-vibe-coded-app/?$\",21],[\"^/how-to-deploy-a-vibe-coded-app/?$\",21],[\"^/is-vibe-coding-production-ready/?$\",21],[\"^/vibe-coding-security-risks/?$\",21],[\"^/vibe-coding-horror-stories/?$\",21],[\"^/claude-code-security-vs-pre-deploy-review/?$\",21],[\"^/supabase-rls-checker/?$\",22],[\"^/guides/?$\",23]]};",
"maxBytes": 51200,
"maxLines": 2000,
"truncated": true,
"totalBytes": 54422,
"totalLines": 5,
"outputBytes": 27151,
"outputLines": 2,
"truncatedBy": "bytes",
"lastLinePartial": false,
"firstLineExceedsLimit": false
},
"fullOutputPath": "/tmp/pi-bash-154da661cf4937cd.log"
}
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-989b02f22781ec9c",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Alright. Got enough info. Pricing from the README: the CLI is free and open source (MIT), no account required. Hosted viberaven.dev: free includes 2 changes, Pro is 300 changes per month. Hosted full checks are 2 for free, 50/month for Pro. Need the Pro price — let me check PricingPage's JS. Quick grep.
Next, build a simple example: create a small sample app with intentional gaps in the repo, run npx viberaven check (one-shot, fast). Might check the Node version. Let's do both: fetch the pricing from PricingPage's JS, and scaffold the sample.
Pricing details are in the README. Let me grab the Pro price from the pricing page JS and scaffold a demo app.
curl -sL --max-time 10 "https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js" | grep -oE '\$[0-9]+|per month|/month|[0-9]+ changes|[0-9]+ checks|Free|Pro' | sort | uniq -c | sort -rn | head -20; echo ===; curl -sL --max-time 10 "https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js" | grep -oE '.{60}\$[0-9]+.{60}' | head -66 Pro
6 Pro
1 Free
===
Recorded tool call
{
"type": "tool_call",
"seq": 50,
"ts": "2026-11-02T12:29:24.071Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 10 \"https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js\" | grep -oE '\\$[0-9]+|per month|/month|[0-9]+ changes|[0-9]+ checks|Free|Pro' | sort | uniq -c | sort -rn | head -20; echo ===; curl -sL --max-time 10 \"https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js\" | grep -oE '.{60}\\$[0-9]+.{60}' | head -6"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-a9e9386d469a5daf",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 54,
"ts": "2026-11-02T12:29:24.697Z",
"turn": 1,
"output": {
"content": [
{
"text": " 6 Pro\n 1 Free\n===\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-a9e9386d469a5daf",
"is_error": false,
"tool_kind": "shell"
}node --version; mkdir -p /sandbox/repo/viberaven-demo/{supabase/migrations,app/admin,app/api/stripe/webhook,lib}v22.23.4
v22.23.4
Recorded tool call
{
"type": "tool_call",
"seq": 52,
"ts": "2026-11-02T12:29:24.071Z",
"name": "bash",
"turn": 1,
"input": {
"command": "node --version; mkdir -p /sandbox/repo/viberaven-demo/{supabase/migrations,app/admin,app/api/stripe/webhook,lib}"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-875b537ec99b23e9",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 53,
"ts": "2026-11-02T12:29:24.071Z",
"turn": 1,
"output": {
"content": [
{
"text": "v22.23.4\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-875b537ec99b23e9",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The JS on the pricing page doesn't display "$X" in plaintext — it might be encoded or embedded some other way. Let me grep for the "month" context within the JS.
curl -sL --max-time 10 "https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js" > /tmp/pricing.js; wc -c /tmp/pricing.js; grep -oE '.{80}(month|price|USD|usd|amount|300).{80}' /tmp/pricing.js | head -123675 /tmp/pricing.js
3675 /tmp/pricing.js
head`,children:[(0,d.jsx)(`h3`,{children:e.name}),(0,d.jsxs)(`p`,{className:`hm-price`,children:[(0,d.jsx)(`b`,{children:e.price}),(0,d.jsx)(`span`,{children:e.caden
not include`,children:[(0,d.jsx)(`p`,{children:`Pro gives you 50 full checks a month from the Studio, across all production areas. Free accounts get 2 full checks o
e areas. Local Studio checks stay free and unlimited on both. Pro also includes 300 app changes a month from viberaven.dev. Those changes run on your own computer
Recorded tool call
{
"type": "tool_call",
"seq": 57,
"ts": "2026-11-02T12:29:26.715Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 10 \"https://viberaven.dev/assets/PricingPage-C4H0fh6Q.js\" > /tmp/pricing.js; wc -c /tmp/pricing.js; grep -oE '.{80}(month|price|USD|usd|amount|300).{80}' /tmp/pricing.js | head -12"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-98ab3eddf67c6575",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 61,
"ts": "2026-11-02T12:29:27.461Z",
"turn": 1,
"output": {
"content": [
{
"text": "3675 /tmp/pricing.js\nhead`,children:[(0,d.jsx)(`h3`,{children:e.name}),(0,d.jsxs)(`p`,{className:`hm-price`,children:[(0,d.jsx)(`b`,{children:e.price}),(0,d.jsx)(`span`,{children:e.caden\n not include`,children:[(0,d.jsx)(`p`,{children:`Pro gives you 50 full checks a month from the Studio, across all production areas. Free accounts get 2 full checks o\ne areas. Local Studio checks stay free and unlimited on both. Pro also includes 300 app changes a month from viberaven.dev. Those changes run on your own computer \n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-98ab3eddf67c6575",
"is_error": false,
"tool_kind": "shell"
}grep -n -A6 -B2 -iE "pro\b.*(month|change)|300 changes|hosted full checks" /tmp/vr-readme.md | head -40
240-On Windows PowerShell, use `npx.cmd` if execution policy blocks `npx`.
240-On Windows PowerShell, use `npx.cmd` if execution policy blocks `npx`. 241- 242:The Studio also runs on [viberaven.dev](https://viberaven.dev/try): sign in with Google, bring your repo, and connect your computer once. Your agent still works on your computer. The site includes 2 free changes, then [Pro](https://viberaven.dev/pricing) for 300 changes a month. Both need a coding agent you are signed in to; its own account and limits apply. 243- 244-| | What the Studio gives you | 245-| --- | --- | 246-| **Your agent, your machine** | Claude Code, Codex or Gemini CLI make the edit in your folder, with a connection test and Ask or Edit access. | 247-| **Proof next to the change** | The real steps, your project's checks, the running app and the diff, in one place. | 248-| **Review and Undo** | Read every changed file. Undo restores attributed Claude Code edits; anything else stays for you to review. | -- 253- 254-- **Local Studio and repository checks.** These run on your machine without a VibeRaven account. The CLI has no telemetry. 255:- **Changes from viberaven.dev.** Sign in with Google. Free includes 2 changes per account; [Pro](https://viberaven.dev/pricing) includes 300 a month. Your coding agent's account and usage are separate. The site stores requests, progress, check results, file paths and redacted, size-limited diffs so you can review them. 256:- **Hosted full checks.** Optional: 2 on Free, 50 a month on Pro, separate from changes. 257-- **Markdown on disk.** All context lives in `.viberaven/` as plain files that your agent and your git history can read. 258-- **Evidence over vibes.** Findings point at repo evidence. Provider dashboard state is never claimed from repo edits alone. 259-- **Changes under your control.** Review the plan and access mode before the agent edits your project. Cleanup is plan-only. A clear repository check is not a security audit or proof that the deployed app works. 260- 261-## Contributing 262-
Recorded tool call
{
"type": "tool_call",
"seq": 59,
"ts": "2026-11-02T12:29:26.715Z",
"name": "bash",
"turn": 1,
"input": {
"command": "grep -n -A6 -B2 -iE \"pro\\b.*(month|change)|300 changes|hosted full checks\" /tmp/vr-readme.md | head -40"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-adf6d5ac505f6cc8",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 60,
"ts": "2026-11-02T12:29:26.715Z",
"turn": 1,
"output": {
"content": [
{
"text": "240-On Windows PowerShell, use `npx.cmd` if execution policy blocks `npx`.\n241-\n242:The Studio also runs on [viberaven.dev](https://viberaven.dev/try): sign in with Google, bring your repo, and connect your computer once. Your agent still works on your computer. The site includes 2 free changes, then [Pro](https://viberaven.dev/pricing) for 300 changes a month. Both need a coding agent you are signed in to; its own account and limits apply.\n243-\n244-| | What the Studio gives you |\n245-| --- | --- |\n246-| **Your agent, your machine** | Claude Code, Codex or Gemini CLI make the edit in your folder, with a connection test and Ask or Edit access. |\n247-| **Proof next to the change** | The real steps, your project's checks, the running app and the diff, in one place. |\n248-| **Review and Undo** | Read every changed file. Undo restores attributed Claude Code edits; anything else stays for you to review. |\n--\n253-\n254-- **Local Studio and repository checks.** These run on your machine without a VibeRaven account. The CLI has no telemetry.\n255:- **Changes from viberaven.dev.** Sign in with Google. Free includes 2 changes per account; [Pro](https://viberaven.dev/pricing) includes 300 a month. Your coding agent's account and usage are separate. The site stores requests, progress, check results, file paths and redacted, size-limited diffs so you can review them.\n256:- **Hosted full checks.** Optional: 2 on Free, 50 a month on Pro, separate from changes.\n257-- **Markdown on disk.** All context lives in `.viberaven/` as plain files that your agent and your git history can read.\n258-- **Evidence over vibes.** Findings point at repo evidence. Provider dashboard state is never claimed from repo edits alone.\n259-- **Changes under your control.** Review the plan and access mode before the agent edits your project. Cleanup is plan-only. A clear repository check is not a security audit or proof that the deployed app works.\n260-\n261-## Contributing\n262-\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-adf6d5ac505f6cc8",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The price data comes from a variable (e.price). The actual plan data probably comes from an API or a separate asset. Not critical — I can note that Pro's monthly price is displayed on viberaven.dev/pricing. Should I quickly check the checkout or studio-site JS to look up the price? Let me quickly grep studio-site's JS. Actually let's keep it light — I'll try grepping just once.
Next, scaffold a demo app with intentional gaps:
- A migration that creates public.profiles without RLS
- A policy using using (true)
- A client file that uses the service_role key
- A Stripe webhook route with no signature verification
- A package.json
Then run npx -y viberaven@latest check in that directory — one-shot. The README pins 1.6.12, but latest is 1.7.6. I'll use viberaven@1.7.6. It might take a bit (npm download) but won't take that long. Running it.
Pricing data loads dynamically. Let me try one quick grep for the Pro dollar amount, and meanwhile scaffold the demo app.
for a in studio-site-DkkWD_on api-DbQpyuc8 checkout-DFdsG5yD; do curl -sL --max-time 8 "https://viberaven.dev/assets/$a.js" | grep -oE '.{50}(\$[0-9]+|price.{0,4}:.{0,20}).{50}' | head -4; done 2>/dev/null | head -15s e}from"./api-DbQpyuc8.js";var t=[{name:`Studio`,price:`$0`,cadence:`open source`,description:`The local Studio on your machi
s e}from"./api-DbQpyuc8.js";var t=[{name:`Studio`,price:`$0`,cadence:`open source`,description:`The local Studio on your machi
,cta:`Open the Studio`,href:`/start`},{name:`Pro`,price:`$20`,cadence:`per month`,description:`Full checks from the Studio. Ch
f:`/try?plan=pro`,highlighted:!0}],n={name:`Team`,price:`Custom`,cadence:`for agencies and teams`,description:`For agencies an
Recorded tool call
{
"type": "tool_call",
"seq": 65,
"ts": "2026-11-02T12:29:31.676Z",
"name": "bash",
"turn": 1,
"input": {
"command": "for a in studio-site-DkkWD_on api-DbQpyuc8 checkout-DFdsG5yD; do curl -sL --max-time 8 \"https://viberaven.dev/assets/$a.js\" | grep -oE '.{50}(\\$[0-9]+|price.{0,4}:.{0,20}).{50}' | head -4; done 2>/dev/null | head -15"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-a4c4f797f11dd48e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 70,
"ts": "2026-11-02T12:29:33.254Z",
"turn": 1,
"output": {
"content": [
{
"text": "s e}from\"./api-DbQpyuc8.js\";var t=[{name:`Studio`,price:`$0`,cadence:`open source`,description:`The local Studio on your machi\n,cta:`Open the Studio`,href:`/start`},{name:`Pro`,price:`$20`,cadence:`per month`,description:`Full checks from the Studio. Ch\nf:`/try?plan=pro`,highlighted:!0}],n={name:`Team`,price:`Custom`,cadence:`for agencies and teams`,description:`For agencies an\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-a4c4f797f11dd48e",
"is_error": false,
"tool_kind": "shell"
}File edits
1 file
Writtenviberaven-demo/package.jsonView changes
/sandbox/repo/viberaven-demo/package.json
Written content · previous contents were not recorded
{"name": "viberaven-demo","version": "0.1.0","private": true,"description": "Tiny Next.js + Supabase app with deliberate launch gaps, for a VibeRaven demo","dependencies": {"@supabase/supabase-js": "^2.45.0","next": "^15.0.0","stripe": "^16.0.0"}}
Source: write · chatcmpl-tool-9302c765f5853438
Recorded tool call
{
"type": "tool_call",
"seq": 66,
"ts": "2026-11-02T12:29:31.676Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/viberaven-demo/package.json",
"content": "{\n \"name\": \"viberaven-demo\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"description\": \"Tiny Next.js + Supabase app with deliberate launch gaps, for a VibeRaven demo\",\n \"dependencies\": {\n \"@supabase/supabase-js\": \"^2.45.0\",\n \"next\": \"^15.0.0\",\n \"stripe\": \"^16.0.0\"\n }\n}\n"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9302c765f5853438",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 68,
"ts": "2026-11-02T12:29:31.676Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 282 bytes to /sandbox/repo/viberaven-demo/package.json",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9302c765f5853438",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenviberaven-demo/supabase/migrations/20260101000000_init.sqlView changes
/sandbox/repo/viberaven-demo/supabase/migrations/20260101000000_init.sql
Written content · previous contents were not recorded
-- Gap 1: public table, row level security never enabled (rls_disabled)create table public.profiles (id uuid primary key references auth.users,email text,display_name text);create table public.orders (id uuid primary key default gen_random_uuid(),user_id uuid references auth.users,amount_cents integer);alter table public.orders enable row level security;-- Gap 2: policy with using (true) — anyone can update every rowcreate policy "orders are editable" on public.ordersfor update to anon, authenticatedusing (true);-- Gap 3: security definer function, EXECUTE never revoked from anoncreate or replace function public.grant_credits(p_user uuid, p_amount integer)returns voidlanguage plpgsqlsecurity defineras $$beginupdate public.profiles set display_name = display_name where id = p_user;end;$$;
Source: write · chatcmpl-tool-80ec161813248b5f
Recorded tool call
{
"type": "tool_call",
"seq": 67,
"ts": "2026-11-02T12:29:31.676Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/viberaven-demo/supabase/migrations/20260101000000_init.sql",
"content": "-- Gap 1: public table, row level security never enabled (rls_disabled)\ncreate table public.profiles (\n id uuid primary key references auth.users,\n email text,\n display_name text\n);\n\ncreate table public.orders (\n id uuid primary key default gen_random_uuid(),\n user_id uuid references auth.users,\n amount_cents integer\n);\n\nalter table public.orders enable row level security;\n\n-- Gap 2: policy with using (true) — anyone can update every row\ncreate policy \"orders are editable\" on public.orders\n for update to anon, authenticated\n using (true);\n\n-- Gap 3: security definer function, EXECUTE never revoked from anon\ncreate or replace function public.grant_credits(p_user uuid, p_amount integer)\nreturns void\nlanguage plpgsql\nsecurity definer\nas $$\nbegin\n update public.profiles set display_name = display_name where id = p_user;\nend;\n$$;\n"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-80ec161813248b5f",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 69,
"ts": "2026-11-02T12:29:31.676Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 846 bytes to /sandbox/repo/viberaven-demo/supabase/migrations/20260101000000_init.sql",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-80ec161813248b5f",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Pricing confirmed: Studio (local) $0 open source; Pro is $20/month; Team is custom. Next, add client code containing gaps: service_role key within client code, Stripe webhook without signature verification, .env.example, then run the scan.
Pricing confirmed. Now the remaining demo files with deliberate gaps, then run the scan.
File edits
1 file
Writtenviberaven-demo/app/admin/page.tsxView changes
/sandbox/repo/viberaven-demo/app/admin/page.tsx
Written content · previous contents were not recorded
"use client";// Gap 4: service_role key in a file that ships to the browserimport { createClient } from "@supabase/supabase-js";const supabase = createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!,process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!);// Gap 5: unbounded query — no .limit()/.range()export default function AdminPage() {async function load() {const { data } = await supabase.from("profiles").select("*");return data;}load();return <div>admin</div>;}
Source: write · chatcmpl-tool-ae263c6e4860d213
Recorded tool call
{
"type": "tool_call",
"seq": 74,
"ts": "2026-11-02T12:29:35.643Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/viberaven-demo/app/admin/page.tsx",
"content": "\"use client\";\n\n// Gap 4: service_role key in a file that ships to the browser\nimport { createClient } from \"@supabase/supabase-js\";\n\nconst supabase = createClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!\n);\n\n// Gap 5: unbounded query — no .limit()/.range()\nexport default function AdminPage() {\n async function load() {\n const { data } = await supabase.from(\"profiles\").select(\"*\");\n return data;\n }\n load();\n return <div>admin</div>;\n}\n"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-ae263c6e4860d213",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 77,
"ts": "2026-11-02T12:29:35.643Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 501 bytes to /sandbox/repo/viberaven-demo/app/admin/page.tsx",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-ae263c6e4860d213",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenviberaven-demo/app/api/stripe/webhook/route.tsView changes
/sandbox/repo/viberaven-demo/app/api/stripe/webhook/route.ts
Written content · previous contents were not recorded
// Gap 6: Stripe webhook that never verifies the signature over the raw bodyimport Stripe from "stripe";import { NextRequest, NextResponse } from "next/server";const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);export async function POST(req: NextRequest) {const event = await req.json(); // parsed JSON, no constructEvent, no stripe-signature checkif (event.type === "checkout.session.completed") {console.log("paid!", event.data.object);}return NextResponse.json({ received: true });}
Source: write · chatcmpl-tool-9921fa46a6eff31a
Recorded tool call
{
"type": "tool_call",
"seq": 75,
"ts": "2026-11-02T12:29:35.643Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/viberaven-demo/app/api/stripe/webhook/route.ts",
"content": "// Gap 6: Stripe webhook that never verifies the signature over the raw body\nimport Stripe from \"stripe\";\nimport { NextRequest, NextResponse } from \"next/server\";\n\nconst stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n\nexport async function POST(req: NextRequest) {\n const event = await req.json(); // parsed JSON, no constructEvent, no stripe-signature check\n if (event.type === \"checkout.session.completed\") {\n console.log(\"paid!\", event.data.object);\n }\n return NextResponse.json({ received: true });\n}\n"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9921fa46a6eff31a",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 78,
"ts": "2026-11-02T12:29:35.643Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 518 bytes to /sandbox/repo/viberaven-demo/app/api/stripe/webhook/route.ts",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-9921fa46a6eff31a",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenviberaven-demo/.env.exampleView changes
/sandbox/repo/viberaven-demo/.env.example
Written content · previous contents were not recorded
NEXT_PUBLIC_SUPABASE_URL=https://example.supabase.coNEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keySTRIPE_SECRET_KEY=sk_test_xxx# note: NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY is intentionally missing (env_var_drift)
Source: write · chatcmpl-tool-be6b18f160a49f62
Recorded tool call
{
"type": "tool_call",
"seq": 76,
"ts": "2026-11-02T12:29:35.643Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/viberaven-demo/.env.example",
"content": "NEXT_PUBLIC_SUPABASE_URL=https://example.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key\nSTRIPE_SECRET_KEY=sk_test_xxx\n# note: NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY is intentionally missing (env_var_drift)\n"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-be6b18f160a49f62",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 79,
"ts": "2026-11-02T12:29:35.643Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 214 bytes to /sandbox/repo/viberaven-demo/.env.example",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-be6b18f160a49f62",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Next, I'll run the scan (one-off CLI, no service required, no account required, no network needed for the app):
cd /sandbox/repo/viberaven-demo && npx -y viberaven@1.7.6 check 2>&1 | tail -40; echo "exit=$?"
viberaven check · /sandbox/repo/viberaven-demo
viberaven check · /sandbox/repo/viberaven-demo 🔴 No RLS policy proof in migrations (rls_disabled) 1 public table without row level security: public.profiles (supabase/migrations/20260101000000_init.sql:2). The Data API does not enforce row restrictions for roles and operations allowed by the table's grants. Verify those grants to determine who can read or change rows. Guide: https://viberaven.dev/find-supabase-tables-missing-rls 🔴 A policy lets anyone write every row (rls_policy_allows_all_write) Policy "orders are editable" on public.orders (supabase/migrations/20260101000000_init.sql:17) lets anyone, signed in or not, update every row, to any values: using (true). Guide: https://viberaven.dev/supabase-policy-using-true 🔴 Service role key used in client code (service_role_key_in_client_code) app/admin/page.tsx:6: creates a Supabase client with the service role key. This file ships to the browser, and the service role key skips RLS entirely. Move the call behind a server route or edge function and rotate the key. Guide: https://viberaven.dev/check-supabase-service-role-key-in-client-code 🟡 Security definer function callable by the Data API roles (security_definer_function_executable) public.grant_credits(uuid, integer) at supabase/migrations/20260101000000_init.sql:22 is security definer, so it runs with its owner's rights and RLS does not limit what it touches. No migration revokes EXECUTE from public, anon, authenticated, so anyone holding the anon key can call it at /rest/v1/rpc/grant_credits. If only the server calls it, add: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated; Fix: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated; Guide: https://viberaven.dev/supabase-security-definer-function-anon 🟡 API routes have no rate limiting (missing_rate_limit) The repo exposes API routes but no rate limiting library or middleware was detected. One abusive client can exhaust quotas or run up provider bills. 🟡 Stripe webhook does not verify the signature (unverified_stripe_webhook) 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout. 🟡 Env vars used in code but missing from .env.example (env_var_drift) Code reads 1 environment variable that .env.example does not document (NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY). Fresh clones, CI, and the production deploy can silently run without them. Guide: https://viberaven.dev/find-env-vars-missing-in-vercel-production ⚪ No health check endpoint (missing_health_route) No /api/health route was found. Uptime monitors and deploy checks have nothing cheap to probe. ⚪ No error monitoring detected (missing_monitoring) No Sentry/PostHog (or similar) instrumentation was found. Production errors will only surface when users complain. Verdict: ❌ 3 blockers, 4 warnings · score 5 Fix: viberaven fix · Details: /sandbox/repo/viberaven-demo/.viberaven/agent-tasklist.md Optional live catalog: npx -y viberaven@1.7.6 live start --provider supabase --project <project-ref> --json (read-only metadata; account required; server availability not checked; user approves in the browser and approves the project read). Keep checks running with your agent: npx -y viberaven@1.7.6 init exit=0
Recorded tool call
{
"type": "tool_call",
"seq": 82,
"ts": "2026-11-02T12:29:36.899Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/viberaven-demo && npx -y viberaven@1.7.6 check 2>&1 | tail -40; echo \"exit=$?\"",
"timeout": 120
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-b57d8f21105118be",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 84,
"ts": "2026-11-02T12:29:41.248Z",
"turn": 1,
"output": {
"content": [
{
"text": "\nviberaven check · /sandbox/repo/viberaven-demo\n\n🔴 No RLS policy proof in migrations (rls_disabled)\n 1 public table without row level security: public.profiles (supabase/migrations/20260101000000_init.sql:2). The Data API does not enforce row restrictions for roles and operations allowed by the table's grants. Verify those grants to determine who can read or change rows.\n Guide: https://viberaven.dev/find-supabase-tables-missing-rls\n🔴 A policy lets anyone write every row (rls_policy_allows_all_write)\n Policy \"orders are editable\" on public.orders (supabase/migrations/20260101000000_init.sql:17) lets anyone, signed in or not, update every row, to any values: using (true).\n Guide: https://viberaven.dev/supabase-policy-using-true\n🔴 Service role key used in client code (service_role_key_in_client_code)\n app/admin/page.tsx:6: creates a Supabase client with the service role key. This file ships to the browser, and the service role key skips RLS entirely. Move the call behind a server route or edge function and rotate the key.\n Guide: https://viberaven.dev/check-supabase-service-role-key-in-client-code\n🟡 Security definer function callable by the Data API roles (security_definer_function_executable)\n public.grant_credits(uuid, integer) at supabase/migrations/20260101000000_init.sql:22 is security definer, so it runs with its owner's rights and RLS does not limit what it touches. No migration revokes EXECUTE from public, anon, authenticated, so anyone holding the anon key can call it at /rest/v1/rpc/grant_credits. If only the server calls it, add: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated; Fix: revoke execute on function public.grant_credits(uuid, integer) from public, anon, authenticated;\n Guide: https://viberaven.dev/supabase-security-definer-function-anon\n🟡 API routes have no rate limiting (missing_rate_limit)\n The repo exposes API routes but no rate limiting library or middleware was detected. One abusive client can exhaust quotas or run up provider bills.\n🟡 Stripe webhook does not verify the signature (unverified_stripe_webhook)\n 1 Stripe webhook handler without signature verification over the raw body: app/api/stripe/webhook/route.ts (no signature check (constructEvent), no stripe-signature header, no raw body). Anyone who finds the URL can post a fake event, for example a paid checkout.\n🟡 Env vars used in code but missing from .env.example (env_var_drift)\n Code reads 1 environment variable that .env.example does not document (NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY). Fresh clones, CI, and the production deploy can silently run without them.\n Guide: https://viberaven.dev/find-env-vars-missing-in-vercel-production\n⚪ No health check endpoint (missing_health_route)\n No /api/health route was found. Uptime monitors and deploy checks have nothing cheap to probe.\n⚪ No error monitoring detected (missing_monitoring)\n No Sentry/PostHog (or similar) instrumentation was found. Production errors will only surface when users complain.\n\nVerdict: ❌ 3 blockers, 4 warnings · score 5\nFix: viberaven fix · Details: /sandbox/repo/viberaven-demo/.viberaven/agent-tasklist.md\nOptional live catalog: npx -y viberaven@1.7.6 live start --provider supabase --project <project-ref> --json (read-only metadata; account required; server availability not checked; user approves in the browser and approves the project read).\nKeep checks running with your agent: npx -y viberaven@1.7.6 init\n\nexit=0\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-b57d8f21105118be",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The scan worked. Let me quickly check the .viberaven output files to verify the agent-readable artifacts, then I'll write the answer. Might be nice to peek a little at the head of gate-result.json.
ls /sandbox/repo/viberaven-demo/.viberaven/ && head -c 400 /sandbox/repo/viberaven-demo/.viberaven/gate-result.json; echo
action-registry.json
action-registry.json
actions.json
agent-summary.md
agent-tasklist.md
architecture-map.json
architecture-map.md
context-map.json
gaps
gate-result.json
last-scan.json
launch-playbook.md
report
report.html
{
"$schema": "https://viberaven.dev/schemas/gate-result.schema.json",
"schemaVersion": "v1",
"runId": "vr_20261102122940",
"mode": "scan",
"generatedAt": "2026-11-02T12:29:40.297Z",
"workspace": {
"root": "/sandbox/repo/viberaven-demo",
"packageManager": "unknown",
"languages": [
"typescript"
],
"frameworks": [
"SaaS product"
]
},
"gate": {
"
Recorded tool call
{
"type": "tool_call",
"seq": 87,
"ts": "2026-11-02T12:29:42.123Z",
"name": "bash",
"turn": 1,
"input": {
"command": "ls /sandbox/repo/viberaven-demo/.viberaven/ && head -c 400 /sandbox/repo/viberaven-demo/.viberaven/gate-result.json; echo"
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8fec61a7f4b3fe97",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 88,
"ts": "2026-11-02T12:29:42.123Z",
"turn": 1,
"output": {
"content": [
{
"text": "action-registry.json\nactions.json\nagent-summary.md\nagent-tasklist.md\narchitecture-map.json\narchitecture-map.md\ncontext-map.json\ngaps\ngate-result.json\nlast-scan.json\nlaunch-playbook.md\nreport\nreport.html\n{\n \"$schema\": \"https://viberaven.dev/schemas/gate-result.schema.json\",\n \"schemaVersion\": \"v1\",\n \"runId\": \"vr_20261102122940\",\n \"mode\": \"scan\",\n \"generatedAt\": \"2026-11-02T12:29:40.297Z\",\n \"workspace\": {\n \"root\": \"/sandbox/repo/viberaven-demo\",\n \"packageManager\": \"unknown\",\n \"languages\": [\n \"typescript\"\n ],\n \"frameworks\": [\n \"SaaS product\"\n ]\n },\n \"gate\": {\n \"\n",
"type": "text"
}
]
},
"run_id": "cmvz8jppw00tn0ixggf3ktbeo",
"tool_id": "chatcmpl-tool-8fec61a7f4b3fe97",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Done. Write a concise summary: what VibeRaven is, the example I created and the scan results, pricing, ease-of-management assessment, no blockers.
Done — no blockers. Here's the summary.
What VibeRaven is
A pre-launch security/gap scanner for AI-built apps on Vercel + Supabase (MIT, npm viberaven). Its developer workflow is a one-shot CLI — npx -y viberaven check — that reads your repo (migrations, client/server code, env files), needs no account, connects to nothing, and exits in seconds. That fit your constraints, so I used it directly. The hosted product (viberaven.dev Studio) requires Google sign-in and connecting a local coding agent, so I did not touch that.
The example I built
/sandbox/repo/viberaven-demo/ — a tiny Next.js + Supabase app with deliberate launch gaps:
supabase/migrations/20260101000000_init.sql— table without RLS, ausing (true)policy, an anon-callablesecurity definerfunctionapp/admin/page.tsx— service_role key in browser-shipped code + unbounded queryapp/api/stripe/webhook/route.ts— webhook with no signature verification.env.example— missing a var the code reads
Scan result (v1.7.6, ran in ~seconds)
It caught every planted gap with file:line evidence: 3 blockers (rls_disabled, rls_policy_allows_all_write, service_role_key_in_client_code), 4 warnings (security-definer function, no rate limiting, unverified Stripe webhook, env drift), plus hygiene notes (no health route, no monitoring). Verdict: ❌ 3 blockers, 4 warnings · score 5. Machine-readable output landed in .viberaven/ (gate-result.json, agent-tasklist.md, report.html, etc.), so an agent or CI can consume it.
Pricing
- Studio / CLI (local): $0 — open source, unlimited checks, no account, no telemetry.
- Free (hosted, viberaven.dev): 2 changes per account + 2 hosted full checks.
- Pro: $20/month — 300 agent-driven changes/month + 50 hosted full checks/month (changes run on your own machine via your coding agent; its account/limits are separate).
- Team: custom (agencies).
Will it be easy for me to manage?
Yes, very. It's a stateless CLI with zero infrastructure: one command, fast deterministic output, exit code 1 on blockers (CI-friendly), and all results as plain markdown/JSON in .viberaven/ that I can read and act on. No services, no auth, no long-running processes. The only part outside my reach is the hosted Studio tier, which needs interactive Google sign-in.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents