Open Source Community Manager
Komunumo is an esperanto noun with a meaning of community.
You are a community leader? Komunumo makes your life a lot easier! Everything you need to run your community in one place, for free! Komunumo is an open source community manager software which assists you in all tasks managing a community like a user group or a meetup.
With Komunumo you can manage your community members (including self-management), organize events (including registration), send out newsletters, manage your sponsors, and a lot more.
We have set ourselves the goal of implementing all important Meetup functions for communities in Komunumo. We strive for full compatibility with the Fediverse to ensure smooth data exchange with Mastodon, Mobilizon, and other services using the ActivityPub protocol.
Please read more about the vision of Komunumo in the separate file VISION.md.
Komunumo follows Semantic Versioning 2.0.0. Version numbers are structured as MAJOR.MINOR.PATCH:
- MAJOR versions introduce incompatible API or data changes,
- MINOR versions add functionality in a backwards-compatible manner,
- PATCH versions include backwards-compatible bug fixes.
This versioning scheme applies to the public API, database schema, and plugin interfaces. We aim to keep upgrades predictable and manageable. Breaking changes, new features, and fixes are documented in the CHANGELOG.md and in the release notes.
You can find a lot of information on how you can contribute to Komunumo in the separate file CONTRIBUTING.md. A curated list of contributors is available in the file CONTRIBUTORS.md.
There is a channel at Matrix for quick and easy communication. This is publicly accessible for everyone. For developers as well as users. The communication in this chat is to be regarded as short-lived and has no documentary character.
You can find our Matrix channel here: @komunumo:ijug.eu
We use the corresponding GitHub function for discussions. The discussions held here are long-lived and divided into categories for the sake of clarity. One important category, for example, is that for questions and answers.
Discussions on GitHub: https://github.com/McPringle/komunumo/discussions
Questions and Answers: https://github.com/McPringle/komunumo/discussions/categories/q-a
The file application.properties contains only some default values. To override the default values and to specify other configuration options, just set them as environment variables. The following sections describe all available configuration options. You only need to specify these options if your configuration settings differ from the defaults.
The server runs on port 8080 by default. If you don't like it, change it using an environment variable:
KOMUNUMO_PORT=8080
When starting Komunumo for the first time, the system can automatically create an initial instance admin. To enable this, set the following environment variable to the email address of the admin:
If no user with the admin role is found in the database, a new instance admin will be created with the email address given.
Warning
This mechanism only runs once! It will not overwrite or recreate users if an admin already exists.
| Variable | Default | Description |
|---|---|---|
KOMUNUMO_FILES_BASEDIR |
${user.home}/.komunumo/data |
Base directory for local file storage. |
Komunumo stores files on the local file system, for example uploaded images. The base directory must be writable by the application and should have sufficient disk space. To ensure data integrity, administrators are strongly advised to include this directory in regular backup routines.
The placeholder ${user.home} refers to the home directory of the system user running the application.
Komunumo can be started in demo mode, which will automatically delete any data entered at each start of the server and at the top of every hour! This ensures a consistent state for repeated testing and demonstrations. To enable demo mode, set the following environment variable:
KOMUNUMO_DEMO_ENABLED=true
If you want to provide custom demo data, you can specify a JSON file. The file must be publicly accessible over HTTPS and contain valid JSON in the expected format. To use your own demo data, set the following environment variable:
KOMUNUMO_DEMO_JSON=https://example.com/events.json
The structure of the JSON file must follow the expected format used by Komunumo for demo data. The file should contain an array of setting, user, community, event, image, and global page objects. Here is an example of the expected JSON structure:
{
"settings": [
{
"setting": "instance.name",
"language": "en",
"value": "Komunumo Demo"
},
{
"setting": "instance.slogan",
"language": "en",
"value": "This is a demo instance of Komunumo."
}
],
"users": [
{
"userId": "1b7cd51b-4f1b-43d1-a51c-e58043b5d7a4",
"profile": "@[email protected]",
"email": "[email protected]",
"name": "Admin User",
"bio": "The bio of the admin.",
"imageId": "",
"role": "ADMIN",
"type": "LOCAL"
},
{
"userId": "025d62be-b564-4bd4-9325-f2f1d8bf2093",
"profile": "@[email protected]",
"email": "[email protected]",
"name": "Test User",
"bio": "The bio of the user.",
"imageId": "24a27732-09c3-45e0-9b4c-3d6a3f2eb81b",
"role": "USER",
"type": "LOCAL"
},
{
"userId": "f309ee0d-519d-4eaa-8781-256f3200f243",
"profile": null,
"email": "[email protected]",
"name": "",
"bio": "",
"imageId": "",
"role": "USER",
"type": "ANONYMOUS"
}
],
"communities": [
{
"communityId": "9a73690b-6dbd-456a-88e9-dc3f77b69aa0",
"profile": "@[email protected]",
"name": "Demo Community",
"description": "A description of the demo community.",
"imageId": "0278ec5a-9fe1-4882-85f9-845ca72c2795"
}
],
"members": [
{
"userId": "1b7cd51b-4f1b-43d1-a51c-e58043b5d7a4",
"communityId": "9a73690b-6dbd-456a-88e9-dc3f77b69aa0",
"role": "OWNER",
"since": "2025-01-01T10:00:00+02:00[Europe/Zurich]"
},
{
"userId": "025d62be-b564-4bd4-9325-f2f1d8bf2093",
"communityId": "9a73690b-6dbd-456a-88e9-dc3f77b69aa0",
"role": "ORGANIZER",
"since": "2025-01-01T10:00:00+02:00[Europe/Zurich]"
},
{
"userId": "f309ee0d-519d-4eaa-8781-256f3200f243",
"communityId": "9a73690b-6dbd-456a-88e9-dc3f77b69aa0",
"role": "MEMBER",
"since": "2025-01-01T10:00:00+02:00[Europe/Zurich]"
}
],
"events": [
{
"eventId": "07fe5b04-0ea1-43b7-a63a-f4d8b8c29ed6",
"communityId": "9a73690b-6dbd-456a-88e9-dc3f77b69aa0",
"title": "Demo Event",
"description": "A description of the demo event.",
"location": "Somewhere",
"begin": "2025-08-06T18:00:00+02:00[Europe/Zurich]",
"end": "2025-08-06T20:00:00+02:00[Europe/Zurich]",
"imageId": "4ca05a55-de1e-4571-a833-c9e5e4f4bfba",
"visibility": "PUBLIC",
"status": "PUBLISHED"
}
],
"images": [
{
"imageId": "24a27732-09c3-45e0-9b4c-3d6a3f2eb81b",
"contentType": "image/jpeg",
"url": "https://example.com/images/demo-user.jpg"
},
{
"imageId": "0278ec5a-9fe1-4882-85f9-845ca72c2795",
"contentType": "image/jpeg",
"url": "https://example.com/images/demo-community.jpg"
},
{
"imageId": "4ca05a55-de1e-4571-a833-c9e5e4f4bfba",
"contentType": "image/jpeg",
"url": "https://example.com/images/demo-event.jpg"
}
],
"globalPages": [
{
"slot": "imprint",
"language": "en",
"title": "Legal Notice",
"markdown": "## Legal Notice\n\nThis is a demo for testing purposes **only**."
}
]
}- The
settingsarray contains key-value pairs for instance settings, such as the instance name and slogan. - The
languagefields specify the language of the content. - The
communityId,eventId, andimageIdfields must be valid UUIDs. - The
beginandendfields in theeventsobject must be in ISO 8601 format with a timezone offset, such as2025-08-06T18:00:00+02:00[Europe/Zurich]. This ensures correct interpretation of event times, including proper handling of daylight saving time. They can be empty ornullif not applicable. - The
imageIdfields in theusers,communities, andeventsobjects must refer to the IDs of the images in theimagesarray. Theurlfield in each image object must point to a publicly accessible image file. If theimageIdis blank, the community or event will not have an image associated with it. - The
typefields in theusersobject can be set toLOCAL,REMOTE, orANONYMOUSto define the user type. - The
rolefields in theusersobject can be set toADMINorUSERto define the role of the user for this instance. - The
rolefields in themembersobject can be set toOWNER,ORGANIZER, orMEMBERto define the membership role of the user in the community. - The
visibilityfield in theeventsobject can be set toPUBLICorPRIVATE, to define the visibility of the event. - The
statusfield can be set toDRAFT,PUBLISHED, orCANCELEDto reflect the current state of the event. - The
contentTypefield in theimagesobject must contain a valid MIME type for the image and be one of:image/gif,image/jpeg,image/png,image/svg+xml, orimage/webp - The
urlfield in theimagesobject must point to a publicly accessible image file usinghttps://, to an accessible file usingfile://, or contain the image data usingdata:.
Komunumo supports sending email notifications. Configuration is done via environment variables using the KOMUNUMO_MAIL_* naming scheme.
| Variable | Default | Description |
|---|---|---|
KOMUNUMO_MAIL_FROM |
noreply@localhost |
Sender address shown in outgoing emails (e.g. [email protected]). |
KOMUNUMO_MAIL_REPLY_TO |
(empty) | Optional reply-to address (e.g. [email protected]). |
KOMUNUMO_MAIL_HOST |
localhost |
Mail server address. Use a local MTA or external SMTP provider. |
KOMUNUMO_MAIL_PORT |
25 |
Port for the SMTP server (e.g., 587 for STARTTLS or 465 for SSL). |
KOMUNUMO_MAIL_PROTOCOL |
smtp |
Protocol used for sending email. Usually smtp. |
KOMUNUMO_MAIL_USERNAME |
(empty) | Username for SMTP authentication, if required. |
KOMUNUMO_MAIL_PASSWORD |
(empty) | Password for SMTP authentication, if required. |
KOMUNUMO_MAIL_SMTP_AUTH |
false |
Whether SMTP authentication is enabled. |
KOMUNUMO_MAIL_STARTTLS_ENABLE |
false |
Enable STARTTLS encryption (recommended for port 587). |
KOMUNUMO_MAIL_STARTTLS_REQUIRED |
false |
Require STARTTLS (connection will fail if not supported). |
KOMUNUMO_MAIL_SSL_ENABLE |
false |
Enable SSL encryption (typically for port 465). |
KOMUNUMO_MAIL_ENCODING |
UTF-8 |
Default encoding for email subject and content. |
In a .env file, CI system, or Docker environment:
[email protected]
[email protected]
KOMUNUMO_MAIL_HOST=smtp.example.com
KOMUNUMO_MAIL_PORT=587
KOMUNUMO_MAIL_USERNAME=myuser
KOMUNUMO_MAIL_PASSWORD=secret
KOMUNUMO_MAIL_SMTP_AUTH=true
KOMUNUMO_MAIL_STARTTLS_ENABLE=trueTip
If you are using a local mail relay (e.g., Nullmailer or Postfix), you can often omit authentication and encryption settings.
Komunumo needs a database to store the business data. By default, Komunumo comes with MariaDB drivers. MariaDB is recommended because we are using it during development, and it is highly tested with Komunumo. All free and open source JDBC compatible databases are supported, but you need to configure the JDBC driver dependencies accordingly. Please make sure that your database is using a Unicode character set to avoid problems storing data containing Unicode characters. The database user to access the Komunumo database executes automatic schema migrations and needs ALL PRIVILEGES.
Please configure the database connection using the following environment variables:
KOMUNUMO_DB_URL=jdbc:mariadb://localhost:3306/komunumo?serverTimezone\=Europe/Zurich&allowMultiQueries=true
KOMUNUMO_DB_USER=johndoe
KOMUNUMO_DB_PASS=verysecret
The database schema will be migrated automatically by Komunumo.
MySQL and MariaDB have a possible silent truncation problem with the GROUP_CONCAT command. To avoid this it is necessary, to configure these two databases to allow multi queries. Just add allowMultiQueries=true to the JDBC database URL like in this example (you may need to scroll the example code to the right):
KOMUNUMO_DB_URL=jdbc:mariadb://localhost:3306/komunumo?serverTimezone\=Europe/Zurich&allowMultiQueries=true
Copyright (C) Marcus Fihlon and the individual contributors to Komunumo.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/.