0.456 (05 Jun 2026)

5 June, 2026

This release focuses on migration reliability, query correctness for fields with digit suffixes, and flow dashboard performance.

Module-Aware Subscriber Scaffolding

Subscribers defined on models inside a module now scaffold into the correct module directory. Previously, subscriber handlers always landed in the project-root subscribers/ folder, even when the declaring model lived in a module. They now follow the same convention as jobs, flows, and custom functions:

my-project/
├── modules/
│   └── orders/
│       ├── orders.keel
│       └── subscribers/
│           └── onOrderCreated.ts   ← now lands here

No action is needed for existing projects — new scaffolds will automatically use the right path.

Decimal and Negative Default Fixes

Two migration bugs affecting numeric @default values have been fixed:

  • Integer decimal defaults — a Decimal field with @default(0) or @default(10) produced invalid SQL, causing migrations to fail with a Postgres error. These now render correctly.
  • Negative numeric defaults — fields with defaults like @default(-1) or @default(-1.5) caused a redundant migration on every keel run, even when nothing had changed. The comparison logic now handles Postgres's quoting of negative constants.
model Product {
    fields {
        discount Decimal? @default(0)
        temperature Number? @default(-1)
    }
}

Column Name Casing for Digit-Suffixed Fields

Fields with digits at the end of a word boundary (e.g. itemBarcode2) now resolve to the correct database column in useDatabase() queries, where clauses, joins, and orderBy. Previously the JavaScript runtime produced item_barcode2 instead of the correct item_barcode_2, causing queries to reference non-existent columns.

Flow Dashboard Performance

The flows dashboard loads significantly faster thanks to two changes:

  • Bounded stats window — flow stats now default to a 30-day lookback when no explicit time range is set, so the aggregation query uses an index scan instead of reading all historical runs. Explicit before/after filters still override this default.
  • Deduplicated authorisation — listing flows previously ran one permission query per flow. Flows that share the same permission expression now trigger a single query, reducing authorization overhead from O(flows) to O(distinct rules).

Better Docker Error Message

keel run and keel test now show a clear, single-line error when Docker is not running, instead of printing the raw Docker SDK error multiple times.

Fixes and Improvements

For a full list of fixes and improvements, check out our GitHub releases page (opens in a new tab).

For any issues or feedback, please contact us at help@keel.so.

Thank you for using Keel!