{"id":21455520,"url":"https://github.com/hookdeck/supavlog","last_synced_at":"2025-07-22T16:05:57.545Z","repository":{"id":217832657,"uuid":"744913376","full_name":"hookdeck/supavlog","owner":"hookdeck","description":"SupaVlog - Open Source Vlog Application Template","archived":false,"fork":false,"pushed_at":"2025-03-17T03:13:27.000Z","size":7095,"stargazers_count":30,"open_issues_count":8,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-05-30T08:34:55.348Z","etag":null,"topics":["event-driven-application","event-driven-architecture","getstream","hookdeck","nextjs","supabase","vlog","vlogging","webhooks"],"latest_commit_sha":null,"homepage":"https://supavlog.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hookdeck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-01-18T09:06:01.000Z","updated_at":"2025-04-12T07:12:58.000Z","dependencies_parsed_at":"2025-05-30T07:47:51.110Z","dependency_job_id":"1c2469f6-31c0-4904-8bae-a079e9034708","html_url":"https://github.com/hookdeck/supavlog","commit_stats":null,"previous_names":["hookdeck/supavlog"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/hookdeck/supavlog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Fsupavlog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Fsupavlog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Fsupavlog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Fsupavlog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hookdeck","download_url":"https://codeload.github.com/hookdeck/supavlog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Fsupavlog/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266524875,"owners_count":23942833,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["event-driven-application","event-driven-architecture","getstream","hookdeck","nextjs","supabase","vlog","vlogging","webhooks"],"created_at":"2024-11-23T05:12:30.834Z","updated_at":"2025-07-22T16:05:57.489Z","avatar_url":"https://github.com/hookdeck.png","language":"TypeScript","readme":"\u003ch1 align=\"center\"\u003eSupaVlog - Vlog Application Starter Kit\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n Built with \u003ca href=\"https://supabase.com?ref=github-supavlog\"\u003eSupabase\u003c/a\u003e, \u003ca href=\"https://getstream.io?ref=github-supavlog\"\u003eStream\u003c/a\u003e, \u003ca href=\"https://hookdeck.com?ref=github-supavlog\"\u003eHookdeck\u003c/a\u003e, \u0026amp; \u003ca href=\"https://nextjs.org?ref=github-supavlog\"\u003eNext.js\u003c/a\u003e.\n\u003c/p\u003e\n\nRead the [SupaVlog blog post](https://hookdeck.com/blog/supavlog-vlog-start-kit-supabase-stream-hookdeck-nextjs?ref=github-supavlog) for more details on the application event-driven architecture (systems, components, and component interactions).\n\n## Features\n\n- Authentication with [Supabase](https://supabase.com?ref=github-supavlog)\n- Video recording with [Stream](https://getstream.io?ref=github-supavlog)\n- Webhook event handling with [Hookdeck](https://hookdeck.com?ref=github-supavlog)\n- Stream video storage with Supabase\n- Built with [Next.js](https://nextjs.org?ref=github-supavlog)\n\n### Limitations\n\n- A free Supabase plan has 1GB of storage and a maximum file size of 50MB. Videos \u003e 50MB will fail to upload.\n\n## Demo\n\n[![SupaVlog Screenshot](docs/supavlog-capture.png)](https://supavlog.com)\n\n## Running your own SupaVlog\n\nTo set up your own instance of SupaVlog you will need:\n\n- A [Supabase](https://supabase.com?ref=github-supavlog) account and a new project created\n- A [Stream](https://getstream.io?ref=github-supavlog) account with a project created\n- A [Hookdeck](https://hookdeck.com?ref=github-supavlog) account\n- A [Vercel](https://vercel.com?ref=github-supavlog) account\n\n### Supabase\n\nCreate a new Supabase project and up the Supabase CLI to use your project:\n\n```\nsupabase link --project-ref {YOUR_PROJECT_ID}\n```\n\n#### Edge Functions\n\nSet environmental variables for the Edge Functions:\n\n```\nsupabase secrets set NEXT_PUBLIC_SUPABASE_URL={SUPABASE_URL}\nsupabase secrets set X_SUPABASE_API_SECRET={SUPABASE_SERVICE_SECRET}\n```\n\nDeploy your Edge Functions:\n\n```\nsupabase functions deploy\n```\n\n#### Database\n\nCreate the schema by copying the contents of `supabase/schema.sql` and running it in the SQL editor for your Supabase project.\n\n#### Authentication\n\nSet the Site URL configuration for Supabase Authentication:\n\n![Supabase Authentication Site URL Configuration](docs/supabase-site-url-config.png)\n\n#### Storage\n\nCreate a **public** storage bucket called `videos`.\n\n### Vercel\n\nTo deploy this Next.js application to Vercel you will need to populate the following environment variables:\n\n```\n# set to false if you do not wish to allow signup\nNEXT_PUBLIC_SIGNUP_ENABLED=true\n\nNEXT_PUBLIC_SUPABASE_URL={your Supabase project URL}\nNEXT_PUBLIC_SUPABASE_ANON_KEY={your Supabase project Anon Key}\n\nNEXT_PUBLIC_STREAM_API_KEY={your Stream project API key}\nSTREAM_API_SECRET={your Stream project API secret}\n\nVIDEO_STORAGE_PLATFORM=supabase\n```\n\nYou can either sync with your own repository or use the **Deploy** button below.\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fhookdeck%2Fsupavlog\u0026env=NEXT_PUBLIC_SIGNUP_ENABLED,NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY,NEXT_PUBLIC_STREAM_API_KEY,STREAM_API_SECRET,VIDEO_STORAGE_PLATFORM\u0026demo-title=SupaVlog\u0026demo-url=https%3A%2F%2Fsupavlog.com\u0026demo-image=https%3A%2F%2Fgithub.com%2Fhookdeck%2Fsupavlog%2Fraw%2Fmain%2Fdocs%2Fsupavlog-capture.png)\n\n### Hookdeck\n\nCreate two connections within Hookdeck, both using the same [Source](https://hookdeck.com/docs/sources?ref=github-supavlog).\n\n![Hookdeck connections](docs/prod-connection-overview.png)\n\nSet authentication up on the Source, using `HMAC`, `SHA-256`, and `hex`. Enter `X-SIGNATURE` for the **Header Key** and use the Stream API secret as the **Webhook Signing Secret**.\n\n![Source Authentication Config](docs/source-auth-config.png)\n\nSet a filter on each connection.\n\nFor `upload-video`:\n\n```\n{\n  \"type\": {\n    \"$eq\": \"call.recording_ready\"\n  }\n}\n```\n\n![Upload video filter](docs/upload-video-filter.png)\n\nFor `upload-thumbnail`:\n\n```\n{\n  \"type\": {\n    \"$eq\": \"call.ended\"\n  }\n}\n```\n\n![Upload video filter](docs/upload-thumbnail-filter.png)\n\nFor each [Destination](https://hookdeck.com/docs/destinations?ref=github-supavlog) within the Connection, ensure that you configure your Destinations to use Bearer Token auth using your **live** `SUPABASE_ANON_KEY`as the bearer token.\n\n![Destination auth configuration](docs/destination-auth-config.png)\n\n### Stream\n\n#### Webhooks\n\nUse the Hookdeck `prod-stream-inbound` Source URL as the Webhook URL in Stream:\n\n![Stream Webhook configuration](docs/stream-webhook-config.png)\n\n#### Call types\n\nIn the Stream dashboard, under **Call Types**, select the **default** call type.\n\n\u003c!--\n\nTODO: currently a bug in Single Participant layout which means no sound is recorded.\nOnce that is resolved, bring this back in.\n\nUpdate **Recording** -\u003e **Layout Type** to be **Single Participant**\n\n![Stream - set layout type](docs/stream-layout-type.png)\n\n--\u003e\n\nEnable thumbnails:\n\n![Stream - Enable Thumbnails](docs/stream-enable-thumbnails.png)\n\nClick **Submit** to save.\n\n## Clone and run locally\n\n### Supabase functions\n\nTo run locally you will need the [Supabase CLI](https://supabase.com/docs/guides/cli/getting-started) installed.\n\nYou can then run the functions using the environment variables defined in `.env.local` by running:\n\n```\nnpm run supabase-functions\n```\n\n### Hookdeck\n\nCreate two connections within Hookdeck, both using the same [Source](https://hookdeck.com/docs/sources?ref=github-supavlog).\n\n![Hookdeck connections](docs/local-connection-overview.png)\n\nUse the Source URL as the Webhook URL in Stream:\n\n![Stream Webhook configuration](docs/stream-webhook-config.png)\n\nFor each [Destination](https://hookdeck.com/docs/destinations?ref=github-supavlog) within the Connection, ensure that you configure your Destinations to use Bearer Token auth using your **local** `SUPABASE_ANON_KEY`as the bearer token.\n\n![Destination auth configuration](docs/destination-auth-config.png)\n\nTo set up the Hookdeck CLI to connect to Hookdeck and tunnel the events locally:\n\n- Install the [Hookdeck CLI](https://hookdeck.com/docs/cli?ref=github-supavlog)\n- Run `npm run hookdeck-local`\n\n## Feedback and issues\n\nPlease file feedback and issues over on the [SupaVlog GitHub repo](https://github.com/hookdeck/supavlog/issues/new/choose).\n\n## Useful resources\n\n- [Supabase auth docs](https://supabase.com/docs/guides/auth?ref=github-supavlog)\n- [Supabase storage docs](https://supabase.com/docs/guides/storage?ref=github-supavlog)\n- [Stream video \u0026 audio docs](https://getstream.io/video/docs/?ref=github-supavlog)\n- [Hookdeck docs](https://hookdeck.com?ref=github-supavlog)\n\n# Attribution\n\n- \u003ca href=\"https://www.svgrepo.com/svg/458427/video\" title=\"video icons\"\u003eSVG video vector - SVG Repo\u003c/a\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhookdeck%2Fsupavlog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhookdeck%2Fsupavlog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhookdeck%2Fsupavlog/lists"}