23 June, 2026
This release introduces email notifications from the SDK, automatic orphaned file cleanup, named file downloads, and authenticated integration proxying for calling third-party services.
Named File Downloads
Presigned download URLs for File fields now include the file's real filename in the Content-Disposition header. Browsers save files with their proper name instead of a generic object key.
This works automatically for file URLs returned from actions. In custom functions, getPresignedUrl() now accepts an optional options bag to control the download behaviour:
// Default: inline preview with the file's own filename
const url = await file.getPresignedUrl();
// Force a download (Save As dialog) with the file's own filename
const url = await file.getPresignedUrl({ contentDisposition: "attachment" });
// Force a download with a custom suggested filename
const url = await file.getPresignedUrl({
contentDisposition: "attachment",
filename: "2026-invoice.pdf",
});Automatic File Cleanup
Keel now automatically removes orphaned files from storage when a File field is set to null, replaced with a different file, or the row is deleted. This applies to both built-in actions and the models API in custom functions.
Previously, updating a file field or deleting a row left the old file sitting in storage. Now the runtime handles cleanup for you — no manual file management needed. Cleanup is best-effort: a storage failure is recorded in traces but never fails the action itself.
Fixes and Improvements
- JSONB key preservation — JSON/JSONB column values returned from the database no longer have their nested keys incorrectly camelCased. Developer-supplied JSON payloads now preserve their original key casing.
- Flow stability — fixed duplicate step creation when a step is already running, support for more than 16 back-to-back flow steps without triggering recursion detection, and a panic when viewing state of a no-input flow run.
useDatabasewrites — rawuseDatabasewrite queries no longer fail when there's nothing to return.- Seeding —
keel generatenow emits primary-key IDs in seed data so required foreign keys resolve correctly. - File inputs in flows — fixed file input callback lookup inside flow iterators.
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!