Skip to content

Releases: niklan1110/keel

Release list

Keel 0.3.2

Choose a tag to compare

@github-actions github-actions released this 13 Oct 18:02

A security release from a full review of 0.3.0. Update every install.

Changed

  • Keel is licensed under the Functional Source License (FSL-1.1-ALv2). Using,
    changing and running Keel, including inside a company, is free; selling it
    or offering it as a competing product or hosted service needs permission.
    Each release becomes Apache 2.0 two years after it comes out.

Security

  • A project's owner role could make the Postgres superuser run its own code:
    through the scheduler's nightly cleanup, the event triggers that turn on
    row level security for new tables, and the Studio table editor. Superuser
    connections now use search_path=pg_catalog, the trigger functions have a
    fixed search path (migration 015), and the table editor works as the owner
    role.
  • Edge functions could reach private addresses through import(), which
    --deny-net doesn't cover. Module imports now follow the same address
    rules as fetch.
  • Function secrets can no longer set runtime variables that change how Deno
    or npm behave, such as SSLKEYLOGFILE, NPM_CONFIG_* or GLIBC_TUNABLES.
  • A realtime channel takes at most 100 postgres_changes bindings, so one
    join can no longer stall realtime for every project.
  • Signed URLs need a numeric expiry, and install.sh makes the install folder
    readable by its owner only.
  • Default-branch builds no longer publish the branch name as an image tag.

0.3.0 - 2026-10-12

Postgres extensions, scheduled jobs and webhooks, more sign-in providers,
encrypted off-site backups and installers for Windows, macOS and NAS systems.
Read "Upgrading" before you update an existing install.

Upgrading

  • keel-db runs a new image, keel-postgres: the same Postgres 17 as before
    with pgvector and PostGIS added, so existing data is used as it is. It comes
    with the new compose file: run the installer again to switch (a plain
    ./keel update keeps the old compose file and image). On ZimaOS, change
    keel-db's image to ghcr.io/<owner>/keel-postgres:latest. A third package
    is published next to keel and keel-functions; make it public too if you
    publish your own images.
  • The compose files have a new service, keel-egress, and a new network.
    With the installer's compose file, ./keel up (or docker compose up -d)
    starts it; on ZimaOS, import the new compose file.

Added

  • Sign-in with any OpenID Connect provider, such as Authentik, Keycloak,
    Authelia, Pocket ID or Zitadel: add one or more per project in Studio
    (Users > Sign-in settings) and sign in with
    signInWithOAuth({ provider: 'custom:<id>' }), as in Supabase. Keel uses
    discovery, PKCE and a nonce, and checks the provider's signed ID token.
    A provider on your own network can be reached over plain http when you
    allow it for that provider.
  • Sign-in with Discord, GitLab (gitlab.com or your own) and Microsoft
    (azure).
  • pgvector 0.8.7: create extension vector with schema extensions, vector
    columns, HNSW and IVFFlat indexes and nearest-neighbour search through RPC,
    as in Supabase's guides. A project's owner role can enable it.
  • PostGIS 3.6.4 (without raster): geometry and geography, spatial indexes
    and .geojson() responses. Enabled by the superuser in Studio's SQL editor.
  • The Supabase importer recreates vector and postgis.
  • Docs: a page on extensions.
  • Scheduled jobs with pg_cron's SQL API in every project: cron.schedule
    (five-field schedules, $, @daily and friends, or 'N seconds'),
    cron.unschedule, cron.alter_job, cron.job and cron.job_run_details.
    Jobs run as the project's owner role, never as a superuser, one run at a
    time, stopped after KEEL_CRON_TIMEOUT. keel-studio runs them.
  • HTTP requests from SQL with pg_net's API: net.http_get, net.http_post,
    net.http_delete and net._http_response, and Supabase's Database Webhooks
    (supabase_functions.http_request triggers). Calls to the project's own
    edge functions are routed inside Keel. A full queue skips a webhook's
    request instead of failing the write that fired it.
  • keel-egress, a new container that sends those requests. It logs in as
    keel_egress_admin, which can only work the request queues, and sits on a
    network of its own with the database and the gateway.
  • Studio: a Jobs tool listing scheduled jobs, recent runs and outgoing
    requests.
  • A Windows installer, install.ps1, for Docker Desktop in Windows PowerShell
    5.1 or PowerShell 7: no WSL terminal or Git Bash needed. It installs one
    exact version into %USERPROFILE%\keel, writes .env with random
    passwords (readable by your account only), keeps Studio and Postgres on the
    PC unless you pass -Lan / -LanDb, waits until Keel answers and prints
    your login. Running it again updates (with a database backup first);
    -Rollback goes back. -DryRun shows what it would do.
  • A Windows keel command (keel.cmd) with the same commands as the bash one,
    including update and rollback with the same backups, so either can roll
    back the other's update.
  • On Windows, Postgres keeps its data in a Docker volume
    (docker-compose.windows.yml) instead of on the Windows drive, where it is
    several times slower.
  • Install guides for Windows, macOS (Docker Desktop, OrbStack, Colima),
    Unraid, TrueNAS SCALE and Synology.
  • nas-docker-compose.yml, the self-contained compose file for NAS app
    screens (Unraid's Compose Manager, TrueNAS's Install via YAML, Synology's
    Container Manager, Portainer). It is the ZimaOS file under a second name.
  • KEEL_PUBLIC_NETWORK names the network a tunnel or Traefik joins, so a
    second Keel on the same machine no longer shares the first one's
    keel-public network.
  • Full backups: with KEEL_BACKUP_PASSPHRASE set, Keel writes one file each
    night holding every project's database, Keel's own settings, keys and Studio
    accounts, and every uploaded file, encrypted with the passphrase in the age
    format (open it with Keel or with the age tool). The newest
    KEEL_BACKUP_KEEP_LOCAL (2) stay on the server.
  • Off-site copies: full backups are uploaded to an S3-compatible bucket (AWS
    S3, Backblaze B2, Cloudflare R2, Wasabi, MinIO...), set up in Studio or with
    KEEL_BACKUP_S3_* in .env. The bucket keeps the newest backup of each of
    the last 7 days and 4 weeks. Uploads go in parts, so a NAS with 1 GB of RAM
    can upload backups of any size.
  • ./keel restore brings a whole install back from a full backup, on the same
    machine or a fresh install elsewhere, from a file or straight from the
    bucket. It checks the passphrase and the whole file before changing
    anything. ./keel restore --list shows the backups.
  • Studio's Backups drawer has the backup schedule, the retention, the backup
    target with a connection test, full backups with their upload state, and the
    backups in the bucket.
  • .\keel restore on Windows, with the same checks and confirmation as the
    bash keel.
  • Studio's Postgres connection strings (Connect, the agent prompt's
    KEEL_DB_URL) ask for TLS with ?sslmode=require when Postgres has it.
  • A new landing page and a restyled documentation site: one sidebar in
    reading order, a quickstart per platform, Coming from Supabase, a glossary,
    an FAQ, more troubleshooting, image zoom and better search.

Security

  • Requests from SQL follow the edge functions' network rules: private, LAN,
    loopback and metadata addresses (IPv4 and IPv6), this server and Keel's
    containers are refused unless opened with KEEL_FUNCTIONS_ALLOW_LAN; every
    address a name resolves to is checked and the connection is pinned to it;
    redirects aren't followed. Only the project owner role and superusers can
    schedule jobs or send requests; the API roles can't reach the cron and
    net schemas. The sender has no superuser password and no route to
    Studio or the Docker socket proxy.
  • Both installers check every file they download (compose files, the keel
    command) against the published SHA256SUMS and stop before changing
    anything when one doesn't match.
  • Keel's own CLI (fn deploy, secrets) follows the sslmode in
    KEEL_DB_URL like libpq (require, verify-ca, verify-full, disable);
    before, it never used TLS from another machine. A repeated sslmode is
    refused. The docs recommend verify-ca with the server's certificate.
  • cloudflared 2026.10.0, the Dockerfile frontend pinned by digest, and the
    keel-functions image takes Debian's security updates at build time.

Changed

  • Sign-in provider secrets are encrypted in the project settings when you
    save them. Secrets saved before stay as they are until you enter them again.
  • GET /auth/v1/settings lists the new providers under external.
  • The database image no longer contains gosu (a Go binary); its entrypoint
    drops root with Alpine's su-exec, and it gets Alpine's security updates at
    build time.
  • Releases now include install.ps1 with install.ps1.sha256, the Windows
    keel command, docker-compose.windows.yml and nas-docker-compose.yml.
  • CI runs the installers end to end on Linux, on macOS with its bash 3.2, and
    on Windows PowerShell 5.1, runs PSScriptAnalyzer, and checks that the main,
    source and NAS compose files define the same services and pinned images.
  • Studio mounts the storage folder (read-only) to back up uploaded files, and
    keel-migrate mounts the storage and backups volumes in a source checkout,
    for ./keel restore. Installer installs get the new compose file and
    keel script by running the installer again; on ZimaOS, import the new
    compose file. Without it, a full backup of a project with uploaded files
    fails with a message saying so, rather than leaving the files out.
  • The nightly backup time can be changed in Studio; it wins over
    KEEL_BACKUP_SCHEDULE.

Fixed

  • A failed sign-in with a provider redirects back to the app with 302, as
    Supabase does, instead of 303.
  • Docs: Studio API example...
Read more