@ucin-studio/desktop
v0.1.0
Published
UCIN Creator Studio — the local desktop agent bridging creative professionals to the UCIN V5 Control Plane.
Readme
UCIN Creator Studio
The local desktop agent that bridges creative professionals to the UCIN V5 Control Plane. It watches local catalogs, extracts tiny proxies, encrypts them on-device (Zero-Trust), uploads ciphertext, deploys jobs to the dual-tier routing engine, and syncs results back into the user's workflow — making a decentralized GPU network feel like a local supercomputer.
Install (studio clients)
No installer to download, no security warnings, no certificate required — because npm places the files (a browser never "downloads" them), Windows SmartScreen and macOS Gatekeeper never fire.
One-time: install Node.js (LTS) from https://nodejs.org — a normal signed installer.
Then, launch any time:
npx @ucin-studio/desktop@latestThat single command fetches the app and opens the window. (Optional: npm install -g
@ucin-studio/desktop once, then just run ucin-studio.) The first run downloads the runtime,
so give it a minute on a good connection. Sign in with your UCIN account when the window opens.
Publishing (maintainers)
The package ships the prebuilt out/ bundle + the bin/ launcher only (see files). prepack
rebuilds before packing, so a publish always contains a fresh build.
# 1. Create the npm org/scope "ucin-studio" once at npmjs.com (Settings → Organizations),
# then: npm login
# 2. Bake the PRODUCTION Control Plane URL into the build (NOT localhost):
CONTROL_PLANE_URL=https://api.ucin.network npm publish # prepack builds, then publishes publicpublishConfig.access is public, so the scoped package publishes publicly without extra flags.
Bump version per release; clients on @latest pick it up on next launch.
Stack
Electron · Vite · React 19 · TypeScript · TailwindCSS, built with electron-vite.
Architecture
Three trust zones, one shared type contract:
| Zone | Path | Responsibility |
|------|------|----------------|
| Main (Node, full OS) | src/main | All I/O, crypto, file-watching, worker threads, Control-Plane HTTP. The entire agent backend. |
| Preload (bridge) | src/preload | The only crossing. Exposes window.ucin under contextIsolation. |
| Renderer (sandboxed UI) | src/renderer | React presentation. No Node, no network, no keys. |
| Shared | src/shared | Types imported by every zone — the IPC contract + API mirror. |
The Zero-Trust pipeline (PipelineService)
detect → preprocess (proxies) → encrypt (AES-256-GCM) → upload (ciphertext)
→ estimate → scan → audit → deploy → watch telemetry → sync results- Keys never leave Main.
KeyVaultServicemints AES-256 keys, stores them wrapped by the OS keychain (safeStorage), and hands the Renderer only opaquekeyRefhandles. - Plaintext never persists in the cloud.
CryptoServicestreams proxies through GCM in a worker thread; only ciphertext is uploaded. Data keys are RSA-OAEP wrapped for the GPU enclave at dispatch time and scrubbed afterward. - Non-blocking. Proxy extraction (
proxy-extractor.worker), encryption (encrypt.worker), and LoRA zipping (zip-assets.worker) all run off the Main event loop.
The UI is a truth-teller
Every wait-time, SCU, and price comes from backend telemetry: JobPoller forwards
JobStatusResponse on the configured cadence, and ProgressMeter renders real byte fractions.
There are no synthetic loading bars.
Type sync
Frontend types are generated from the live FastAPI OpenAPI schema:
CONTROL_PLANE_URL=http://localhost:8000 npm run gen:apisrc/shared/types/api.ts re-exports the generated schemas and intersects the hand-authored
narrow unions from domain.ts (the backend widens Literal/pattern fields to string).
Until the first codegen pass, api.ts carries faithful hand-written mirrors so the project
builds offline.
Prerequisites
- Node 20+
- ffmpeg on PATH — used by the pre-processor for proxy/Smart-Preview extraction.
- The V5 Control Plane running (default
http://localhost:8000).
Scripts
npm install
npm run dev # electron-vite dev (HMR renderer + main/preload watch)
npm run typecheck # tsc over node + web project references
npm run build # typecheck + bundle
npm run build:win # package a Windows installer (needs resources/icon.ico)
npm run gen:api # regenerate types from the Control Plane OpenAPI schemaPackaging targets expect icons under
resources/(icon.ico/icon.icns/icon.png) and a mac entitlements plist. They are not needed fordev,typecheck, orbuild.
