The Two Walls a GenroPy Site Hits
You have a GenroPy site. It runs. But two things stand between you and a modern deployment.
Wall one: one synchronous process. A GenroPy site is synchronous WSGI. Under gnrwsgiserve it serves requests through a single process and its thread pool. A handful of concurrent users and it saturates — there is no async, no WebSocket, no way to spread the load without standing up an external load balancer and sharing session state by hand.
Wall two: the register daemon. Every request touches the site register — who is connected, which pages exist, who is logged in, what datachanges to push. Historically that register was a separate process on a wire (Pyro4, then the genro-nodaemon TCP daemon): one more thing to launch, to keep alive, to debug when it hangs.
genropy-asgi removes both walls with one command. gnrasgiserve runs your unmodified site on uvicorn (ASGI). Add --workers N and the same command spreads it over a supervised pool of processes, each user pinned to a stable worker. And there is no daemon — the register is served in-process.
What you actually get
Drop-in for gnrwsgiserve
Same site name, same options, unmodified code. gnrasgiserve mysite and you are on uvicorn.
Scale across processes
--workers N turns one process into a commander plus a pool that grows under load. No external balancer.
No register daemon
The register runs in-process. Nothing to start, connect to, or keep alive. This replaces genro-nodaemon.
Sticky per user
Each user always returns to the same worker, so their session state stays coherent — no shared session store to configure.
WebSocket, natively
ASGI means real WebSocket support, which werkzeug/WSGI never had.
The site never changes
Same root.py, same auth, same sessions. genropy-asgi changes how the site is served, not what it is.