-
-
Notifications
You must be signed in to change notification settings - Fork 0
Developer guide
How Radd is built, and how to extend it. This guide is for a developer who writes a plugin, an editor extension or an automation node.
Radd is a kernel and a set of plugins. The kernel holds mechanism only: the plugin contract, the contribution registries, the loader, and the pure contribution specifications. It imports nothing from any plugin. Every feature is a plugin, including the 52 that ship with the product, and the server is assembled from configuration. A plugin contributes entities, permissions, events, routes, navigation, MCP tools and query fields through declarations that the kernel reads blind.
| Page | Covers |
|---|---|
| Architecture: the kernel and plugins | The plugin contract, the registries, the loader, EntitySpec |
| Events and consumers | Declaring, emitting and consuming an event |
| Permissions and access control | Permission atoms, scope, and the access-grant framework |
| Write a backend plugin | A complete tutorial, from empty directory to loaded plugin |
| Write a plugin user interface | Module federation, the SDK, slots and theme tokens |
| Write a page editor extension | A radd: fence as a real editor node |
| Write an automation node | Triggers, conditions and actions |
| The query language for developers | SLQ, its two dialects, and adding a field |
| The REST API and authentication | Credentials, error shapes and route rules |
| The MCP server | Contributing a tool, and the per-caller catalog |
| Develop, test and deploy | Running it, testing it, migrating it, shipping it |
A plugin talks to another plugin through its public service.py, its events,
and its declared extension points. It never reaches into another plugin's
tables. One exception is measured and enforced: the models of auth,
projects, items, workflow, teams and fields are the de-facto spine and
may be imported for reads. Writes always go through the owner's service.
Every cross-plugin import is declared. Use depends_on when the target must
load first, and weak_depends for a deferred reverse reach. A test refuses an
undeclared edge.
A value that names a behaviour, a state or a type is an enum member, never a
string literal. Tunables live in config.py.
- Architecture: the kernel and plugins
- Develop, test and deploy
- Events and consumers
- Permissions and access control
- The MCP server
- The query language for developers
- The REST API and authentication
- Write a backend plugin
- Write a page editor extension
- Write a plugin user interface
- Write an automation node
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.
-
Developer guide
- Architecture: the kernel and plugins
- Develop, test and deploy
- Events and consumers
- Permissions and access control
- The MCP server
- The query language for developers
- The REST API and authentication
- Write a backend plugin
- Write a page editor extension
- Write a plugin user interface
- Write an automation node
-
Release notes
- 0.36.4
- 0.36.3
- 0.36.2
- 0.36.1
- 0.36.0
- 0.35.0
- 0.34.0
- 0.33.0
- 0.32.0
- 0.31.1
- 0.31.0
- 0.30.0
- 0.29.0
- 0.28.0
- 0.27.0
- 0.26.0
- 0.25.1
- 0.25.0
- 0.24.1
- 0.24.0
- 0.23.1
- 0.23.0
- 0.22.0
- 0.21.0
- 0.20.0
- 0.19.0
- 0.18.1
- 0.18.0
- 0.17.2
- 0.17.1
- 0.17.0
- 0.16.0
- 0.15.0
- 0.14.1
- 0.14.0
- 0.13.1
- 0.13.0
- 0.12.0
- 0.11.0
- 0.10.0
- 0.9.2
- 0.9.1
- 0.9.0
- 0.8.1
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.6
- 0.6.5
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.0
- 0.4.1
- 0.4.0
- 0.3.2
- 0.3.0
- 0.2.0
- 0.1.0
-
User guide
- AI features
- Attachments
- Automations
- Cycles and releases
- Instance settings
- Intake forms and the portal
- Notifications and the inbox
- Personal settings
- Project settings
- Projects
- Reports and dashboards
- Search and the query language
- Start here
- The application window
- The card designer
- The roadmap
- The service desk
- The wiki
- Time logging and the timesheet
- Views
- Work items