A single Go binary: the console API, the React console files, and a proxy to the Keystone catalog.
Go Upstream React consoleopenkeel-skyline
The module
OpenKeel implementation in Go of OpenStack skyline-apiserver, the back end of the Skyline dashboard, generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. skyline-console runs unchanged against it: same routes under /api/openstack/skyline/api/v1, same session cookie and JWT, same profile, list and error bodies. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist, including the session key handling, is in docs/SECURITY.md.
One image and one process do what the Python container did with nginx and gunicorn:
the Skyline API (login, TOTP, WebSSO, profile, project and region switch, aggregated lists of servers, volumes, snapshots and ports, policies for the UI, settings, Prometheus queries, and the OpenKeel addition GET /extension/server_metrics: CPU, memory and disk usage of the project's instances for the console's Metrics page);
the skyline-console files under /, with the single-page fallback; they are built into the image (/usr/share/skyline-console) from the stable/2026.2 sources;
the reverse proxy /api/openstack/<region>/<service>/ to the OpenStack APIs of the Keystone catalog, re-read every minute (no restart when the catalog changes).
Peers: Keystone (openkeel-keystone), Nova, Cinder, Glance, Neutron through the catalog, Prometheus, and a small MariaDB Galera database (revoked_token, settings).
Name: openkeel-skyline, not openkeel-skyline-apiserver, because the project covers the Skyline server side as a whole (the API and the nginx of the Python container) while skyline-console stays upstream. The binary keeps the upstream name skyline-apiserver; the reverse-specification is reverse-spec-skyline-apiserver/.
Go module: github.com/openkeel/openkeel-skyline
Binary: skyline-apiserver (API, console and proxy on port 9998, health and readiness on 9090)
Configuration: YAML, see config/config.example.yaml
Setting up a development environment, the database and the tests: docs/GETTING-STARTED.md
Database schema, migrations and upgrades: docs/DATABASE.md
Excerpt from openkeel-skyline/README.md (in English).
REST API
30 operations of the original REST API (routes and body actions), and their state in OpenKeel.
The target is the unchanged skyline-console: recorded scenarios are replayed with their outbound calls, policies and session tokens are compared with Python, and the built console is replayed against Go.
Replay of recorded exchanges
E2E replay with outbound calls
Recorded scenarios give the same status, body and cookies, and the same non-Keystone calls to OpenStack in the same order.
How it runs
make e2e against internal/fakeos, on go-mysql-server and MariaDB 11.4.
Latest result 44 / 45 identical on both engines, 1 deliberate difference; 118 outbound calls instead of 222.
Source: openkeel-skyline/docs/CONFORMANCE.md
Unit and golden tests
Policy vectors and session JWT
All embedded policy rules decide as oslo.policy, and the session token is byte-identical to python-jose's.
How it runs
internal/skypolicy/testdata/policy-vectors.json and internal/session/session_test.go.
Latest result 1 862 rules × 7 personas identical; byte-identical JWT for the same payload and key.
Source: openkeel-skyline/docs/CONFORMANCE.md
Client contract
skyline-console smoke replay
Requests recorded with the built console get the recorded statuses, and proxied calls reach their endpoints with the expected headers.
How it runs
test/e2e/console_test.go with E2E_CONSOLE_DIR on the console files of the image.
Latest result 35 / 35.
Source: openkeel-skyline/docs/CONFORMANCE.md
End to end on a lab
Live run against Go Keystone
Login, profile, policies, project switch, contrib endpoints, wrong-password text, logout and the Keystone proxy work against openkeel-keystone.
How it runs
Live run against a MariaDB-seeded Go Keystone, identity endpoint only.
Latest result System admin policies: 1 817 / 1 860 allowed, as Python against its fake.
Source: openkeel-skyline/docs/CONFORMANCE.md
Concurrency on Galera
Concurrency on MariaDB Galera
Concurrent first writes of one setting and concurrent logouts stay consistent across three nodes.
How it runs
make galera-test on galera1 to galera3.
Latest result Pass, 3 runs out of 3: one row, same value on every node, 0 × 5xx.
Source: openkeel-skyline/docs/CONFORMANCE.md
Scenario
skyline-console Cypress suite
The console's own Cypress suite against the Go services.
How it runs
Needs the Go services in a kind cluster (Python Skyline in kind: 31 / 34).
Latest result Not run.
Source: openkeel-skyline/docs/CONFORMANCE.md
Left out of the rewrite
Skyline becomes one Go binary serving the console, its API and the proxy, without the generated nginx, the CORS option or the FastAPI documentation routes.
Internal machinery simplified
nginx and skyline-nginx-generator
Why it was left out
The Go server serves the console build and proxies the OpenStack APIs with the generator's path rules.
Why the solution is not affected
Catalog changes are read every 60 s instead of needing a restart, and the start no longer fails while Keystone is down.
Source: openkeel-skyline/docs/CONFORMANCE.md
Obsolete or unused upstream
CORS allowed origins
Why it was left out
The console is same-origin, and the option prevents start-up on Starlette 1.x anyway.
Why the solution is not affected
None for the console, which is served from the same origin as its API.
Source: openkeel-skyline/docs/CONFORMANCE.md
Internal machinery simplified
FastAPI docs routes and offline generators
Why it was left out
/docs, /redoc and openapi.json are not served, and the policy-manager, swagger and sample-config generators are offline tools of the Python package.
Why the solution is not affected
The OpenAPI document lives in the reverse-spec and policy rules are embedded; the console does not use these routes.
Source: openkeel-skyline/docs/CONFORMANCE.md
Only what was left out by design is listed here; the work not done yet is in the Known gaps of the module's docs/CONFORMANCE.md. Every module
Skyline interactions
Service view generated by the diagram skill from the OpenKeel model.