Dart Edge

Dart Edge, a project built and maintained by Invertase, enables Dart code to be run on different edge environments. This guide will walk you through how you can start using Dart Edge to write your backend code using Dart and run it on Supabase.

⚠️ WARNING: Dart Edge is an experimental project - it's probably not ready for production usage unless you're okay with living on the 'edge'. Open issues on Dart Edge repo if you encounter any issues.

Pre requirements#

Make sure you have the edge CLI installed in addition to the Supabase CLI.

1# install the edge CLI
2dart pub global activate edge

Setting up your first Dart Edge project#

Create a new Dart Edge project using the new command on the edge CLI. This will create a familiar boilerplate for your Dart Edge project such as main.dart and pubspec.yaml file.

1edge new supabase_functions new_project

cd into the project and initialize a new Supabase project inside the project you just created.

1cd new_project
2supabase init

Run pub get to install the dependencies.

1dart pub get

Open the lib/main.dart and look at the initial template.

void main() {
  SupabaseFunctions(fetch: (request) {
    return Response("Hello from Supabase Edge Functions!");

SupabaseFunctions class has a fetch handler, which is expected to return a Response object, and has a request parameter, which contains information about the request such as body and headers.

Using Supabase Client#

Now let’s try to interact with our Supabase database. We will start by installing the dependencies.

Add dependencies#

Add supabase to interact with Supabase service.

1dart pub add supabase

We also need to use a special HTTP client to HTTP requests in the edge environment.

1dart pub add edge_http_client

Initialize SupabaseClient#

At this point, you can initialize a SupabaseClient by passing the EdgeHttpClient. We can access the Supabase credentials through the environment variables using Deno.env.get() method. Note that Supabase credentials are available by default, so no configurations are necessary.

Now we have the following sample functions code to query Supabase database using the Supabase client.

import 'dart:convert';

import 'package:supabase_functions/supabase_functions.dart';
import 'package:edge_http_client/edge_http_client.dart';
import 'package:supabase/supabase.dart';

void main() {
  final supabase = SupabaseClient(
    Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!, // Use service role key to bypass RLS
    httpClient: EdgeHttpClient(),

  SupabaseFunctions(fetch: (request) async {
		// You can query `public.users` table for example.
    final List users = await supabase.from('users').select().limit(10);
    return Response.json(users);

Run the Functions#

Run locally#

Run the following command to compile your Dart code. This command will start a watcher that will recompile anytime you make changes to your code.

1edge build supabase_functions --dev

With docker running, start your local Supabase with the following command

1supabase start

While you have the above code running, open another terminal and run the following to start the Supabase local development environment.

1supabase functions serve dart_edge --no-verify-jwt

You should be able to access your local function here:


Deploy to the Edge#

Run the following commands to compile and deploy your function on Supabase Edge functions.

1edge build supabase_functions
2supabase functions deploy dart_edge

You will be asked to provide the project reference of your Supabase instance to which you want to deploy the function. You can link your local project to your Supabase instance to avoid having to provide the Supabase reference every time you deploy.