# brijeshsrivdev/storysprout architecture

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

- Interactive diagram: https://gitdiagram.com/brijeshsrivdev/storysprout
- Repository: https://github.com/brijeshsrivdev/storysprout

## Overview

StorySprout is a browser-based kids video creation studio backed by a Spring API and renderer service. Its supported workflow runs from creating a project and story through outline, character and scene setup, then composition editing and render-job handling. The README calls composition JSON the source of truth. Source excerpts substantiate several API service handoffs; the web page and renderer are only sampled narrowly, so web-to-API routing and renderer-job execution are not asserted as verified calls.

Main entry points: [`apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/editor/EditorService.java) (Editor Service), [`apps/api/src/main/java/com/storysprout/api/story/StoryRepository.java`](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/story/StoryRepository.java) (Story Store), [`apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java) (Story Outline), [`apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java) (Scene Setup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web Studio"]
  node_studio["Web Studio<br/>[page.tsx]"]
  node_api_client["API Client<br/>[api.ts]"]
end

subgraph group_content["Story Content API"]
  node_project_story["Projects &amp; Stories<br/>[StoryService.java]"]
  node_story_store[("Story Store")]
  node_characters["Characters"]
  node_character_store[("Character Store")]
  node_outline["Story Outline"]
  node_outline_store[("Outline Store")]
  node_scene_setup["Scene Setup"]
  node_setup_store[("Setup Store")]
  node_ai["AI Generators"]
end

subgraph group_editor["Composition Editor"]
  node_editor_service["Editor Service<br/>[EditorService.java]"]
  node_composition_store[("Composition Store")]
  node_editor_model["Editor Model<br/>[index.ts]"]
  node_preview["Composition Preview<br/>[preview.ts]"]
end

subgraph group_render["Rendering"]
  node_render_jobs["Render Jobs"]
  node_render_store[("Render Job Store")]
  node_renderer_client["Renderer Client"]
  node_renderer["Renderer Service<br/>[server.ts]"]
  node_render_engine["Render Engine<br/>[render.ts]"]
  node_object_storage[("Artifact Storage")]
end

node_creator(("Studio User"))
node_minio[("MinIO")]

node_creator -->|"creates stories"| node_studio
node_studio -->|"requests data"| node_api_client
node_project_story -->|"reads and writes"| node_story_store
node_project_story -->|"generates drafts"| node_ai
node_outline -->|"loads stories"| node_story_store
node_outline -->|"manages scenes"| node_outline_store
node_outline -->|"deletes setups"| node_setup_store
node_outline -->|"generates outlines"| node_ai
node_characters -->|"loads stories"| node_story_store
node_characters -->|"manages characters"| node_character_store
node_characters -.->|"suggests characters"| node_ai
node_scene_setup -->|"loads stories"| node_story_store
node_scene_setup -->|"loads scenes"| node_outline_store
node_scene_setup -->|"checks membership"| node_character_store
node_scene_setup -->|"saves setup"| node_setup_store
node_editor_service -->|"loads story"| node_story_store
node_editor_service -->|"loads outline"| node_outline_store
node_editor_service -->|"loads setup"| node_setup_store
node_editor_service -->|"loads characters"| node_character_store
node_editor_service -->|"opens composition"| node_composition_store
node_preview -->|"uses model"| node_editor_model
node_render_jobs -->|"loads composition"| node_editor_service
node_render_jobs -->|"queues and tracks"| node_render_store
node_render_jobs -->|"dispatches job"| node_renderer_client
node_render_jobs -->|"stores artifact"| node_object_storage
node_object_storage -.->|"stores objects"| node_minio
node_renderer -->|"renders request"| node_render_engine
node_renderer_client -.->|"calls service"| node_renderer

click node_studio "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/app/page.tsx"
click node_api_client "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/lib/api.ts"
click node_project_story "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/story/StoryService.java"
click node_story_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/story/StoryRepository.java"
click node_characters "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/character/CharacterService.java"
click node_character_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/character/CharacterRepository.java"
click node_outline "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java"
click node_outline_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/outline/OutlineSceneRepository.java"
click node_scene_setup "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java"
click node_setup_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/scene/SceneSetupRepository.java"
click node_ai "https://github.com/brijeshsrivdev/storysprout/tree/main/apps/api/src/main/java/com/storysprout/api/ai/infrastructure/google"
click node_editor_service "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/editor/EditorService.java"
click node_composition_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/editor/CompositionRepository.java"
click node_editor_model "https://github.com/brijeshsrivdev/storysprout/blob/main/packages/editor-model/src/index.ts"
click node_preview "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/lib/preview.ts"
click node_render_jobs "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java"
click node_render_store "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RenderJobRepository.java"
click node_renderer_client "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RendererClient.java"
click node_renderer "https://github.com/brijeshsrivdev/storysprout/blob/main/services/renderer/src/server.ts"
click node_render_engine "https://github.com/brijeshsrivdev/storysprout/blob/main/services/renderer/src/render.ts"
click node_object_storage "https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/MinioObjectStorage.java"

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_studio,node_api_client,node_creator toneBlue
class node_project_story,node_story_store,node_characters,node_character_store,node_outline,node_outline_store,node_scene_setup,node_setup_store,node_ai,node_minio toneAmber
class node_editor_service,node_composition_store,node_editor_model,node_preview toneMint
class node_render_jobs,node_render_store,node_renderer_client,node_renderer,node_render_engine,node_object_storage toneRose
```

## Components

### Web Studio

- [Web Studio](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/app/page.tsx): `apps/web/app/page.tsx`
- [API Client](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/lib/api.ts): `apps/web/lib/api.ts`

### Story Content API

- [Projects & Stories](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/story/StoryService.java): `apps/api/src/main/java/com/storysprout/api/story/StoryService.java`
- [Story Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/story/StoryRepository.java): `apps/api/src/main/java/com/storysprout/api/story/StoryRepository.java`
- [Characters](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/character/CharacterService.java): `apps/api/src/main/java/com/storysprout/api/character/CharacterService.java`
- [Character Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/character/CharacterRepository.java): `apps/api/src/main/java/com/storysprout/api/character/CharacterRepository.java`
- [Story Outline](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java): `apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`
- [Outline Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/outline/OutlineSceneRepository.java): `apps/api/src/main/java/com/storysprout/api/outline/OutlineSceneRepository.java`
- [Scene Setup](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java): `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`
- [Setup Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/scene/SceneSetupRepository.java): `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupRepository.java`
- [AI Generators](https://github.com/brijeshsrivdev/storysprout/tree/main/apps/api/src/main/java/com/storysprout/api/ai/infrastructure/google): `apps/api/src/main/java/com/storysprout/api/ai/infrastructure/google`

### Composition Editor

- [Editor Service](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/editor/EditorService.java): `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`
- [Composition Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/editor/CompositionRepository.java): `apps/api/src/main/java/com/storysprout/api/editor/CompositionRepository.java`
- [Editor Model](https://github.com/brijeshsrivdev/storysprout/blob/main/packages/editor-model/src/index.ts): `packages/editor-model/src/index.ts`
- [Composition Preview](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/web/lib/preview.ts): `apps/web/lib/preview.ts`

### Rendering

- [Render Jobs](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java): `apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java`
- [Render Job Store](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RenderJobRepository.java): `apps/api/src/main/java/com/storysprout/api/render/RenderJobRepository.java`
- [Renderer Client](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/RendererClient.java): `apps/api/src/main/java/com/storysprout/api/render/RendererClient.java`
- [Renderer Service](https://github.com/brijeshsrivdev/storysprout/blob/main/services/renderer/src/server.ts): `services/renderer/src/server.ts`
- [Render Engine](https://github.com/brijeshsrivdev/storysprout/blob/main/services/renderer/src/render.ts): `services/renderer/src/render.ts`
- [Artifact Storage](https://github.com/brijeshsrivdev/storysprout/blob/main/apps/api/src/main/java/com/storysprout/api/render/MinioObjectStorage.java): `apps/api/src/main/java/com/storysprout/api/render/MinioObjectStorage.java`

### Other components

- **Studio User**
- **MinIO**

## Connections

- Studio User → Web Studio: creates stories (evidence: `apps/web/app/page.tsx`)
- Web Studio → API Client: requests data (evidence: `apps/web/app/page.tsx`)
- Projects & Stories → Story Store: reads and writes (evidence: `apps/api/src/main/java/com/storysprout/api/story/StoryService.java`)
- Projects & Stories → AI Generators: generates drafts (evidence: `apps/api/src/main/java/com/storysprout/api/story/StoryService.java`)
- Story Outline → Story Store: loads stories (evidence: `apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`)
- Story Outline → Outline Store: manages scenes (evidence: `apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`)
- Story Outline → Setup Store: deletes setups (evidence: `apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`)
- Story Outline → AI Generators: generates outlines (evidence: `apps/api/src/main/java/com/storysprout/api/outline/StoryOutlineService.java`)
- Characters → Story Store: loads stories (evidence: `apps/api/src/main/java/com/storysprout/api/character/CharacterService.java`)
- Characters → Character Store: manages characters (evidence: `apps/api/src/main/java/com/storysprout/api/character/CharacterService.java`)
- Characters → AI Generators: suggests characters
- Scene Setup → Story Store: loads stories (evidence: `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`)
- Scene Setup → Outline Store: loads scenes (evidence: `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`)
- Scene Setup → Character Store: checks membership (evidence: `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`)
- Scene Setup → Setup Store: saves setup (evidence: `apps/api/src/main/java/com/storysprout/api/scene/SceneSetupService.java`)
- Editor Service → Story Store: loads story (evidence: `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`)
- Editor Service → Outline Store: loads outline (evidence: `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`)
- Editor Service → Setup Store: loads setup (evidence: `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`)
- Editor Service → Character Store: loads characters (evidence: `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`)
- Editor Service → Composition Store: opens composition (evidence: `apps/api/src/main/java/com/storysprout/api/editor/EditorService.java`)
- Composition Preview → Editor Model: uses model (evidence: `apps/web/lib/preview.ts`)
- Render Jobs → Editor Service: loads composition (evidence: `apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java`)
- Render Jobs → Render Job Store: queues and tracks (evidence: `apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java`)
- Render Jobs → Renderer Client: dispatches job (evidence: `apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java`)
- Render Jobs → Artifact Storage: stores artifact (evidence: `apps/api/src/main/java/com/storysprout/api/render/RenderJobService.java`)
- Artifact Storage → MinIO: stores objects
- Renderer Service → Render Engine: renders request (evidence: `services/renderer/src/server.ts`)
- Renderer Client → Renderer Service: calls service
