No description
  • JavaScript 89.4%
  • CSS 5.5%
  • HTML 4.5%
  • Python 0.4%
  • Shell 0.1%
Find a file
Kees Rodriguez 544f2df1e4 Studio deploys with only docker compose; README with screenshots, banner, licence and changelog
docker-compose.yml works as it is: every setting has a default, the library and finished
files live in named volumes, and LOCAL_USER lets one person use it without a sign-in proxy.
No built-in LAN addresses or domains: ComfyUI defaults to the same PC, music and sound effects
stay off until MUSIC_URL / SFX_URL are set, and the Kompanion links come from KOMPANION_LINK.

The README describes Kreative Studio (the old one described the SD.Next front end), with
screenshots from a demo library (docs/screenshots/shoot.js) and a banner in the style of the
other Kreative apps. The shots test expects the 3D refine action added in 3D-01.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 19:08:00 +02:00
docs Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
lib Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
public Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
test Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
tools STU-PE3: pose check (Check a picture in the Pose tab): DWPose keypoints or OpenPose JSON against the puppet per bone, fit as set_joint ops (Match the picture), repaint mask; part-colour map (Parts view, Parts PNG, parts.png); /api/pose/check and tools/posecheck-cli.js; PE1 PNG downloads fixed; e2e containers end node themselves 2026-10-19 16:32:33 +02:00
.dockerignore Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
.env.example Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
.gitignore Stop tracking runtime data (data/jobs.json) and Python caches; fix .gitignore 2026-10-24 18:26:47 +02:00
CHANGELOG.md Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
docker-compose.yml Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
Dockerfile Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
LICENSE Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
package-lock.json Kreative Studio: ComfyUI back end with OC sheet, VN portrait and VN scene presets, photo likeness, live progress, Keycloak identity, brand theme 2026-10-05 06:36:29 +02:00
package.json Kreative Studio: ComfyUI back end with OC sheet, VN portrait and VN scene presets, photo likeness, live progress, Keycloak identity, brand theme 2026-10-05 06:36:29 +02:00
README.md Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00
server.js Studio deploys with only docker compose; README with screenshots, banner, licence and changelog 2026-10-24 19:08:00 +02:00

Kreative Studio: your ideas, your GPU

Kreative Studio

A self-hosted web studio for anime-style pictures, short videos, music and sound effects. You type what you want (and can add a photo for the face), and your own ComfyUI on your own GPU does the work. Every result lands in one library per person, so you can refine it, animate it or download it later.

Main repository: git.kreative-kompas.com/khyretos/remote-image-generation.

Screenshots

Image tab and library Details
Image tab: pick OC sheet, VN portrait or VN scene, describe it, and the library fills on the right A result up close: prompt, seed, Refine, Animate, Download
Pose editor Refine
Pose tab: a 3D puppet with presets, IK handles and finger controls; OpenPose and depth renders Refine tab: 4K, recolour, repaint with a brush, chibi and parts
Music Light theme
Music and sound effects with a waveform player Light theme
On a phone
On a phone

The pictures in the screenshots are placeholders. docs/screenshots/shoot.js takes the screenshots again from a demo library, with no GPU needed.

Features

  • Three picture types: OC sheet (front, side and back of one character on one page), VN portrait (a visual-novel sprite) and VN scene (a background with people in it).
  • Photo likeness: add a photo and the face follows it (IP-Adapter Plus Face), with face and hand passes that repaint only what needs it.
  • Simple first: one prompt field and a type; size, likeness, rating, "Leave out" (negative prompt) and seed sit under Advanced.
  • Helmet characters: an OC sheet can come as a pair, helmet on and face visible, from one seed; headshot and cowboy shot from a sheet in one click.
  • Refine: upscale to 4K, recolour, repaint an area you brush, make a chibi version, or cut it into parts.
  • Pose editor: a 3D puppet with 21-point hands, IK handles, mirror and look-at; OpenPose, depth and part-colour PNGs for ControlNet; the same edits as JSON ops through /api/pose and tools/pose-cli.js.
  • Animation: key poses on a timeline with eases and loop; export BVH, a skinned .glb, a sprite strip or OpenPose frames.
  • Pose check: compare a picture's pose (DWPose) with the puppet per bone, match it in one click, and get a repaint mask for the parts that are off.
  • Video: Wan 2.2 (5B, Q8 GGUF) turns a prompt or a picture from your library into a short clip.
  • Music and sound effects: songs with lyrics (HeartMuLa) and short effects (MOSS), if you run those services.
  • One GPU, one queue: image, video, music and sound take turns on the card and free each other's memory; the library shows your place in line and the elapsed time, and a failed job tells you why, with Retry.
  • Your own library: per person (by e-mail), searchable (Ctrl+K), filter by kind, select and delete with a 10-second Undo; it survives restarts.
  • Ratings: general and sensitive for everyone; questionable and explicit only for the e-mails you list.
  • Works on any screen: desktop and phone, dark and light, keyboard shortcuts (press ?), WCAG AA contrast.
  • Optional Kreative Kompanion: jobs can go through Kompanion's Studio service, which picks the machine, schedules the GPUs and keeps one shared library.

How it works

The Studio is a small Node.js server and a web page. When you press Generate it builds a ComfyUI workflow for that type (checkpoint, LoRAs, prompt, face detailer, size), queues it on your ComfyUI and follows its progress over ComfyUI's websocket, so you see the progress ring and a live preview. Finished files are read back from ComfyUI (or from a folder you mount at /generated) and stay in your library in /data/jobs.json.

Who you are comes from the X-Forwarded-Email header that a sign-in proxy in front sets. On your own PC without a proxy, LOCAL_USER makes every visitor that one person.

Quick start

  1. Have a ComfyUI running with the models and custom nodes below.

  2. Get the code and start it:

    git clone https://git.kreative-kompas.com/khyretos/remote-image-generation.git kreative-studio
    cd kreative-studio
    docker compose up -d
    
  3. Open http://127.0.0.1:3000.

That is all: docker-compose.yml works as it is. By default it looks for ComfyUI on the same PC at port 8188 and treats you as me@localhost. To change something, edit the value in docker-compose.yml, or put it in a .env file next to it (one VAR=value per line; .env.example lists them all). Then run docker compose up -d again.

services:
  studio:
    build: .
    image: kreative-studio:local
    container_name: kreative-studio
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      - LOCAL_USER=${LOCAL_USER:-me@localhost}
      - COMFY_URL=${COMFY_URL:-http://host.docker.internal:8188}
      # ... every other setting, see the table below
    volumes:
      - studio-data:/data
      - studio-generated:/generated
    mem_limit: 512m

volumes:
  studio-data:
  studio-generated:

Notes:

  • ComfyUI on another machine: set COMFY_URL=http://that-machine:8188 and start ComfyUI with --listen.
  • Open to more people: put the Studio behind a sign-in proxy that sets X-Forwarded-Email (oauth2-proxy, Authelia, Authentik, nginx auth_request), set LOCAL_USER= (empty) and drop 127.0.0.1 from the port, or put it on the proxy's network instead.
  • Your own extras (networks, a host folder for /generated) go in a docker-compose.override.yml; docker compose reads it by itself.

What ComfyUI needs

Kind Files (in ComfyUI's models/ folders)
Checkpoint novaAnimeXL_ilV170.safetensors (Illustrious XL)
LoRAs (OC sheet) character_Sheet_XL.safetensors, ILLUST_STYLE_MarvelRivels_ownwaifu.safetensors
Photo likeness ip-adapter-plus-face_sdxl_vit-h.safetensors (ipadapter), CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors (clip_vision)
Face and hand passes bbox/face_yolov8m.pt, bbox/hand_yolov8s.pt (ultralytics), sam_vit_b_01ec64.pth (sams)
Video Wan2.2-TI2V-5B-Q8_0.gguf (unet), umt5_xxl_fp8_e4m3fn_scaled.safetensors (text_encoders), wan2.2_vae.safetensors (vae)

Custom nodes: ComfyUI-Impact-Pack and ComfyUI-Impact-Subpack (FaceDetailer, UltralyticsDetectorProvider, SAMLoader), ComfyUI_IPAdapter_plus and ComfyUI-GGUF (UnetLoaderGGUF). The rest is built into ComfyUI. A 16 GB card runs everything; the Studio frees ComfyUI's memory when it switches between pictures and video.

Check each model's licence before you use what it makes; with Kompanion connected, the type picker shows its licence warnings.

Settings

Variable Default Description
LOCAL_USER me@localhost Without a sign-in proxy, every request is this e-mail. Empty: only requests with X-Forwarded-Email (or X-Auth-Request-Email) get in.
ADULT_USERS (none) Comma list of e-mails that may pick the questionable and explicit ratings.
STUDIO_ADMINS (none) Comma list of e-mails that may change where the studio runs (with Kompanion).
COMFY_URL http://host.docker.internal:8188 Your ComfyUI.
MUSIC_URL (none) Music service (HeartMuLa) with /music, /files/<name> and /unload. Empty: the Music tab is not set up.
SFX_URL (none) Sound-effect service (MOSS) with /sfx, /files/<name> and /unload. Empty: the Sound tab is not set up.
OLLAMA_URL (none) An Ollama on the same GPU; its models are unloaded before each run so ComfyUI has the memory.
OVMS_URL, OVMS_KEY (none) OpenAI-compatible vision model that describes an uploaded photo into face tags.
POSE_DETECT_URL (none) DWPose service for "Check a picture" in the Pose tab; you can also paste OpenPose JSON instead.
KOMPANION_JOBS off on: jobs go through Kreative Kompanion's Studio service.
KOMPANION_URL http://kreative-kompanion:8080 Kompanion's address from inside the container.
KOMPANION_STUDIO_TOKEN (none) The Studio service token from Kompanion.
KOMPANION_LINK (none) Kompanion's web address for the "Kompanion" links; empty hides them.
MAX_UPLOAD_MB 12 Largest photo you can upload.
TZ Europe/Amsterdam Time zone for the log.
PORT 3000 Port inside the container.

Development

The server is server.js with the workflow builders in lib/; the page is plain HTML, CSS and JavaScript in public/, with no build step.

Run the unit tests (Node 22):

npm ci
node --test --test-force-exit test/*.test.js

The browser tests in test/e2e/ run in the Playwright image; test/e2e/run.sh <name> explains what it mounts. tools/pose-cli.js, tools/anim-cli.js and tools/posecheck-cli.js drive the pose, animation and pose-check APIs from a terminal.

Credits and licences

Inter font (SIL Open Font License, public/fonts/Inter-OFL.txt). The Studio drives ComfyUI and the custom nodes above; models are not included and keep their own licences. Project licence: MIT, see LICENSE.