Run
The very first thing you did in this guide was wf run app. Now that you've seen
the whole stack, here's what that command actually arranges — and the few flags that
change how your app comes up.
What run does
wf run <app> takes the name of an app config, reads
app_configs/<app>.ini into the environment, sets a handful of runtime
variables (the app name, host, port, log level) and launches your main.py as a
child process. It streams the app's output to your console and tees it into a timestamped log
file under logs/<app>/. Both an app config and a main.py have
to exist, otherwise it tells you to create them first.
The flags
--host/-h— bind host. Default 127.0.0.1.--port/-p— bind port. Default 8000.--loglevel/-l— log verbosity (passed through to the log session). Default info.--debug/-d— run in debug mode.--interactive/-i— run with the interactive control menu.
# Plain run on a custom port
wf run app -p 9000
# Debug mode with verbose logging
wf run app -d -l debug
Debug mode
The -d flag is what lights up the frontend developer experience. In debug mode
the framework starts the Vite dev server, proxies it for hot module replacement, and rewrites
your pages to pull assets from it — everything we described in the Frontend chapters.
It also silences the insecure-session-cookie warning, since you're obviously developing.
Debug mode is not compatible with port 5173 — that one is reserved for the Vite dev server it manages for you. Pick any other port and you're fine.
Interactive mode
With -i, instead of streaming straight to your terminal, run drops
you into a small control menu — restart, stop, start, join the live log, clear the log
folder. It asks for host, port and debug up front if you didn't pass them. It's handy for
babysitting a long-lived process during development.
Heads up: interactive mode does not behave properly on NT-based (Windows) systems in this alpha, due to how child processes are managed there. It's on the known-issues list on the overview page. On Windows, stick to a plain or debug run for now.
A plain (non-interactive) run forwards SIGINT and SIGTERM for you, so a clean Ctrl+C triggers the graceful shutdown sequence from the Lifecycle chapter: in-flight request finishes, shutdown hooks run, process exits.
That's the tour
From a single main.py to a fullstack runtime with batteries, modules and a
managed frontend — and a CLI that scaffolds and runs the lot. You now have the whole
map. For the precise surface of every class and function, the Reference is next.
Continue reading
From here you can continue straight with the Reference overview.