FlowMiner MAN FM-002 · REV 0.3
Star ★
MAN 00 — OPERATOR’S MANUAL APPLIES TO REV 0.3 · Q2 2026

The operator’s manual.

Everything you need to run FlowMiner on your own hardware — quick start in three commands, a walkthrough from upload to first insight, the config keys that matter, and how to wire up an LLM. No 200-page vendor PDF; for anything deeper, the source is the docs.

WHAT YOU NEED
Docker + Compose
everything else is pulled in by the stack
TIME TO FIRST MAP
< 5 min
two of docker pull, three of clicks
SAMPLE DATA
3 logs included
running example · order OCEL · logistics OCEL
COST
$0 forever
MIT · BYO LLM key for Ask AI

Prefer to poke before installing? The live demo is a full instance with the sample logs preloaded. No login, no email, no tracking.

MAN 01 — INSTALLATION SEQUENCE

Quick start

Three commands. FlowMiner clones, builds, and comes up on localhost:3000. No external services, no account creation, no credit card.

PLATE 01 — TERMINAL
$ git clone https://github.com/flowminer-stack/flowminer
$ cd flowminer && cp .env.example .env
$ docker compose up -d

[+] Running 6/6
 ✓ postgres    Healthy   12.3s
 ✓ redis       Healthy    8.1s
 ✓ backend     Healthy   38.7s
 ✓ worker      Started   39.1s
 ✓ beat        Started   39.4s
 ✓ frontend    Started   41.2s

$ open http://localhost:3000
$ █
INSTALLATION, AS OBSERVED. FIRST BUILD TAKES LONGER.
WHAT YOU SHOULD SEE

After roughly 40 seconds, http://localhost:3000 shows the FlowMiner login page. The default seeded admin is [email protected] / admin. Change it in Settings → Account the moment you log in.

HEADS UP

The stock .env.example works for a local box, but it ships with a placeholder SECRET_KEY. Before exposing FlowMiner to anyone else on your network, skip to MAN 03 · Configuration and rotate the secrets.

MAN 02 — FIRST WALKTHROUGH

Upload to insight in five minutes

From logged-in to a process map you actually trust. Use one of the sample logs that ship under docs/examples/ — no real data required.

  1. Create a project

    Click New project on the sidebar. A project is just a container for logs, so the HR-onboarding traces stay separate from the invoicing ones.

  2. Upload an event log

    Drop a CSV or XES file onto the upload panel. The column mapper auto-detects case_id, activity, and timestamp — confirm and click ingest. For OCEL 2.0, upload the .jsonocel directly.

    Sample logs: docs/examples/running-example.csv and docs/examples/sample-order-management.jsonocel in the repo — or grab them from the live demo.

  3. Read the process map

    Click into the log. The Process tab is the default view — the discovered map, with frequency on every edge. Filter rare paths out, switch to performance-weighted edges to see where time goes, or highlight the critical path.

  4. Explore variants and conformance

    The Analysis tab has every view you’d expect: variants, bottlenecks, rework, temporal profile, handoff network, log skeleton, conformance via token replay. Hit each one once so you know where it is.

  5. Ask the AI

    Open the chat panel and ask “what are my worst bottlenecks?” — it runs get_bottlenecks() against the current log and answers with numbers that came from your data, not a hallucination. Every tool call is visible, so you can audit what it did.

    Requires an LLM provider — see MAN 04 · Connect an LLM. Two minutes with an Anthropic or OpenRouter key.

MAN 03 — CONFIGURATION SCHEDULE

Configuration

FlowMiner reads its config from .env at the repo root. The defaults work for a single-machine install; these are the keys worth actually looking at before you put it anywhere real.

SECRET_KEY dev-secret Signs JWTs and session cookies. Rotate before anyone else hits the instance. openssl rand -hex 32
POSTGRES_PASSWORD flowminer Primary database password. Change before exposing Postgres on any interface but 127.0.0.1.
REDIS_PASSWORD — Optional. Required if Redis is reachable from anywhere besides the compose network.
FLOWMINER_ENCRYPTION_KEY — Fernet key used to encrypt LLM credentials at rest. openssl rand -hex 32
CORS_ORIGINS http://localhost:3000 Comma-separated list of allowed origins. Set to your public hostname when running behind a reverse proxy.
UPLOAD_DIR /data/uploads Where event log files land on disk. Back this folder up to keep uploaded logs across deploys.
ENV development Set to production to enable strict cookies, HSTS, and tighter rate limits.

There are a few dozen other knobs — rate-limit bands, Celery queues, Sentry DSN, SMTP — but you only need them when hardening a real deployment. backend/app/config.py has the full list; every field has an inline comment.

MAN 04 — ASK AI · PROVIDER HOOKUP

Connect an LLM

Ask AI is the chat panel that answers questions about a log. It needs a model. Pick one provider, drop the key into .env, restart the backend. All four below work out of the box.

04·1

Anthropic

Claude Opus / Sonnet / Haiku. The default the tool was tuned against.

FLOWMINER_LLM_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
ANTHROPIC_MODEL=claude-sonnet-4-6
04·2

OpenAI

GPT-4.1, GPT-5 families. Same tool-calling protocol; works identically.

FLOWMINER_LLM_PROVIDER=openai
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4.1
04·3

OpenRouter

One key, every model. Cheapest way to try the whole frontier.

FLOWMINER_LLM_PROVIDER=openrouter
OPENROUTER_API_KEY=sk-or-v1-...
OPENROUTER_MODEL=anthropic/claude-haiku-4-5
04·4

Ollama OFFLINE

Local models — no key, no network. The route for sensitive data.

FLOWMINER_LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.1:70b

No key at all? Leave FLOWMINER_LLM_PROVIDER unset. Every mining view still works; only the chat panel is disabled.

MAN 05 — ALTERNATE ARRANGEMENTS

Advanced setup

Once the default Compose stack feels too small, these are the knobs worth reaching for — in roughly the order most people reach for them.

05·1

Reverse proxy + TLS

Drop a Caddy or Traefik container in front of the frontend and backend. The repo ships a ready-to-use Caddyfile that terminates TLS with Let’s Encrypt and proxies /api/* to the backend.

FILEdeploy/demo/Caddyfile

05·2

Kubernetes via Helm

The chart defines the same five services as Compose, with an optional ingress, configurable resource limits, and a secrets template.

INSTALLhelm install flowminer ./deploy/helm

05·3

MCP server for agents

Every mining endpoint is exposed as an MCP tool via a stdio server. Register it in Claude Desktop, Cursor, or Zed and your assistant can query FlowMiner directly — no browser in the loop.

RUNpython -m app.mcp.stdio

05·4

Offline LLM

Pair with Ollama on the host (see MAN 04·4) and set OLLAMA_BASE_URL. No egress required — great for air-gapped VPCs and security reviews.

MODELSllama3.1:70b · qwen2.5:72b

05·5

Backups

Two things to back up: UPLOAD_DIR (uploaded logs) and the Postgres volume (everything else). A nightly pg_dump + rsync is enough for most self-hosted installs.

CMDdocker exec postgres pg_dump -U flowminer

05·6

Observability

Sentry DSN, Prometheus /metrics, and an OpenTelemetry exporter are all opt-in via env vars. Nothing phones home unless you turn it on — that’s a core promise, not an oversight.

VARSSENTRY_DSN · OTEL_ENDPOINT

MAN 06 — FAULT-FINDING TABLE

Troubleshooting

A handful of things go wrong on fresh installs. These are the fixes 95% of people need.

Backend won’t start — database “flowminer” does not exist
The Postgres init ran before the backend mounted its volume. Bring the stack down and up once more: docker compose down && docker compose up -d. Alembic picks up from an empty database on first run.
Frontend loads but shows “Network error”
The SPA is looking for the API at the wrong origin. Set VITE_API_URL to your public backend URL and rebuild with docker compose build frontend.
Upload stalls on large files
The reverse proxy is capping request size. For Caddy, set request_body { max_size 500MB }. For Nginx, bump client_max_body_size. FlowMiner itself has no upload cap.
Ask AI says “no provider configured”
You haven’t set FLOWMINER_LLM_PROVIDER, or the API key is missing / wrong. Jump to MAN 04. Restart the backend after editing .env — env vars are read at boot, not on each request.
OCEL upload errors with “invalid jsonocel”
pm4py only reads OCEL 2.0. If your file is OCEL 1.0 (top-level ocel:events object), convert it first or regenerate from source.

Stuck on something that isn’t listed? Open an issue on GitHub with your docker compose logs backend output — the maintainers read every one.

MAN 07 — WHERE TO GO NEXT

Next steps