Highlights
Estimates on an issue
A project turns on story points, time, or both in Settings → Configuration. The kinds you turn on appear in the issue properties, and you can show them on the cards, the rows and the Table columns. Time accepts 1h 30m and reads back the same way. The activity log records each change with the value the estimate had before.
Log the time spent
Turn on Time logging in the same settings. An issue then gets a Time logged section. Every entry carries the time, the day, a note and its author. The Time tracking row compares the total with the estimate: a bar, 1h logged, 9h remaining. Past the estimate it turns red and reads 2h over. You can change your own entry, and a project owner can change anyone's.
Finish a cycle before its end date
A running cycle has two new actions. Finish cycle closes it today and offers to move the unfinished issues. Start next cycle today closes it, starts the next upcoming cycle from today, and carries the unfinished issues over. The list shows "Finished early, planned to end ". Delete now asks for confirmation.
The cycle history of an issue
An issue keeps every cycle it went through. A counter next to the Cycle property opens the list, oldest first, with the dates of each cycle. If you plan an issue into a cycle and take it back out while the cycle still runs, that does not count.
Published Docker images
Every release now publishes an image per service to GHCR, for amd64 and arm64. A self-hosted instance updates with docker compose pull && docker compose up -d and builds nothing. VERSION in .env pins a release. docker compose up -d --build still builds from source.
Also in this release
- The issue properties are grouped into five foldable blocks: State, People, Planning, Labels, Custom fields. What you fold stays folded after a reload, in the panel and on the full page.
- The status timeline reads from its own table now. A renamed column keeps one period under its current name, and a move between two completed columns counts as one closing, not two.
- The header of a shared view is simpler.
- web reads its origins from the environment when it starts, so one image serves any instance. A changed
API_URLneeds a restart, not a rebuild. - Avatars and attachments come from the web origin, through
/media.
Upgrade
The api applies the migrations when it starts. Migration 0105 rebuilds the status history of every issue from the change log.
Two counts change with that migration. An issue that was closed, reopened and closed again counts as one closing. An issue created directly in a completed column counts as closed.
web now reads API_URL from its environment at startup, not from a build argument.
- You use a compose file from this repository: nothing to do.
- You have your own compose file or Dockerfile: pass
API_URLas an environment variable. A build argument no longer reaches web, and the browser cannot reach the api.
NEXT_PUBLIC_API_URL still works as an environment variable, under the same rule.
Contributors
Thank you to everyone who contributed to this release: