The manifest (module.toml)
The module.toml file at the repository root describes your module to the core: identity, process, port, routes, sidebar entries and events.
Full example #
[module]
id = "calendar" # alphanumérique + '-' + '_'
display_name = "Calendar"
version = "0.1.0"
description = "Calendriers, événements, CalDAV…"
author = "Kubuno Contributors"
license = "AGPL-3.0"
homepage_url = "https://github.com/kubuno/kubuno" # optionnel
runtime = "rust" # rust | python | node | binary
dependencies = [] # ids d'autres modules requis
internal = false # true : module d'infrastructure, masqué de l'administration
settings_path = "/calendar/settings" # optionnel
[process]
entrypoint = "kubuno-calendar" # nom de l'exécutable
args = []
[server]
host = "127.0.0.1"
port = 3102 # port dédié du module (le core est sur 8080)
[routes]
patterns = [
{ method = "*", path = "/*" },
]
[[sidebar_items]]
id = "calendar"
label = "Calendar"
icon = "Calendar" # nom d'icône Lucide
path = "/calendar"
position = 20 # ordre de tri
section = "main" # main | secondary
[events]
subscribed = ["UserDeleted", "ContactUpdated"]
publishes = ["EventCreated", "EventUpdated", "EventDeleted"]
# Réglages rendus par la console d'administration du core — donc cherchables,
# héritables et journalisés dans l'audit, ce qu'une page maison n'obtient pas.
[[setting_groups]]
id = "access"
label = "Accès et restrictions"
icon = "ShieldCheck"
position = 30
[[settings]]
key = "allow_downloads"
scope = "global" # global | overridable | user
group = "access"
type = "bool" # bool | int | string | enum
default = true
label = "Téléchargement des fichiers"
description = "Désactivé, la lecture reste entière ; seul le fichier d'origine est refusé."The sections #
| Section | Purpose |
|---|---|
[module] | Identity: id, display_name, version, runtime, license. |
[process] | Executable launched by the core supervisor (entrypoint + args). |
[server] | host and port the module listens on locally. |
[routes] | Route patterns the core will proxy to the module. |
[[sidebar_items]] | Sidebar entries (Lucide icon, position, section). |
[events] | subscribed (received) and publishes (emitted) events. |
[[setting_groups]] | Groups settings into sections of the admin console (id, label, icon, position). |
[[settings]] | Declared settings: scope (global, overridable per organizational unit, or user), type, default value and labels. |
Note
Declaring a setting instead of writing your own page makes it searchable in the console, inheritable per organizational unit and traceable in the audit log — three things a hand-written view does not get.
Note
The manifest is also a compatibility guard: the version is checked against what the core expects, and on the frontend side the module declares its sdkVersion.