# d3voz/openjutsu architecture

> Architecture diagram of the GitHub repository d3voz/openjutsu, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/d3voz/openjutsu
- Repository: https://github.com/d3voz/openjutsu

## Overview

Openjutsu is a local-GPU video and image editing app: users select a mode, provide source media and settings, check workflow requirements, submit a ComfyUI job, and follow its progress or retrieve outputs. Its documented modes cover simple and advanced character swaps, reviewed person matching and montage, object edits, picture-led generation and relighting, face repair, and colour finishing. The graph keeps UI, API orchestration, workflow construction, and ComfyUI execution distinct. Some feature paths are documented but their implementation excerpts were not sampled, so those relationships cite the README.

Main entry points: [`lib/comfy.ts`](https://github.com/d3voz/openjutsu/blob/main/lib/comfy.ts) (Workflow submission and jobs), [`app/api/jobs/route.ts`](https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/route.ts) (Job submission), [`lib/setup.ts`](https://github.com/d3voz/openjutsu/blob/main/lib/setup.ts) (Workflow requirement checks), [`lib/simple.ts`](https://github.com/d3voz/openjutsu/blob/main/lib/simple.ts) (Simple swap workflow)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["User interface"]
  node_editor["Editor and mode selection<br/>[openjutsu.tsx]"]
  node_welcome["Model selection<br/>[welcome.tsx]"]
  node_picture_ui["From picture editor<br/>[from-picture.tsx]"]
  node_object_ui["Object placement"]
end

subgraph group_api["API orchestration"]
  node_jobs_api["Job submission<br/>[route.ts]"]
  node_job_api["Job details<br/>[route.ts]"]
  node_events_api["Live job events<br/>[route.ts]"]
  node_outputs_api["Job outputs<br/>[route.ts]"]
  node_models_api["Model listing<br/>[route.ts]"]
  node_presets_api["Edit presets<br/>[route.ts]"]
  node_setup_api["Workflow readiness<br/>[route.ts]"]
  node_picture_api["Picture pipeline API<br/>[route.ts]"]
  node_http["Upload and request handling<br/>[http.ts]"]
end

subgraph group_workflows["Edit workflows"]
  node_setup["Workflow requirement checks<br/>[setup.ts]"]
  node_simple["Simple swap workflow<br/>[simple.ts]"]
  node_advanced["Advanced character workflow<br/>[advanced.ts]"]
  node_montage["People matching and montage<br/>[montage.ts]"]
  node_object["Object edit workflow<br/>[object.ts]"]
  node_picture["Picture and relight workflow<br/>[picture.ts]"]
  node_face["Face repair workflow<br/>[face.ts]"]
  node_color["Colour finishing workflow<br/>[color.ts]"]
  node_model["Model and LoRA settings<br/>[model.ts]"]
end

subgraph group_runtime["ComfyUI runtime"]
  node_comfy["Workflow submission and jobs<br/>[comfy.ts]"]
end

node_user(("Editor user"))
node_comfyui["ComfyUI"]

node_user -->|"selects and submits"| node_editor
node_editor -->|"opens model setup"| node_welcome
node_editor -->|"opens picture mode"| node_picture_ui
node_editor -->|"opens object placement"| node_object_ui
node_editor -->|"submits jobs"| node_jobs_api
node_editor -->|"checks workflow"| node_setup_api
node_welcome -->|"refreshes models"| node_models_api
node_picture_ui -->|"requests picture render"| node_picture_api
node_object_ui -->|"provides edit settings"| node_jobs_api
node_jobs_api -->|"parses uploads"| node_http
node_jobs_api -->|"dispatches selected mode"| node_comfy
node_jobs_api -->|"validates settings"| node_simple
node_jobs_api -->|"validates settings"| node_advanced
node_jobs_api -->|"validates settings"| node_object
node_jobs_api -->|"validates review data"| node_montage
node_jobs_api -->|"validates settings"| node_face
node_jobs_api -->|"validates settings"| node_color
node_setup_api -->|"checks readiness"| node_setup
node_picture_api -->|"applies render settings"| node_picture
node_picture_api -->|"submits picture workflow"| node_comfy
node_models_api -->|"lists models"| node_comfy
node_presets_api -->|"reads presets"| node_comfy
node_job_api -->|"reads job state"| node_comfy
node_events_api -->|"streams job events"| node_comfy
node_outputs_api -->|"retrieves output"| node_comfy
node_setup -->|"checks node registry"| node_comfy
node_comfy -->|"submits workflows"| node_comfyui
node_comfy -->|"builds swap graph"| node_simple
node_comfy -->|"finds workflow nodes"| node_advanced
node_comfy -->|"applies model settings"| node_model
node_comfy -->|"prunes face graph"| node_face
node_comfy -->|"prunes colour graph"| node_color
node_simple -.->|"shares model settings"| node_model
node_advanced -->|"uses graph helpers"| node_simple
node_object -->|"uses graph helpers"| node_simple
node_object -->|"finds workflow nodes"| node_advanced
node_montage -->|"prunes shared graph"| node_advanced
node_picture -->|"uses sizing helpers"| node_simple
node_picture -->|"uses model settings"| node_model
node_setup -->|"prunes selected graph"| node_simple
node_setup -->|"prunes selected graph"| node_object
node_setup -->|"prunes selected graph"| node_advanced
node_setup -->|"prunes selected graph"| node_montage
node_setup -->|"prunes selected graph"| node_face
node_setup -->|"prunes selected graph"| node_color

click node_editor "https://github.com/d3voz/openjutsu/blob/main/components/openjutsu.tsx"
click node_welcome "https://github.com/d3voz/openjutsu/blob/main/components/welcome.tsx"
click node_picture_ui "https://github.com/d3voz/openjutsu/blob/main/components/from-picture.tsx"
click node_object_ui "https://github.com/d3voz/openjutsu/blob/main/components/object-placement.tsx"
click node_jobs_api "https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/route.ts"
click node_job_api "https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/route.ts"
click node_events_api "https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/events/route.ts"
click node_outputs_api "https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/outputs/%5BoutputId%5D/route.ts"
click node_models_api "https://github.com/d3voz/openjutsu/blob/main/app/api/models/route.ts"
click node_presets_api "https://github.com/d3voz/openjutsu/blob/main/app/api/presets/route.ts"
click node_setup_api "https://github.com/d3voz/openjutsu/blob/main/app/api/setup/route.ts"
click node_picture_api "https://github.com/d3voz/openjutsu/blob/main/app/api/picture/route.ts"
click node_http "https://github.com/d3voz/openjutsu/blob/main/lib/http.ts"
click node_setup "https://github.com/d3voz/openjutsu/blob/main/lib/setup.ts"
click node_simple "https://github.com/d3voz/openjutsu/blob/main/lib/simple.ts"
click node_advanced "https://github.com/d3voz/openjutsu/blob/main/lib/advanced.ts"
click node_montage "https://github.com/d3voz/openjutsu/blob/main/lib/montage.ts"
click node_object "https://github.com/d3voz/openjutsu/blob/main/lib/object.ts"
click node_picture "https://github.com/d3voz/openjutsu/blob/main/lib/picture.ts"
click node_face "https://github.com/d3voz/openjutsu/blob/main/lib/face.ts"
click node_color "https://github.com/d3voz/openjutsu/blob/main/lib/color.ts"
click node_model "https://github.com/d3voz/openjutsu/blob/main/lib/model.ts"
click node_comfy "https://github.com/d3voz/openjutsu/blob/main/lib/comfy.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_editor,node_welcome,node_picture_ui,node_object_ui,node_user,node_comfyui toneBlue
class node_jobs_api,node_job_api,node_events_api,node_outputs_api,node_models_api,node_presets_api,node_setup_api,node_picture_api,node_http toneAmber
class node_setup,node_simple,node_advanced,node_montage,node_object,node_picture,node_face,node_color,node_model toneMint
class node_comfy toneRose
```

## Components

### User interface

- [Editor and mode selection](https://github.com/d3voz/openjutsu/blob/main/components/openjutsu.tsx): `components/openjutsu.tsx`
- [Model selection](https://github.com/d3voz/openjutsu/blob/main/components/welcome.tsx): `components/welcome.tsx`
- [From picture editor](https://github.com/d3voz/openjutsu/blob/main/components/from-picture.tsx): `components/from-picture.tsx`
- [Object placement](https://github.com/d3voz/openjutsu/blob/main/components/object-placement.tsx): `components/object-placement.tsx`

### API orchestration

- [Job submission](https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/route.ts): `app/api/jobs/route.ts`
- [Job details](https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/route.ts): `app/api/jobs/[id]/route.ts`
- [Live job events](https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/events/route.ts): `app/api/jobs/[id]/events/route.ts`
- [Job outputs](https://github.com/d3voz/openjutsu/blob/main/app/api/jobs/%5Bid%5D/outputs/%5BoutputId%5D/route.ts): `app/api/jobs/[id]/outputs/[outputId]/route.ts`
- [Model listing](https://github.com/d3voz/openjutsu/blob/main/app/api/models/route.ts): `app/api/models/route.ts`
- [Edit presets](https://github.com/d3voz/openjutsu/blob/main/app/api/presets/route.ts): `app/api/presets/route.ts`
- [Workflow readiness](https://github.com/d3voz/openjutsu/blob/main/app/api/setup/route.ts): `app/api/setup/route.ts`
- [Picture pipeline API](https://github.com/d3voz/openjutsu/blob/main/app/api/picture/route.ts): `app/api/picture/route.ts`
- [Upload and request handling](https://github.com/d3voz/openjutsu/blob/main/lib/http.ts): `lib/http.ts`

### Edit workflows

- [Workflow requirement checks](https://github.com/d3voz/openjutsu/blob/main/lib/setup.ts): `lib/setup.ts`
- [Simple swap workflow](https://github.com/d3voz/openjutsu/blob/main/lib/simple.ts): `lib/simple.ts`
- [Advanced character workflow](https://github.com/d3voz/openjutsu/blob/main/lib/advanced.ts): `lib/advanced.ts`
- [People matching and montage](https://github.com/d3voz/openjutsu/blob/main/lib/montage.ts): `lib/montage.ts`
- [Object edit workflow](https://github.com/d3voz/openjutsu/blob/main/lib/object.ts): `lib/object.ts`
- [Picture and relight workflow](https://github.com/d3voz/openjutsu/blob/main/lib/picture.ts): `lib/picture.ts`
- [Face repair workflow](https://github.com/d3voz/openjutsu/blob/main/lib/face.ts): `lib/face.ts`
- [Colour finishing workflow](https://github.com/d3voz/openjutsu/blob/main/lib/color.ts): `lib/color.ts`
- [Model and LoRA settings](https://github.com/d3voz/openjutsu/blob/main/lib/model.ts): `lib/model.ts`

### ComfyUI runtime

- [Workflow submission and jobs](https://github.com/d3voz/openjutsu/blob/main/lib/comfy.ts): `lib/comfy.ts`

### Other components

- **Editor user**
- **ComfyUI**

## Connections

- Editor user → Editor and mode selection: selects and submits (evidence: `README.md`)
- Editor and mode selection → Model selection: opens model setup (evidence: `components/openjutsu.tsx`)
- Editor and mode selection → From picture editor: opens picture mode (evidence: `components/openjutsu.tsx`)
- Editor and mode selection → Object placement: opens object placement (evidence: `components/openjutsu.tsx`)
- Editor and mode selection → Job submission: submits jobs (evidence: `README.md`)
- Editor and mode selection → Workflow readiness: checks workflow (evidence: `README.md`)
- Model selection → Model listing: refreshes models (evidence: `README.md`)
- From picture editor → Picture pipeline API: requests picture render (evidence: `README.md`)
- Object placement → Job submission: provides edit settings (evidence: `README.md`)
- Job submission → Upload and request handling: parses uploads (evidence: `app/api/jobs/route.ts`)
- Job submission → Workflow submission and jobs: dispatches selected mode (evidence: `app/api/jobs/route.ts`)
- Job submission → Simple swap workflow: validates settings (evidence: `app/api/jobs/route.ts`)
- Job submission → Advanced character workflow: validates settings (evidence: `app/api/jobs/route.ts`)
- Job submission → Object edit workflow: validates settings (evidence: `app/api/jobs/route.ts`)
- Job submission → People matching and montage: validates review data (evidence: `app/api/jobs/route.ts`)
- Job submission → Face repair workflow: validates settings (evidence: `app/api/jobs/route.ts`)
- Job submission → Colour finishing workflow: validates settings (evidence: `app/api/jobs/route.ts`)
- Workflow readiness → Workflow requirement checks: checks readiness (evidence: `app/api/setup/route.ts`)
- Picture pipeline API → Picture and relight workflow: applies render settings (evidence: `app/api/picture/route.ts`)
- Picture pipeline API → Workflow submission and jobs: submits picture workflow (evidence: `app/api/picture/route.ts`)
- Model listing → Workflow submission and jobs: lists models (evidence: `app/api/models/route.ts`)
- Edit presets → Workflow submission and jobs: reads presets (evidence: `app/api/presets/route.ts`)
- Job details → Workflow submission and jobs: reads job state (evidence: `app/api/jobs/[id]/route.ts`)
- Live job events → Workflow submission and jobs: streams job events (evidence: `app/api/jobs/[id]/events/route.ts`)
- Job outputs → Workflow submission and jobs: retrieves output (evidence: `app/api/jobs/[id]/outputs/[outputId]/route.ts`)
- Workflow requirement checks → Workflow submission and jobs: checks node registry (evidence: `lib/setup.ts`)
- Workflow submission and jobs → ComfyUI: submits workflows (evidence: `lib/comfy.ts`)
- Workflow submission and jobs → Simple swap workflow: builds swap graph (evidence: `lib/comfy.ts`)
- Workflow submission and jobs → Advanced character workflow: finds workflow nodes (evidence: `lib/comfy.ts`)
- Workflow submission and jobs → Model and LoRA settings: applies model settings (evidence: `lib/comfy.ts`)
- Workflow submission and jobs → Face repair workflow: prunes face graph (evidence: `lib/comfy.ts`)
- Workflow submission and jobs → Colour finishing workflow: prunes colour graph (evidence: `lib/comfy.ts`)
- Simple swap workflow → Model and LoRA settings: shares model settings (evidence: `lib/model.ts`)
- Advanced character workflow → Simple swap workflow: uses graph helpers (evidence: `lib/advanced.ts`)
- Object edit workflow → Simple swap workflow: uses graph helpers (evidence: `lib/object.ts`)
- Object edit workflow → Advanced character workflow: finds workflow nodes (evidence: `lib/object.ts`)
- People matching and montage → Advanced character workflow: prunes shared graph (evidence: `lib/montage.ts`)
- Picture and relight workflow → Simple swap workflow: uses sizing helpers (evidence: `lib/picture.ts`)
- Picture and relight workflow → Model and LoRA settings: uses model settings (evidence: `lib/picture.ts`)
- Workflow requirement checks → Simple swap workflow: prunes selected graph (evidence: `lib/setup.ts`)
- Workflow requirement checks → Object edit workflow: prunes selected graph (evidence: `lib/setup.ts`)
- Workflow requirement checks → Advanced character workflow: prunes selected graph (evidence: `lib/setup.ts`)
- Workflow requirement checks → People matching and montage: prunes selected graph (evidence: `lib/setup.ts`)
- Workflow requirement checks → Face repair workflow: prunes selected graph (evidence: `lib/setup.ts`)
- Workflow requirement checks → Colour finishing workflow: prunes selected graph (evidence: `lib/setup.ts`)
