Console to manage and distribute your live update
➡️ Get Instant updates for your App with Capgo
Missing a feature? We’ll build the plugin for you 💪
Features
- ☁️ Cloud / Self hosted Support: Use our Cloud to manage your app updates or yours.
- 📦 Bundle Management: Download, assign to channel, rollback.
- 📺 Channel Support: Use channels to manage different environments.
- 🎯 Set Channel to specific device to do QA or debug one user.
- 🔄 Auto Update: Automatically download and set the latest bundle for the app.
- ✅ Official Appflow alternative: our Capacitor updater plugin is the official alternative to Ionic Appflow.
- 🛟 Rollback: Reset the app to last working bundle if an incompatible bundle has been set.
- 🔁 Delta Updates: Make instant updates by only downloading changed files.
- 🔒 Security: Encrypt and sign each updates with best in class security standards.
- ⚔️ Battle-Tested: Used in more than 3000 projects.
- 📊 View your deployment statistics
- 🔋 Supports Android and iOS
- ⚡️ Capacitor 8/7/6/5 support
- 🌐 Open Source: Licensed under GNU AFFERO GENERAL PUBLIC LICENSE
- 🌐 Open Source Backend: Self install our backend in your infra
Usage
Capgo is deployed to production on Cloudflare workers and Supabase.
Cloudflare workers take 99% of the traffic. Supabase is used for internal calls, for internal tasks such as CRON jobs that call functions.
When self-hosted, installing only Supabase is sufficient.
Why Cloudflare Workers + Supabase
We support both deployments for practical reasons:
- Supabase is the legacy backend and the only required piece for self-hosting.
- Cloudflare Workers runs the same backend code (via the Hono adapter) but is much cheaper at Capgo scale. With ~50M devices, Supabase Edge Functions are cost-prohibitive because they follow AWS pricing. Cloudflare is ~10x cheaper for our traffic profile.
In production, we route most traffic through Cloudflare Workers for cost and
scale, while Supabase remains the reference backend and the default for
self-hosted deployments. Capgo cloud console and current CLI calls go to the
Cloudflare API hosts (VITE_API_HOST / hostApi). Capgo cloud still publishes
a small Supabase function allowlist for Postgres pg_net (triggers) and for
legacy CLI compatibility via /functions/v1 through 2026-10-28. Self-hosted
deployments keep using /functions/v1. Plugin hot paths and other unused Capgo
cloud endpoints are not published on Supabase.
Project structure (self-hosting map)
If you're self-hosting, the key pieces live in a few top-level directories:
supabase/- Primary backend for self-hostingsupabase/functions/- Edge functions (Deno) that power the API_backend/- Core implementation used by both Supabase and Cloudflarepublic/- Public API routes used by customers and appsprivate/- Internal API routes for the console and ops toolingplugins/- Plugin endpoints (updates, stats, channel_self, etc.)triggers/- Database triggers and CRON functions
supabase/migrations/- Database schema and RLS policiessupabase/seed.sql- Local seed data for tests/dev
supabase/schemas/prod.sql- Production schema dump (reference only)cloudflare_workers/- Optional Cloudflare Workers deployment (prod traffic)cloudflare_workers/snippet/- Geo routing for replicas- Worker entry points and deploy config live here
src/- Frontend Vue 3 web console (Vite + Tailwind + DaisyUI)src/pages/- File-based routessrc/components/- Reusable UI componentssrc/services/- API clients and integrationssrc/stores/- Pinia stores
sql/- Raw SQL helpers and maintenance scriptsscripts/- Dev/build scripts used by CI and local toolingtests/- Backend Vitest tests (run in parallel)playwright/- Frontend E2E testsdocs/- Extra documentation and guidesandroid/,ios/- Capacitor native projects (mobile builds)
Quick self-hosting path:
supabase/is enough to run the backend locally.src/is the web console you point to your own backend.cloudflare_workers/is only needed if you want to run the Workers layer instead of (or in front of) Supabase.
Backend endpoints (what lives where)
The backend is split by responsibility to keep routes clear and access scoped:
supabase/functions/_backend/public/- Public API exposed to customers. This is the documented API on the website for customers that want to interact with Capgo programmatically (apps, channels, bundles, devices, etc.).supabase/functions/_backend/private/- Private API used internally. The console (web UI) uses this heavily for admin/ops workflows. It is not publicly accessible. Some UI flows still use the public API where appropriate.supabase/functions/_backend/plugin_runtime/- Plugin API used by the@capgo/capacitor-updaterplugin running inside apps:plugins/updates- device update checks and bundle download flowplugins/stats- upload usage stats from devicesplugins/channel_self- allow a device to opt into a channel (QA/debug)
supabase/functions/_backend/triggers/- Triggers & CRON for automated backend jobs (queue consumers, scheduled tasks, DB-triggered flows).
When self-hosting, you generally expose public + plugin_runtime (via the
plugin worker / Deno updates · stats · channel_self entries). private
should stay internal and locked down. triggers runs automatically.
Production schema (prod.sql)
supabase/schemas/prod.sql is a schema dump of the production database. It is
generated via bun run schemas (or bun run schemas:local) and is meant for
reference/diffing, not as a source of truth. All actual schema changes live in
supabase/migrations/.
Documentation
https://github.com/Cap-go/capacitor-updater/wiki/Capgo-Sandbox-App
Plugins
All the following official plugins are already installed and pre-configured:
- [Action Sheet](https://github.com/