Self-hosting
Deploy Rowflare to your Cloudflare account
One button creates everything Rowflare needs in your account. Budget $5/month for the Cloudflare Workers Paid plan; that covers the whole team, with unlimited users.
Requirement: Workers Paid plan ($5/month)
Rowflare needs the Cloudflare Workers Paid plan, which costs $5/month per Cloudflare account. The free plan is not enough for a real team:
- The free plan allows 10 ms of CPU per request. A filter or sort on a 50,000-row base takes 74-80 ms inside the Durable Object.
- The free plan allows 5 million SQLite rows read per day. One filter on a 50,000-row base reads 50,000 rows, so roughly 100 filters a day would use up the quota.
The Paid plan includes 25 billion rows read per month, which is far more than a team normally uses. See the cost table.
One-click deploy
- Click Deploy to Cloudflare above and sign in to Cloudflare. Cloudflare forks the repository into your GitHub or GitLab account and builds it.
- Confirm the resource names it proposes (you can keep the defaults).
- Open the URL Cloudflare shows when the deploy finishes, for example
https://rowflare.your-subdomain.workers.dev. - Sign up right away. The first user to sign up becomes the owner of the instance. After that, signup is closed and other people join by invite from the owner.
What the button creates
| Resource | Used for |
|---|---|
| Worker | Serves the web app and the REST API, and routes each base to its Durable Object. |
| Durable Object namespace | One SQLite-backed Durable Object per base. All rows, fields, views and formulas live here. |
| D1 database | Users, workspaces, memberships, invites and API tokens. |
| R2 bucket | Attachments, including files copied from Airtable. |
| Cron trigger | Hourly maintenance jobs. |
Settings (environment variables)
Set these in the Cloudflare dashboard under your Worker, Settings, Variables and Secrets, or in wrangler.jsonc. Put keys and passwords in secrets, never in plain variables.
| Variable | Values | What it does |
|---|---|---|
MODE | "selfhost" (default) or "cloud" | selfhost: the first user to sign up becomes the owner and everyone else joins by invite. cloud: open sign-up for anyone (for running a hosted service). There are no plans or payments in the open-source edition. |
ALLOW_SIGNUP | "false" (default) or "true" | Allow anyone who can reach the instance to create an account. Keep it off for a private team. |
APP_URL | https://your-domain | Public URL of the instance, used to build absolute links such as invite links. |
SECRET_KEY | any long random string | Encrypts the AI keys and mail credentials that workspace owners save. Changing it makes saved credentials unreadable. |
EMAIL_FROM | noreply@your-domain | Sender address for system and account email through the Cloudflare Email Service binding EMAIL. |
AUTH_EMAIL | unset or "code" | code: people sign in with a 6-digit code mailed to them instead of a password. Needs account email. |
Manual deploy from the command line
If you prefer not to use the button, or want to change the code first:
git clone https://github.com/rowflare/rowflare.git
cd rowflare
npm install
npx wrangler login
npm run deploynpm run deploy builds the web app and deploys the Worker with its Durable Object, D1, R2 and cron bindings. Wrangler creates the D1 database and R2 bucket on the first deploy, and the Worker creates its D1 tables on the first request, so there is no separate migration step.
Run it with Docker
No Cloudflare account? The Docker image runs the same Worker code on any server, in workerd (Cloudflare's open-source Workers runtime). Durable Objects, D1 and R2 are stored as SQLite databases and files in /data, so mount a volume there.
docker run -d --name rowflare \
-p 8787:8787 \
-v rowflare-data:/data \
ghcr.io/rowflare/rowflare:latestOr run docker compose up -d with the docker-compose.yml from the repository. The settings above are passed as environment variables, for example -e APP_URL=https://rowflare.example.com. Images are published for linux/amd64 and linux/arm64. Put a reverse proxy with HTTPS in front of it, and sign up right away: the first user becomes the owner.
Updating
Pull the latest code and deploy again. Database migrations run as part of the deploy.
git pull
npm install
npm run deployIf you used the button, Cloudflare connected your fork to Workers Builds: sync your fork with the upstream repository on GitHub and the new commit deploys automatically.
With Docker, run docker compose pull and docker compose up -d. The data volume is kept.
Backups
- D1 Time Travel restores the accounts database to any point in the last 30 days on the Paid plan (
npx wrangler d1 time-travel). - Export a base as CSV (per table) or JSON (the whole base) and keep the files somewhere outside Cloudflare.
- Attachments stay in your R2 bucket; copy the bucket with any S3-compatible tool if you want an off-site copy.
- With Docker, everything is in the
/datavolume: stop the container and copy the volume, or snapshot its disk.
What it costs on Cloudflare
Everything below is included in the $5/month Workers Paid plan. You only pay more if your account goes above the included amounts.
| Usage | Included in $5/month | Above the included amount |
|---|---|---|
| Durable Object requests | 1 million / month | $0.15 per million |
| Durable Object duration | 400,000 GB-s / month | $12.50 per million GB-s (idle time with WebSocket Hibernation is not billed) |
| SQLite rows read | 25 billion / month | $0.001 per million |
| SQLite rows written | 50 million / month | $1.00 per million |
| SQLite storage | 5 GB-month | $0.20 per GB-month |
Worked example (estimate)
A team that runs 2,000 filters or sorts a day on a 50,000-row base reads about 50,000 x 2,000 x 30 = 3 billion rows a month, well inside the 25 billion included. Recomputing a formula column on that base 100 times a month writes about 5 million rows, inside the 50 million included. A 50,000-row base at about 678 bytes per row is roughly 34 MB of row data, far below 5 GB. That team pays $5/month.
Estimate based on the published prices above; your Cloudflare bill is the source of truth. The included amounts are shared across everything in your Cloudflare account.