pasquelin/AIDesktopStudio

Agent-drivable generative creation studio on the desktop: 310 MCP actions across 26 families cover everything the interface can do. Local models on the machine — GGUF LLMs, offline dictation — and cloud generation of images, video and 3D, with API keys encrypted in the main process, never exposed to the renderer.

0

stars

5,595

commits

TypeScript

primary language

Sep 10, 2026

updated

www.aidesktopstudio.com
3d-editor
ai-agent
audio-editor
desktop-app
electron
generative-ai
image-editor
llama-cpp
local-llm
mcp
mcp-server
model-context-protocol
pixijs
react
text-to-3d
text-to-image
text-to-video
threejs
typescript
video-editor

README

AI Desktop Studio

A desktop creation studio for generative models. Generate and edit images, videos, 3D models, audio, textures and skyboxes — in one place, on your machine.

Electron React TypeScript three.js PixiJS Vite Tests License

→ Presentation site

AI Desktop Studio in the Modelling workspace: the asset library and the project explorer on the left, a rigged robot character standing in the model workshop in the centre with its skeleton drawn over it, and the inspector on the right showing its mesh counts, its skeleton and its attachment points
The same studio with a third-person level open: blocked-out platforms in the viewport, the character selected and drawn in wireframe, and the scene environment, background and post-processing stack in the inspector

Documentation

EnglishFrançais
User guide — how to use the studiodocs/en/user-guide.mddocs/fr/guide-utilisateur.md
Architecture — how it is builtdocs/en/architecture.mddocs/fr/architecture.md

The application itself ships in French and English; the language follows your settings.


What it is

Not a web client wrapped in a window. A studio: you generate assets, then edit them, combine them, and assemble them into 3D scenes or video sequences — without leaving the application and without your API credentials ever reaching the browser context.

The unit of work is a project: a folder on your disk. The unit of display is a workspace: seven of them — Image, Video, 3D, Audio, Textures, Skyboxes and Graph — each rearranging the panels around what that kind of work needs. The Graph is the newest: it holds nodes, wires them, saves them and runs them, reusing whatever has not changed — its logic and loop nodes are still to come.

Seven workspacesImage, Video, 3D, Audio, Textures, Skyboxes and Graph, each with its own toolbar and its own panels
Real editors, not previewsa Pixi-backed image canvas, a three.js 3D viewport, a video timeline that decodes for real, and a sound editor working on samples
No hand-written generation formsevery model's inputs are discovered from the API and rendered from its schema
Your keys stay in the main processencrypted by the OS keychain, never handed to the renderer
Bounded concurrencyone queue polls the API, with exponential backoff on 429 and 5xx
Local catalogueassets indexed in SQLite, searched off the UI thread

The workspaces

Above: the model workshop, and a scene built from the third-person starter. The rest, one panel arrangement per kind of work.

Home
The project shelf, the tools, and what your models already cover.

The Home surface: the project shelf on the left, the tool cards in the centre, and panels reporting installed models, connected services and per-workspace coverage
Image
A layered canvas, with document, layer and transform in the inspector.

The Image workspace: a render of the robot open on a layered canvas over a transparency checkerboard, the tool column on the left, document and layer properties on the right
Video
Source and programme viewers, over a timeline that decodes for real.

The Video workspace: source and programme viewers above a video and audio timeline, with a text-to-video generation form on the left
Code
Behaviour written script by script, and rewritten in place by a model.

The Code workspace: a TypeScript player script open in the editor, and a code-rewrite generation panel on the left targeting that same file
Audio
A spectrum, a clip editor and a multitrack montage, working on samples.

The Audio workspace: a frequency spectrum above a clip editor, and three audio tracks on the timeline below
Skyboxes
A panorama, the sun that goes with it, and test objects lit on the spot.

The Skyboxes workspace: a mountain panorama projected around two test spheres, one matte and one mirrored, with sun, adjustment and environment controls in the inspector

Getting started

Requirements — Node 24 (the version in .nvmrc, which is also what CI runs), pnpm 12.3.4 installed with its standalone installer (Corepack does not yet run pnpm 12), macOS / Windows / Linux, and a API key and secret from your generation provider.

pnpm install
pnpm rebuild:native   # better-sqlite3 against this Electron build
pnpm start

Then open Settings (⌘, / Ctrl+,) and enter your API key and secret. They are encrypted with the OS keychain and never leave the main process.

Full walkthrough: user guide · every setting explained: Settings · how configuration is layered: Architecture.


Commands

CommandWhat it does
pnpm startelectron-vite in watch mode, hot reload on main, preload and renderer
pnpm start:debugsame, with the remote debugging port on 9222 — what drives the app from outside
pnpm world:validatewith pnpm start:debug already running, compares real WebGL frames and runtime observations for benchmark scenes S1–S5; this is separate from pnpm validate
pnpm buildtypecheck, then build the three targets
pnpm distbuild, then package and sign with electron-builder
pnpm typechecktsc --noEmit across the three targets
pnpm test · pnpm test:watchvitest, single run or watching
pnpm lint · pnpm lint:fixoxlint over src, scripts and config, warnings included
pnpm format · pnpm format:checkprettier, write or check
pnpm validatethe gate: every check a commit must pass, chained. package.json names its links, and the CI job runs this very command rather than a copy of it
pnpm unused:mainknip — exports, files and dependencies nothing reaches. src/main only: the same unreachable export is reported there and ignored under renderer and shared, and no configuration found so far widens it
pnpm duplicationjscpd — blocks written twice, from sixty tokens up, over the whole of src
pnpm drydry-ts — same-shape functions, names forgotten, tests excluded
pnpm duplication:reportclassified jscpd + dry-ts report (production vs tests, same-name first)
pnpm rebuild:nativeelectron-rebuild — required after touching better-sqlite3

Repository layout

src/
├── main/          Electron main process — the only side that holds secrets
│   ├── provider/    API client, model registry, job manager, credentials
│   ├── project/     project folders, manifest, SQLite catalogue
│   ├── settings/    encrypted store and its handlers
│   ├── assets/      asset ingestion and the ai-desktop-studio:// protocol
│   ├── media/       ffmpeg-backed media work
│   ├── menu/        native menu, built from the shared registries
│   └── window/      window lifecycle, navigation lockdown
├── preload/       the typed bridge, and nothing else
├── renderer/src/
│   ├── app/         the shell: rails, zones, tool windows, document area
│   ├── design/      the in-house design system — every docked component
│   ├── engines/     one engine per kind of surface. No React in here
│   ├── spaces/      one document editor per kind
│   ├── panels/      the dockable tools
│   ├── stores/      zustand stores
│   ├── hooks/       shared hooks
│   └── helpers/     pure functions
└── shared/        types and constants only — no runtime dependency
    ├── domain/      the vocabulary both processes speak
    └── i18n/        one directory of sections per language, read by the menu and the UI

A selection, not an inventory — enough to find your way, and no more. Architecture goes through each side in turn.


Quality bar

pnpm validate must be green before any commit. It chains every check this repository enforces — package.json is where they are listed, so that no second list can drift from it — and the suite it runs is north of 9,000 tests (9,315 across 686 files on 2026-08-17). Unit tests are colocated with the code they cover and written in the same movement, never after.

pnpm sizes:check enforces strict physical-line limits on every tracked maintained source, including tests: files < 500, classes < 300, ordinary functions < 50, React components < 250, and hooks named use… < 150. A function with cyclomatic complexity 10 or more is instead limited to < 30 lines. Complexity starts at 1 and adds a path for each conditional, loop, catch, non-empty switch/match arm, and short-circuit boolean operator. Nested functions are measured separately. Vendored code, copied three.js decoders, and generated outputs are excluded. The same guard runs in both pnpm check and pnpm validate; there is no debt baseline.

Every change also goes through a reuse-and-simplification pass and an automated review before it is called done.


Releasing

A git tag vX.Y.Z builds and packages the three platforms, and opens a draft GitHub Release.

docs/ci/RELEASE.mdThe checklist to publish a version, and how to roll one back
docs/ci/SECRETS.mdCode-signing secrets: what each one is, how to obtain it, when it expires
docs/ci/TROUBLESHOOTING.mdSymptom, cause, fix — for when the pipeline breaks

The decisions behind the pipeline are recorded in docs/ci/adr/. Builds are currently unsigned: macOS and Windows both warn on first launch until the certificates of SECRETS.md are provisioned.


License

Three texts, three scopes:

  • The source code in this repository is available under the PolyForm Noncommercial License 1.0.0. Read it, build it, study it, use it for any noncommercial purpose. Commercial use is reserved.
  • The application distributed on the releases page has its own terms of use.
  • The third-party components both of them carry keep their own licences — 36 of them, in THIRD-PARTY-NOTICES.md and shown in the app under Help ▸ Licences.

FFmpeg is shipped beside the application as a separate program, under GPL-3.0 on macOS and LGPL-2.1 elsewhere. Its corresponding sources are attached to every release. The reasoning is in ADR-16.


Independence

This is an independent project, developed personally by Alban Pasquelin. Its name, its icon and its interface are its own, and it reproduces no third party's brand.

The application provides no generation service and resells none. It connects to a generation API using the key you supply, under your own account: your use of that service is governed by its own provider's terms, which you accept directly with them, and the cost is yours.

© 2026 Alban Pasquelin.

Contributors

pasquelin

5,595 commits

pasquelin/AIDesktopStudio

Agent-drivable generative creation studio on the desktop: 310 MCP actions across 26 families cover everything the interface can do. Local models on the machine — GGUF LLMs, offline dictation — and cloud generation of images, video and 3D, with API keys encrypted in the main process, never exposed to the renderer.

0

stars

5,595

commits

TypeScript

primary language

Sep 10, 2026

updated

www.aidesktopstudio.com
3d-editor
ai-agent
audio-editor
desktop-app
electron
generative-ai
image-editor
llama-cpp
local-llm
mcp
mcp-server
model-context-protocol
pixijs
react
text-to-3d
text-to-image
text-to-video
threejs
typescript
video-editor

README

AI Desktop Studio

A desktop creation studio for generative models. Generate and edit images, videos, 3D models, audio, textures and skyboxes — in one place, on your machine.

Electron React TypeScript three.js PixiJS Vite Tests License

→ Presentation site

AI Desktop Studio in the Modelling workspace: the asset library and the project explorer on the left, a rigged robot character standing in the model workshop in the centre with its skeleton drawn over it, and the inspector on the right showing its mesh counts, its skeleton and its attachment points
The same studio with a third-person level open: blocked-out platforms in the viewport, the character selected and drawn in wireframe, and the scene environment, background and post-processing stack in the inspector

Documentation

EnglishFrançais
User guide — how to use the studiodocs/en/user-guide.mddocs/fr/guide-utilisateur.md
Architecture — how it is builtdocs/en/architecture.mddocs/fr/architecture.md

The application itself ships in French and English; the language follows your settings.


What it is

Not a web client wrapped in a window. A studio: you generate assets, then edit them, combine them, and assemble them into 3D scenes or video sequences — without leaving the application and without your API credentials ever reaching the browser context.

The unit of work is a project: a folder on your disk. The unit of display is a workspace: seven of them — Image, Video, 3D, Audio, Textures, Skyboxes and Graph — each rearranging the panels around what that kind of work needs. The Graph is the newest: it holds nodes, wires them, saves them and runs them, reusing whatever has not changed — its logic and loop nodes are still to come.

Seven workspacesImage, Video, 3D, Audio, Textures, Skyboxes and Graph, each with its own toolbar and its own panels
Real editors, not previewsa Pixi-backed image canvas, a three.js 3D viewport, a video timeline that decodes for real, and a sound editor working on samples
No hand-written generation formsevery model's inputs are discovered from the API and rendered from its schema
Your keys stay in the main processencrypted by the OS keychain, never handed to the renderer
Bounded concurrencyone queue polls the API, with exponential backoff on 429 and 5xx
Local catalogueassets indexed in SQLite, searched off the UI thread

The workspaces

Above: the model workshop, and a scene built from the third-person starter. The rest, one panel arrangement per kind of work.

Home
The project shelf, the tools, and what your models already cover.

The Home surface: the project shelf on the left, the tool cards in the centre, and panels reporting installed models, connected services and per-workspace coverage
Image
A layered canvas, with document, layer and transform in the inspector.

The Image workspace: a render of the robot open on a layered canvas over a transparency checkerboard, the tool column on the left, document and layer properties on the right
Video
Source and programme viewers, over a timeline that decodes for real.

The Video workspace: source and programme viewers above a video and audio timeline, with a text-to-video generation form on the left
Code
Behaviour written script by script, and rewritten in place by a model.

The Code workspace: a TypeScript player script open in the editor, and a code-rewrite generation panel on the left targeting that same file
Audio
A spectrum, a clip editor and a multitrack montage, working on samples.

The Audio workspace: a frequency spectrum above a clip editor, and three audio tracks on the timeline below
Skyboxes
A panorama, the sun that goes with it, and test objects lit on the spot.

The Skyboxes workspace: a mountain panorama projected around two test spheres, one matte and one mirrored, with sun, adjustment and environment controls in the inspector

Getting started

Requirements — Node 24 (the version in .nvmrc, which is also what CI runs), pnpm 12.3.4 installed with its standalone installer (Corepack does not yet run pnpm 12), macOS / Windows / Linux, and a API key and secret from your generation provider.

pnpm install
pnpm rebuild:native   # better-sqlite3 against this Electron build
pnpm start

Then open Settings (⌘, / Ctrl+,) and enter your API key and secret. They are encrypted with the OS keychain and never leave the main process.

Full walkthrough: user guide · every setting explained: Settings · how configuration is layered: Architecture.


Commands

CommandWhat it does
pnpm startelectron-vite in watch mode, hot reload on main, preload and renderer
pnpm start:debugsame, with the remote debugging port on 9222 — what drives the app from outside
pnpm world:validatewith pnpm start:debug already running, compares real WebGL frames and runtime observations for benchmark scenes S1–S5; this is separate from pnpm validate
pnpm buildtypecheck, then build the three targets
pnpm distbuild, then package and sign with electron-builder
pnpm typechecktsc --noEmit across the three targets
pnpm test · pnpm test:watchvitest, single run or watching
pnpm lint · pnpm lint:fixoxlint over src, scripts and config, warnings included
pnpm format · pnpm format:checkprettier, write or check
pnpm validatethe gate: every check a commit must pass, chained. package.json names its links, and the CI job runs this very command rather than a copy of it
pnpm unused:mainknip — exports, files and dependencies nothing reaches. src/main only: the same unreachable export is reported there and ignored under renderer and shared, and no configuration found so far widens it
pnpm duplicationjscpd — blocks written twice, from sixty tokens up, over the whole of src
pnpm drydry-ts — same-shape functions, names forgotten, tests excluded
pnpm duplication:reportclassified jscpd + dry-ts report (production vs tests, same-name first)
pnpm rebuild:nativeelectron-rebuild — required after touching better-sqlite3

Repository layout

src/
├── main/          Electron main process — the only side that holds secrets
│   ├── provider/    API client, model registry, job manager, credentials
│   ├── project/     project folders, manifest, SQLite catalogue
│   ├── settings/    encrypted store and its handlers
│   ├── assets/      asset ingestion and the ai-desktop-studio:// protocol
│   ├── media/       ffmpeg-backed media work
│   ├── menu/        native menu, built from the shared registries
│   └── window/      window lifecycle, navigation lockdown
├── preload/       the typed bridge, and nothing else
├── renderer/src/
│   ├── app/         the shell: rails, zones, tool windows, document area
│   ├── design/      the in-house design system — every docked component
│   ├── engines/     one engine per kind of surface. No React in here
│   ├── spaces/      one document editor per kind
│   ├── panels/      the dockable tools
│   ├── stores/      zustand stores
│   ├── hooks/       shared hooks
│   └── helpers/     pure functions
└── shared/        types and constants only — no runtime dependency
    ├── domain/      the vocabulary both processes speak
    └── i18n/        one directory of sections per language, read by the menu and the UI

A selection, not an inventory — enough to find your way, and no more. Architecture goes through each side in turn.


Quality bar

pnpm validate must be green before any commit. It chains every check this repository enforces — package.json is where they are listed, so that no second list can drift from it — and the suite it runs is north of 9,000 tests (9,315 across 686 files on 2026-08-17). Unit tests are colocated with the code they cover and written in the same movement, never after.

pnpm sizes:check enforces strict physical-line limits on every tracked maintained source, including tests: files < 500, classes < 300, ordinary functions < 50, React components < 250, and hooks named use… < 150. A function with cyclomatic complexity 10 or more is instead limited to < 30 lines. Complexity starts at 1 and adds a path for each conditional, loop, catch, non-empty switch/match arm, and short-circuit boolean operator. Nested functions are measured separately. Vendored code, copied three.js decoders, and generated outputs are excluded. The same guard runs in both pnpm check and pnpm validate; there is no debt baseline.

Every change also goes through a reuse-and-simplification pass and an automated review before it is called done.


Releasing

A git tag vX.Y.Z builds and packages the three platforms, and opens a draft GitHub Release.

docs/ci/RELEASE.mdThe checklist to publish a version, and how to roll one back
docs/ci/SECRETS.mdCode-signing secrets: what each one is, how to obtain it, when it expires
docs/ci/TROUBLESHOOTING.mdSymptom, cause, fix — for when the pipeline breaks

The decisions behind the pipeline are recorded in docs/ci/adr/. Builds are currently unsigned: macOS and Windows both warn on first launch until the certificates of SECRETS.md are provisioned.


License

Three texts, three scopes:

  • The source code in this repository is available under the PolyForm Noncommercial License 1.0.0. Read it, build it, study it, use it for any noncommercial purpose. Commercial use is reserved.
  • The application distributed on the releases page has its own terms of use.
  • The third-party components both of them carry keep their own licences — 36 of them, in THIRD-PARTY-NOTICES.md and shown in the app under Help ▸ Licences.

FFmpeg is shipped beside the application as a separate program, under GPL-3.0 on macOS and LGPL-2.1 elsewhere. Its corresponding sources are attached to every release. The reasoning is in ADR-16.


Independence

This is an independent project, developed personally by Alban Pasquelin. Its name, its icon and its interface are its own, and it reproduces no third party's brand.

The application provides no generation service and resells none. It connects to a generation API using the key you supply, under your own account: your use of that service is governed by its own provider's terms, which you accept directly with them, and the cost is yours.

© 2026 Alban Pasquelin.

Contributors

pasquelin

5,595 commits

Languages

TypeScript

96.9%

JavaScript

1.2%

Python

1.2%