{"slug": "rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box", "title": "Rack Community: a self-hosted AI lab whose job runner won't overload the box", "summary": "Rack Community released a self-hosted AI lab for a single Linux box, built on Node 24 and Python 3, that runs a durable job queue with memory admission control so jobs cannot overload the machine. The admission script admit.sh admits a job only if max(live memory in use, declared total) plus the job's peak is at or below LIMIT, with ADMIT_LIMIT defaulting to 90 GB and ADMIT_BASE to 10 GB; a refused job exits 75. The project ships no model and no keys, pointing recipes at Ollama at http://127.0.0.1:11434/v1 or any OpenAI-compatible endpoint via RACK_LLM_URL, RACK_LLM_MODEL and RACK_LLM_KEY, and includes Somnus, a human-approved memory control plane, and TalkBack, a team room AI agents can join.", "body_md": "**A self-hosted home AI lab for one box: live gauges, a job runner that refuses to overload the machine, recipe templates for training and testing, memory you approve, and a team room any AI can join.**\n\nIf this is useful to you, a star helps other people find it.\n\n| Controls stay locked until you paste your token. | Pause says who paused and why. Saved pieces are kept. | \n| Recipes, and what memory each one is allowed to use. | Run status follows your own log lines as they are written. | \n| Works at phone width. |  | \n\nLinux, Node 24, Python 3. Everything listens on `127.0.0.1`.\n\n```\n# clone or download this repository, then from its top folder:\n./start.sh\n# open http://127.0.0.1:8080 and paste the token that start.sh prints the path of\n```\n\nThen **Controls**, switch to **LIVE**, pick `slow_count`, **Check it fits**, **Start**, type `START`. Press **Pause everything** half way, then **Resume**: the saved pieces are kept and the job finishes.\n\n| Folder | What it is | \n|---|---|\n| `engine/` | The core, in Python. A durable job queue; an actor that runs one admitted job at a time with a hard deadline per piece; `admit.sh` memory admission control; recipes; host gauges (CPU, memory, and GPU if`nvidia-smi` exists; a reading that cannot be taken shows`unavailable` , never a made-up zero); a small HTTP API. | \n| `panel/` | The control panel (React, TanStack Start): gauges, \"what is it doing\", jobs with saved progress, recipes, controls, run status. | \n| `memory/` | **Somnus.** A control plane for AI-agent memory. It runs a*dream* pass over a memory folder and reports what it proposed, what it applied and what waits for a person. Judgment-class changes wait for a human; you can diff a snapshot against live and roll back. It calls no model provider. | \n| `room/` | **TalkBack.** A team room for people and AI agents: channels, threads, reactions, mentions, a*wire* so an AI agent joins as a desk with its own key, huddles, and an Electron shell that hosts the room on your LAN. | \n\nEach folder is its own project with its own `package.json` or `requirements.txt`.\n\nRack Community ships no model and no keys. It is the place your models run and report.\n\n- **Local:** point a recipe at[Ollama](https://ollama.com) .`engine/samples/ask_model_pieces.py` asks a list of questions, one saved piece per answer, against`http://127.0.0.1:11434/v1` by default.\n- **Hosted:** the same script works with any OpenAI-compatible endpoint. Set`RACK_LLM_URL` ,`RACK_LLM_MODEL` and, if the service needs one,`RACK_LLM_KEY` (sent as a Bearer token and never written to the saved pieces).\n- **In the room:** any AI agent that can make an HTTP call can join TalkBack as a desk with its own key (`room/tools/talkback-wire.mjs` is a small client).\n\nTo use the sample, copy `engine/samples/ask_model.recipe.json` into your Rack folder's `recipes/` and add `ask_model 8` to its `peaks.conf`.\n\n**Admission control.** `admit.sh` admits a job only if `max(live memory in use, declared total) + the job's peak <= LIMIT`. The declared total is a base figure plus the declared peaks of admitted jobs that are still alive, so two jobs that have not yet touched memory cannot both be admitted into the same gap. A refused job exits `75` and says why. Peaks live in `peaks.conf`; `ADMIT_LIMIT` (default 90) and `ADMIT_BASE` (default 10) are in GB.\n\n**Durable pieces.** A job is split into named pieces. Each piece result is written atomically and in order, so a crash, a restart or a pause resumes at the first piece that was not saved. A supervisor outside the worker enforces a wall-clock limit per piece, including a worker stuck in a native call.\n\n**Dry-run first.** The Rack starts in dry-run: every request is validated and recorded and nothing changes. Switching to LIVE is one explicit action. Pause writes a single `HOLD` marker; work queued before the pause waits, new starts are refused while it exists.\n\n**Recipes, not commands.** A start names a recipe from `recipes/*.json`. No endpoint accepts a command line, a path or a shell string.\n\n```\n{\"action\": \"nightly_index\", \"label\": \"Rebuild the search index\", \"script\": \"samples/hello_pieces.py\",\n \"args\": [], \"admission\": \"nightly_index\", \"peak_gb\": 4}\n```\n\nAdd the recipe file, add `nightly_index 4` to `peaks.conf`, and write the script with `from rack_jobs import from_environment`. See `engine/samples/` for complete examples. More detail in [`docs/ARCHITECTURE.md`](https://github.com/ohhbeehave35-commits/rack-community/blob/main/docs/ARCHITECTURE.md).\n\n- The API needs the `X-Rack-Token` header for every write and for the two reads that show your log lines. With no`RACK_TOKEN` set, nothing unlocks.\n- Bind everything to `127.0.0.1` , or put it behind your own access boundary. Do not expose it to the internet as it is.\n- **Somnus and TalkBack have no sign-in.** They run as one local owner. Their server functions refuse requests that a browser reports as started by another site, but they are not a multi-user service.\n- The panel keeps the token in `sessionStorage` for one tab and never puts it in a URL, a body or a log. Workers never receive it.\n- Admission, pause and the recipe list are safety rails, not a sandbox: a recipe script runs as the user who started the actor.\n\nUse a different port from the panel:\n\n```\ncd memory && npm install && npm run dev -- --port 8081   # http://127.0.0.1:8081\ncd room   && npm install && npm run dev -- --port 8082   # http://127.0.0.1:8082\n```\n\nSomnus keeps its state in an embedded database, in memory by default; set `PGLITE_DATA_DIR` to keep it. TalkBack's desktop shell is described in `room/desktop/README-DESKTOP.md`.\n\nRun the narrowest check that covers what you changed.\n\n```\ncd engine && python3 -m pytest -q tests                                       # 38 tests\ncd panel  && npx tsc --noEmit && npm test                                     # 19 tests\ncd memory && npx tsc --noEmit && npm test                                     # 39 tests\ncd room   && npx tsc --noEmit && npm test                                     # 61 tests\n```\n\nThose are unit and small integration tests. There is no browser end-to-end suite in this repository, and the full test suites of the original apps were not carried over (see \"What is not here\").\n\n- No company-specific assistant, recipes, prompts, data or customer material. This is the general-purpose part only.\n- The engine was rewritten from the mechanisms of a private lab (the admission rule, ordered atomic pieces, external deadlines, a pause that holds starts, dry-run first). It is not a cleaned copy of that code.\n- The web apps in `panel/` ,`memory/` and`room/` started from an app template whose licence we could not establish. Its sign-in layer, install-page scripts and the tests that only exercised them were removed before this release, and the apps now run as one local owner. Some template-era source files remain in the apps; see`NOTICE` .\n- Somnus's Backup page and checkpoint tool were removed because they copied files specific to one machine. The TalkBack relay has no authentication of its own (see `room/relay/README.md` ).\n- Version 1.0.0 is a first public release. Expect rough edges.\n\nIssues and pull requests are welcome. Keep changes small, keep the safety rails (admission, dry-run, token-checked writes) intact, and say which tests you ran.\n\nMIT. See `LICENSE` and `NOTICE`. Copyright (c) Rack Community contributors.", "url": "https://wpnews.pro/news/rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box", "canonical_source": "https://github.com/ohhbeehave35-commits/rack-community", "published_at": "2026-11-05 04:06:43+00:00", "updated_at": "2026-11-05 04:20:07.406371+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "ai-infrastructure", "mlops", "developer-tools"], "entities": ["Rack Community", "Ollama", "Somnus", "TalkBack", "Node 24", "Python 3", "React", "TanStack Start"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box", "markdown": "https://wpnews.pro/news/rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box.md", "text": "https://wpnews.pro/news/rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box.txt", "jsonld": "https://wpnews.pro/news/rack-community-a-self-hosted-ai-lab-whose-job-runner-won-t-overload-the-box.jsonld"}}