DEV Community

Royce
Royce

Posted on • Originally published at ossalt.com

How to Self-Host Baserow: Open Source Airtable Alternative 2026

How to Self-Host Baserow: The Open Source Airtable Alternative in 2026

TL;DR

Airtable charges $20–$45/user/month and restricts records per base. Baserow is the open source alternative — a no-code database platform with a spreadsheet-like UI, built on PostgreSQL, self-hostable for the price of a VPS. It supports formula fields, gallery/kanban/calendar/grid views, file attachments, row-level permissions, and a full REST API that auto-generates from your table schema. The self-hosted version is free forever with no record limits. The community is active with 9,500+ GitHub stars and the project is actively maintained by a commercial company (Baserow BV) that monetizes through their hosted cloud offering, ensuring sustained development.

Key Takeaways

  • Free self-hosted: unlimited rows, tables, and workspaces on self-hosted instances
  • Multiple views: Grid, Gallery, Kanban, Calendar, and Form views on every table
  • Auto-generated REST API: every table gets a full CRUD API instantly, with OpenAPI spec
  • Formula fields: 100+ functions, cell references, and computed values
  • Real-time collaboration: multiple users editing simultaneously, no page refreshes
  • GitHub stars: 9,500+ with active weekly releases
  • License: MIT (open source) for the core; premium features require a license key

Why Baserow Over NocoDB or Grist?

Feature Baserow NocoDB Grist
License MIT AGPL AGPL
Row limits (self-hosted) None None None
Built on PostgreSQL MySQL/PostgreSQL/SQLite Python/SQLite
Formula engine 100+ functions Basic Advanced (Python-like)
Kanban view
Calendar view
Gallery view
Form builder Limited
Real-time collab
API quality Excellent (OpenAPI) Good Good

Baserow's differentiator is polish and UI quality — it feels the closest to the Airtable experience. NocoDB is stronger if you need to connect to an existing database (MySQL, MSSQL). Grist excels at Python-style formulas and spreadsheet power users. Baserow wins for teams wanting a clean Airtable drop-in.


Self-Hosting with Docker Compose

Prerequisites

  • Docker and Docker Compose
  • 2GB RAM minimum (4GB recommended for teams)
  • Domain with SSL (for production)

docker-compose.yml

version: "3.4"

services:
  # Caddy for reverse proxy + automatic TLS
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config

  backend:
    image: baserow/backend:latest
    restart: unless-stopped
    environment:
      DATABASE_HOST: db
      DATABASE_NAME: baserow
      DATABASE_USER: baserow
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      DATABASE_PORT: 5432
      REDIS_URL: redis://redis:6379
      SECRET_KEY: ${SECRET_KEY}
      BASEROW_PUBLIC_URL: https://baserow.yourdomain.com
      EMAIL_SMTP_HOST: ${EMAIL_HOST}
      EMAIL_SMTP_PORT: 587
      EMAIL_SMTP_USER: ${EMAIL_USER}
      EMAIL_SMTP_PASSWORD: ${EMAIL_PASSWORD}
      EMAIL_SMTP_USE_TLS: "true"
      FROM_EMAIL: baserow@yourdomain.com
    volumes:
      - baserow_media:/baserow/media
    depends_on:
      - db
      - redis

  web-frontend:
    image: baserow/web-frontend:latest
    restart: unless-stopped
    environment:
      BASEROW_PUBLIC_URL: https://baserow.yourdomain.com
      NUXT_PUBLIC_BASEROW_URL: https://baserow.yourdomain.com
    depends_on:
      - backend

  celery:
    image: baserow/backend:latest
    restart: unless-stopped
    command: celery-worker
    environment:
      DATABASE_HOST: db
      DATABASE_NAME: baserow
      DATABASE_USER: baserow
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      DATABASE_PORT: 5432
      REDIS_URL: redis://redis:6379
      SECRET_KEY: ${SECRET_KEY}
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    restart: unless-stopped
    environment:
      POSTGRES_DB: baserow
      POSTGRES_USER: baserow
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  baserow_media:
  caddy_data:
  caddy_config:
  redis_data:
Enter fullscreen mode Exit fullscreen mode

.env File

# .env
DATABASE_PASSWORD=change-this-strong-database-password
SECRET_KEY=change-this-secret-key-at-least-32-chars
EMAIL_HOST=smtp.youremail.com
EMAIL_USER=baserow@yourdomain.com
EMAIL_PASSWORD=your-email-password
Enter fullscreen mode Exit fullscreen mode

Generate the secret key:

openssl rand -hex 32
Enter fullscreen mode Exit fullscreen mode

Caddyfile for Automatic TLS

baserow.yourdomain.com {
    # Frontend
    reverse_proxy /api/* backend:8000
    reverse_proxy /ws/* backend:8000
    reverse_proxy /media/* backend:8000
    reverse_proxy web-frontend:3000
}
Enter fullscreen mode Exit fullscreen mode

Start Baserow

docker compose up -d

# Check status
docker compose ps

# Access at https://baserow.yourdomain.com
# Create your admin account on first visit
Enter fullscreen mode Exit fullscreen mode

The first user to register becomes the admin. Baserow initializes the PostgreSQL database automatically on first startup.


Creating Your First Database

Once logged in:

Create workspace → "My Team"
Create database → "Project Tracker"
Create table → "Tasks"
Enter fullscreen mode Exit fullscreen mode

Baserow auto-creates a grid view with default fields. Add fields by clicking the + button:

Field Type Use Case
Text Names, descriptions, notes
Long text Detailed descriptions, markdown
Number Quantities, prices, scores
Date Deadlines, created dates
Single select Status (Todo, In Progress, Done)
Multiple select Tags, categories
Checkbox Boolean flags
File Attachments, images, PDFs
URL Links to external resources
Formula Computed values from other fields
Link to table Relationships between tables
Lookup Pull data from linked records
Count Count linked records
Rollup Aggregate linked record values (sum, avg, min, max)

Views: Grid, Kanban, Gallery, Calendar, Form

Each table can have multiple views — the same underlying data, displayed differently.

Kanban View

Perfect for task management:

Create view → Kanban
Group by: Status field (Todo, In Progress, Review, Done)
Enter fullscreen mode Exit fullscreen mode

Cards show up in columns by status. Drag to move between stages. Click a card to open the full record editor.

Calendar View

For deadline tracking:

Create view → Calendar
Date field: Due Date
Enter fullscreen mode Exit fullscreen mode

Records appear on their due date. Drag to reschedule. Month, week, and day views available.

Gallery View

For image-heavy data (product catalogs, portfolios):

Create view → Gallery
Cover image: Photo field
Visible fields: Name, Price, Category
Enter fullscreen mode Exit fullscreen mode

Form View

Generate embeddable forms that create new records:

Create view → Form
→ Customize: hide internal fields, set required fields
→ Share: public link or embed code
→ Submissions appear as new rows in the grid
Enter fullscreen mode Exit fullscreen mode

Forms work without login — share with clients to collect data without exposing your database.


The Auto-Generated REST API

Every Baserow table gets a full CRUD REST API automatically. No configuration needed.

Get Your API Token

Settings → API Tokens → Create Token
Name: My Integration
Permissions: Read, Create, Update, Delete
Database: Project Tracker
Enter fullscreen mode Exit fullscreen mode

API Endpoints

# List all rows in a table
curl -X GET "https://baserow.yourdomain.com/api/database/rows/table/TABLE_ID/?user_field_names=true" \
  -H "Authorization: Token YOUR_API_TOKEN"

# Response:
{
  "count": 150,
  "next": "...?page=2",
  "results": [
    {
      "id": 1,
      "Name": "Build landing page",
      "Status": "In Progress",
      "Due Date": "2026-03-15",
      "Assignee": "Alice"
    },
    ...
  ]
}

# Create a new row
curl -X POST "https://baserow.yourdomain.com/api/database/rows/table/TABLE_ID/?user_field_names=true" \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "Name": "New task",
    "Status": "Todo",
    "Due Date": "2026-03-20"
  }'

# Update a row
curl -X PATCH "https://baserow.yourdomain.com/api/database/rows/table/TABLE_ID/ROW_ID/?user_field_names=true" \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "Status": "Done" }'

# Filter rows
curl "https://baserow.yourdomain.com/api/database/rows/table/TABLE_ID/?user_field_names=true&filters=\
[{\"field\":\"Status\",\"type\":\"equal\",\"value\":\"In Progress\"}]" \
  -H "Authorization: Token YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Baserow also exposes an OpenAPI spec at /api/schema/ — import it into Postman or Insomnia for full API exploration.


Automations: Webhooks and Zapier

Baserow supports webhooks on row events — connect to any external service:

Table  Settings  Webhooks  Create Webhook
Name: Notify Slack on Task Completion
URL: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
Events: Row updated
Request body:
{
  "text": "Task completed: {{ row.Name }} ({{ row.Status }})"
}
Enter fullscreen mode Exit fullscreen mode

Webhooks fire when rows are created, updated, or deleted. Combine with:

  • Zapier: Baserow has a native Zapier integration — trigger zaps on new rows, update rows from other apps
  • Make (Integromat): Visual workflow builder, native Baserow module
  • n8n: Open source automation — Baserow HTTP node for custom workflows

Formula Field Examples

Baserow's formula engine supports 100+ functions:

# Days until due date
toDate(field('Due Date'), 'YYYY-MM-DD') - now()

# Status badge with conditional logic
if(field('Status') = 'Overdue', '🔴 URGENT',
   if(field('Status') = 'In Progress', '🟡 Active', '🟢 OK'))

# Concatenate first and last name
concat(field('First Name'), ' ', field('Last Name'))

# Parse URL domain
regex_extract(field('Website'), 'https?://([^/]+)', 1)

# Calculate project budget remaining
field('Budget') - field('Spent')

# Text length check
if(length(field('Description')) < 50,
   'Too short - please expand',
   'Good')
Enter fullscreen mode Exit fullscreen mode

Formulas reference other fields with field('Field Name') and can chain functions. The formula editor provides autocomplete and real-time error checking.


Team Collaboration and Permissions

Baserow's premium tier adds row-level permissions; the free community tier has workspace-level roles:

Workspace Roles

Role Permissions
Admin Full access: create databases, manage members, delete workspace
Builder Create and edit tables, views, fields; cannot manage members
Viewer Read-only access to all databases in the workspace
Editor Read + write rows, cannot modify table structure

Inviting Team Members

Workspace Settings → Members → Invite by email
Role: Builder
→ User receives email invitation, creates account, gets instant access
Enter fullscreen mode Exit fullscreen mode

For external collaborators who don't need full database access, use Form views — they submit data without seeing the underlying table.


Backup and Restore

#!/bin/bash
# backup-baserow.sh
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR=/backups/baserow/$DATE
mkdir -p $BACKUP_DIR

# PostgreSQL backup
docker compose exec -T db pg_dump \
  -U baserow baserow \
  | gzip > $BACKUP_DIR/baserow_db.sql.gz

# Media files (attachments, images)
tar -czf $BACKUP_DIR/baserow_media.tar.gz \
  -C /var/lib/docker/volumes baserow_baserow_media

# Upload to S3-compatible storage
rclone copy $BACKUP_DIR b2:my-backups/baserow/$DATE

# Keep only last 14 days locally
find /backups/baserow -type d -mtime +14 -exec rm -rf {} +

echo "Baserow backup complete: $DATE"
Enter fullscreen mode Exit fullscreen mode

Restore

# Restore database
gunzip < /backups/baserow/20260301/baserow_db.sql.gz | \
  docker compose exec -T db psql -U baserow baserow

# Restore media
tar -xzf /backups/baserow/20260301/baserow_media.tar.gz \
  -C /var/lib/docker/volumes
Enter fullscreen mode Exit fullscreen mode

Upgrading Baserow

cd /opt/baserow

# Pull latest images
docker compose pull

# Restart services
docker compose up -d

# Database migrations run automatically on startup
# Check logs for any migration issues
docker compose logs backend | grep -i "migration"
Enter fullscreen mode Exit fullscreen mode

Baserow uses Django database migrations — they run automatically when the backend container starts. Always back up before major version upgrades.


Connecting to an Existing PostgreSQL Database

One of Baserow's most powerful features is connecting to an existing database — making your production data accessible through a spreadsheet UI without writing code:

Settings  Database Connections  Connect to External Database
Type: PostgreSQL
Host: your-prod-db.internal
Port: 5432
Database: your_database
Username: baserow_readonly    (use a read-only user!)
Password: ***
Schema: public
Enter fullscreen mode Exit fullscreen mode

Baserow reads your table schema and displays data in the grid UI. You can create views, filter, sort, and export — without touching SQL. Important: Use a read-only database user for this connection to prevent accidental data modification.


Cost Comparison: Airtable vs Baserow Self-Hosted

Plan Airtable Baserow Self-Hosted
Free tier 1,000 rows/base Unlimited
Team (5 users) $100/month ~$10/month (VPS)
Business (25 users) $1,125/month ~$20/month (VPS)
Record limit Per-plan None
Automations 25K runs/month Unlimited (webhooks)
Data location Airtable's cloud Your server

For a 10-person team, switching from Airtable Business to self-hosted Baserow saves over $800/month. The trade-off is operational responsibility — updates, backups, and uptime are yours to manage.


Methodology

  • GitHub data from github.com/bram2w/baserow, March 2026
  • Pricing comparisons from Airtable pricing page, March 2026
  • Setup guide based on Baserow official Docker documentation (baserow.io/docs/installation/install-with-docker)
  • Version: Baserow 1.x (check GitHub releases for latest)

Compare open source Airtable alternatives on OSSAlt — self-hosting difficulty, feature coverage, and community health.

Related: NocoDB vs Baserow vs Grist: Open Source Airtable Alternatives 2026 · How to Self-Host NocoDB: Connect to Your Existing Database 2026 · Best Open Source No-Code Database Tools in 2026

Top comments (0)