# Leumas Studio — @leumas/studio

Leumas Studio — the admin CRM (wp-admin for AI): everything Web has + Imperium config CRUD, marketplace, users/roles, tools. Ships as a desktop EXE / white-label.


**Imperium.** Host and manage websites, run AI, install apps from the store, publish your own.

Ships as a desktop **EXE**, a self-host, or a **white-label**. `LEUMAS_ROLE=appliance` ·
dev port **5000**.
Architecture: [APPLIANCES.md](../../APPLIANCES.md) §4 · [PLATFORM.md](../../PLATFORM.md)

---

## Core functionality

1. **Imperium hosting** — connect a domain, create sites and subdomains across 30 modes, edit pages,
   theme them, publish. **This is the product.**
2. **The app store client** — search, install, and run plugins from the central marketplace; publish
   your own and get paid.
3. **AI** — Leviathan chatbots, the coding agent, skills, MCP servers, consensus/research, LMX.
4. **Accounts** — users, roles, connections, API keys, this instance's licence, storage.
5. **Monetization** — PassNode rules: how *you* price *your* tools for *your* users.
6. **Automation** — the trigger/action/rule spine every plugin hooks into.

## What it must never do

| Never | Because |
|---|---|
| Contain social | it moved to leumas-web + iOS; moderation is control-plane |
| Issue licences | that's Leumas-the-company — control plane only |
| Grow a 34th domain | new capability = a plugin. That is the entire point |
| Depend on a plugin's package | the dep edge **is** the bloat. `studio.plugins.json` per edition |
| Re-implement UI | `@leumas/ui` (the `st-` kit) — `pnpm check:ui-kit` ratchets regrowth |

## Editions

Build-time `studio.plugins.json` drives both the surface glob and a lint check on `package.json`.

| Edition | Contains |
|---|---|
| **Studio Lite** | core only — hosting, marketplace, accounts, monetization, automation, assets |
| **Studio** (default) | core + the AI pack (chatbots · builder · intelligence · lmx) |
| **Studio Everything** | + all 16 first-party plugins |

## Composes

```
@leumas/ui  @leumas/theme            the st- kit + tokens
@leumas/features                     guards · dashboard · nav-views · capability provider
@leumas/config-registry              modes · DynamicPage · nav manifests · the plugin contract
@leumas/hosting                      Imperium
@leumas/entitlements                 the access axis
@leumas/api-client                   every HTTP call
@leumas/leviathan                    the AI widget
@leumas/capability-sdk               CapabilityProvider · TriggerRuntime · command registration
@leumas/plugin-bridge [todo] the plugin host protocol
@leumas/imperium-pages  @leumas/cinematic  @leumas/headlock
```

**Plugin packages (`media`, `music`, `wardrobe`, `grids-ui`, `forge`, `splats`, `sing`,
`text-network`, `circuit-preview`, `detection-client`, `business-finder`, `hud`, `three`,
`@react-three/*`) leave `dependencies` as each domain is cut.** That removal *is* the slimming.

## File tree

```
products/leumas-studio/
├── package.json [partial] 24 deps → ~10. The dep list IS the weight
├── studio.plugins.json [todo] which plugins this edition bundles
├── vite.config.js [done] port 5000
├── scripts/
│ └── copy-circuit-preview.mjs [partial] → ops/infra/scripts/copy-plugin-bundles.mjs
├── public/
│ ├── tscircuit/ [partial] → public/plugins/hardware/
│ └── plugins/<id>/ [todo] every asset-delivery plugin's dist
└── src/
 ├── main.jsx [done] registers modes · TENANT_FALLBACK · FirstRunWizard
 ├── App.jsx [partial] 113 lines — remove socialRoutes()
 ├── setup/FirstRunWizard.jsx [partial] licence → domain → first site (see S1)
 ├── pages/StudioLanding.jsx [done]
    └── admin/
 ├── nav.manifest.js [partial] 455 → ~120 lines (core only; domains contribute their own)
 ├── AdminRoutes.jsx [partial] 488 → ~200 lines (glob registry + a plugin branch)
 ├── AdminHome.jsx [done] Command Deck / solar navigator
 ├── DomainHub.jsx [done]
 ├── hosting/ [done] CORE — 16 surfaces, the product
 ├── Marketplace.jsx [partial] 40 lines, Install has NO onClick. Rewrite
 ├── _shared/model/plugins/ [done] the plugin host (the `_shared/plugins/` clone is deleted)
 ├── accounts surfaces [done] CORE (+ absorbs Storage from datacenter)
 ├── PassNodeRulesManager [done] CORE
 ├── Triggers · Actions [done] CORE
 ├── builder/ intelligence/ lmx/ [partial] AI PACK — become bundled plugins
 ├── social/ [todo] DELETE → leumas-web + iOS + control plane
 ├── knowledge/ [todo] MOVE → leumas-docs
 ├── dev surfaces [todo] DELETE → @leumas/os (already exists there)
 └── 19 other domains [todo] → products/standalone/leumas-<x>/ as plugins
```

**206 `.jsx` in `src/admin/` today. Target: ~60.**

## Roadmap

Mirrors [Stage B](../../ops/todos/leumas-consolidation-roadmap.md).

### [todo] S1 · Hosting UX to the bar (Platform P1)

- Status: todo — **Connect-a-domain wizard**: enter domain → exact DNS records with per-row Copy → Verify → TLS
- Status: todo — Detect the environment (public IP? `cloudflared`?) and show only the relevant path
- Status: todo — **Cloudflare Tunnel** path for a machine with no static IP or port forwarding
- Status: todo — First-run wizard: licence → domain → **first site published**, no terminal
- Status: todo — Failure states that name the fix, not just the error

**Done when:** a non-technical operator goes from a fresh EXE to a live site in under 10 minutes.

### [todo] S2 · Declare, don't move (roadmap B2)

- Status: todo — Each domain's nav subtree → `src/admin/<domain>/manifest.js`
- Status: todo — `STUDIO_NAV = mergeNavManifests(CORE_NAV, ...domains)` — `mergeNavManifests` already exists
- Status: todo — `SURFACES` literal → an `import.meta.glob` registry
- Status: todo — `pnpm check:nav` green throughout; all 183 `/admin/*` paths still resolve

**Done when:** `nav.manifest.js` ~120 lines, `AdminRoutes.jsx` ~200. Bundle unchanged — expected.

### [todo] S3 · Social exits (roadmap B4)

- Status: todo — Remove `socialRoutes()` from `App.jsx` and the `social` domain from the manifest
- Status: todo — Moderation / Analytics / Config → control plane
- Status: todo — **Social Links → hosting** (it's a site setting, not a social feature)

### [todo] S4 · Plugin host (roadmap B3, C2)

- Status: todo — `<PluginFrame>` from `@leumas/ui`; delete `ThemedFrame` and the legacy `PluginHost.jsx`
- Status: todo — Marketplace rewrite: browse · install · consent screen · uninstall · my listings
- Status: todo — `AdminRoutes.jsx` branch: `subItem.plugin` → `<PluginFrame>` instead of `SURFACES[surface]`
- Status: todo — [warning] **Plugin nav must fail CLOSED.** `visibleNav` only blocks on an explicit `false` — for plugin
      nodes, absent must mean denied, or a paid plugin leaks

### [todo] S5 · Cut the edges (roadmap B5–B7)

- Status: todo — `copy-plugin-bundles.mjs` — generalize the circuit-preview copier, **preserving turbo discipline**
      (each plugin builds to its own `dist/`; Studio's prebuild copies)
- Status: todo — hardware first (pilot, already isolated) → then media, music+sing, wardrobe → then the rest
- Status: todo — Every PR carries **before/after `dist/` sizes**
- Status: todo — Exits: dev → os · knowledge → docs · datacenter → accounts
- Status: todo — `studio.plugins.json` + the editions lint check
- Status: todo — Claim the `three` win last; verify with `pnpm why three`

### [todo] S6 · Publish + earn (roadmap C3, C4)

- Status: todo — "My listings" surface — submit a plugin, track review
- Status: todo — Earnings surface reading the publisher credit rows

### [todo] S7 · Studio revamp absorbed

- Status: todo — `ops/todos/studio-revamp-roadmap.md` Phase 1 (R1–R11) is answered by [APPLIANCES.md](../../APPLIANCES.md) §4.3 — replace it
- Status: todo — Phases 2–5 survive; 6–24 amended (those surfaces are leaving)
- Status: todo — `ops/reference/LEUMAS-INDEX.md` gains a Tier / Destination column
- Status: todo — The 8 checks now apply to 6 core domains + one plugin-conformance bar

## Run

```bash
pnpm --filter @leumas/studio dev
```

Build the EXE:

```bash
pnpm build:exe
```

The installed EXE **opens itself when you sign in to Windows** — a per-user login item registered on
first run, so a rebooted machine comes back with Studio and its appliance API up. The switch is
Settings -> "Start when I sign in"; the mechanism is `ops/tools/exe-builder/electron/autostart.js` and
`pnpm check:desktop-autostart` pins it.

Leave `VITE_API_BASE` unset in dev — the Vite proxy makes the httpOnly cookie work with no CORS.


---
Source: products/leumas-studio/README.md
Canonical: https://docs.leumas.tech/p/products/studio
