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 #

SectionPurpose
[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.