// @ts-nocheck import { useParams } from 'common' import { Code, Play, Terminal } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' import { useMemo } from 'react' import { AiIconAnimation, Button, Card, CardContent, CardHeader, CardTitle, cn, Dialog, DialogContent, DialogDescription, DialogHeader, DialogSection, DialogTitle, DialogTrigger, Separator, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { EDGE_FUNCTION_TEMPLATES } from './Functions.templates' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ScaffoldSectionTitle } from '@/components/layouts/Scaffold' import { DocsButton } from '@/components/ui/DocsButton' import { ResourceItem } from '@/components/ui/Resource/ResourceItem' import { ResourceList } from '@/components/ui/Resource/ResourceList' import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { DOCS_URL } from '@/lib/constants' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const FunctionsEmptyState = () => { const { ref } = useParams() const router = useRouter() const aiSnap = useAiAssistantStateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const { mutate: sendEvent } = useSendEventMutation() const { data: org } = useSelectedOrganizationQuery() const [, setCreateMethod] = useQueryState('create', parseAsString) const showStripeExample = useIsFeatureEnabled('edge_functions:show_stripe_example') const templates = useMemo(() => { if (showStripeExample) { return EDGE_FUNCTION_TEMPLATES } // Filter out Stripe template return EDGE_FUNCTION_TEMPLATES.filter((template) => template.value !== 'stripe-webhook') }, [showStripeExample]) return ( <> Deploy your first edge function {/* Editor Option */}

Via Editor

Create and edit functions directly in the browser. Download to local at any time.

{/* AI Assistant Option */}

AI Assistant

Let our AI assistant help you create functions. Perfect for kickstarting a function.

{/* CLI Option */}

Via CLI

Create and deploy functions using the Briven CLI. Ideal for local development and version control.

Start with a template {templates.map((template) => ( } onClick={() => { sendEvent({ action: 'edge_function_template_clicked', properties: { templateName: template.name, origin: 'functions_page' }, groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) }} >

{template.name}

{template.description}

))}
) } export const FunctionsInstructionsLocal = () => { const showStripeExample = useIsFeatureEnabled('edge_functions:show_stripe_example') const templates = useMemo(() => { if (showStripeExample) { return EDGE_FUNCTION_TEMPLATES } // Filter out Stripe template return EDGE_FUNCTION_TEMPLATES.filter((template) => template.value !== 'stripe-webhook') }, [showStripeExample]) return ( <>
Developing Edge Functions with the CLI

Create an Edge Function

Create a new edge function called hello-world in your project via the Briven CLI.

code]:m-0 2xl:min-h-28' )} value="briven functions new hello-world" />

Run Edge Functions

You can run your Edge Function locally using briven functions serve.

code]:m-0 2xl:min-h-28' )} value={` briven start # start the briven stack briven functions serve # start the Functions watcher`.trim()} />

Invoke Edge Functions

While serving your local Edge Functions, you can invoke it using cURL or one of the client libraries.

code]:m-0 2xl:min-h-28' )} value={` curl --request POST 'http://localhost:54321/functions/v1/hello-world' \\ --header 'Authorization: Bearer BRIVEN_ANON_KEY' \\ --header 'Content-Type: application/json' \\ --data '{ "name":"Functions" }'`.trim()} />
Self-hosted Briven

Edge Functions are available in self-hosted Briven via Briven Edge Runtime. Unlike the platform, functions must be added manually — place each function at{' '} volumes/functions/<function-name>/index.ts {' '} and restart the functions service to pick up changes. See the guide to learn more about configuration, secrets, and routing.

Explore our templates {templates.map((template) => ( } >

{template.name}

{template.description}

{template.name} {template.description} code]:m-0 max-h-[420px]' )} value={template.content} />
))}
) } export const FunctionsSecretsEmptyStateLocal = () => { return ( <> Local development & CLI

Secrets can be loaded in two ways:

  • Place a .env file at{' '} briven/functions/.env — picked up automatically on briven start.
  • Pass --env-file to{' '} briven functions serve, e.g.{' '} briven functions serve --env-file ./path/to/.env-file
Self-Hosted Briven

Configure secrets in your .env file and{' '} docker-compose.yml under the{' '} functions service.

) }