Skip to content
Hussein Jarrar edited this page Sep 12, 2026 · 2 revisions

v0.27.0

16 changes · 5 Bugfixes, 10 New Features, 1 Uncategorized.

Bugfix

  • RADD-950 Settings → Labels says rename and delete "aren't supported by the API yet"; both have shipped since spec 87
    Settings → Labels is a read-only list carrying this line:
    ad177fd9
  • RADD-948 Restricting a page leaves its subpages open, so the restriction is only as good as the tree is flat
    Restricting a page protects that page and nothing beneath it. page_access.py says so on purpose:
    4d6be68f
  • RADD-947 The grant editor offers a project Scope on resources that reject it — the ResourceSpec it was built to read is not exposed
    Restricting a single page shows a Scope picker: "on ". A page has no project — _PAGE_SPEC sets project_scoped=False, and access.service refuses the write with the literal message "page grants can't be scoped". So the UI offers a control whose only possible use is an error, on a screen whose entire…
    2c370991
  • RADD-946 Roadmap: "Show closed" is a recency policy wearing a visibility label, so turning it off appears to do nothing
    Done and canceled bars stay on the roadmap with Show closed off. The control looks broken; it is not, it just does not mean what it says.
    872493b7
  • RADD-945 The Linked issues panel opens itself; "collapsed by default" has to mean always
    RADD-943 shipped the collapse as defaultOpen = count > 0 — shut when empty, open when it has links. That was my reading of "collapsed by default when it's empty", and it is the wrong reading. On the release-notes pages the section now opens to twelve rows nobody asked to see, which is a bigger interruption between…
    082e6fa5

New Feature

  • RADD-958 Settings → Email: mail sources and senders as rows, env-seeded, so a Gmail adapter is a new class not a rewrite
    Companies on Google Workspace will want Radd pointed at their existing support@company.com. That has to be an adapter, not a fork — which means the transport is configuration, and configuration is rows.
    e5811033
  • RADD-960 Mail events are invisible to automations: nothing is emitted when a message arrives, is sent, or is dropped
    Rules like "when mail arrives from a VIP domain, set priority high", "when a message arrives on a ticket in Waiting for customer, move it back to In progress", "if outbound mail to a requester fails, flag the issue".
    d8832f71
  • RADD-959 Mail topology: Migadu IMAP for help@, agent@ as the sending identity — and one definition of "our own addresses"
    What changed
    c08e916d
  • RADD-955 Outbound: mail the participants, thread the headers, and store the Message-ID the provider actually used
    A comment on an issue emails the people following it, in a message their client threads under the original.
    bf13a912
  • RADD-954 Threading: In-Reply-To, then References, then the subject key — never sub-addressing
    An inbound message matched to its issue by what a real mail client produces when a human hits Reply.
    08263c9f
  • RADD-953 POST /integrations/email: HMAC-verified raw-message ingest with a 4xx/5xx contract that decides whether mail bounces
    The endpoint the deployed Cloudflare Email Worker already posts to. The wire format is fixed — it is in production, so this is an implementation against a contract, not a design:
    63beab4e
  • RADD-957 Loop prevention: autoresponders, self-addressed mail, and a per-sender rate limit
    Nothing in the current intake stops a mail loop, and a mail loop is the failure mode that takes the instance down while looking like ordinary traffic.
    0c498fa5
  • RADD-956 Parsing hostile mail: HTML fallback, quote stripping, attachments, and a reporter that is a claim not an identity
    Inbound mail is the most reliably hostile input Radd accepts — anyone with an address can send it, and nothing about it is trustworthy. Current parsing takes text/plain and stops: an HTML-only message becomes an empty ticket, attachments are dropped, and every reply carries the entire quoted history.
    eec5061e
  • RADD-952 mail_messages: the sent/received Message-ID store threading depends on
    One table doing the two jobs that are currently done by nothing and by a single column respectively:
    5d57f84d
  • RADD-949 A custom field's options can only ever grow — removing one needs a decision about the items holding it
    Editing a select field offers Add and nothing else. update_field holds options immutable and extend_options is additive by construction:
    cba5dfa6

Uncategorized

  • RADD-951 Email service desk: provider-agnostic intake, real RFC threading, and Settings → Email
    Mail to help@radd-hq.com creates an issue; commenting emails the participants; their replies land as comments on the same issue. End to end, with threading that survives a real mail client.
    31893152

Changes from v0.26.0 to v0.27.0.


Mirrored from project.radd-hq.com on 2026-09-12. Documentation is written there; this copy is regenerated by scripts/publish_wiki.py and hand edits do not survive it.

Clone this wiki locally