genropy-kajenn
genropy legacy sites on kajenn: a commander in the server, a supervised pool of workers each hosting one site, users pinned to a worker, no register daemon.
genropy-kajenn serves an existing, synchronous genropy site on an ASGI
server. It replaces two pieces of the legacy stack at once: gnrwsgiserve, the
one-process werkzeug launcher, and gnrdaemon, the register daemon reached over
a wire.
One server process holds the front and the commander. Every worker is a process
of its own hosting one unmodified GnrWsgiSite, born by fork out of a template
process that builds that site once for the whole group. A user and all his pages
live in one worker, and the spa_connection_id cookie — the connection id the
site itself minted — is what sends every request of his back to it. A user who
goes quiet is written to a freezer on disk and his worker gets the memory back;
his next request wakes him wherever there is room.
The site register is answered in-process. The package declares the
gnr.web:daemon entry point, and genropy installs it as gnr.web.daemon only
when GNR_DAEMON_PROVIDER names the provider — which the command does for its
own process, so the classic stack and this one can share one virtualenv. That gate
needs a genropy later than 26.9.29 (see Installation).
Your site does not change: same root.py, same packages, same authentication,
same pages.
Installation
pip install genropy-kajenn
kajenn and kajenn-orchestra are installed with it. genropy must be present
at runtime and configured as usual (~/.gnr/environment.xml plus an existing
site); it is deliberately not a declared dependency of this package.
genropy must be later than 26.9.29. The genropy the site runs on must contain
commits 9810aa4f1a (the GNR_DAEMON_PROVIDER gate), 436c805006
(websocketHandlerClass, gnrwebsocket_kajenn.js) and add8e38b8d (the browser
socket closed when its channel is refused). The latest PyPI release, genropy
26.9.29 (tag release-26.09.29), contains none of them; until a release does,
they exist only on the develop branch. Details:
genropy prerequisite.
Usage
gnrkajenn mysite -p 8080
mysite is the genropy instance name — the same you pass to gnrwsgiserve — or
a path to a site directory. That is the whole launch: no worker count to declare
and no single/pool selector. On macOS export PGGSSENCMODE=disable, because
libpq negotiating Kerberos inside a forked child crashes it.
Site-wide counters, no authentication needed:
curl -s http://127.0.0.1:8080/metrics
Documentation
https://genropy-kajenn.readthedocs.io/en/latest/ — concepts, architecture with
diagrams, the CLI, the configuration keys, the FAQ and troubleshooting. To build
it locally see docs/building.md:
pip install -e ".[docs]"
sphinx-build -W --keep-going -b html docs docs/_build/html
Underneath: kajenn is the ASGI server, kajenn-orchestra the commander/worker orchestration.
Development
pip install -e ".[dev]"
pytest tests/
ruff check src/ tests/
The live tests host the test_invoice_pg instance of genropy and need:
- a genropy checkout (the
developbranch), installed withpip install -e "gnrpy[pgsql]"plus therequirements.txtof thegnrcore/admpackage; - a genro configuration folder named by
GENRO_GNRFOLDER, whoseenvironment.xmlpoints at that checkout (gnrhome,projects,packages,resources,webtools); the folder itself must be calledgnr, because genropy reads its files under the folder's name (gnr.environment_xml), and kept outside any directory onsys.path, where it would shadow thegnrpackage; - a running PostgreSQL, reached with the libpq variables (
PGUSER,PGPASSWORD,PGHOST); - in the configuration folder,
instanceconfig/default.xml(an empty<packages/>) andsiteconfig/default.xml(<jslib dojo_version="11" gnr_version="11"/>plus<resources><common/><js_libs/></resources>); - in
environment.xml, a<static><js>block withdojo_11atdojo_libs/dojo_11(cdn="") andgnr_11atgnrjs/gnr_d11of the checkout; - the database created with
createdb test_invoice_pgand then built withgnr app dbsetup test_invoice_pg.
The suite skips only for genropy not installed, a database driver not installed,
an opt-in variable not set (BENCH_*, GNR_BENCH_*, GNR_WSX_TEST_URL) and an
installed genropy without websocketHandlerClass. Any other missing prerequisite
fails the run. .github/workflows/tests.yml builds all of the above.
License
Apache License 2.0 — Copyright 2025 Softwell S.r.l. See LICENSE and NOTICE.
Metadata
Release files for genropy-kajenn 0.5.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| genropy_kajenn-0.5.2.tar.gz | 514.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| genropy_kajenn-0.5.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 603.3 kB
Release files / genropy_kajenn-0.5.2.tar.gz
| Download URL | genropy_kajenn-0.5.2.tar.gz |
|---|---|
| Size | 514.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d93c1e3d28054d9e72e62ef0b3d1e6a06c2bf58cc0221454ae204d9d04078441
|
|
BLAKE2b-256 checksum How to use checksums |
91f31e54f917a265ced601460bdbefca008cfde947009aedcb311e08d72d8d38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / genropy_kajenn-0.5.2-py3-none-any.whl
| Download URL | genropy_kajenn-0.5.2-py3-none-any.whl |
|---|---|
| Size | 88.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
031d74e4dc0a7c279e2e049c31d5f3463f7e7ddff2a71b3007092079fa3d9a6e
|
|
BLAKE2b-256 checksum How to use checksums |
026e5a5e96e35963b31ec99cfac6790f8b45947de0a4fb16e8663320dc162026
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log