Back to Factorial

How Factorial works

Factorial runs the process-improve Python package inside your browser tab. The server sends the app's files and nothing more: your factors, results and analyses stay on your machine, unless you send them in a report with Feedback.

What runs where

factori.althe app's files and the process-improve wheel
jsDelivrPyodide, its Python packages, and Plotly.js
PyPIopenpyxl and plotly

Your browser tab

The pagethe form, the tables and the charts
A worker running PythonCPython in WebAssembly, with process-improve
This browser's storageyour studies and a draft of the one you are writing

The study file

Download all, under Your studies, saves every study as one JSON file, and Share beside a study sends that study alone, as a file of its own (it reads Download in a browser that cannot share a file). Drop the file on the dropzone under Your studies, in any browser: a file of one study opens it on the page, and a file of several adds them all. A study already kept in that browser is not saved twice, and none is overwritten.

The file is plain JSON, readable without Factorial (web/study-file.js writes and reads it):

{
  "format": "factorial-studies",
  "version": 1,
  "exported": "2026-10-21T08:30:00.000Z",
  "app": { "name": "Factorial", "url": "https://factori.al/", "process_improve": "1.4.0" },
  "studies": [
    { "id": "8f1c…", "created": "…", "updated": "…", "sha256": "ab12…",
      "study": { "v": 1, "title": "…", "design": { … }, "responses": [ … ], … } }
  ]
}

A study is whole: its brief, its design and run sheet, each response's results and where each came from, the process they were simulated from, the models, and the settings kept from the what-if panel, each under its name, as "what_if": [{ "name": "Cooler, more pressure", "settings": { "T": 175, "P": 2.5 } }]. Their predictions are not kept: Learn works them out from the models and the results each time, so they follow a result that changes. The file is built to grow with Factorial:

What reaches a server

What this copy is built with

These are the versions this copy of Factorial loads, read from the files it loads them by: runtime.json and wheels/manifest.json.

process-improvethe wheel built with this copy
Python, in WebAssemblyPyodide
From the Pyodide releasenumpy, pandas, scipy, statsmodels and more
From PyPIopenpyxl and plotly
ChartsPlotly.js

Read the code

All of it is open source, under the MIT license, at github.com/kgdunn/process-improve. To check what it does with your data, these are the places to read:

OMARS® is a registered trademark of KU Leuven Research & Development. Factorial uses the name only for the class of designs defined by Núñez Ares and Goos (2020), and is not affiliated with, or endorsed by, KU Leuven, Minitab or Effex.

Run it yourself

Factorial is a folder of plain files, so it runs on any web server. To build that folder from the code and serve it on your own machine (with uv installed):

git clone https://github.com/kgdunn/process-improve
cd process-improve
uv sync --all-extras
uv run python scripts/build_web_app.py --out site --serve

then open http://localhost:8000. The site folder can be copied to any web server: nginx, Apache, Caddy, an internal server or GitHub Pages. It has to be served over HTTP, as Python's files are fetched by the worker, so opening index.html from a disk does not work. deploy/factorial/ holds the setup that serves factori.al, with deploys and roll-backs, as a worked example.

On a network without access to the internet, the browser has to fetch Pyodide, the two PyPI packages and Plotly.js from inside it as well: copy them to a server there, and change their addresses in web/worker.js (Pyodide and the PyPI packages) and web/charts.js (Plotly.js).