This document maps user-facing features to the codebase for maintenance and onboarding.
- Live streaming from Mod Retro Chromatic with GPU rendering and Canvas2D fallback.
- Render presets: True Color, Vibrant, Hi-Def, Vintage, Pixel, Performance.
- Brightness and volume controls with real-time preview.
- Cinematic mode and fullscreen viewing (optional fullscreen-on-startup).
- Screenshots (PNG) and recordings (WebM, MP4, or MOV with ffmpeg transcoding).
- Notes panel with search, autosave, and local persistence.
- Status strip with device state, resolution, and FPS.
- Update checks, downloads, and install flow in Settings.
- System tray integration (background device monitoring, show window, refresh, quit).
| Feature | Primary directories | Notes |
|---|---|---|
| Streaming and rendering | src/renderer/infrastructure/services/streaming, src/renderer/infrastructure/rendering |
GPU pipeline, render presets, health checks, audio warmup |
| Capture (screenshots/recording) | src/renderer/infrastructure/services/capture |
PNG screenshots, recordings with format selection |
| Transcode | src/main/infrastructure/transcode, src/renderer/infrastructure/services/transcode, src/shared/features/transcode |
FFmpeg-based transcoding for MP4/MOV output |
| Devices and adapters | src/renderer/infrastructure/services/devices, src/renderer/infrastructure/adapters/devices, src/main/infrastructure/devices, src/shared/features/devices |
USB detection, device registry, adapters |
| Settings and display modes | src/renderer/infrastructure/services/settings, src/renderer/presentation/config/storage-keys.config.ts |
Cinematic, fullscreen, performance mode, status strip |
| Notes | src/renderer/infrastructure/services/notes, src/renderer/presentation/config/storage-keys.config.ts |
Notes CRUD and search |
| Updates | src/main/infrastructure/updates, src/renderer/infrastructure/services/updates, src/preload/index.js |
electron-updater + renderer UI |
| UI shell | src/renderer/presentation, src/renderer/assets |
Templates, components, effects |
| App lifecycle and performance | src/renderer/application, src/renderer/application/di, src/main/application |
Orchestrators, DI registration modules, performance state |
| IPC and preload bridge | src/shared/ipc, src/preload/index.js |
Shared channel definitions |
| Surface | Template | Component(s) | Orchestrator/Bridge |
|---|---|---|---|
| Header + Settings | src/renderer/presentation/shell/header.template.js |
SettingsMenuComponent, UpdateSectionComponent, DeviceStatusComponent |
UISetupOrchestrator, UIEventBridge |
| Stream viewer + toolbar | src/renderer/presentation/features/streaming/stream-viewer.template.js |
StreamingControlsComponent, ShaderSelectorComponent |
UISetupOrchestrator, UIEventBridge |
| Notes panel | src/renderer/presentation/features/notes/notes-panel.template.js |
NotesPanelComponent |
UISetupOrchestrator |
| Status footer | src/renderer/presentation/shell/status-footer.template.js |
StatusNotificationComponent, DeviceStatusComponent |
UIEventBridge |
| Transcode toast | src/renderer/presentation/features/streaming/stream-viewer.template.js |
TranscodeToastComponent |
TranscodeUIBridge |
UI input is wired in src/renderer/application/orchestrators/ui-setup.orchestrator.ts. UI updates are applied via src/renderer/presentation/bridges/ui-event.bridge.js, src/renderer/presentation/bridges/capture-ui.bridge.js, or src/renderer/presentation/bridges/transcode-ui.bridge.js.
- User clicks the overlay ->
ui:stream-start-requested. StreamingOrchestratorcallsStreamingService.start.StreamingServiceemitsstream:started.StreamingOrchestratorstarts the render pipeline and publishesui:streaming-mode,ui:stream-info, andui:status-message.UIEventBridgeupdates controls, overlay, and stream info.
- User clicks the stream view ->
ui:stream-stop-requested. StreamingOrchestratorcallsStreamingService.stop.StreamingServiceemitsstream:stopped.StreamingOrchestratorstops the render pipeline and publishesui:streaming-mode(false) andui:overlay-message.
- User clicks the screenshot button ->
ui:screenshot-requested. CaptureOrchestratorpublishesui:shutter-flashandcapture:screenshot-triggered, then callsCaptureService.takeScreenshot.CaptureServiceemitscapture:screenshot-ready.CaptureUIBridgetriggers the download and publishesui:status-message.
- User clicks the record button ->
ui:recording-toggle-requested. CaptureOrchestratorstarts/stops recording (GPU path viaCaptureGpuRecordingServicewhen active).CaptureServiceemitscapture:recording-started,capture:recording-stopped, andcapture:recording-ready.CaptureOrchestratorcallsCaptureSaveService.saveRecording, which checks the user's format preference:- If WebM: direct download via
CaptureSaveService._directSave. - If MP4/MOV: sends blob to
TranscodeService(main process) for ffmpeg conversion.
- If WebM: direct download via
- During transcoding,
TranscodeUIBridgeshows progress toast and updates the record button with percentage. - On completion,
CaptureOrchestratorpublishesui:status-messagefor direct saves;TranscodeUIBridgehandles status for transcoded saves.
- User selects format in Settings dropdown ->
SettingsService.setRecordingFormat. settings:recording-format-changedevent updates UI.- Format preference is persisted to localStorage and used when saving recordings.
- Shader panel updates settings via
SettingsService.setRenderPreset,setGlobalBrightness,setVolume. - Settings events emit
settings:render-preset-changed,settings:brightness-changed,settings:volume-changed. StreamingOrchestratorlistens for preset changes and updates the render pipeline.ShaderSliderControlsComponentlistens for brightness/volume updates to keep UI in sync.
- Settings toggle calls
SettingsService.setPerformanceMode. settings:performance-mode-changedupdatesPerformanceStateOrchestrator, which emitsperformance:render-mode-changed.StreamingOrchestratorswitches to Canvas2D rendering when performance mode is enabled.
- Fullscreen button ->
ui:fullscreen-toggle-requested. SettingsDisplayModeOrchestratortogglesSettingsFullscreenService.SettingsFullscreenServiceemitsui:fullscreen-state.UIEventBridgeupdates fullscreen UI and control auto-hide.- Cinematic toggle ->
ui:cinematic-toggle-requested->SettingsCinematicModeService->settings:cinematic-mode-changed.
- Notes button toggles
NotesPanelComponent. - Create/update/delete actions call
NotesServicemethods. - Notes events emit
notes:note-created,notes:note-updated, andnotes:note-deleted.
- Settings update action button calls
UpdateOrchestrator(check/download/install). UpdateServiceuseswindow.updateAPIto call IPC and emitsupdate:*events.UpdateUiServicepublishes status messages and badge visibility.UpdateSectionComponentlistens forupdate:state-changedandupdate:progressto refresh UI.
- Downloads location: screenshots and recordings go to the OS downloads folder.
- Local storage keys: settings and notes live in localStorage, defined in
src/renderer/presentation/config/storage-keys.config.ts. - Stored device IDs:
src/renderer/infrastructure/services/devices/device-storage.service.ts. - Transcode temp files: during MP4/MOV conversion, temporary files are created in the system temp directory and cleaned up after completion or cancellation.
Screenshots will not be added to this repository.
- Register metadata in
src/shared/features/devices/device.registry.js. - Add a profile class in
src/shared/features/devices/profiles/and register it insrc/main/infrastructure/devices/device-profile.registry.ts. - Add an adapter in
src/renderer/infrastructure/adapters/devices/<device-name>/and register it. - Update docs and tests if behavior changes.
- Add a new preset file in
packages/prismgb-gpu/src/domain/presets/presets/implementing theIPresetinterface. - Register it with
PresetRegistry.register()and import it inpackages/prismgb-gpu/src/index.ts. - Ensure UI labels and descriptions read well (
PresetRegistry.getForUI()provides the list). - Consider performance mode interactions.
- Add a storage key in
src/renderer/presentation/config/storage-keys.config.ts. - Update
src/renderer/infrastructure/services/settings/settings.service.ts. - Wire UI in
src/renderer/presentation/features/settings.
- Renderer infrastructure timing values come from
src/shared/config/timing.config.ts. - IPC handlers import channels through
src/shared/ipc/channels.config.js. - Active runtime paths do not use
@coreimports.