Source-available business management suite for service-oriented teams.
NEXUS combines CRM, project management, invoicing, time tracking, HR, marketing automation, uptime monitoring, and workflow automation into a single, self-hosted web application. Internal use is free with no subscription fees. Commercial hosting or SaaS use requires a commercial license — see LICENSE.md for details.
Built for digital agencies, IT service companies, consultancies, and software development teams.
| Module | What it does |
|---|---|
| CRM | Company and contact management, relationship mapping, revenue analytics |
| Projects | Gantt planning, milestones, tasks, team assignments, budget tracking |
| Invoicing | PDF generation, ZUGFeRD/XRechnung, recurring billing, cash flow, FinTS bank balance |
| Time Tracking | Focus sessions, break management, workload heatmaps, billable hours |
| HR | Vacation, sick leave, travel expenses, team capacity analytics |
| Marketing | Prospect pipeline, campaign management, Sankey funnel charts |
| Sentinels | Visual no-code automation — triggers, conditions, commands |
| Uptime Monitoring | HTTP health checks with alerting via email and team chat |
| Calendar | CalDAV and CardDAV protocol support for universal device sync |
| Layer | Technology |
|---|---|
| Frontend | Angular 21+, TypeScript, Bootstrap 5, RxJS |
| Backend | Laravel 13, PHP 8.3+, Eloquent ORM |
| Database | MySQL / MariaDB |
| Real-Time | Laravel Reverb (WebSockets) |
| Auth | Token (simple) or Keycloak SSO |
| Docker | PHP-FPM + nginx + supervisor in one container |
nexus/
├── frontend/ Angular SPA (TypeScript)
├── backend/ Laravel API (PHP)
├── docker/ Docker build files
│ ├── Dockerfile Multi-stage build (Node → Angular, Composer → PHP)
│ ├── entrypoint.sh Container startup (migrations, seeding, caching)
│ ├── nginx.conf Reverse proxy config (port 3200 → Angular + backend)
│ └── supervisord.conf PHP-FPM, nginx, queue worker, scheduler, Reverb
└── docker-compose.yml Quick-start with MariaDB included
The quickest way to get NEXUS running is with Docker Compose. This builds the application from source and starts it together with a MariaDB database.
- Docker Desktop (Windows / macOS) or Docker Engine + Docker Compose (Linux)
- Docker ≥ 24, Docker Compose ≥ 2
- ~4 GB RAM available to Docker
- Ports 3200 and 8000 free on the host (configurable)
- Docker Desktop must be running before any
dockercommand (Windows/macOS: start it from the Start Menu / Applications and wait for the taskbar icon to stop animating)
cp .env.example .envOpen .env and set at minimum:
| Variable | Description | Default |
|---|---|---|
ADMIN_EMAIL |
Initial admin account e-mail | admin@example.com |
ADMIN_PASSWORD |
Initial admin account password | changeme |
DB_PASSWORD |
MariaDB password for NEXUS | nexus |
DB_ROOT_PASSWORD |
MariaDB root password | nexus_root |
Important: Change all default passwords before exposing NEXUS to a network.
DB_USERNAMEmust not beroot— MariaDB reserves that name.
The first run builds the Docker image from source (Angular + PHP). This takes a few minutes.
docker compose up -dSubsequent starts use the cached image and are instant.
| Service | URL |
|---|---|
| NEXUS | http://localhost:3200 |
| Backend API | http://localhost:8000 |
Log in with the ADMIN_EMAIL / ADMIN_PASSWORD you set in .env.
docker compose downData is stored in Docker volumes (db_data, storage_data) and survives restarts. To delete all data:
docker compose down -vIf you want to build and tag the image yourself (e.g. for a private registry):
docker build -f docker/Dockerfile -t nexus:latest .The build context is the repository root. The multi-stage Dockerfile handles everything:
- Stage 1 — Node.js 22: installs npm dependencies and compiles the Angular app for all locales
- Stage 2 — PHP 8.4-FPM + nginx: installs Composer dependencies, copies the built frontend, configures the runtime
FRONTEND_PORT=3200
BACKEND_PORT=8000
DB_PORT_HOST=3308MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_FROM_ADDRESS=noreply@example.comAPP_AUTH=keycloak
KEYCLOAK_BASE_URL=https://keycloak.example.com
KEYCLOAK_REALM=my-realm
KEYCLOAK_CLIENT_ID=nexus
KEYCLOAK_REALM_PUBLIC_KEY=<your-public-key>Leave APP_AUTH=token (the default) for simple token-based auth without Keycloak.
For local development without Docker, run frontend and backend separately:
Backend (PHP / Laravel):
cd backend
composer install
cp .env.example .env && php artisan key:generate
php artisan migrate --seed
php artisan serve # → http://localhost:8000
php artisan reverb:start # WebSocket serverFrontend (Angular):
cd frontend
npm install
npx ng serve --configuration=de # → http://localhost:4200NEXUS is licensed under the Business Source License 1.1 (BSL). Key terms:
- Free for internal use — self-host NEXUS for your own organization at no cost
- Commercial license required — offering NEXUS as a hosted/SaaS product to third parties requires a commercial license (€25 EUR/tenant/month, minimum €100/month)
- Converts to AGPL v3 — four years after each release, that version becomes fully open source under the GNU Affero General Public License v3.0
BSL is a source-available license, not an OSI-approved open-source license. The source code is publicly available and forkable, but with the commercial-use restrictions described above.
See LICENSE.md for the full terms or contact info@at2-software.com for commercial licensing.