---
id: local-development
title: Local Development
description: How to use Supabase on your local development machine.
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Learn how to use the Supabase CLI to develop your project locally and deploy to the Supabase Platform.
## Prerequisites
Make sure you have these installed on your local machine:
- [Docker](https://docs.docker.com/engine/install/)
- [Git](https://github.com/git-guides/install-git)
- [Supabase CLI](/docs/guides/cli)
## Log in to the Supabase CLI
```bash
supabase login
```
## Initialize your project
Create a new folder for your project and start a new git repository:
```bash
# create your project folder
mkdir your-project
# move into the new folder
cd your-project
# start a new git repository
git init
```
## Start Supabase services
[Initialize](/reference/cli/usage#supabase-init) Supabase to set up the configuration for developing your project locally:
```bash
supabase init
```
Make sure Docker is running. The [start](/reference/cli/usage#supabase-start) command uses Docker to start the Supabase [services](/architecture).
This command may take a while to run if this is the first time using the CLI.
```bash
supabase start
```
Once all of the Supabase services are running, you'll see output containing your local Supabase credentials.
You can use the [stop](/reference/cli/usage#supabase-stop) command at any time to stop all services.
## Access services
You can access services directly with any Postgres client or through the API Gateway ([Kong](https://github.com/Kong/kong)).
```sh
# Default URL:
postgresql://postgres:postgres@localhost:54322/postgres
```
The local Postgres instance can be accessed through [`psql`](https://www.postgresql.org/docs/current/app-psql.html)
or any other Postgres client, such as [pgadmin](https://www.pgadmin.org/).
For example:
```bash
psql 'postgresql://postgres:postgres@localhost:54322/postgres'
```
```sh
# Default URL:
http://localhost:54321
```
If you are accessing these services without the client libraries, you may need to pass the client keys as an `Authorization` header.
Learn more about JWT headers in our [Resources](/learn/auth-deep-dive/auth-deep-dive-jwts).
```sh
curl 'http://localhost:54321/rest/v1/' \
-H "apikey: " \
-H "Authorization: Bearer "
http://localhost:54321/rest/v1/ # REST (PostgREST)
http://localhost:54321/realtime/v1/ # Realtime
http://localhost:54321/storage/v1/ # Storage
http://localhost:54321/auth/v1/ # Auth (GoTrue)
```
## Database migrations
Database changes are managed through "migrations." Database migrations are a common way of tracking changes to your database over time.
### Make database changes
For this guide, create a table called `employees`. In Supabase Studio, navigate to the **SQL Editor** page and run the following SQL command:
```sql
create table employees (
id integer primary key generated always as identity,
name text
);
```
:::note
You can execute any SQL using the `DB URL` shown by [`supabase status`](/reference/cli/usage#supabase-status).
:::
Run the [`db diff`](/reference/cli/usage#supabase-db-diff) command to detect changes in the local database:
```sh
supabase db diff create_employees -f create_employees
```
This creates a new migration named `supabase/migrations/_create_employees.sql`, representing any changes made to the local database since [`supabase start`](/reference/cli/usage#supabase-start).
### Add sample data
Use the seed script in `supabase/seed.sql` (created with [`supabase init`](/reference/cli/usage#supabase-init)) to add sample data to the table.
```sql
-- in supabase/seed.sql
insert into public.employees (name)
values
('Erlich Backman'),
('Richard Hendricks'),
('Monica Hall');
```
Rerun the migration and seed scripts:
```bash
supabase db reset
```
You should now see the contents of `employees` in Studio.
### Reset database changes
Use the [`reset`](/reference/cli/usage#supabase-db-reset) command to revert any changes to the local database.
```sql
-- run on local database to make a change
alter table employees
add department text default 'Hooli';
```
Run the following command to reset the local database:
```sh
supabase db reset
```
## Deploy your project
Go to the [Supabase Dashboard](https://app.supabase.com) and create a project to deploy the changes.
### Link your project
:::note
There are a few commands required to link your project. We are in the process of consolidating these commands into a single command. Bear with us!
:::
Associate your project with your remote project using [`supabase link`](/reference/cli/usage#supabase-link).
```bash
supabase link --project-ref
# You can get from your project’s dashboard URL: https://app.supabase.com/project/
supabase db remote commit
# Capture any changes that you have made to your database before setting up the CLI
```
`supabase/migrations` is now populated with a migration in `..._remote_commit.sql`.
This migration captures any changes required for your local database to match the schema of your remote Supabase project.
### Deploy database changes
Deploy any local database migrations using [`db push`](/reference/cli/usage#supabase-db-push):
```sh
supabase db push
```
### Deploy Edge Functions
Deploy any Edge Functions using [`functions deploy`](/reference/cli/usage#supabase-functions-deploy):
```sh
supabase functions deploy
```
## Limitations
The local development environment is not as feature-complete as the Supabase Platform. Here are some of the differences:
- The Storage interface is coming soon.
- The Functions interface is coming soon.
- Logs are not supported through the interface (however you can access them through the Docker containers).
- You cannot update your project settings in the Dashboard—this must be done using the CLI.