Getting Started

Use Supabase with Astro

Learn how to create a Supabase project, add sample data, and query from an Astro app.


1

Create a Supabase project

Go to database.new and create a new Supabase project.

Alternatively, you can create a project using the Management API:

1
# First, get your access token from https://supabase.com/dashboard/account/tokens
2
export SUPABASE_ACCESS_TOKEN="your-access-token"
3
4
# List your organizations to get the organization ID
5
curl -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
6
https://api.supabase.com/v1/organizations
7
8
# Create a new project (replace <org-id> with your organization ID)
9
curl -X POST https://api.supabase.com/v1/projects \
10
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
11
-H "Content-Type: application/json" \
12
-d '{
13
"organization_id": "<org-id>",
14
"name": "My Project",
15
"region": "us-east-1",
16
"db_pass": "<your-secure-password>"
17
}'

When your project is up and running, go to the Table Editor, create a new table and insert some data.

Alternatively, you can run the following snippet in your project's SQL Editor. This will create an instruments table with some sample data.

1
-- Create the table
2
create table instruments (
3
id bigint primary key generated always as identity,
4
name text not null
5
);
6
-- Insert some sample data into the table
7
insert into instruments (name)
8
values
9
('violin'),
10
('viola'),
11
('cello');
12
13
alter table instruments enable row level security;

Make the data in your table publicly readable by adding an RLS policy:

1
create policy "public can read instruments"
2
on public.instruments
3
for select to anon
4
using (true);
2

Create an Astro app

  • Create an Astro app using the npm create command.

Terminal
1
npm create astro@latest my-app
2
cd my-app
3

Install Supabase client library and Node adapter

Install the supabase-js client library and the @astrojs/node adapter to enable server-side rendering.

Terminal
1
npm install @supabase/supabase-js @astrojs/node
4

Configure Astro for SSR

Update your astro.config.mjs.

astro.config.mjs
1
import { defineConfig } from "astro/config";
2
import node from "@astrojs/node";
3
4
export default defineConfig({
5
output: "server",
6
adapter: node({
7
mode: "standalone",
8
}),
9
});
5

Declare Supabase Environment Variables

Create a .env.local file and populate with your Supabase connection variables:

Project URL
Publishable key
1
PUBLIC_SUPABASE_URL=<SUBSTITUTE_SUPABASE_URL>
2
PUBLIC_SUPABASE_PUBLISHABLE_KEY=<SUBSTITUTE_SUPABASE_PUBLISHABLE_KEY>

You can also get the Project URL and key from the project's Connect dialog.

Get API details#

Now that you've created some database tables, you are ready to insert data using the auto-generated API.

To do this, you need to get the Project URL and key from the project Connect dialog.

Read the API keys docs for a full explanation of all key types and their uses.

6

Create a Supabase client helper

Create a utility file to initialize the Supabase client:

src/lib/supabase.ts
1
import { createClient } from "@supabase/supabase-js";
2
3
const supabaseUrl = import.meta.env.PUBLIC_SUPABASE_URL
4
const supabasePublishableKey = import.meta.env.PUBLIC_SUPABASE_PUBLISHABLE_KEY
5
6
export function createServerClient() {
7
return createClient(
8
supabaseUrl,
9
supabasePublishableKey
10
);
11
}
7

Query Supabase data from Astro

Create a new file at src/pages/instruments.astro and populate with the following.

This queries all rows from the instruments table in Supabase and renders them on the page.

src/pages/instruments.astro
1
---
2
import { createServerClient } from "../lib/supabase";
3
4
const supabase = createServerClient();
5
const { data: instruments } = await supabase.from("instruments").select();
6
---
7
8
<html>
9
<head>
10
<title>Instruments</title>
11
</head>
12
<body>
13
<ul>
14
{instruments?.map((instrument) => (
15
<li>{instrument.name}</li>
16
))}
17
</ul>
18
</body>
19
</html>
8

Start the app

Run the development server, go to http://localhost:4321/instruments in your browser of choice to check the list of instruments.

Terminal
1
npm run dev

Next steps#