mirror of
https://github.com/supabase/supabase.git
synced 2026-09-06 18:11:51 +08:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Docs update ## What is the new behavior? - All 19 guides follow one step order: create project → set up database → create app → AI tooling → add keys → create client → query data → run it → go to production. Added _template.mdx with structure requirements; it is not enforced with a lint check for now - this will be a separate PR before adding new guides. - 4 new partials replace copy-pasted blocks (AI tooling, connection strings, mobile env vars, going to production). - Error handling: return a message instead of a blank page when a query fails. - All guides verified and tested separately - all work as described. What was fixed: wrong env var names in the Hono sample, a Next.js page that redirected to login, missing database permissions in Refine and Hono, and stale file paths and APIs in SvelteKit, Refine, and TanStack. - Astro, Expo, Python, Laravel, and Rails were live but missing from the quickstart grid or listing page. Added, with two new icons. ## Quick links for review Base preview: https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs **Quickstart discovery**: new Astro/Expo/Python/Laravel/Rails entries and icons - [Docs homepage grid](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs) <img width="1998" height="882" alt="CleanShot 2026-08-12 at 12 06 31@2x" src="https://github.com/user-attachments/assets/942eb7e2-1e85-4b20-a6a7-c2b127d31b2b" /> - [Getting started overview](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started) <img width="856" height="878" alt="CleanShot 2026-08-12 at 12 13 30@2x" src="https://github.com/user-attachments/assets/d48091a9-7daf-4796-a521-14116b7479c9" /> ### New shared files: **[apps/docs/content/guides/getting-started/quickstarts/_template.mdx](e311542913/apps/docs/content/guides/getting-started/quickstarts/_template.mdx)** A reference contract the other 19 quickstart guides are checked against. Documents the required frontmatter, the canonical 10-step section order, every guide's deviation from that order (and why), the direct-Postgres exception (Laravel/Rails/RedwoodJS/Spring Boot), and the discovery-surface/icon requirements for adding a new guide. No lint rule enforces it yet; that's a follow-up PR. **[apps/docs/content/_partials/quickstart_ai_tooling.mdx](e311542913/apps/docs/content/_partials/quickstart_ai_tooling.mdx)** Example: [Next.js](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/nextjs#4-set-up-ai-tooling-optional) → "Set up AI tooling" section Shared by all 19 guides: astrojs, expo-react-native, flask, flutter, hono, ios-swiftui, kotlin, laravel, nextjs, nuxtjs, reactjs, redwoodjs, refine, ruby-on-rails, solidjs, spring-boot, sveltekit, tanstack, vue **[apps/docs/content/_partials/quickstart_going_to_production.mdx](e311542913/apps/docs/content/_partials/quickstart_going_to_production.mdx)** Example: [Next.js](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/nextjs#going-to-production) → "Going to production" section Shared by all 19 guides: same full list as above **[apps/docs/content/_partials/quickstart_connection_string.mdx](e311542913/apps/docs/content/_partials/quickstart_connection_string.mdx)** Example: [Laravel](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/laravel#5-set-up-the-postgres-connection-details) → connection string setup step Shared by 3 guides: laravel, ruby-on-rails, spring-boot – the ORM/backend frameworks that connect directly to Postgres rather than through the Data API **[apps/docs/content/_partials/quickstart_mobile_env_note.mdx](e311542913/apps/docs/content/_partials/quickstart_mobile_env_note.mdx)** Example: [iOS SwiftUI](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/ios-swiftui#get-api-details:~:text=This%20guide%20substitutes%20your%20project%20URL%20and%20key%20directly) → environment variables step Shared by 3 guides: ios-swiftui, flutter, kotlin – note Expo React Native is mobile too but doesn't use this partial, since it has its own `EXPO_PUBLIC_` prefix convention inline instead. ## Per guide changes **[Astro](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/astrojs#9-query-supabase-data-from-astro)** Typed query error in the server client sample. **[Expo React Native](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/expo-react-native#8-query-data-from-the-app)** Added an `error` state alongside instruments. Also removed the broken [`--web` verification path](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/expo-react-native#9-start-the-app): expo-sqlite needs Metro wasm + COEP/COOP config the guide never had (CodeRabbit finding). **[Flask](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/flask#7-create-the-supabase-client)** Split "Create the Supabase client" and ["Query data"](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/flask#8-query-data-from-the-app) into their own steps. **[Flutter](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/flutter#9-setup-deep-links-optional)** Reworded the deep-links section; keeps the framework-specific [Android `INTERNET` permission subsection](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/flutter#android) under "Going to production." **[Hono](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/hono#6-declare-supabase-environment-variables)** Split into "Install dependencies," "Declare environment variables," "Set up anonymous sign-ins," and "Query data" as separate steps. Fixes wrong env var names from the previous sample. **[iOS SwiftUI](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/ios-swiftui#8-query-data-from-the-app)** Added an `isLoading` state so the loading overlay doesn't hang forever on a successful empty result (CodeRabbit fix). **[Kotlin](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/kotlin#5-install-dependencies)** Fixed the Compose compiler plugin declaration: `apply false` was missing from the app module (CodeRabbit finding). **[Laravel](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/laravel#5-set-up-the-postgres-connection-details)** Now uses the shared `quickstart_connection_string.mdx` partial for the session-pooler/SSL guidance instead of inline copy. **[Next.js](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/nextjs#6-allow-public-access-to-the-instruments-page)** New step fixing the page that previously redirected to login. Its middleware path check is also now segment-aware so it doesn't over-match paths like `/instruments-private` (CodeRabbit finding). **[Nuxt](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/nuxtjs#7-create-the-supabase-client)** "Create the Supabase client" and ["Query data"](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/nuxtjs#8-query-data-from-the-app) split out as their own steps. **[React](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/reactjs#7-create-the-supabase-client)** Same client-creation/[query-data](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/reactjs#8-query-data-from-the-app) split as the other Vite-based guides. **[RedwoodJS](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/redwoodjs#2-gather-database-connection-strings)** Expanded into explicit transaction-mode/session-mode connection strings, Prisma schema, migration, seed, and scaffold steps; fixes stale file paths and APIs from the previous version. **[Refine](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/refine#8-allow-writes-to-the-instruments-table)** New step fixing the missing RLS grants that made the scaffolded create/edit pages fail. **[Ruby on Rails](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/ruby-on-rails#4-set-up-the-postgres-connection-details)** Now uses `quickstart_connection_string.mdx`; added a [reminder to save the database password](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/ruby-on-rails#1-create-a-supabase-project) before it's needed for the connection string. **[SolidJS](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/solidjs#7-create-the-supabase-client)** Same client-creation/[query-data](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/solidjs#8-query-data-from-the-app) split, adapted to Solid's `resource.error`. **[Spring Boot](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/spring-boot#4-set-up-the-postgres-connection-details)** Connection-string section now uses the shared partial instead of a duplicated inline caution. **[SvelteKit](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/sveltekit#8-query-data-from-the-app)** Updated `load` functions (both `+page.js` and `+page.server.ts` variants) with explicit query-error typing; fixes stale file paths and APIs from the previous version. **[TanStack](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/tanstack#8-query-supabase-data-from-tanstack-start)** `fetchInstruments` now returns and renders the query error instead of silently returning an empty list (CodeRabbit finding); fixes stale file paths and APIs from the previous version. **[Vue](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/vue#7-create-the-supabase-client)** Same client-creation/[query-data](https://docs-git-docs-standardize-framework-quickstarts-supabase.vercel.app/docs/guides/getting-started/quickstarts/vue#8-query-data-from-the-app) split as the other Vite-based guides. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added SolidJS, RedwoodJS, Refine, Laravel, and Ruby on Rails quickstarts. * Added framework discovery entries for Astro, Expo React Native, Python, Laravel, and Rails. * Added optional AI tooling, MCP setup, connection-string, mobile configuration, and production-readiness guidance. * Added a Hono authentication example with anonymous sign-in, user details, and instrument data. * **Documentation** * Expanded setup, environment, authentication, RLS, migration, SSL, and deployment guidance. * **Bug Fixes** * Improved sample error handling for failed data requests. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Miranda Limonczenko <miranda.limonczenko@supabase.io>
155 lines
9.2 KiB
Plaintext
155 lines
9.2 KiB
Plaintext
This file is a reference contract for framework quickstarts in this directory. It is
|
|
not a rendered page (filenames starting with `_` are excluded from the docs build
|
|
and from `supa-mdx-lint`) — it exists so every quickstart conforms to the same shape,
|
|
and so Phase 3's lint rule has a single source to check against.
|
|
|
|
## Required frontmatter
|
|
|
|
```yaml
|
|
---
|
|
title: 'Use Supabase with <Framework>'
|
|
subtitle: '<one sentence: what the reader builds>'
|
|
breadcrumb: 'Framework Quickstarts'
|
|
---
|
|
```
|
|
|
|
## Required section order
|
|
|
|
Before the numbered steps, and before any heading:
|
|
|
|
- `<AiPrompt id="<slug>" />` — always first. Every id must exist as a key in
|
|
`apps/docs/data/ai-prompts.data.ts`.
|
|
- An optional `## Prerequisites` section, for guides whose toolchain isn't implied
|
|
by the framework itself. `spring-boot.mdx` is the current example: Java 17,
|
|
`curl`, `unzip`. Don't add one to restate the obvious.
|
|
|
|
The list below is the canonical order, not the literal heading numbers.
|
|
`quickstart_db_setup.mdx` supplies headings 1 and 2, so guides that use it start
|
|
their own headings at 3. Guides that use `quickstart_create_project.mdx` alone get
|
|
heading 1 from the partial and start at 2. A guide may also insert a
|
|
framework-specific step — `astrojs.mdx` adds **Configure Astro for SSR** between the
|
|
client library and the environment variables — so number each guide's headings
|
|
sequentially from where its partial leaves off rather than copying numbers from here.
|
|
|
|
1. **Create a Supabase project** — via `<$Partial path="quickstart_create_project.mdx" />`,
|
|
either directly or nested inside `quickstart_db_setup.mdx` (see below).
|
|
- **Set up your database** (also numbered step 2, replacing the above) — only
|
|
for guides that query the shared `instruments` sample table through a
|
|
Supabase client library. Use `<$Partial path="quickstart_db_setup.mdx" />`
|
|
instead (it nests the project-creation partial). Guides that connect
|
|
directly to Postgres with their own ORM (Laravel, Rails, RedwoodJS, Spring
|
|
Boot) skip this and use `quickstart_create_project.mdx` alone — add a
|
|
one-line note stating the guide uses the framework's own tables instead, so
|
|
the omission reads as deliberate rather than a gap.
|
|
2. **Create a `<framework>` app**
|
|
3. **Set up AI tooling (optional)** — `<$Partial path="quickstart_ai_tooling.mdx" />`.
|
|
Covers both Agent Skills and the MCP server in one step. Keep them together:
|
|
two adjacent optional AI steps push the first real Supabase code further down
|
|
the page for no reader benefit, and the prose is identical across all 19 guides,
|
|
so it lives in the partial rather than being copied per guide.
|
|
4. **Install the Supabase client library**
|
|
- Guides that start from a scaffold which already depends on `supabase-js`
|
|
keep the step but retitle it to what the reader actually does. `hono.mdx`
|
|
uses **Install dependencies**, because `npx supabase bootstrap hono` already
|
|
lists the packages in `package.json` and the reader only runs `npm install`.
|
|
`nextjs.mdx` drops the step entirely, because the `with-supabase` template
|
|
installs them as part of step 3.
|
|
5. **Declare Supabase environment variables** — env vars only, never literal
|
|
credentials in code. Mobile guides (Flutter, iOS SwiftUI, Kotlin) are the
|
|
documented exception — they use `YOUR_SUPABASE_URL` / `YOUR_SUPABASE_PUBLISHABLE_KEY`
|
|
placeholder substitution instead of a `.env` file, with
|
|
`<$Partial path="quickstart_mobile_env_note.mdx" />` explaining why. Include the
|
|
`<Button>` "Open Connect panel" link and `<$Partial path="api_settings.mdx" />`
|
|
(or, for direct-Postgres guides, `<$Partial path="quickstart_connection_string.mdx" />`).
|
|
6. **Create the Supabase client** — its own step, not inlined into the query
|
|
sample. `reactjs.mdx`, `vue.mdx`, `solidjs.mdx`, and `sveltekit.mdx` export a
|
|
shared client from `src/lib/supabaseClient.*`; Nuxt uses a composable in
|
|
`app/composables/` because `useRuntimeConfig()` requires a Nuxt context.
|
|
- Guides whose scaffold already creates the client omit this step rather than
|
|
telling the reader to write a file that exists. `nextjs.mdx` (the
|
|
`with-supabase` template's `lib/supabase/{client,server}.ts`), `hono.mdx`
|
|
(`src/middleware/auth.middleware.ts`), and `refine.mdx` (the
|
|
`refine-supabase` preset's `src/providers/supabase-client.ts`) all do this.
|
|
When you omit it, say where the client lives at the point the query sample
|
|
first imports it. Otherwise the import arrives unexplained, and an agent
|
|
reading the page has no signal the file exists.
|
|
7. **Query data from the app** — every inline query sample must handle the error
|
|
branch. `reactjs.mdx`'s `getInstruments` (destructure `error`, check it, log/render
|
|
before touching `data`) is the reference implementation; adapt to the language's
|
|
idiom (`try`/`catch` for Kotlin/Flask, `snapshot.hasError` for Flutter's
|
|
`FutureBuilder`, Solid's `resource.error`, etc.) rather than copying JS syntax
|
|
verbatim.
|
|
- If the guide's UI also writes, it must add the matching grants and RLS
|
|
policies before telling the reader to try them. `quickstart_db_setup.mdx`
|
|
grants `select` to `anon` only, so an insert or update through a Supabase
|
|
client library fails with `permission denied for table instruments`.
|
|
`refine.mdx` (scaffolded create and edit pages) and `hono.mdx` (anonymous
|
|
sign-ins use the `authenticated` role) each carry their own policy step for
|
|
this reason. Guides that reach Postgres directly through their own ORM bypass
|
|
RLS and don't need one.
|
|
|
|
8. **Start the app** — exact local URL and what the reader should see.
|
|
9. **Production requirements** — `<$Partial path="quickstart_going_to_production.mdx" />`,
|
|
which supplies the `##` heading itself, so don't add one in the host file. Every
|
|
guide gets this, immediately before Next steps. Its wording is deliberately neutral
|
|
about which tables the guide uses, so it stays true for both the `instruments`
|
|
guides and the direct-Postgres ones. `flutter.mdx` is the one guide that appends a
|
|
framework-specific `###` subsection under it, for the Android `INTERNET`
|
|
permission.
|
|
10. **Next steps** — canonical order: framework-specific Auth pointer (or the
|
|
generic `Set up [Auth](/docs/guides/auth) for your app` if there's no
|
|
framework-specific one) → Insert more data → Storage → Supabase Library (`/ui`).
|
|
- Only link `/ui` from a framework Supabase Library actually ships blocks for.
|
|
The supported list is `supportedFrameworks` in
|
|
`apps/ui-library/config/docs.ts`, currently Next.js, Nuxt, React, React
|
|
Router, TanStack, and Vue. Check it rather than assuming — Astro, SolidJS,
|
|
and SvelteKit are **not** supported, so those guides omit the link even
|
|
though they render a component-based frontend.
|
|
- `/ui` and `/ui/docs/*` are permanent redirects to `/library` and
|
|
`/library/docs/*`. Existing guides still link `/ui`; point new links at
|
|
`/library` directly, and use `/library/docs/<framework>/<block>` for
|
|
individual blocks.
|
|
- Also omit it from mobile-native and backend-only guides, and from RedwoodJS
|
|
and Refine, which ship their own component and Inferencer story.
|
|
|
|
## Direct-Postgres guides (Laravel, Rails, RedwoodJS, Spring Boot)
|
|
|
|
Use `<$Partial path="quickstart_connection_string.mdx" />` for the session-pooler
|
|
rationale, IPv6/IPv4 note, percent-encoding, and `sslmode` guidance. Laravel, Rails,
|
|
and Spring Boot all use it. Keep the actual connection-string code block in the host
|
|
file — the URI format differs (`postgres://` vs `jdbc:postgresql://`).
|
|
|
|
RedwoodJS is the exception and doesn't use the partial: Prisma needs a Transaction-mode
|
|
string for app queries and a Session-mode string for migrations, so the guide walks
|
|
through both connection modes itself rather than the single session-pooler string the
|
|
partial describes.
|
|
|
|
## Discovery surfaces
|
|
|
|
A new quickstart must appear in the navigation menu, and optionally in the content
|
|
listing and the framework grid:
|
|
|
|
- `apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts` — required
|
|
- `apps/docs/data/content-listings/getting-started.data.ts` — optional
|
|
- `apps/docs/components/FrameworkQuickstarts.tsx` — optional
|
|
|
|
Both optional surfaces need an icon in `apps/docs/public/img/icons/`, so a guide stays
|
|
out of them until the framework's icon is one Supabase can use. Spring Boot is the
|
|
current example. The content listing also accepts an icon chip
|
|
(`{ kind: 'server', color: '#64748B', bg: 'rgba(100,116,139,0.1)' }`) in place of a
|
|
brand icon.
|
|
|
|
Icons must be square and readable on both themes. `FrameworkQuickstarts.tsx` renders
|
|
them at a fixed width in a `bg-surface-100` tile, so a wide wordmark renders small and
|
|
an icon with no explicit `fill` defaults to black and disappears in dark mode. Set the
|
|
brand color explicitly, and pad the `viewBox` to a square if the source asset isn't
|
|
one. Icons that ship a `-light.svg` variant set `hasLightIcon: true`, which uses the
|
|
light file in light mode and the base file in dark mode.
|
|
|
|
## What's deliberately not in this contract yet
|
|
|
|
- A machine-checked version of this list (Phase 3 — a `supa-mdx-lint` rule or a
|
|
vitest over the MDX AST).
|
|
- A "last verified" date, pinned framework versions, or a time-to-value label per
|
|
guide (Phase 4).
|