Skip to content

Playground

A real footman, in your browser. The editor below is a tasks.py; the prompt is fm. Python (and footman itself) load into the page via Pyodide as soon as you arrive — nothing is installed on your machine, and nothing you type leaves it.

The browser has no processes and one thread, so every run("…") child is simulated — it succeeds and its output says [simulated] — and runs are sequential. A few well-known reads (git branch, git tag) answer with plausible canned output instead, so a completer that parses a child's stdout has real names to offer. run(shell=True) resolves to a stand-in shell, since the simulated child never executes it. The page's filesystem holds only the editor's files, so a path requirement (exists/isfile/isdir) passes without looking — nothing it could ask for is there. A tab named stdin is the pipe, not a file: its text feeds the run's stdin, and stdin-bound parameters read it exactly as they would a real pipe. Everything else is the real thing: parsing, eager validation, taught errors, scheduling, --json, --dry-run plans — and fm test runs the real pytest, on toolroom's in-process path, right here in the page (the page provides a quiet pytest.ini that keeps pytest's cache files and footman's own pytest plugin out of the run; add your own tab to override it). A browser has no processes to spawn, so the page is that path's proof by extremes: a true twin, not a fallback. The prompt completes too: press Tab and the candidates come from the same manifest walk a shell completion hook consults, rebuilt from whatever the editor says — and a dynamic suggest() completer runs fresh on every Tab, in the page, exactly as a shell would respawn it. Prompts work too: ask(), prompt(), confirm(), and select() open a browser dialog standing in for the terminal — a menu's numbered lines become the dialog text, Cancel reads as end-of-input, and a secret is typed unmasked (this is a playground, not a vault). The editor completes too: type . after a toolroom handle (or press Ctrl-Space anywhere) and the menu comes from the interpreter — real methods from the typed stubs, docstrings included — and rest the pointer on a name for its signature and docstring, no menu required.

The output pane is a session transcript: every run appends its prompt line and output, in footman's own colours, and Clear starts over.

Press Run. The gate fails — one of the tests is wrong on purpose. Read pytest's diff, fix fizzbuzz (or the test), and run it green. Then try -k check audit to watch keep-going collect every failure, and deploy produ to read a taught error. Completion knows the grammar, not just the words: type deploy prod --regions=eu, and press Tab to watch a comma-separated list complete item by item.

fm
Python is loading — a few seconds; ~15 MB on your first visit, cached after.

Every Python example in these docs has a run it there link that brings the page's code straight into this editor, the prompt already holding a command that runs against it — the examples are tested against every commit, so what you paste is what runs.