Generate release notes from git commits with AI

An agent turns a list of commits into customer-facing release notes, grouped and with breaking changes called out first.

  • Files
  • Budget cap

Watch a real run

A real run on Oct 7, 2026, replayed. Model: openai/gpt-6-luna.

Succeededrun_c697350f053152ff39bf441f8d691425$0.002963 of $0.03
  1. Queuedbudget $0.03 reserved
  2. MicroVMmicroVM ready
  3. MicroVMworker started · shell off · web off
  4. Fileread commits.txt
  5. MicroVMmicroVM destroyed
  6. Succeeded2 model calls, 2,265 tokensRecorded output (English)

    Breaking changes

    • Update /v1/runs requests to use max_cost_micros instead of limit; the old field is no longer supported.

    New

    • Schedule email delivery for saved reports.
    • Use dark mode on the dashboard.
    • View invoices on a dedicated page linked from Settings.

    Improved

    • Large report CSV exports stream to avoid timing out.
    • Dashboard summary queries are cached for 60 seconds.

    Fixed

    • Users stay signed in after resetting their password.
    • An error is shown when an Excel row cannot be parsed.
    • Opening an empty report on mobile no longer crashes.
  7. Worker destroyed$0.002963 charged, $0.027037 released
Model $0.000363 · Web $0.00 · Compute $0.0026

Run it yourself

Open the sample in the playground with the whole request filled in. It runs on your own account, within the budget shown, against the same read-only sample systems.

Budget for this sample: $0.03

How it works

Paste the output of git log and get notes written for customers rather than developers: internal chores are left out, breaking changes come first with what to do about them. The commits are a read-only file, so nothing needs repository access.

What the agent can and cannot do

The permissions are part of the request. Anything not listed here is not available to the run.

SettingAllowed
ConnectionsNone
WebOff
ShellOff
Filescommits.txt (read-only)
Zero data retentionOff: the record is kept for 30 days
Budget$0.03, a hard cap
Timeout60 seconds

Credentials never enter the machine: a broker adds them to each call and enforces the methods above.

The code

This is the exact request the sample sends. Set EPHEMERAL_API_KEY to a member key of your organization.

curl -X POST $EPHEMERAL_URL/v1/runs \
  -H "Authorization: Bearer $EPHEMERAL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @request.json

Files in the request

Passed inline, so nothing is uploaded first. The agent sees each one as a read-only file.

commits.txt
commits.txt
a1f3c9e feat(reports): add scheduled email delivery for saved reports
b72d0aa fix(export): stream CSV exports so large reports no longer time out
c9e4d11 chore(deps): bump eslint to 9.12
d03a6be feat(api)!: rename /v1/runs field "limit" to "max_cost_micros" (old name removed)
e5b1f72 fix(auth): keep users signed in after a password reset
f8c0a34 docs: clarify webhook signature verification
0a9d7be refactor(db): move report queries into their own module
1b2c3d4 feat(ui): dark mode for the dashboard
2c3d4e5 fix(import): show an error when an Excel row cannot be parsed
3d4e5f6 test: add integration tests for billing proration
4e5f607 fix(mobile): prevent crash when opening an empty report
5f60718 perf(dashboard): cache the summary query for 60 seconds
6071829 ci: speed up the build with a dependency cache
718293a feat(billing): show invoices on a dedicated page linked from Settings
Full request body request.json

The same body, with the files inline.

request.json
{
  "prompt": "commits.txt lists the commits of the next release (hash, then a conventional-commit message; '!' marks a breaking change). Write release notes for customers in Markdown, at most 200 words. First a 'Breaking changes' section with what a customer must change (omit it if none), then 'New', 'Improved' and 'Fixed'. Leave out chores, tests, CI, docs-only and refactor commits. Write in plain language, one line per change, no hashes. Use only what the messages say and never invent details.",
  "files": [
    {
      "path": "commits.txt",
      "content": "a1f3c9e feat(reports): add scheduled email delivery for saved reports\nb72d0aa fix(export): stream CSV exports so large reports no longer time out\nc9e4d11 chore(deps): bump eslint to 9.12\nd03a6be feat(api)!: rename /v1/runs field \"limit\" to \"max_cost_micros\" (old name removed)\ne5b1f72 fix(auth): keep users signed in after a password reset\nf8c0a34 docs: clarify webhook signature verification\n0a9d7be refactor(db): move report queries into their own module\n1b2c3d4 feat(ui): dark mode for the dashboard\n2c3d4e5 fix(import): show an error when an Excel row cannot be parsed\n3d4e5f6 test: add integration tests for billing proration\n4e5f607 fix(mobile): prevent crash when opening an empty report\n5f60718 perf(dashboard): cache the summary query for 60 seconds\n6071829 ci: speed up the build with a dependency cache\n718293a feat(billing): show invoices on a dedicated page linked from Settings\n"
    }
  ],
  "shell": false,
  "timeout_seconds": 60,
  "max_cost_micros": 30000
}

Read more

Related samples

esc

Nothing matches “”.