The official FreeSynergy package registry — apps, containers, themes, languages, widgets, icon sets, tasks, and more.
All packages live under packages/. The root catalog.toml lists all namespaces.
| Namespace | Type | Description |
|---|---|---|
init/ |
bootstrap | Bootstrap package — not installable, only downloadable |
packages/apps/ |
app | Native Rust binaries (kanidm, stalwart, tuwunel, zentinel, …) |
packages/adapters/ |
adapter | Trait implementations — swap DB engines, LLM providers, channels |
packages/bundles/ |
bundle | Meta-packages referencing other packages by id |
packages/containers/ |
container | Podman/Docker containers (forgejo, postgres, outline, …) |
packages/external/ |
external | Non-self-hostable services (Telegram, Discord, …) — metadata only |
packages/i18n/ |
language | Language packs — shared UI translation snippets (51 languages) |
packages/icons/ |
icon_set | SVG icon sets |
packages/repos/ |
repo | Additional Store repository sources |
packages/tasks/ |
task | Community automation templates |
packages/themes/ |
theme | Visual themes with color variables |
packages/widgets/ |
widget | Desktop widgets |
Every installable package (app, container, task) is self-describing:
packages/{namespace}/{name}/
├── catalog.toml ← Full description + deployment spec (MANDATORY)
├── icon.svg ← SVG icon (MANDATORY)
├── templates/ ← Jinja2 config templates + scripts (MANDATORY for installable types)
│ ├── *.toml.j2 ← App config templates
│ ├── *.service ← systemd units
│ ├── *.container.j2 ← Podman Quadlet (containers)
│ └── scripts/
│ ├── pre-install.sh
│ ├── post-install.sh
│ ├── pre-remove.sh
│ └── post-remove.sh
└── i18n/ ← Translations (at least en/ is MANDATORY)
├── en/
│ ├── description.ftl ← Long description for Store detail view
│ ├── overview.ftl ← Help overview shown in the manager UI
│ └── fields.ftl ← Field-level help for config variables
└── de/ ← German (and other ISO-639-1 codes)
└── ...
External packages (type = "external") have only catalog.toml, icon.svg, and i18n/ — no templates/.
Each language pack is identified by its ISO 639-1 code (e.g. de, en, fr) and contains shared
UI translation snippets used across all FreeSynergy programs:
packages/i18n/{lang}/
├── catalog.toml ← Package metadata (locale, direction, coverage)
├── icon.svg ← Language/flag icon
├── actions.toml ← Verb actions (save, cancel, delete, …)
├── labels.toml ← UI labels and headings
├── nouns.toml ← Common nouns (file, user, package, …)
├── errors.toml ← Error messages
├── confirmations.toml ← Confirmation dialogs
├── notifications.toml ← System notifications
├── phrases.toml ← Common phrases
├── status.toml ← Status strings (running, stopped, pending, …)
├── time.toml ← Time and date expressions
├── validation.toml ← Form validation messages
└── help.toml ← General help text snippets
Note: Language packs do not use i18n/ sub-folders for their own description — metadata is
inline in catalog.toml. Using i18n/lang/ inside a language pack would create circular paths.
Themes define platform-wide CSS variables. The [colors] section in catalog.toml is the
authoritative color definition — programs read these on startup and apply their own prefix:
[colors]
bg_base = "#0f172a"
primary = "#00bcd4"
# ... (see individual theme catalog.toml for full color set)[package]
summary = "..." # ≤255 chars — shown in lists and search
description = "..." # inline medium-length description
description_file = "i18n/en/description.ftl"
[provides]
apis = ["messenger.send", "messenger.receive"] # capabilities this package provides
[requires]
apis = ["iam.oidc-provider"] # capabilities this package needsPackages can declare optional features that users toggle on/off:
[[features]]
id = "ldap"
label = "LDAP Interface"
default = falseAPIs never produce errors on unknown fields. If a new field is added, old implementations silently ignore it. A warning is shown in the UI, but the system keeps running.
- Create
packages/{namespace}/{name}/ - Write
catalog.toml—summary,description, anddescription_fileare mandatory - Add
icon.svg - Add
templates/with all required Jinja2 templates - Add
i18n/en/description.ftl,i18n/en/overview.ftl, andi18n/en/fields.ftl(if config variables exist) - The CI validator rejects commits with incomplete or broken packages
Versioning is handled via Git — tags, branches, or commit refs. No v2/ subdirectories.