Instatic logo

Instatic

Self-hosted visual CMS that publishes clean static pages

Alternative to: webflow, framer, wordpress, squarespace, wix


Instatic is a self-hosted, open-source alternative to Webflow, Framer and WordPress. A single Bun server bundles a visual canvas editor, content engine, media manager, forms, plugins and publisher, and outputs plain semantic HTML and compact CSS with no framework runtime left behind. Content, custom collections, users, roles and plugins are all managed from one admin, backed by SQLite or Postgres.

Instatic Docker Compose example

Self-host Instatic on your own server, homelab, or VPS starting from this Docker Compose example. It runs Instatic in Docker containers using the official ghcr.io/corebunch/instatic:latest image, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  app:
    image: ghcr.io/corebunch/instatic:latest
    restart: unless-stopped
    environment:
      # Port the Instatic server listens on inside the container.
      PORT: "3001"
      # Database connection string. SQLite is the default for single-site
      # installs and stores the database file inside the persistent /app/data
      # volume. Use a "postgres://..." URL to run against Postgres instead.
      DATABASE_URL: "sqlite:/app/data/cms.db"
      # Directory for uploaded media, fonts, plugins and published artifacts.
      UPLOADS_DIR: "/app/uploads"
      # Directory holding the built static admin assets shipped in the image.
      STATIC_DIR: "/app/dist"
      # Base64-encoded 32-byte key used to sign sessions. Generate a real value
      # for production (bun run scripts/generate-secret-key.ts); an empty value
      # only works for local trials.
      INSTATIC_SECRET_KEY: ""
      # Comma-separated trusted proxy CIDRs for real client-IP attribution when
      # running behind a reverse proxy (e.g. "10.0.0.0/8"). Empty disables it.
      TRUSTED_PROXY_CIDRS: ""
    volumes:
      - data:/app/data
      - uploads:/app/uploads
    healthcheck:
      test: ["CMD", "bun", "run", "server/healthcheck.ts"]
      interval: 30s
      timeout: 5s
      start_period: 20s
      retries: 3

volumes:
  data:
  uploads:

Prefer a managed setup? WinterFlow installs, configures, and updates Instatic for you using this same Docker Compose configuration.