0.460 (23 Jun 2026)

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.
  • useDatabase writes — raw useDatabase write queries no longer fail when there's nothing to return.
  • Seedingkeel generate now 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!