You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A modern reimplementation of flat-manager in Python/Django, with flatpak lifecycle management, extended with RPM package management, LDAP authentication, and a Bootstrap 5 web UI.
Current version: 1.0.29
Features
Flatpak repository management — Create and manage OSTree-backed Flatpak repositories with GPG signing
Flatpak build pipeline — Build packages from Git or BuildStream sources, commit and promote between repositories
RPM package management — Build RPMs with Mock, manage distributions, sync to Satellite/Katello
External refs — Track and import upstream Flatpak refs from remote repositories
Every view and API endpoint enforces one of five roles. Roles can be scoped globally or per-organisation.
Role
Description
Grants
admin
Platform administrator
All actions including user management, config, and LDAP
superuser
Elevated operator
All write actions except user/LDAP management
build_admin
Build operator
Package/build CRUD and promotion
repo_admin
Repository operator
Repository, GPG key, and distribution management
view
Read-only
View access only (all authenticated users also have read access)
Local users authenticate with Django's password backend. LDAP-provisioned users (flagged is_local=False) are authenticated against LDAP and have roles synced from group mappings on every login.
Installation
Prerequisites
Python 3.10+
Redis or Valkey
MariaDB/MySQL (production) or SQLite (development)
Quick Start
# 1. Install dependencies
pip install -r requirements.txt
# 2. Configure environment
cp packaging/conf/flat-manager.env.example .env
# Edit .env — at minimum set SECRET_KEY and DATABASE_URL# 3. Apply migrations
python manage.py migrate
# 4. Create an initial admin user
python manage.py createsuperuser
# 5. Start all services
./manage-services.sh start
Production (RPM)
See docs/INSTALL_RPM.md for the full RPM-based installation guide covering Nginx, systemd units, and SELinux.
Service Management
./manage-services.sh start # Start all services
./manage-services.sh stop # Stop all services
./manage-services.sh restart # Restart all services
./manage-services.sh status # Check service status
Systemd units are provided under packaging/systemd/:
All API endpoints require session or token authentication. Write operations require an appropriate role (see Permission column). Unauthenticated access to build logs is explicitly allowed.
Resources
Resource
Base URL
Read
Write
Users
/api/users/
Authenticated
Admin
User profiles
/api/profiles/
Authenticated
Admin
GPG keys
/api/gpg-keys/
Authenticated
Repo Admin
Repositories
/api/repositories/
Authenticated
Repo Admin
Repository subsets
/api/repository-subsets/
Authenticated
Repo Admin
Packages
/api/packages/
Authenticated
Build Admin
Builds (history)
/api/builds/
Authenticated
Read-only viewset
Build artifacts
/api/artifacts/
Authenticated
Build Admin
Tokens
/api/tokens/
Authenticated
Repo Admin
Notable Actions
Endpoint
Method
Auth
Description
/api/users/me/
GET
Authenticated
Current user
/api/gpg-keys/<pk>/public_key/
GET
Authenticated
Download public key
/api/gpg-keys/generate/
POST
Repo Admin
Generate key pair
/api/gpg-keys/import_key/
POST
Repo Admin
Import key
/api/repositories/<pk>/builds/
GET
Authenticated
Repository builds
/api/repositories/<pk>/subsets/
GET
Authenticated
Repository subsets
/api/packages/<pk>/start/
POST
Build Admin
Start build
/api/packages/<pk>/cancel/
POST
Build Admin
Cancel build
/api/packages/<pk>/commit/
POST
Build Admin
Commit build
/api/packages/<pk>/publish/
POST
Build Admin
Publish build
/api/packages/<pk>/logs/
GET
Public
Build logs
/api/builds/<pk>/logs/
GET
Public
Build logs
/api/auth/login/
POST
—
DRF session login
/api/auth/logout/
POST
Authenticated
DRF session logout
/api/git-branches/
GET
Authenticated
List branches of a git URL
WebSocket Events
Connect to ws://<host>/ws/notifications/ (authenticated session required).
No authentication is required on this endpoint. The server compares the installed list against all active repositories and responds with outdated/foreign counts, then pushes a WebSocket update to all connected UI sessions.
Releasing
Always use the release script — never do manual git tag + git push:
./release.sh # patch bump (default)
./release.sh --minor # minor bump
./release.sh --version X.Y.Z # explicit version
./release.sh --dry-run # preview only
The script bumps version.py, adds a %changelog entry to the RPM spec, commits, tags, and pushes, triggering the GitHub Actions RPM build workflow.