{"id":51325638,"url":"https://github.com/sybil-solutions/local-studio","last_synced_at":"2026-07-01T18:01:28.818Z","repository":{"id":331455985,"uuid":"1118209602","full_name":"sybil-solutions/local-studio","owner":"sybil-solutions","description":"Control panel for VLLM, Sglang, llama.cpp, exllamav3","archived":false,"fork":false,"pushed_at":"2026-06-26T22:05:26.000Z","size":68116,"stargazers_count":1235,"open_issues_count":43,"forks_count":99,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-06-27T00:28:55.730Z","etag":null,"topics":["ai","exllama","hosting","llamacpp","local","local-ai","self","sglang","vllm"],"latest_commit_sha":null,"homepage":"https://sybilsolutions.ai","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sybil-solutions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-12-17T12:20:31.000Z","updated_at":"2026-06-27T00:19:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sybil-solutions/local-studio","commit_stats":null,"previous_names":["0xsero/vllm-studio","sybil-solutions/vllm-studio","sybil-solutions/local-studio"],"tags_count":168,"template":false,"template_full_name":null,"purl":"pkg:github/sybil-solutions/local-studio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sybil-solutions%2Flocal-studio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sybil-solutions%2Flocal-studio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sybil-solutions%2Flocal-studio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sybil-solutions%2Flocal-studio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sybil-solutions","download_url":"https://codeload.github.com/sybil-solutions/local-studio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sybil-solutions%2Flocal-studio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35017091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","exllama","hosting","llamacpp","local","local-ai","self","sglang","vllm"],"created_at":"2026-07-01T18:01:23.921Z","updated_at":"2026-07-01T18:01:28.725Z","avatar_url":"https://github.com/sybil-solutions.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Local Studio\n\nLocal Studio is a local-first workstation for running, managing, and using\nself-hosted LLM backends. One machine can launch models, watch GPU/runtime\nstate, chat with OpenAI-compatible endpoints, and run agent sessions against\nlocal or remote controllers.\n\nIt is built from three modules that share one controller API:\n\n- [`controller/`](controller/README.md) — Bun/Hono backend. Owns model lifecycle\n  (launch, evict, recipes, downloads, runtime process coordination), an\n  OpenAI-compatible proxy (chat, models, tokenization, audio), system state\n  (GPU metrics, logs, usage, settings, SSE), and controller integrations.\n- [`frontend/`](frontend/README.md) — Next.js 16 + React 19 UI and the macOS\n  Electron desktop shell. Hosts `/agent` (Pi coding agent runtime), settings,\n  usage, recipes, logs, and the browser-facing API routes.\n- [`cli/`](cli/README.md) — Bun CLI for checking and operating a controller from\n  a terminal, with headless commands and an interactive TUI.\n\n## What is a controller?\n\nA controller is the backend process the UI and CLI talk to — the Bun/Hono\nserver in `controller/`. You can run one locally or point the frontend at a\nremote controller on a GPU host. The controller owns model lifecycle, the\nOpenAI-compatible proxy, system state, and SSE event streams.\n\n## Architecture\n\n```mermaid\nflowchart LR\n    User[\"User\"] --\u003e Desktop[\"Electron desktop app\"]\n    User --\u003e Web[\"Next.js web UI\"]\n    User --\u003e CLI[\"Bun CLI\"]\n\n    Desktop --\u003e Frontend[\"Frontend server / API routes\"]\n    Web --\u003e Frontend\n    CLI --\u003e Controller[\"Controller API (Bun + Hono)\"]\n    Frontend --\u003e Controller\n\n    Controller --\u003e Runtime[\"Inference runtime process\"]\n    Runtime --\u003e Backends[\"vLLM / SGLang / llama.cpp / MLX recipes\"]\n    Controller --\u003e Data[\"Local data directory\"]\n    Controller --\u003e Events[\"SSE status and runtime events\"]\n    Frontend --\u003e Agent[\"Pi coding agent runtime\"]\n```\n\n```mermaid\nflowchart TB\n    subgraph Frontend[\"frontend/\"]\n        AgentPage[\"/agent\"]\n        Settings[\"/settings and controller config\"]\n        Usage[\"/usage\"]\n        Recipes[\"/recipes\"]\n        ProxyRoutes[\"/api/* proxy and agent routes\"]\n        DesktopMain[\"desktop/ Electron shell\"]\n    end\n\n    subgraph Controller[\"controller/\"]\n        HttpApp[\"src/http/app.ts\"]\n        Engines[\"src/modules/engines\"]\n        Models[\"src/modules/models\"]\n        Proxy[\"src/modules/proxy\"]\n        Studio[\"src/modules/studio\"]\n        System[\"src/modules/system\"]\n        Audio[\"src/modules/audio\"]\n        Stores[\"src/stores\"]\n    end\n\n    ProxyRoutes --\u003e HttpApp\n    HttpApp --\u003e Engines\n    HttpApp --\u003e Models\n    HttpApp --\u003e Proxy\n    HttpApp --\u003e Studio\n    HttpApp --\u003e System\n    HttpApp --\u003e Audio\n    System --\u003e Stores\n```\n\n## Quick start\n\nPrerequisites: Bun 1.x (controller, CLI), Node.js 20+ and npm (frontend),\nPython 3.10+ on `PATH` (`uv` strongly recommended; engine installs fall back to\npip), Git. vLLM/SGLang serving on Linux needs NVIDIA driver + CUDA; Apple\nSilicon uses the MLX backend.\n\nRun the preflight check first (toolchain, ports, directories, network):\n\n```bash\nnpm run doctor\n```\n\nStart the controller (listens on `127.0.0.1:8080`, data dir + SQLite created\nautomatically, model weights in `LOCAL_STUDIO_MODELS_DIR`, default `/models`):\n\n```bash\ncd controller \u0026\u0026 bun install \u0026\u0026 bun src/main.ts\n```\n\nStart the frontend in a second terminal, then open\n\u003chttp://localhost:3000/setup\u003e:\n\n```bash\ncd frontend \u0026\u0026 npm ci \u0026\u0026 npm run dev\n```\n\n`npm ci` runs a postinstall patch against `@earendil-works/pi-ai`. If that step\nprints a warning, agent streaming may misrender. The setup wizard walks through\nchoosing a models directory, installing an engine, downloading a model,\nlaunching it, and benchmarking. Engine installs (vLLM/SGLang/MLX) land in\n`\u003cdata dir\u003e/runtime/venvs/\u003cbackend\u003e-latest`.\n\nOptional CLI:\n\n```bash\ncd cli \u0026\u0026 bun install \u0026\u0026 bun src/main.ts status\n```\n\n## Agent runtime\n\nThe agent surface lives at `/agent` in the frontend. It uses\n`@earendil-works/pi-coding-agent` through the frontend runtime rather than\nshelling out to a separate agent process for normal turns. Agent skills and\nextensions are loaded by the frontend runtime and surfaced in the session UI.\nAgent file operations are local-only, stored under `data/agentfs`.\n\n## Runtime backends\n\nRecipes launch through the controller runtime layer. Wired backend families:\n\n- `vllm` — vLLM server recipes through configured/discovered/system/Docker/bundled targets.\n- `sglang` — SGLang `launch-server` recipes through configured or discovered Python targets.\n- `llamacpp` — llama.cpp `llama-server` recipes for GGUF models.\n- `mlx` — MLX `mlx_lm.server` recipes for Apple Silicon.\n\nRuntime target discovery is surfaced in Settings; selections persist in the\ncontroller data directory.\n\n## Production\n\nBuild the frontend, then serve it with the standalone server:\n\n```bash\ncd frontend \u0026\u0026 npm run build \u0026\u0026 npm run start\n```\n\n`npm run start` launches the standalone server (`scripts/start-standalone.mjs`).\nNever use plain `next start` — it breaks SSE streaming. The controller runs the\nsame way in production as in development: `bun src/main.ts`.\n\n## Remote / LAN deployment\n\nThe controller binds `127.0.0.1` by default. Binding a non-loopback host (e.g.\n`LOCAL_STUDIO_HOST=0.0.0.0`) requires `LOCAL_STUDIO_API_KEY` — startup throws\nwithout it. On a trusted LAN you may instead set\n`LOCAL_STUDIO_ALLOW_UNAUTHENTICATED=true` to opt out of authentication.\n\nPoint the frontend at a remote controller with `BACKEND_URL` or\n`NEXT_PUBLIC_API_URL` (default `http://localhost:8080`). The CLI uses\n`LOCAL_STUDIO_URL`.\n\nRemote deployment is handled by `scripts/deploy-remote.sh`. Configure\n`.env.local` first (see `.env.example`):\n\n```bash\nREMOTE_HOST=192.168.x.x\nREMOTE_USER=username\nREMOTE_PATH=/home/user/project\nREMOTE_URL=https://your-domain.example\n```\n\n```bash\n./scripts/deploy-remote.sh controller   # sync + build + restart controller\n./scripts/deploy-remote.sh frontend     # sync + build + restart frontend\n./scripts/deploy-remote.sh status       # inspect remote processes\n```\n\nLocal daemon helpers: `./scripts/daemon-start.sh`, `daemon-status.sh`,\n`daemon-stop.sh`.\n\n## Validation\n\n```bash\nnpm run check        # contracts + structure + frontend quality + controller/cli typecheck\nnpm run test:e2e     # controller integration + frontend e2e\n```\n\nThe configured pre-push hook (`.githooks/pre-push`) checks conventional commits\nand runs the frontend quality gate (`npm --prefix frontend run check:quality`)\nbefore pushing.\n\n## Releases\n\nReleases are automated. Pushing conventional commits to `main` triggers the\n`release.yml` workflow, which runs semantic-release (`release.config.cjs`): it\nanalyzes commits since the last tag, cuts the next tag (`feat` → minor, others\n→ patch, breaking → major), and publishes a GitHub Release with generated notes.\nThere is no npm publish (private monorepo, protected `main`). Do not tag by hand.\n\n## Contributing\n\nContributions should be small, focused, and easy to review. Start from the\nlatest `main`, one logical change per branch, no formatting-only rewrites, no\nsecrets or build artifacts. Run `npm run check` (and `npm run test:e2e` for\nbehavior changes) before opening a PR; include a concise summary, the validation\ncommands you ran, and screenshots for UI changes. See AGENTS.md for the full\ncode standards an agent (or contributor) must follow.\n\n## License\n\nSee [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsybil-solutions%2Flocal-studio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsybil-solutions%2Flocal-studio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsybil-solutions%2Flocal-studio/lists"}