It’s a Plan
Changelog

v1.2.0

View on GitHub

Highlights

Project keys are unique per team

Two teams on the same instance can each have a project with the key MKT. Every URL names the team: /acme/MKT, /acme/issue/MKT-42, /acme/settings. A team has an optional URL slug in team settings. A team with no slug uses its id. The old paths redirect to the new ones.

Burnup widget

A dashboard widget shows scope, started, and completed issues for each day, for a project or for one initiative. By default, it shows the projected completion date as a range between an optimistic date and a pessimistic date. A widget setting changes the range to one line. The same data is available at GET /projects/:key/analytics/burnup and in the get_project_burnup MCP tool.

Issue activity feed

The activity feed has four tabs: All, Comments, History, and Work log. Each tab shows the number of entries. The Status switch groups the entries by the status of the issue. A second switch sets the order to newest or oldest first. Each issue opens with the last tab, order, and grouping that you selected. Repeated changes of the same kind by the same person show as one line with a "+N" toggle. The comment box is one line until you use it.

Team settings for agents and Git

  • Team owners and managers select agents that join every new project.
  • Git provider credentials belong to the team. Owners and managers connect them once in the team Git settings. Each project attaches its repositories to a team account.

MCP assistants can see images

An assistant that uses MCP can open the attachments of an issue or an initiative, and see its images. view_issue_images, view_initiative_images, and view_attachment return the images. Each tool result gives an attachment as a URL on the api origin. list_initiative_attachments is a new MCP tool.

Webhook payloads

Each delivery has an actor with the type (human, agent, or system), the id, and the name. Issue events include the state, the assignee, the delegate, the issue type, the labels, and the URL. issue.deleted includes the full issue. Comment events include the issue. All fields are new, so existing receivers continue to work. Archive, restore, and the deletion of a column also send events.

RustFS replaces MinIO

The MinIO images are no longer available. The compose files and the Helm chart use RustFS 1.0.0 for attachments. RustFS reads the files that MinIO wrote, in the same volume.

Also in this release

  • The text of an issue, a comment, or a document shows KEY-123 as a link with the state and the title of the issue. A mention of you has a different color.
  • The Subtasks panel has a filter by state. You can change the state of a subtask, the parent, or a linked issue from its row.
  • The project switcher has a new design. Each row shows the project key and the last activity under the name.
  • An external agent chat claim waits for a maximum of 30 seconds, so the runner does not stop the request first.
  • Links in notification emails, Telegram messages, and pull request comments use the new team URLs.
  • Agents that use OpenCode Go work. Each request sends the x-opencode-session header, which OpenCode Go requires.
  • The worker reads only the first part of the response from a webhook receiver.
  • More than one api replica can use the same database. The migrations run one time, and the worker and the bot do not start on an old schema.
  • @itsaplan/runner 0.5.2 keeps the text of a chat tool at 32,000 characters or fewer. The api refuses a longer text and marks the answer as failed.

Upgrade

The migrations run in a separate migrate step. The three compose files have a one-shot migrate service. The api, the worker, and the bot start after it completes. In the Helm chart, the api pods apply the migrations in an init container, and the worker and bot pods wait for them.

  • 0131 adds the default agents of a team.

  • 0132 moves the Git provider credentials from the project to the team.

  • 0133 adds the repositories permission. A role that can edit integrations also gets permission to edit repositories.

  • 0134 makes a project key unique per team and adds the team slug.

  • Compose. Run git pull to get the new compose file, then docker compose pull && docker compose up -d. The minio service and the minio-data volume keep their names, so RustFS reads the existing files. The instructions to copy the volume before the upgrade are in docs/self-hosting.md.

  • Your own compose file. Replace the MinIO image with rustfs/rustfs:1.0.0 and run it as root (user: '0:0'). The bucket init uses curl from the RustFS image, because the mc image is not available. Add a one-shot migrate service from the api image and move the db-backups volume to it. Start the api with bun run apps/api/src/index.ts after migrate completes. Use docker-compose.yml as the example.

  • Helm. The minio.* values and the PVC name do not change. The optional api.backups.persistence value gives a volume for the pre-migration dump. It is off by default.

  • Git. Existing connections continue to work with their tokens. When a team has more than one connection of the same account, save the token of that account one time in the team Git settings. This updates all of them. The settings page shows each repository that the token cannot manage.

  • API and MCP clients. A route with {projectKey} accepts the project ref <team>.<KEY>, for example acme.MKT. A key without a team works while only one of your teams has it. When more than one team has it, the api returns 409. A new project key must match ^[A-Z][A-Z0-9]{0,9}$.

  • A value of AGENT_CHAT_CLAIM_WAIT_MS above 30,000 is reduced to 30,000.

Contributors

Thank you to everyone who contributed to this release.

Code

@grootbro @sinmingx @shkarinn @henry2man

Requests and reports

@maresmarian @henry2man @sinmingx @shkarinn @remadisson @Rasaboun @m0nstrum