Modern Resource-Order-Activity Working Time, Absence Management, and Period Closing System
Features β’ Screenshots β’ Architecture β’ Quick Start β’ Docker β’ Mail Config β’ Operations β’ REST API β’ License
Chronivaro is a lightweight, high-performance working time and absence management platform built on the Strolch framework. It delivers precise multi-block daily time tracking with automatic break derivation, comprehensive vacation journal accounting, monthly period closing workflows with calculation snapshots, role-based supervisor approval queues, and tenant-wide administration.
The system is packaged as a standalone application distribution with an embedded Eclipse Jetty 12 runtime and a lib/ directory containing all dependencies, serving both modern Web Component frontend assets and REST API endpoints without requiring an external servlet container.
Chronivaro offers a responsive single-page web interface tailored for employees, supervisors, HR managers, and administrators.
π Click to preview key interface highlights
| Live Team Presence ("Who is Working?") | Multi-Block Daily Time Recording |
|---|---|
![]() |
![]() |
| Absence Requests & Vacation Balances | Supervisor Approvals Inbox |
|---|---|
![]() |
![]() |
| Monthly Period Closing & Calculation Snapshot | Master Data & Employee Administration |
|---|---|
![]() |
![]() |
π Explore the complete visual walkthrough: See the Full UI Screenshots Gallery for all 21 application screens, including reporting views, work schedule definitions, holiday calendars, and audit logs.
- β±οΈ Time Tracking & Live Timer: Real-time start/stop timer, manual work entry creation/editing, multi-interval daily tracking, automatic break calculation from time gaps, and overnight shift handling.
- π΄ Absence & Vacation Management: Multi-type absence requests (Vacation, Sickness, Military/Civil Defense, Special Leave) with flexible units (Full-Day, Half-Day, Hours), quota accounting, and balance progression.
- β Supervisor Approval Queues: Dedicated approval inbox for team supervisors and HR managers with optimistic concurrency validation, team/type filters, and mandatory rejection feedback.
- π Monthly Period Closing Workflow: Employee period submission, calculation snapshot generation (actual vs. target hours, overtime/undertime), supervisor approval, and HR/Admin period locking.
- π Reporting & RFC 4180 CSV Export: Personal summaries, monthly balance histories, vacation account journals, team performance overviews, and filtered absence reports with UTF-8 BOM encoding for Excel.
- π₯ Tenant Administration & Self-Service: Comprehensive master data management for employees, employment schedules, teams, locations, holiday calendars (including extensible CSV holiday import for formats like "fcal.ch DE"), absence types, global tenant parameters, and user self-service password management.
- π Security & Audit Logging: Role-based access control (Employee, Supervisor, HR, Administrator), immutable append-only audit trail logging all state transitions, approvals, and configuration changes.
- π Standalone Embedded Jetty Execution: Executable standalone JAR (
chronivaro.jar) with manifest classpath loading fromlib/(and packaged distribution archivechronivaro.tar.gz) delivering frontend assets and REST API endpoints out-of-the-box.
Chronivaro is structured as a modular Maven project separating core domain logic, REST APIs, frontend web components, and standalone packaging:
graph LR
Client[Web Browser / API Clients] -->|HTTP / JSON| Jetty[Embedded Jetty 12 Server]
Jetty -->|Static Routing| WebUI[chronivaro-web / Frontend SPA]
Jetty -->|JAX-RS Jersey| REST[chronivaro-rest / REST API]
REST -->|Services & Commands| Core[chronivaro-core / Strolch Domain Model]
Core -->|In-Memory TX| Strolch[Strolch Runtime & Data Persistence]
| Module | Description |
|---|---|
chronivaro-core |
Domain model, Strolch services, commands, searches, and calculation policies |
chronivaro-rest |
Jakarta REST (Jersey) endpoints, DTO mappers, authentication filters, and error mappers |
chronivaro-web |
Single Page Application (Web Components, JavaScript modules, CSS, icons) |
chronivaro-app |
Standalone launcher with embedded Eclipse Jetty HTTP server, lib/ dependency staging, and distribution packaging |
docs/ |
Architecture specifications, REST API OpenAPI definition, screenshots gallery, and operations guides |
runtime/ |
Strolch runtime directory (configuration XMLs, templates, and model persistence) |
- Java Runtime: JDK 25 (or JDK 24+)
- Build Tool: Maven 3.6+
- Browser: Modern web browser (Firefox, Chrome, Edge, Safari)
To build all modules and package the distribution archive:
mvn clean installTo run unit and integration tests:
mvn testThe resulting executable JAR, dependency lib/ folder, and distribution tarball are located at:
chronivaro-app/target/chronivaro.jar
chronivaro-app/target/lib/
chronivaro-app/target/chronivaro.tar.gz
Start Chronivaro as a standalone application using Java:
java -jar chronivaro-app/target/chronivaro.jar --port 8080 --runtime ./runtime --env devThe application will be accessible at http://localhost:8080.
| Argument | Environment Variable | Default Value | Description |
|---|---|---|---|
--port <int> |
PORT / CHRONIVARO_PORT |
8080 |
HTTP port to listen on (0 binds to dynamic available port) |
--bind <address> |
BIND_ADDRESS / CHRONIVARO_BIND |
0.0.0.0 |
IP address to bind HTTP listener |
--context-path <path> |
CONTEXT_PATH |
/ |
Base HTTP context path for Web UI and REST endpoints |
--no-http |
NO_HTTP |
false |
Disable HTTP server and run Strolch core runtime only |
--runtime <path> |
STROLCH_PATH |
./runtime |
Path to Strolch runtime directory containing config/ and data/ |
--env <name> |
STROLCH_ENV / STROLCH_ENVIRONMENT |
dev |
Environment configuration profile (e.g. dev, prod, test) |
--web-resources <path> |
WEB_RESOURCES_PATH |
null (auto) |
Custom filesystem path to override static frontend assets |
- Build the project from the root:
mvn clean package -DskipTests
- Start the container stack using Docker Compose:
docker compose -f docker-compose-dev.yml up --build
- Open
http://localhost:8080in your browser.
Build and tag the local Docker image:
./build-docker-image.shBuild, tag, and push to the remote registry (repo.strolch.li):
./build-and-push-docker.shTo package a clean, ready-to-use runtime environment tarball for deployment:
# Using the shell script
./build-runtime-tarball.sh -o runtime.tar.gz
# Or using the Java class directly
java -cp "chronivaro-app/target/*" ch.eitchnet.chronivaro.app.RuntimeArchiveGenerator -s runtime -o runtime.tar.gzThe packaging process automatically:
- Copies all necessary configuration and model files from
runtime/. - Excludes temporary/session files (
runtime/temp/) and dbStore directories (runtime/data/dbStore/). - Sanitizes
PrivilegeUsers.xmlto remove personal user accounts while preserving system accounts (State=SYSTEM) and theadminuser.
Chronivaro includes an automated release script (release.sh) to update Maven POM versions to the release version, sign and annotate git tags, build artifacts (standalone application distribution tarball, sanitized runtime tarball, SHA-256 checksums), sign all release assets with GPG (.asc detached signatures), generate release notes, publish GitHub Releases, announce releases on Mastodon, and automatically increment the POM version to the next minor snapshot (e.g. 0.2.0-SNAPSHOT):
# Dry-run / Simulation mode (inspect release notes, assets, and version updates preview):
./release.sh --simulate
# Full release for version 0.1.0 with Maven build:
./release.sh -v 0.1.0 -b
# Release with custom next development version:
./release.sh -v 0.1.0 -n 0.2.0-SNAPSHOT -b
# Release and announce on Mastodon:
./release.sh -v 0.1.0 -b -m --mastodon-instance mastodon.social --mastodon-token $MASTODON_TOKENConfiguration can be provided via flags, environment variables (GITHUB_TOKEN, MASTODON_INSTANCE, MASTODON_ACCESS_TOKEN, MASTODON_VISIBILITY), or loaded automatically from the release environment file ${HOME}/.config/chronivaro/release.env.
- Prepare directory structure on host:
mkdir chronivaro && cd chronivaro mkdir -p logs runtime/{config,data,temp}
- Copy configuration files from
runtime/intoruntime/(config/,data/,temp/). - Set secure values for
secretKeyandsecretSaltinruntime/config/PrivilegeConfig.xml. - Configure mail delivery in
runtime/config/StrolchConfiguration.xml(see Email Delivery & MailHandler Configuration below). - Optional: Configure file logging in
runtime/config/logback.xmlto persist logs to/chronivaro-logs(mounted to./logs). - Copy
docker-compose.ymlto the directory. - Launch the container:
docker compose up -d docker compose logs -f
When upgrading Chronivaro to a newer version, new features may introduce updated templates (runtime/data/Templates.xml), new service or search privileges (runtime/config/PrivilegeRoles.xml), or new configuration parameters (runtime/data/Model.xml).
Every GitHub release includes:
runtime-upgrade-<prev_tag>-to-<new_tag>.patch: A unified diff patch file that can be applied directly to an existing deployment'sruntime/directory.RELEASE_NOTES.md: Markdown release notes with detailed explanations of changed runtime files and diff snippets.
-
Backup Existing Runtime Directory:
# Always take a backup before upgrading tar -czf "runtime-backup-$(date +%Y%m%d%H%M%S).tar.gz" runtime/
-
Download Release Assets & Patch: Download the new application distribution archive (
chronivaro-<version>.tar.gz), the patch file (runtime-upgrade-<from>-to-<to>.patch), and checksums (SHA256SUMS.txt). Verify integrity:sha256sum --check SHA256SUMS.txt
-
Dry-Run / Test Patch Application: From your installation root directory (containing
runtime/):# Test with patch utility: patch --dry-run -p1 < runtime-upgrade-v0.2.0-to-v0.3.0.patch # Or test with git (if your runtime directory is version-controlled): git apply --check runtime-upgrade-v0.2.0-to-v0.3.0.patch
-
Apply the Patch:
# Using patch: patch -p1 < runtime-upgrade-v0.2.0-to-v0.3.0.patch # Or using git: git apply runtime-upgrade-v0.2.0-to-v0.3.0.patch
-
Review Custom Configurations: If your deployment has customized users (
PrivilegeUsers.xml) or custom tenant data (Model.xml), review any modified sections to ensure your settings are preserved. -
Update Application Binaries & Restart:
- Standalone Deployments: Extract the new
chronivaro.jarandlib/directory, then restart the service:tar -xzf chronivaro-<version>.tar.gz sudo systemctl restart chronivaro
- Docker Deployments: Update the image tag in
docker-compose.ymland restart the container:docker compose pull docker compose up -d
- Standalone Deployments: Extract the new
You can also use the bundled CLI tool to generate markdown upgrade instructions or unified diffs between any two git tags/revisions:
# Print markdown upgrade instructions to stdout
./generate-upgrade-instructions.sh -f v0.2.0 -t HEAD
# Save upgrade instructions to a file
./generate-upgrade-instructions.sh -f v0.2.0 -t v0.3.0 -o UPGRADE.mdChronivaro uses Strolch's li.strolch.privilege.handler.MailUserChallengeHandler in runtime/config/PrivilegeConfig.xml to deliver user registration challenges and password reset tokens.
Challenge delivery is handled by the MailHandler component configured in runtime/config/StrolchConfiguration.xml:
- Development (
SimulatedMailHandler): By default in local/dev environments,SimulatedMailHandlerintercepts outgoing emails and logs challenge links to the standard log output, allowing local testing without an SMTP server. - Production (
SmtpMailHandler): For production deployments, switch the implementation toSmtpMailHandlerand configure your SMTP server connection parameters. No modifications toPrivilegeConfig.xmlare needed.
<Component>
<name>MailHandler</name>
<api>li.strolch.handler.mail.MailHandler</api>
<!-- For production SMTP: -->
<!-- <impl>li.strolch.handler.mail.SmtpMailHandler</impl> -->
<!-- For local development / simulation: -->
<impl>li.strolch.handler.mail.SimulatedMailHandler</impl>
<Properties>
<fromAddr>Chronivaro <[email protected]></fromAddr>
<username>[email protected]</username>
<password>XXX</password>
<auth>true</auth>
<startTls>true</startTls>
<host>smtp.gmail.com</host>
<port>587</port>
<sign>false</sign>
<!-- Optional PGP signing key in runtime/config/ -->
<signingKey>[email protected]</signingKey>
<signingKeyPassword>myKeyPassword</signingKeyPassword>
<encrypt>false</encrypt>
<!-- Optional comma-separated list of recipient PGP public keys in runtime/config/ -->
<recipientPublicKeys>[email protected]</recipientPublicKeys>
</Properties>
</Component>See docs/OPERATIONS.md for detailed descriptions of all MailHandler configuration properties.
For testing, demonstration, or initial development environments, Chronivaro includes a GenerateSampleDataJob that creates a rich dataset (holiday calendars, locations, teams, employees with working schedules, defaults, time entries, absences, on-call periods, and period approvals).
The job is configured as a StrolchJob resource in runtime/data/Model.xml:
<Resource Id="GenerateSampleDataJob" Name="GenerateSampleDataJob" Type="StrolchJob">
<ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
<Parameter Id="className" Name="Class Name" Type="String" Value="ch.eitchnet.chronivaro.core.jobs.GenerateSampleDataJob"/>
<Parameter Id="mode" Name="Job Mode" Type="String" Interpretation="Enumeration" Uom="JobMode" Value="Manual"/>
</ParameterBag>
</Resource>When set to JobMode.Manual, it can be triggered on demand via the Strolch Jobs API or during first startup. StrolchJob definitions are automatically excluded from production runtime distribution tarballs generated by build-runtime-tarball.sh.
- Initial Login: Navigate to
http://localhost:8080and log in with default credentials:- Username:
admin - Password:
admin
- Username:
- Mandatory Password Change: Immediately change the default admin password via the user profile dropdown in the top header.
- First Employee Onboarding:
- Verify/configure Locations, Teams, and Work Schedule Templates under Administration.
- Create the employee profile in Administration -> Employees, assigning Team, Location, and Schedule Template. Saving the employee automatically provisions the linked user account.
- Initiate registration by selecting Actions -> Register on the employee row.
- The employee completes the registration form with their challenge code to set their password, logs in, and can start tracking time immediately.
Chronivaro provides unauthenticated standard endpoints for container orchestration, load balancers, and health checks:
| Endpoint | Method | Description |
|---|---|---|
/rest/chronivaro/v1/system/health |
GET |
Liveness Probe: Returns HTTP 200 {"status": "UP", "agentState": "RUNNING", "uptimeMs": ...} |
/rest/chronivaro/v1/system/readiness |
GET |
Readiness Probe: Returns HTTP 200 {"status": "READY", "activeRealms": [...]} when ready for traffic |
/rest/chronivaro/v1/system/version |
GET |
Version Metadata: Returns application version, build timestamp, environment, and Strolch version |
/rest/chronivaro/v1/system/metrics |
GET |
JVM Telemetry: Returns heap/non-heap memory, active threads, system load average, and uptime |
Chronivaro uses SLF4J with Logback for structured logging. Every HTTP request carries an X-Correlation-Id header mapped to the logging MDC context:
2026-08-19 13:30:00.123 [qtp1234567-24] [corrId=e4a1b2c3-4d5e-6f7a-8b9c-0d1e2f3a4b5c] INFO ch.eitchnet.chronivaro.rest.resource.ChronivaroResource - Processed presence query
Clients can supply custom correlation IDs via the X-Correlation-Id request header; otherwise, the server automatically generates and returns a UUID correlation ID in the response headers.
Logging configuration can be customized dynamically by placing logback.xml in runtime/config/. When the Strolch agent starts, LoggingLoader.reloadLogging(this.configPathF) reloads Logback configuration from runtime/config/logback.xml.
By default, the standard Docker container provides /chronivaro-logs as a mount point for persistent log files. To persist logs:
- Ensure
runtime/config/logback.xmlcontains aRollingFileAppenderpointing to/chronivaro-logs/chronivaro.log(or${LOG_DIR:-/chronivaro-logs}/chronivaro.log). - Mount the log directory in Docker Compose:
volumes: - ./runtime:/chronivaro-runtime - ./logs:/chronivaro-logs
| Role | Responsibilities & Capabilities |
|---|---|
| Employee | Record work entries, start/stop timers, view team presence ("Who is working?"), view personal balances, submit absence requests, submit monthly closing periods |
| Supervisor | View team presence, review and approve/reject team absence requests, review submitted monthly periods for supervised teams with calculation snapshots |
| HR | Manage employee profiles, administer vacation entitlements and adjustments, unlock/lock periods across the tenant, view all absence reports |
| Administrator | Manage global configuration parameters, holiday calendars, teams, locations, schedule templates, and inspect tenant audit logs |
| StrolchAdmin | Full framework administration and privilege user/role management |
Chronivaro supports Personal Access Tokens (PAT) for third-party integrations (e.g. desktop widgets, CLI scripts, mobile timers):
- Generation & Management: Users can generate and revoke tokens in the Web UI under Profile -> Personal Access Tokens (
#tokens). - Validity & Expiration: Tokens can be created with custom validity periods (specified in days, months, or years; defaulting to 1 year) or configured with no expiration.
- Preset Scopes:
DESKTOP_TIMER: Permissions to start/stop timers, fetch status/summaries, and read personal entries.READ_ONLY_TIMES: Read-only access to/me/*entries, summaries, and presence.FULL_PERSONAL: Full scope of the user's personal/me/*permissions.
- Authentication: Pass the token via the
Authorizationheader:(OrAuthorization: Bearer <tokenId>:<tokenSecret>Authorization: <tokenId>:<tokenSecret>or HTTP Basic Auth with username<tokenId>and password<tokenSecret>)
Users can test their PAT against the REST API with standard curl commands (assuming the server is hosted at http://localhost:8080):
curl -X GET "http://localhost:8080/rest/chronivaro/v1/me/timer/status" \
-H "Authorization: Bearer <tokenId>:<tokenSecret>" \
-H "Accept: application/json"curl -X POST "http://localhost:8080/rest/chronivaro/v1/me/timer/start" \
-H "Authorization: Bearer <tokenId>:<tokenSecret>" \
-H "Content-Type: application/json" \
-d '{
"workingLocation": "OFFICE",
"comment": "Working on feature implementation",
"isOnCall": false
}'curl -X POST "http://localhost:8080/rest/chronivaro/v1/me/timer/stop" \
-H "Authorization: Bearer <tokenId>:<tokenSecret>" \
-H "Content-Type: application/json" \
-d '{
"comment": "Lunch break"
}'- πΌοΈ Screenshots Gallery: Comprehensive visual tour of all application views and administration screens.
- βοΈ Operations & Deployment Guide: Production deployment, container setup, systemd integration, and disaster recovery.
- π‘ OpenAPI Specification: Comprehensive REST API contract with request/response schemas and examples.
- π Implementation Backlog: Granular task breakdown and implementation history.
- π Implementation Status: Architectural decisions, delivered milestones, and verification summary.
Chronivaro is free software licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).






