Monitoring and logs
Frameleaf gives you everything you need to keep an eye on your server locally: logs, container health checks, job progress and version history. None of it is sent anywhere.
No telemetry
Section titled “No telemetry”Telemetry is permanently turned off in Frameleaf. The server contains no OpenTelemetry code, exporters, metrics listener or usage collectors, and the bundled Compose files no longer start Prometheus or Grafana. The old IMMICH_TELEMETRY_INCLUDE, IMMICH_TELEMETRY_EXCLUDE and metrics port variables can’t turn reporting back on.
Update checks never contact an upstream service. When you turn them on, the server asks Frameleaf’s release feed whether there’s a newer version, and Frameleaf’s GitHub releases if the feed can’t answer.
Where to look
Section titled “Where to look”| What | Where |
|---|---|
| Server health, storage, backups and what’s processing | The Command Center overview. See Command Center |
| Job queues, failures and errors | Settings, then Compute & jobs. See Jobs and queues |
| Machine learning and other workers | Administration, then Processing destinations. See Workers and where jobs run |
| GPU set-up | Settings, then Compute & jobs, then Hardware & GPU |
| Missing, unknown and changed files | Administration, then Maintenance. See System integrity |
| Container health | docker compose ps |
| Logs | docker compose logs |
Read the logs
Section titled “Read the logs”From your Compose folder:
docker compose logs -f immich-server # the serverdocker compose logs -f immich-machine-learning # machine learningdocker compose logs -f database # PostgreSQLThe service names work whatever the containers are called (frameleaf_server, frameleaf_machine_learning and so on).
Health checks
Section titled “Health checks”Every service in the provided Compose file has a health check, and docker compose ps shows whether each one is healthy. The server’s check uses the frameleaf-healthcheck command in the server image, and the database image has its own check built in, including a check for data checksum failures.
Log level
Section titled “Log level”Set how much the server logs in Administration, then Settings, then Logging: turn logging on or off and choose a level. You can also set it with FRAMELEAF_LOG_LEVEL in .env.
| Level | What’s logged |
|---|---|
verbose |
Everything, including very detailed tracing |
debug |
Detail useful when troubleshooting |
log |
Normal activity (the default) |
warn |
Warnings and errors only |
error |
Errors only |
fatal |
Only errors that stop the server |
Raise the level while you troubleshoot, then set it back: verbose and debug produce a lot of output.
Structured JSON logs
Section titled “Structured JSON logs”Frameleaf logs human-readable lines by default. To feed logs into your own log collector, switch to JSON with FRAMELEAF_LOG_FORMAT in .env and restart:
FRAMELEAF_LOG_FORMAT=json| Value | Format |
|---|---|
console |
Human-readable lines with colours (the default) |
json |
One JSON object per line |
Each JSON line looks like this:
{"level":"log","pid":36,"timestamp":1766533331507,"message":"Initialized websocket server","context":"WebsocketRepository"}{"level":"warn","pid":48,"timestamp":1766533331629,"message":"Unable to open /build/www/index.html, skipping SSR.","context":"ApiService"}| Field | Meaning |
|---|---|
level |
Log level, such as log, warn or error |
pid |
Process ID |
timestamp |
Unix time in milliseconds |
message |
The log message |
context |
The part of the server that wrote it |
Frameleaf never forwards logs itself; collecting them is up to your own tools.