Bundled apps

Antimatter's Docker images come with a set of apps (plugins, in the System Console). This page lists them, says which are on after installing, and covers the settings each one needs from an administrator.

The bundled apps

Apps are listed as Plugins in the System Console. They are in the image (in /antimatter/prepackaged_plugins), signed with the Antimatter app signing key, so they install without an Internet connection.

The release archive and the .deb and .rpm packages include fewer apps: see Apps in the packages and the archive.

AppApp idImageOn after installing
AI chatmattermost-aibothyes
Callscom.mattermost.callsbothyes
GitHubgithubbothno
GitLabcom.github.manland.mattermost-plugin-gitlabbothno
Jirajirabothno
Metricscom.mattermost.mattermost-plugin-metricsbothno
Voice Channelscom.antimatterchat.voice-channelsantimatter-nextyes
Pollscom.antimatterchat.pollsantimatter-nextyes
Notescom.antimatterchat.notesantimatter-nextyes
Whiteboardcom.antimatterchat.whiteboardantimatter-nextyes
Mailcom.antimatterchat.mailantimatter-nextyes
Calendarcom.antimatterchat.calendarantimatter-nextyes
GIFscom.antimatterchat.gifsantimatter-nextyes
Memesmemesantimatter-nextno
Todocom.mattermost.plugin-todoantimatter-nextno

Apps that are on by default are installed at each start if they aren't yet, or upgraded if the image has a newer version. If you turn one off, it stays off: the default only applies to apps the configuration doesn't mention yet. Apps that keep their Mattermost id (AI chat, Calls and the integrations) are Antimatter's own builds.

Kanban (focalboard) and Playbooks (playbooks) aren't bundled with the server or either image any more: install the one you want from its own GitHub release (see Apps in the packages and the archive), like any other app that isn't bundled by default. A server that already has one installed keeps it across an upgrade. Both stay Antimatter's own builds: the Marketplace's vanilla builds of them never replace Antimatter's.

Enable, disable and configure apps

Go to System Console › Plugins › Plugin Management. Under Installed Plugins, each app has Enable or Disable, Settings and Remove, and shows its state (Running, Not running, Failed to start…). Each app with settings also has its own page under System Console › Plugins.

The bundled apps that are off by default are installed from the image's own copy: click your picture at the top of the app rail and choose App Marketplace (in the classic interface, it is in the product menu), find the app and click Install, then enable it in Plugin Management. From the command line:

docker compose exec antimatter amctl --local plugin marketplace install github
docker compose exec antimatter amctl --local plugin enable github

Other commands: amctl plugin list, amctl plugin disable <id>, amctl plugin delete <id>.

Enable apps through the configuration

Which apps are on is the setting PluginSettings.PluginStates, a map of app ids. You can merge entries into it with amctl; with Enable Automatic Prepackaged Plugins on (the default), an enabled bundled app is installed at the next start:

docker compose exec -T antimatter amctl --local config patch /dev/stdin <<'EOF'
{"PluginSettings": {"PluginStates": {"com.mattermost.plugin-todo": {"Enable": true}}}}
EOF
docker compose restart antimatter

This is also how to install Todo, which is not offered in the Marketplace dialog. The variable AM_PLUGINSETTINGS_PLUGINSTATES also works, but it replaces the whole map: list every app you want on.

App settings

App settings are stored under PluginSettings.Plugins.<app id>, with keys in lower case. Change them in the app's System Console page, or with amctl config patch as shown in Configuration. AM_PLUGINSETTINGS_PLUGINS replaces the settings of every app at once and locks them all, so avoid it.

GIFs

The GIFs app adds a GIF and sticker tab to the emoji picker, backed by Antimatter's GIF service (gifs-server), which speaks the Tenor API. The site's compose file runs the service and configures the app through variables. Its settings, in System Console › Plugins › GIFs:

SettingVariable (fallback)DefaultWhat it does
GIF service URLAM_GIFS_SERVICE_URLemptyThe service's API base, for example http://gifs:8080/v2. GIFs are off while it is empty.
API keyAM_GIFS_API_KEYemptyOne of the service's AM_GIFS_API_KEYS.
Upload keyAM_GIFS_UPLOAD_KEYemptyOne of the service's AM_GIFS_UPLOAD_KEYS. Lets people add GIFs and stickers from the picker, and delete the ones added this way. Empty turns uploads off.
Who can add GIFs and stickersSystem adminsSystem admins, or Everyone. Guests never can, as with custom emoji. What people add is available to everyone; the person who added it and system administrators can delete it.
Enable stickersonShows the sticker tab.
Content filtermediumhigh, medium, low or off.
Serve the media through AntimatteronBrowsers load GIFs from Antimatter, which fetches them from the service. Keep it on when the service is only on your internal network.
Media URLthe service's /media/Where the media are, when served directly.
Cache size (MB)64 MBMemory cache of the app.

For this app, the variables are only fallbacks: a value set in the System Console wins over them. If the GIF picker stays empty, check the service URL and the API key on that page.

While the GIFs app is set up, its tab replaces the built-in Giphy picker (System Console › Integrations › GIF › Enable GIF Picker, ServiceSettings.EnableGifPicker).

The GIF service

The service keeps everything in its data directory (/data, the gifs volume): a search index and the media. Its main variables:

VariableDefaultWhat it does
AM_GIFS_API_KEYSnoneComma-separated API keys. Without a key, the API is open to anyone who reaches it. Several keys let you rotate them.
AM_GIFS_UPLOAD_KEYSnoneKeys allowed to upload, and to delete what was uploaded. No uploads without one.
AM_GIFS_RATE_LIMIT20Requests per second per client (API key and address); 0 turns it off. The compose file sets 0, because all of Antimatter's requests share one key and address.
AM_GIFS_LISTEN:8080Listen address.
AM_GIFS_PUBLIC_URLfrom requestsExternal URL, if you expose the service.
AM_GIFS_TRUST_PROXYfalseTrust X-Forwarded-* headers, behind a proxy only.
AM_GIFS_UPLOAD_MAX_MB16Largest uploaded file.

To add your own GIFs in bulk, import them with a manifest, from a directory mounted into a one-off container:

docker compose run --rm -v "$PWD/my-gifs:/import:ro" gifs import -manifest /import/manifest.json

To re-import the starter stickers after an upgrade: docker compose run --rm gifs stickers. The manifest format and the other commands are in the gifs-server README.

Mail and Calendar

Mail and Calendar connect each person to their own mailbox (IMAP and SMTP) and their own calendar (CalDAV). People enter their server and password in the app; passwords are stored encrypted. You don't configure mail or calendar servers for them, but you decide what they may connect to:

AppSettingDefaultWhat it does
Mail, CalendarAllow mail servers on private networks, Allow calendar servers on private networks (AllowPrivateNetworks)offOff, the server refuses to connect to loopback, private and link-local addresses, so the apps can't be used to reach your internal network. Turn it on if your mail or calendar server is on a private address.
Mail, CalendarAllow unencrypted connections (AllowInsecureConnections)offOff, connections must use TLS (Mail: TLS or STARTTLS; Calendar: HTTPS).
MailUnread check interval (minutes) (UnreadCheckMinutes)2 minutesHow often unread counts are checked when the mail server can't push them.
MailLargest message size (MB) (MaxMessageSizeMB)25 MBSize limit of messages sent and read.
CalendarSend reminders (EnableReminders)onThe Calendar bot sends a direct message before events (10 minutes before, for events without their own alarm).
CalendarAllow calendar feeds (AllowCalendarFeeds)onMembers can subscribe to a private link (an ICS feed) of their community's scheduled calls from their own calendar app. Anyone with a member's link sees what that member sees; the member can reset it. Off, every feed link stops working (404) and Subscribe is hidden.

To let people sign in to Gmail or Microsoft 365 mailboxes with their account instead of a password, create an OAuth client and fill in the Mail app's Google or Microsoft fields:

  • Google: a Web OAuth client with the Gmail API and the scope https://mail.google.com/.
  • Microsoft: an Entra ID app with the delegated permissions IMAP.AccessAsUser.All, SMTP.Send, offline_access, openid, email and profile. The tenant is common by default.
  • In both, the redirect URI is https://chat.example.com/plugins/com.antimatterchat.mail/oauth/callback (your site URL).

Kanban, Notes, Whiteboard, Polls and Playbooks

  • Kanban (focalboard) opens in its side panel next to the conversation, as Playbooks does. Old links to /kanban/… and /boards/… pages open the same board or card in a community. Its only setting, Enable Publicly-Shared Boards (EnablePublicSharedBoards, off), lets board editors share a board with anyone who has the link, without signing in.
  • Notes and Polls have no settings.
  • Whiteboard: system administrators can upload shape libraries (Excalidraw .excalidrawlib files, up to 5 MB each) for the whole server in its settings page. Community admins manage their own community's libraries.
  • Playbooks opens in its side panel. Old links to /playbooks/… pages open the same run or playbook in a community. It has a few settings, mostly experimental features; the defaults suit most servers.
  • Memes: Who can add meme templates: Everyone (the default), System admins, or Nobody (custom templates off), which stops new templates while the ones already added stay usable. Guests never add templates. The person who added a template and system administrators can delete it.
  • Todo has no server settings.

GitHub, GitLab and Jira

These apps link Antimatter to your code hosting and issue tracker. Each needs an OAuth application on the other side and a webhook pointing back at Antimatter. Enable the app, then run its setup command in any channel, which guides you step by step: /github setup, /gitlab setup or /jira setup.

AppOAuth redirect URLWebhook URL
GitHubhttps://chat.example.com/plugins/github/oauth/completehttps://chat.example.com/plugins/github/webhook
GitLabhttps://chat.example.com/plugins/com.github.manland.mattermost-plugin-gitlab/oauth/completehttps://chat.example.com/plugins/com.github.manland.mattermost-plugin-gitlab/webhook
Jira/jira instance install server <url> or /jira instance install cloud-oauth <url>; /jira webhook prints the webhook URLs.
Leave Use Preregistered OAuth Application off in the GitHub and GitLab apps: it relies on a Mattermost service Antimatter doesn't have, and the app refuses to start with it on. Register your own OAuth application.

The GitHub and GitLab apps generate their webhook secret and encryption key on first save. The GitHub app can be limited to organisations (GithubOrg) and the GitLab app to a group (GitlabGroup); for GitHub Enterprise or a self-hosted GitLab, set its base URL.

Grafana and Alertmanager

Two apps let the assistant (see The assistant) and AI agents look into your operations. Neither has a chat UI of its own beyond what's described below: install either, enable it, and its tools show up for agents and the assistant to use.

Not yet in the app catalogue: install either by uploading its bundle, from its own GitHub release (see Installing other apps below).

Grafana

Grafana (com.antimatterchat.grafana) gives seven read-only tools: search_dashboards, get_dashboard, query_metrics, panel_data, list_alerts, host_metrics (CPU, memory, disk, load or network for one host, built from node-exporter's own conventions, so nobody needs to write PromQL to ask "CPU on www-1") and list_hosts (the distinct host names Grafana knows, meant to fill the assistant's dictionary, see The assistant). None of them changes anything in Grafana. Settings, in System Console › Plugins › Grafana:

SettingKeyDefaultWhat it does
Grafana URLGrafanaURLemptyThe address this server uses to reach Grafana. Required. Private network addresses are allowed, since Grafana is usually on your own network; link-local and cloud metadata addresses are still refused.
Public Grafana URL (optional)GrafanaPublicURLemptyUsed instead for the dashboard and Explore links in tool results, when members' browsers reach Grafana at a different address than this server does.
Service account tokenServiceAccountTokenemptyA Grafana service account token. Viewer rights are enough: the app only reads. Stored encrypted; never sent to the web app or written to a log.
Let every community use the Grafana toolsAllCommunitiesonOff, only the communities listed in Communities that may use them (AllowedCommunities, one name or ID per line) may use them.
Instance labelInstanceLabelinstanceThe Prometheus label host_metrics and list_hosts match a host name against (node-exporter's own convention).
Job filter (optional)JobFilteremptyRestricts those two tools to one Prometheus job, such as node, so a Prometheus that scrapes more than node-exporter doesn't mix other jobs' series into a host's metrics or the host dictionary.

Alertmanager

Alertmanager (com.antimatterchat.alertmanager) posts Prometheus Alertmanager's alerts into a channel: each group as a card with its status and severity colour, name, instance, summary, description, start time and a link to the source. Repeats update the same post; a resolved group's post turns green with a Resolved reply. People with the right to silence choose Silence 1h, Silence 4h or Silence until… from the post, or Expire silence once one is set (see Alerts in the users' guide). Alerts labelled severity="none" (such as Alertmanager's own always-firing Watchdog) aren't posted unless you choose otherwise. The app also gives read-only tools (list_alerts, list_silences) and, needing confirmation, write tools (create_silence, expire_silence) for agents and the assistant. Settings, in System Console › Plugins › Alertmanager:

SettingKeyDefaultWhat it does
Alertmanager instancesInstances[]A JSON list, each with a name, its url (private addresses allowed; link-local and cloud metadata refused) and routes: each maps a receiver of Alertmanager's own configuration to a channel, by team and channel (their names, as in their addresses) or by channel_id. Alerts for receivers without a route are ignored.
Instance secretsInstanceSecrets{}A JSON object, by instance name: its webhook_secret (required, at least 24 characters; put it at the end of the webhook address below) and, if its Alertmanager needs a sign-in, username/password or a bearer_token. Never shown again or sent to a browser.
Who may silence alertsSilencePermissionChannel admins and community adminsOr Anyone who can post in the channel, or System admins only. Whoever silences must also be a member of the channel; with the agents' tools, they need this right in every channel the instance is routed to.
Post alerts with severity "none"PostSeverityNoneoffOff, alerts such as the Watchdog alert aren't posted.

Point each instance's receiver at the app, with the webhook secret from Instance secrets at the end of the URL:

receivers:
  - name: antimatter
    webhook_configs:
      - url: https://chat.example.com/plugins/com.antimatterchat.alertmanager/webhook/prod/<webhook secret>
        send_resolved: true

Metrics

The Metrics app collects the server's performance metrics into a small time-series database inside Antimatter, so you can download them or include them in a support packet without running Prometheus. When it starts, it turns on the server's metrics endpoint (MetricsSettings.Enable). See Operations.

Installing other apps

Antimatter runs Mattermost apps (plugins). Three ways to add one:

  • From a remote marketplace. Enable Remote Marketplace (PluginSettings.EnableRemoteMarketplace) is off by default, and Marketplace URL (PluginSettings.MarketplaceURL) is empty: Antimatter doesn't use Mattermost's marketplace, and ignores its address if a configuration from Mattermost still has it. To list the apps of a marketplace server you trust, turn the setting on and set its URL. That marketplace's builds of apps Antimatter ships (Calls, Playbooks, Kanban and the others) are hidden, so they can't replace Antimatter's: Allow Marketplace Builds of Antimatter Plugins (PluginSettings.AllowMarketplaceToReplaceAntimatterPlugins) is off by default.
  • By uploading a bundle (.tar.gz). Uploads are off by default and have no System Console switch: set AM_PLUGINSETTINGS_ENABLEUPLOADS=true, then use Upload Plugin in Plugin Management, or amctl --local plugin add app.tar.gz.
  • From a URL: amctl plugin install-url <url>, also with uploads on.

Antimatter checks app signatures against the keys it trusts: the Antimatter key, the key Mattermost, Inc. signs its published apps with (so a Mattermost app you download yourself installs) and any key you add in PluginSettings.SignaturePublicKeyFiles. With Require Plugin Signature (PluginSettings.RequirePluginSignature, off by default) on, unsigned apps are refused and uploads are disabled.

An app runs inside the server with full access to its data. Install only apps you trust.

Some apps made for Mattermost's paid editions check for a Mattermost licence themselves and refuse to run; Antimatter doesn't pretend to have one for them.