qbitOS node process manager — spatial graph UI, JSON across, Python/JAX up, CUDA/C++ down.
Not ComfyUI. Local app for graph orchestration; Colossus configs stay portable in configs/colossus.yaml.
| Layer | Path |
|---|---|
| Graph UI | web/ — canvas node editor |
| API / runtime | src/qbpm/ — FastAPI + graph engine |
| JSON graphs | graphs/*.json + schemas/graph.schema.json |
| CUDA stubs | src/kernels/*.cu |
| Cluster port | configs/colossus.yaml |
| Tools | tools/ — e.g. tools/kbatch/ (live keyboard analyzer) |
cd /Volumes/qbitOS/00.dev/projects/qbpm
chmod +x start.sh
./start.shOpen http://127.0.0.1:8796 · static shell at https://qbitos.github.io/qbpm/ · https://fornevercollective.github.io/Qbpm/ · full stack at https://qbitos.ai
| Graph canvas + dock rail | All float panels open |
|---|---|
![]() |
![]() |
Canvas toolbar (+, ◎, frames) sits right of the dock rail — not over it.
| Visualizer | Inspector | kbatch |
|---|---|---|
![]() |
![]() |
![]() |
| Tools hub | .grok terminal |
|---|---|
![]() |
![]() |
| Video | Chat | Music lab | Processing · osc |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Regenerate: ./start.sh then node scripts/capture-readme-screenshots.mjs
Canvas overlay (like go-ugrad):
- Crosshairs + dashed targeting lines to peers
- Target cards: video left, name + coords right (local cursor + remote peers)
- Top-right: chat notification toasts
- Bottom-left: live music notation mini-strip
- Bottom-right: processing readout (flow, run trace, frames, peers)
| Variant | Host | Build | API |
|---|---|---|---|
| desktop | 127.0.0.1:8796 |
./start.sh |
same origin |
| pages | qbitos.github.io/qbpm/ |
VARIANT=pages make pages |
bridge → api.qbitos.ai |
| forge | fornevercollective.github.io/Qbpm/ |
VARIANT=forge make forge |
bridge → api.qbitos.ai |
| cloudflare | qbpm.qbitos.ai |
VARIANT=cloudflare make cf |
bridge → api.qbitos.ai |
| cloud | qbitos.ai |
./start.sh + nginx |
same origin |
Variant configs: deploy/variants/*.env · launch components: web/launch-config.json · runtime: web/pages-boot.js reads baked static/env-config.json.
In qbitOS/qbpm → Settings → Pages:
- Source: Deploy from a branch
- Branch:
gh-pages// (root)
Workflow pushes _site to gh-pages on every main push.
| Workflow | Target |
|---|---|
deploy-pages.yml |
qbitOS Pages → https://qbitos.github.io/qbpm/ (gh-pages branch) |
sync-fornevercollective.yml |
mirrors web/ → fornevercollective/Qbpm (needs FORNEVER_DEPLOY_TOKEN) |
deploy-cloudflare-pages.yml |
https://qbpm.qbitos.ai (needs CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID) |
ci.yml |
pytest + static builds for all variants |
- Create Pages project
qbpm· custom domainqbpm.qbitos.ai - Add repo secrets:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID - Push
main— workflow buildsVARIANT=cloudflareand deploys_site deploy/cloudflare/_redirects+_headersship with the build
make sync-forge # local · uses Qbpm/ cloneCI uses FORNEVER_DEPLOY_TOKEN (PAT with contents:write on fornevercollective/Qbpm).
./start.sh # port 8796Reverse-proxy with deploy/nginx-qbitos.conf.example — API at api.qbitos.ai or path /api on qbitos.ai. CORS allows Pages, forge, and qbpm.qbitos.ai origins.
- Responsive layout with bottom panels (graph / viz / edit / grok tabs)
- Pinch zoom · ✥ pan mode button · 44px touch targets
manifest.webmanifest+sw.js— offline shell caching- Safe-area padding for notched devices
| Endpoint | Purpose |
|---|---|
POST /api/grok/inject |
Direct line injection ({"text":"run"}) |
POST /api/grok/inject/batch |
Multiple commands |
GET /api/grok/terminal |
Read terminal buffer |
WS /api/grok/ws |
Railway-compatible live inject |
Browser bridge:
await grokTools.inject("run\n");
await grokTools.agent();
grokTools.connect(); // WebSocketCommands: help · run · save · graph · agent · set code <id> <py> · align node|graph
| Endpoint | Purpose |
|---|---|
POST /api/live/ingest |
kbatch / piano / browser live payload |
GET /api/live/state |
Latest flow, musica, bpm snapshot |
WS /api/live/ws |
Live fan-out to qbpm UI + tools |
GET /api/tools |
Discover tools/kbatch etc. |
/tools/kbatch/kbatch.html |
Embedded kbatch (same-origin) |
Starter graph: graphs/live-music.json — music.clock → tool.kbatch → music.score → python.jax / wasm.classify → repel.play.
# qbpm app (8796) — embeds kbatch
./start.sh
# kbatch standalone (8795) — forwards ingest to qbpm via CORS
cd tools/kbatch && ./start.shBrowser bridge: window.qbpmLive.ingest({ text, flow, musica, bpm })
core.clock— tick / cpmmusic.clock— live tempo (cpm / bpm)music.score— flow + musica → notes from live bustool.kbatch— keyboard live ingest snapshotwasm.classify— prefix_engine WASM lane (browser)repel.play— stream play hint (~/dev/ffmpeg/repel)python.exec— Python snippet (result = ...)python.jax— JAX snippet (uv sync --extra jax)kernel.cuda— CUDA binding stubagent.mutator— JSON diff proposals via/api/agent/proposecore.output— sink
nvcc -std=c++17 -arch=sm_80 -c src/kernels/attention_kernel.cu -o build/attention_kernel.oApache-2.0










