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 hereNo 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
Decimalfield 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 everykeel 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/afterfilters 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!