sim.pflow.xyz

Build a model

Turn any operational model into a what-if machine. Describe a system as a Petri net — staffing, queues, equipment, patience — store it with one POST, and every model gets the same instruments: seeded scenario comparison, disruption injection, synthetic event-log datasets, and one-click publishing into your own Google Sheets with live charts.

Every number comes from a discrete engine that enforces the model — resource holds, thresholds, capacities, non-accelerating queues — and says plainly what it could not enforce. Same seed, same answer, byte for byte.

Model catalog

Loading…

Fetching /api/catalog.

Bring your own model

A model is a stored data item, not a deployment. POST a Petri-net JSON and the id that comes back — the content hash, stable forever — carries the whole API. Nothing to register, no routes to code.

# store a model
curl -X POST https://sim.pflow.xyz/api/models \
  -H 'Content-Type: application/json' -d @model.json
# → {"id":"…","url":"/api/models/…"}

# ask it a hypothetical (pure read, seeded)
curl -X POST https://sim.pflow.xyz/api/models/$ID/scenario \
  -d '{"hours":8,"realizations":16,"seed":7,
       "marking":{"staff":3}}'

Every model answers the same six endpoints:

GET  /api/models/$ID            the model
GET  /api/models/$ID/rates      declared knobs
POST /api/models/$ID/scenario   one hypothetical
POST /api/models/$ID/scenario/compare
                                seeded side-by-side
GET  /api/models/$ID/dataset    synthetic event log
                                (?seed=&cases=&format=csv|jsonl)
POST /api/models/$ID/publish    → your Google Sheets

How it works

Petri nets, honestly enforced. Places hold tokens, transitions fire, and the engine honors what most simulators quietly relax: read arcs gate without consuming, inhibitors block above thresholds, capacities bound post-firing, and a queue is a prerequisite — never an accelerant.
Seeded stochastic comparison. Scenarios in one comparison share one seed, enforced server-side — so the difference you see is the staffing, not the dice. Contended-time accounting names what the run actually waited on, classified structurally.
Datasets that survive mining. The synthetic event logs replay cleanly against their own generating net, and process-mining them recovers the rates the model declared — data, not decoration.
Sheets as a first-class surface. A published spreadsheet carries the model itself, the scenario trajectory, contention analysis, native charts — and, for models honest to solve in cells, a live formula tab you can re-solve by editing a rate.