- JavaScript 89.4%
- CSS 5.5%
- HTML 4.5%
- Python 0.4%
- Shell 0.1%
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> |
||
|---|---|---|
| docs | ||
| lib | ||
| public | ||
| test | ||
| tools | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| CHANGELOG.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| server.js | ||
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
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/poseandtools/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
-
Have a ComfyUI running with the models and custom nodes below.
-
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 -
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:8188and 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, nginxauth_request), setLOCAL_USER=(empty) and drop127.0.0.1from the port, or put it on the proxy's network instead. - Your own extras (networks, a host folder for
/generated) go in adocker-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.






