796 testsLLM baseline:304 wrong·478 partial·14 correct

Ask about SvelteKit.Get Next.js patterns.Every time.

Grounded Code reads the actual docs and cites every answer, so you can trust what it tells you and verify the source in one click.

623+ sources indexed
ReactNext.jsSupabasePostgreSQLSentryTailwindAnthropicDrizzleSvelteKitVue.js+ any docs URL

Citation Discipline

If we can’t cite it, we don’t claim it.

Every answer in Grounded Code links to the exact paragraph it came from. If the model fabricates a reference, our validator catches it before you see it. You verify in one click.

EVERY ANSWER

Citations link to the specific chunk in the indexed source. Click any cite and you land on the exact paragraph — not a Google result, not a search page.

EVERY CITATION VALIDATED

If the model invents a reference that doesn't map to a real indexed chunk, our validator flags it and removes it before display. Fabricated citations never reach you.

EVERY GAP MARKED

When indexed docs don't cover your question, Grounded Code says so. It won't fabricate confidence. 'I don't know' beats 'here's a plausible lie.'

796 tests. LLM baseline: 304 wrong, 478 partial, 14 correct. We built Grounded Code because of those numbers.

How it works

Four steps. Zero docs-reading.

Everything from your stack to the style of answer you want — wired up in under a minute.

  1. 01

    Set your stack

    Tell Grounded Code your framework, ORM, and auth once. Every answer is scoped to your setup.

    framework: SvelteKit · orm: Drizzle · auth: Supabase
  2. 02

    Pick your sources

    Toggle from 150+ pre-indexed docs. Type @Resend in the composer to scope a question to one source on the fly.

    @Resend how do I send a transactional email?
  3. 03

    Ask, your way

    Choose response style: terse production code, balanced, or step-by-step tutorial with pseudocode planning.

    style: terse · balanced · tutorial
  4. 04

    Ship

    Copy cited code or save it to your snippet library with a shareable URL. Endpoints are current, auth is correct, parameters are right — because it came from the docs.

    // cited · current · correct · saved

Response styles

Answers shaped to how you work.

Three presets control verbosity, comment depth, and structure. Advanced options let you fine-tune citation placement, error handling, followup suggestions, and the primary code language — per project.

TerseSenior devs

One-paragraph answers, production-clean code, no tutorial comments.

DefaultBalanced

Structured prose with clean code and light explanatory comments.

TutorialLearning mode

Step-by-step prose, pseudocode planning blocks, inline comments.

Advanced overrides

Code comments
onminimaloff
Citation placement
inlinefooter
Followup suggestions
onoff
Try/catch wrapping
onoff
Primary language
TypeScriptPythonGoRust+10 more
Terse7 lines
1const res = await fetch('/api/data', {
2 method: 'POST',
3 headers: { 'Content-Type': 'application/json' },
4 body: JSON.stringify(payload),
5});
6if (!res.ok) throw new Error(res.statusText);
7return res.json();

Production-clean. No prose, no comments.

Tutorial10 lines
1// PSEUDOCODE: POST payload, assert 2xx, parse JSON
2const res = await fetch('/api/data', {
3 method: 'POST',
4 // why: server won't parse body without this header
5 headers: { 'Content-Type': 'application/json' },
6 body: JSON.stringify(payload),
7});
8// why: non-2xx responses don't throw by default in fetch
9if (!res.ok) throw new Error(res.statusText);
10return res.json();

Pseudocode headers, inline why-comments.

same question · same docs · different style

Question

How do I POST JSON and handle errors with the Fetch API?

Primary language:TypeScriptPythonGoRustRubyJava+7 more

Project Profiles

Your stack. Remembered.

Tell Grounded Code your framework, language, and dependencies once. Every chat, every MCP query, every lint pass uses that context — so you never get v4 patterns when you’re on v6.

Framework-aware retrieval

Ask 'how do I handle auth?' on a Next.js 15 project and get App Router patterns. Ask the same on a SvelteKit project and get +page.server.ts. Same question, different stack, different answer.

Version pinning

Profile your dependencies and Grounded Code only retrieves chunks matching your declared versions. No more @supabase/auth-helpers-nextjs patterns when you're on @supabase/ssr.

Team-wide context

Every teammate's chat inherits the project profile. Onboarding catches up by reading the project's pinned answers and source library, not by asking the same questions you already answered last week.

One profile per project. Unlimited sources per profile. Cited every time.

This happened to you last week

Real questions. Real failures. Real answers from Grounded Code.

Set up Supabase Auth in SvelteKit
SvelteKitSupabase Auth
What ChatGPT generates

Next.js middleware using @supabase/auth-helpers-nextjs — removed in 2023.

What Grounded Code returns

safeGetSession() wrapper + sequence() from hooks + getAll/setAll cookies. Cited to the SvelteKit guide.

Clerk auth middleware in Next.js 16
Clerk v6Next.js 16
What ChatGPT generates

authMiddleware() in middleware.ts. Both were renamed — unauthenticated users slip through silently.

What Grounded Code returns

clerkMiddleware() + createRouteMatcher in proxy.ts, async auth(). From the v6 migration guide.

Resend webhook in Astro SSR endpoint
ResendAstro
What ChatGPT generates

Express handler with req.body and app.post(). Astro has neither.

What Grounded Code returns

export POST function + APIContext + output: 'server' + svix-verify on raw request.text() for Resend signature checks.

Vercel AI SDK streaming in SvelteKit
AI SDK v6SvelteKit
What ChatGPT generates

useChat from the wrong package, StreamingTextResponse (removed v4), maxToolRoundtrips (twice-renamed). Three layers of wrong.

What Grounded Code returns

SvelteKit-specific useChat + +server.ts + toUIMessageStreamResponse(). Current API, not Next.js-ported.

Lemon Squeezy + SvelteKit + Supabase (full checkout with auth)
Lemon SqueezySvelteKitSupabase
What ChatGPT generates

Next.js patterns for all three. Cursor @Docs searches one source at a time. You open three tabs.

What Grounded Code returns

SvelteKit +server.ts calling createCheckout + Supabase auth in hooks.server.ts + custom user_id passed through checkoutData. Three docs, one answer.

Works where you already code

Your editor’s AI can read your docs too. Via MCP.

Generate an API key, point any MCP client at it, and every grounded answer is available inside your editor.

Works withCursorClaude CodeZed / Continue

Connect once

One API key, any MCP client. No per-project setup.

Query inline

Your agent calls query_docs, search_by_symbol, list_sources, and get_section against your catalog. Symbol search does exact-match lookup for identifiers like pgTable, useQuery, or z.safeParse. get_section retrieves the full content of any cited section in document order.

Lint against the live docs

lint_against_docs validates a snippet against the indexed docs for a source and returns deprecated, removed, and signature-changed findings — each one cited verbatim from the source the agent can click to verify. Try it in the playground before wiring up MCP.

Auto-configure

Drop in your package.json — match_stack_to_sources recommends which sources to enable. No manual source hunting.

Index from the editor

import_source crawls any public docs URL in the background and indexes it without opening a browser. Poll progress with get_import_status — the source is queryable as soon as it's done.

Same grounding

Same citations you see in chat — nothing paraphrased away.

Lint against live docs

Paste a snippet. See what broke.

Paste any code snippet, pick a source, and get line-by-line findings for removed APIs, deprecated patterns, and signature drift — each one cited directly from the indexed docs. No editor plugin required.

Works on any language or framework in your source library

Every finding links to the exact doc section that flagged it

Also available as lint_against_docs in any MCP client

Linting against Supabase
3 findings
1import { createServerSupabaseClient }
2 from "@supabase/auth-helpers-nextjs"
4export async function middleware(req) {
5 const sb = createServerSupabaseClient({
6 req, res
7 })
8 const user = await sb.auth.getUser()
9}
@supabase/auth-helpers-nextjsREMOVEDline 2

Package removed. Migrate to @supabase/ssr.

createServerSupabaseClient()REMOVEDline 5

Function removed with auth-helpers-nextjs. Use createServerClient() from @supabase/ssr.

sb.auth.getUser()DRIFTline 8

Still valid but slower than getClaims() for read-only middleware — makes a network round-trip every call.

Compare sources

Same question. Every doc.

Pick 2–5 indexed sources and ask one question. Get per-source answers with citations side-by-side — so you see exactly how Stripe, Lemon Squeezy, and Resend each handle the same pattern before you write a line.

How do I handle webhook signature verification?

StripeconstructEvent()

Use stripe.webhooks.constructEvent() with the raw body and signing secret. Throws on mismatch.

Lemon SqueezyHMAC-SHA256

Compute HMAC-SHA256 of the raw body with your signing secret and compare to X-Signature header using timingSafeEqual.

Resendsvix verify()

Use the svix library — Resend webhooks are delivered via Svix. Verify with wh.verify(payload, headers).

What's the correct way to scope an API key to read-only access?

GitHub REST APIFine-grained PAT

Create a fine-grained personal access token with resource owner set and Contents: read permission. Classic tokens use the repo:read scope.

SupabaseRLS + anon key

Use Row Level Security policies with a service_role key restricted by anon key defaults. For read-only, enable SELECT policies only.

How it compares

Every tool fails differently. One tool fixes it.

ToolReads current docsCross-source retrievalCited answersWorks in your IDE (MCP)Persistent source library
ChatGPT / Claude
Cursor @Docs
Copilot
Perplexity
Stack Overflow
Grounded Codebeta

No stale training data, no single-source silos, no surprise API breaks.

Real test, real results

We asked all three the same question.

“How do I get the current user in a Supabase SvelteKit app?”

Hand-verified against live documentation — each output cross-checked with the actual current docs.
ChatGPTDeprecated package
1import { createServerSupabaseClient }
2 from "@supabase/auth-helpers-nextjs"
3
4export async function middleware(req) {
5 const sb = createServerSupabaseClient(
6 { req, res }
7 )
8 // auth-helpers-nextjs: removed 2023
9}
Cursor @DocsSlower method
1const { data: { user } } =
2 await supabase.auth.getUser()
3
4// getUser() makes a network request
5// every time it's called.
6// Use getClaims() for cached access.
7
8if (!user) redirect("/login")
Grounded CodeCurrent best practice
1const { data: { session } } =
2 await supabase.auth.getClaims()
3
4// getClaims() reads from JWT — no
5// network round-trip. Introduced in
6// @supabase/ssr v0.5+.
7
8// Source: Supabase Auth Docs §3.2

Live example

Scope with @mentions.
Every answer, cited.

Type @Lemon Squeezy to scope a question to one source. Pick a response style. Every line of code traces back to the exact doc section it came from.

@Lemon Squeezy · 1,489 sections
style: terse

@Lemon Squeezy how do I create a subscription checkout and pass a custom user_id?

const { data, error } = await createCheckout(storeId, variantId, {
productOptions: {
enabledVariants: [variantId],
redirectUrl: `${baseUrl}/success`,
},
checkoutData: {
email: customer.email,
custom: { user_id: customer.id },
},
});
if (error) throw error;
return data.data.attributes.url;
Sources:Create a checkoutCustom data

Share answers

Send the answer, not a screenshot.

Every assistant response has a share button. One click generates a permanent public link — your teammate gets the full answer with citations intact, no account required.

Permanent URL

The link never expires unless you revoke it. Works for async code review, Slack threads, or PR descriptions.

No account needed to view

Recipients see the full answer and citations without signing up. The unguessable token is the only access control.

grounded.so/answer/ak7x2m9q
Public
Question

How do I stream a response with the Anthropic SDK in Node.js?

1const client = new Anthropic();
3const stream = client.messages.stream({
4 model: 'claude-opus-4-5',
5 max_tokens: 1024,
6 system: systemPrompt,
7 messages: [{ role: 'user', content }],
8});
10for await (const chunk of stream) {
11 if (chunk.type === 'content_block_delta')
12 yield chunk.delta.text;
13}
Sources:Messages API · StreamingModel IDs
Generated with Grounded Code — answers grounded in the docs you select.

Snippet library

Save once. Reuse everywhere.

Every code block has a Save button. Saved snippets land in your library where you can tag, filter, pin, and share them — with a link back to the conversation that produced each one.

Pin to top

Keep your most-used snippets a click away.

Tag & filter

Filter by language, framework, source, or your own tags.

Share a link

One click generates a public read-only URL — no account needed to view.

Back to the conversation

Every snippet links back to the chat it came from.

Filter:TypeScript×SvelteKit×auth×
Supabase auth middleware
TypeScriptSvelteKitauthmiddleware
12 usesshared
1const { data } = await supabase
2 .auth.getClaims()
3if (!data?.claims) {
4 return redirect(303, '/login')
5}
from Supabasecopy link
Lemon Squeezy checkout
TypeScriptNext.jspaymentscheckout
7 uses
1const checkout = await createCheckout(
2 storeId, variantId, {
3 checkoutData: {
4 custom: { user_id: uid },
5 },
6 }
7)
from Lemon Squeezyshare

Your source library

540+ sources indexed. Search across everything.

540+ documentation sources indexed. Re-crawled weekly. Every page chunked, embedded, and ready to cite — across more frameworks, libraries, and infrastructure than any single-source @docs integration.

all indexed
APIs
Anthropic1.7KGitHub REST API7KSpotify Web API2KResend3.3KTwilio49K
Frameworks
Next.js12KReact1.4KAngular13KVue.js1.4KSvelteKit1.4K
Libraries
Prisma11KDrizzle1.9KTensorFlow18KPyTorch22KTanStack Query45K
Infra
Supabase312KKubernetes31KArgoCD8KGrafana14KVercel21K

Supabase alone: 312K indexed pages. More depth in one source than most tools cover across their entire library.

which of my sources supports webhooks?3 matches
Resend
Webhook events

Receive webhook events when an email is delivered, opened, or bounced...

Twilio
Webhook configuration

Twilio sends HTTP POST requests to your webhook URL...

Supabase
Database webhooks

Send real-time data from your database to another system...

Free during beta. No credit card required.

Everything is included while we're in beta. Pricing will be introduced later — early users will be grandfathered.

Beta
$0during beta

Everything included

  • 150+ curated doc sources
  • Unlimited questions
  • Cited code generation
  • Cross-source search
  • MCP server access
  • Project profiles
Get started free

FAQ

Common questions

Still unsure? The answers below cover what most people ask before signing up.

How is this different from Cursor @Docs?

Cursor indexes one source at a time by keywords. Grounded Code indexes every source you add and retrieves across all of them in one query.

Why not just paste docs into Claude or ChatGPT?

Pasting re-reads the whole doc every turn and still misses deep nuance. We pre-index once and retrieve the exact chunk — no token cost, persistent across sessions.

Do you connect to my database?

No. We crawl documentation about databases — Prisma, Drizzle, Supabase — not the databases themselves.

What documentation can you crawl?

Any public docs URL: official sites, versioned docs, GitHub READMEs. Login-gated docs aren't supported yet.

What sources are already indexed?

540+ sources including React, Next.js, Supabase, Drizzle, Lemon Squeezy, Tailwind, SvelteKit, PyTorch, TensorFlow, Kubernetes, and more. Full catalog at /sources after signup.

Why should I trust code from Grounded Code?

Every answer is cited to the exact doc section. Click to verify. The trust is in the source, not our word.

Can I use Grounded Code from my editor?

Yes — we expose an MCP server. Generate a key in Settings and connect Cursor, Claude Code, or any MCP-compatible client.

Are my conversations saved?

Yes. Conversations and saved snippets persist across sessions and are searchable from the sidebar.

What if the model makes up a citation?

Every citation is validated against your indexed sources. If the model fabricates a reference that doesn't map to a real indexed chunk, it's flagged — you only see citations we can verify.

What if my source's version doesn't match my stack?

Grounded Code detects version mismatches between your stack profile and the retrieved chunks. When a conflict is found, it asks you to clarify before answering — so you don't get v4 patterns when you're on v6.

Stop reading docs.
Start shipping code.

150+ doc sources. Cited code answers. Free during beta.

Get started free