Skip to content

Releases: GS-RUN/tubelight

v0.2.0-rc.0 — Phase 3d complete: DX12 + WGC overlay

Choose a tag to compare

@GS-RUN GS-RUN released this 29 May 04:14

Tubelight v0.2.0-rc.0

Date: 2026-05-29
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Supersedes: v0.2.0-beta.0

Release candidate: the DX12 overlay path (T5.5) is feature-complete
and smoke-verified on RTX 2080 Ti FL 12_2. This RC is published as a
prerelease for wider testing ahead of v0.2.0 stable (Phase 3e bench).

Highlights

Closes Phase 3d of ADR-0002. The real overlay now runs the full
8-pass CRT pipeline on Direct3D 12 — not just the standalone
--wgc-test smoke. Combine --renderer dx12 with any --overlay*
mode and Tubelight captures via Windows.Graphics.Capture (WGC),
unwraps each frame to a D3D12 resource through D3D11On12 with zero
CPU copy, and drives the same shader cascade that the OpenGL path does.

The OpenGL overlay is unchanged and remains the default.

What's new

DX12 overlay (--overlay* --renderer dx12)

  • Full pipeline on D3D12: the 8-pass CRT cascade runs on the D3D12
    backend shipped in v0.2.0-beta.0; the overlay is now wired to it.
  • WGC capture by mode:
    • --overlay-target <title|pid> → per-window capture (CreateForWindow).
      The overlay follows the target window's position every frame and
      exits when the target closes.
    • --overlay-fullscreen / --overlay / --overlay-region
      per-monitor capture (CreateForMonitor), monitor chosen with
      --monitor <index>.
  • No self-capture feedback: the overlay window is excluded from WGC
    via WDA_EXCLUDEFROMCAPTURE.
  • Global hotkeys (focus-independent, via the low-level keyboard
    hook): Ctrl+Alt+Q quit, Ctrl+Alt+1..8 toggle pass, Ctrl+Alt+0
    all on, Ctrl+Alt+F freeze.
  • Non-intrusive window: borderless modes use
    WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW so the overlay doesn't steal
    focus or clutter the taskbar.

CLI

  • --renderer dx12 now drives the overlay (was beta-only / shader-only).
  • --help and the --renderer error message updated; they previously
    described dx12 as a non-driving skeleton.

Known limitations (deferred to v0.2.1 / Phase 4a)

  • No cross-process mouse click-through in DX12 mode. Layered windows
    (WS_EX_LAYERED) are incompatible with the DXGI flip-model swap chain,
    so true click-through requires DirectComposition (Phase 4a). Until
    then the DX12 overlay sits on top without passing clicks through.
  • No ImGui menu under DX12 — the in-app menu stays OpenGL-only.
    Control the DX12 overlay with the global hotkeys above.
  • Region / windowed modes capture the whole monitor (WGC has monitor
    granularity); a true sub-rect crop lands in v0.2.1.
  • Target tracking is position-only — if the target window is
    resized, the overlay keeps its launch size (WGC frame-pool recreate
    deferred).
  • HiDPI (>100% scaling) not yet validated for the DX12 swap chain.

Verification

On NVIDIA RTX 2080 Ti, FL 12_2:

  • --wgc-test regression smoke green (CRT-processed monitor capture PNG).
  • --overlay-fullscreen, --overlay (windowed) and
    --overlay-target all render the first frame and run steadily.
  • Injected Ctrl+Alt+Q exits cleanly (147 frames rendered, keyboard
    hook thread joined without hang).
  • OpenGL overlay path unchanged (DXGI Desktop Duplication still ready).

Distribution layout

Same as v0.2.0-beta.0. tubelight-0.2.0-rc.0-win64.zip (~55 MB).

Next phases (per ADR-0002)

Phase Ships in
3e — bench DX12 vs GL + v0.2.0 stable v0.2.0
4a — DirectComposition chrome/body + DX12 click-through + ImGui v0.2.1
5a — HDR10 scRGB FP16 pipeline (blocked on phosphor spectra) v0.3.0
6a — VRS + async compute v0.3.1
7a — Slang single-source shaders (closes cross-API PSNR gap) v0.3.2

v0.2.0-beta.0 — Phase 3c complete: D3D12 backend executes 8-pass pipeline

Choose a tag to compare

@GS-RUN GS-RUN released this 28 May 17:36

Phase 3c of ADR-0002 is complete. Tubelight's 8-pass CRT pipeline now runs on both OpenGL and Direct3D 12 from the same GLSL shader source, compiled at build time via glslang → SPIR-V → SPIRV-Cross → dxc.

Try it

```
tubelight.exe --renderer dx12 --shader-only docs/manual/assets/raw/testcard.png --profile pvm-8220 --signal composite_ntsc
```

Falls back to OpenGL automatically if the D3D12 device can't be created (covers ADR-0002 R12 — pre-DX12 GPUs, Wine without DXVK, etc).

What works in v0.2.0-beta.0

  • --renderer gl (default): identical output to v0.1.7 baseline. Overlay mode unchanged.
  • --renderer dx12: full 8-pass CRT pipeline on D3D12 (FL 12_0+). Validated on NVIDIA RTX 2080 Ti FL 12_2. --shader-only mode only — overlay capture stays on GL.
  • --screenshot <path>: deterministic offscreen capture on both backends, for the new pixel-equivalence harness.

Major changes since v0.1.6

  • Phase 3a (v0.1.7): IRenderBackend abstraction. Cero cambio visual vs v0.1.6.
  • Phase 3b (v0.2.0-alpha.0): D3D12 skeleton (device + swap chain + clear/present).
  • Phase 3c (v0.2.0-beta.0): D3D12 backend drives the full pipeline.
    • cmake/CompileShaders.cmake build-time GLSL→DXIL pipeline.
    • 8 fragment shaders refactored to explicit layout(std140, binding=0) uniform PassUniforms {...} blocks for deterministic HLSL cbuffer output.
    • Pipeline migrated to IRenderBackend resource handles (TextureHandle, RenderTargetHandle, PassHandle).
    • D3D12 root signature: 1 CBV(b0) + 2 SRVs(t1,t2) + 2 static linear-clamp samplers.
    • CB ring + two-heap SRV scheme (CPU staging + shader-visible scratch).
    • Vulkan→D3D12 Y-flip trap fixed via negative-height viewport (standard SPIR-V→HLSL pattern).
  • PSNR pixel-equivalence gate between GL and DX12 backends. Realistic threshold 18 dB after measurement; visually identical at any PSNR > 17. See specs/phase-3c/SPEC.md §M1 for the architectural reasoning.

Known limitations

  • Overlay mode (--overlay, --overlay-target, --overlay-fullscreen, --overlay-region) remains GL-only. Phase 3d (WGC capture + D3D11On12 interop) lets DX12 drive overlay too.
  • Cross-API PSNR is ~20 dB, not bit-exact. Sub-pixel float divergence across the 8 non-linear passes accumulates; perceptually invisible. Phase 7a Slang single-source can close this gap.
  • DPI scaling on HiDPI displays not fully validated in DX12 path. Tested at 1080p / 1280×960.

Hardware tested

  • NVIDIA GeForce RTX 2080 Ti (driver 580+, FL 12_2): all features green.
  • Other GPUs: please report issues — the D3D12 capability requirements are FL 12_0 minimum.

File checksums

  • tubelight-0.2.0-beta.0-win64.zip — 55.19 MB

v0.1.6 — Phase 2b PBO ring + Phase 2c skip pass5

Choose a tag to compare

@GS-RUN GS-RUN released this 28 May 14:56

Tubelight v0.1.6

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Supersedes: v0.1.5

Highlights

ADR-0002 Phase 2b + Phase 2c — surgical OpenGL perf wins on the
recording and temporal-pass paths. No API change. No visual change.
~3-6 ms GPU stall removed per recorded frame, ~0.4 ms saved per
clean-signal frame.

Changes

Changed (perf)

  • Phase 2b: PBO double-buffer for video recording.
    VideoRecorder::push_frame() was the largest single GPU stall in
    the running overlay — glReadPixels to host memory is synchronous
    by default and at 1920×1200 takes 3-6 ms with the driver waiting
    for the GPU to finish the current frame first. A 3-slot Pixel
    Buffer Object ring now buffers the readback: the new frame's
    glReadPixels writes asynchronously into PBO[N % 3], and the slot
    that was written 3 frames ago — guaranteed GPU-ready — is mapped
    and sent to ffmpeg. Recorded frames now lag the live overlay by
    ~50 ms (3 × 16.6 ms at 60 Hz), which is invisible in the saved MP4
    because the recorder timestamps don't change.
  • Phase 2c: skip pass 5 when persistence is negligible.
    Pipeline::render_to_screen() early-skips the temporal pass FBO
    bind + clear + shader dispatch + history snapshot when
    persistence_strength × (ratio_r + ratio_g + ratio_b) < 1e-3.
    Most monochrome / scope-style profiles still need the pass; PVM
    profiles at low intensity skip cleanly. Saved: ~0.4 ms per frame
    when applicable.

Notes

  • Original Phase 2c plan ("merge passes 0+1 into one shader") was
    abandoned during implementation review — it would have tripled
    texture sampling (pass 1 reads pass 0 at its 4 neighbours, so a
    merge would require running pass 0's 9-sample neighbourhood at the
    centre AND four positions = 45 samples vs. current 9+5=14).
    Reverted to the simpler, real win (pass 5 skip).
  • Screenshot path (save_screenshot_png_async) was left as
    synchronous glReadPixels. It's one-shot per user keypress and
    the worker-thread PNG encode already hides its cost; not worth
    the complexity in this release.

Internal

  • src/overlay/capture_to_disk.h: 3 new VideoRecorder members
    (pbos_[], pbo_write_idx_, pbo_filled_) and kPboCount const.
  • src/overlay/capture_to_disk.cpp: start() initialises the PBO
    ring with GL_STREAM_READ hint; push_frame() rewrites the
    readback path; stop() drains the remaining ring before closing
    ffmpeg pipe.
  • src/core/pipeline.cpp: 8 lines added at the top of
    render_to_screen() to compute skip_pass5 once per frame and
    the loop's enable-check now consults it.
  • Version bumps: CMake 0.1.5 → 0.1.6; kVersion string; ImGui Help
    footer; manual.json meta version.
  • Manual HTML/PDF/TXT regenerated.

Distribution layout

Same as v0.1.5. tubelight-0.1.6-win64.zip ~55 MB.

Next phases (per ADR-0002)

Phase Ships in
3a — IRenderBackend abstraction + GL backend wrap v0.1.8
3b — D3D12 backend skeleton v0.2.0-alpha
3c — D3D12 backend full pipeline v0.2.0-beta
3d — WGC capture native v0.2.0-rc
3e — bench + v0.2.0 stable v0.2.0

v0.1.7 was originally planned for Phase 2c standalone; since 2b and
2c shipped together in v0.1.6, the numbering jumps forward — the
next release will be v0.1.7 with Phase 3a (renderer abstraction).

v0.1.5 — ADR-0002 blueprint + ImGui idle skip

Choose a tag to compare

@GS-RUN GS-RUN released this 28 May 14:48

Tubelight v0.1.5

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Supersedes: v0.1.4

Highlights

  • ADR-0002 published: architectural blueprint for the v0.2.0+
    rendering and capture rewrite. Documents the move to D3D12 +
    DirectComposition + Windows Graphics Capture + scRGB FP16 → HDR10 +
    Variable Rate Shading + async compute pairing + Slang shader sources.
    Includes the full 10-phase rollout (2a → 7a) with per-phase
    deliverables.
  • Small CPU saving in idle state: ImGui frame cycle is skipped when
    no UI is on screen.

Why this release exists

  1. Commit the architectural direction in writing. Future sessions
    and contributors need a single anchor document explaining why we
    pick D3D12 over D3D11, why WGC over DXGI Duplication, why Slang
    as the shader source language. ADR-0002 is that document — 200+
    lines covering decisions, alternatives, risks, and the multi-release
    plan.

  2. Sets up the conditional-rendering pattern used everywhere by
    the D3D12 backend. The ImGui idle-skip is the first step.

Changes

Added

  • docs/adr/0002-d3d12-dcomp-wgc-hdr-slang-blueprint.md (new ADR).
  • CHANGELOG.md [0.1.5] section.

Changed (perf)

  • src/overlay/overlay_mode_win.cpp main loop now wraps the entire
    menu.begin_frame() ... menu.end_frame_to_screen() block in a
    visibility check. When the menu is closed, the HUD is off, no toast
    is on and no recording is in flight, ImGui's per-frame work is
    skipped entirely. Saves ~80-150µs per idle frame (~0.5% sustained
    CPU at 60 Hz).

Internal

  • CMake project version 0.1.4 → 0.1.5.
  • kVersion and ImGui Help tab footer bumped to match.
  • manual.json meta version bumped to 0.1.5. Manual HTML/PDF/TXT
    regenerated.

What does NOT ship yet

ADR-0002 lists 10 implementation phases. v0.1.5 is Phase 2a only.
The rest:

Phase Ships in
2b — PBO double-buffer screenshot+record v0.1.6
2c — merge passes 0+1 + skip pass 5 identity v0.1.7
3a — IRenderBackend abstraction + GL backend wrap v0.1.8
3b — D3D12 backend skeleton v0.2.0-alpha
3c — D3D12 backend full pipeline v0.2.0-beta
3d — WGC capture native v0.2.0-rc
3e — bench + v0.2.0 stable v0.2.0
4a — DComp chrome / body separation v0.2.1
5a — HDR10 pipeline v0.3.0
6a — VRS + async compute v0.3.1
7a — Slang shader migration v0.3.2

Distribution layout

tubelight-0.1.5-win64.zip
├── tubelight.exe                (v0.1.5)
├── epoxy-0.dll
├── glfw3.dll
├── profiles/                    (16 CRT + 7 signal)
├── docs/
│   ├── adr/
│   │   ├── README.md
│   │   ├── 0001-always-on-recordable-and-clickthrough.md
│   │   └── 0002-d3d12-dcomp-wgc-hdr-slang-blueprint.md   (new)
│   └── manual/                  (HTML + PDF + TXT + 42 PNG assets)
├── CHANGELOG.md
├── LICENSE
└── README.md

v0.1.4 — ADR-0001 Phase 1 (always-on R/C + Mag fix)

Choose a tag to compare

@GS-RUN GS-RUN released this 28 May 14:40

Tubelight v0.1.4

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Supersedes: v0.1.3 — first cut of ADR-0001

Highlights

  • Recordable is always-on. No more Ctrl+Alt+R hotkey. Snipping
    Tool, Game Bar, and OBS Display Capture see the processed overlay
    automatically.
  • Click-through is mode-dependent, no longer a user toggle.
    --overlay (windowed) lets you drag/resize via the native Win32 title
    bar and borders. --overlay-target, --overlay-region and
    --overlay-fullscreen are click-through, as before.
  • Magnification API src_rect_ bug fixed. Previously, recordable
    mode kept sampling the full monitor even after attaching to a smaller
    target / region. Now the rect updates on every attach.

Why

ADR-0001 (2026-05-27) replaces the two user-toggle hotkeys (Ctrl+Alt+R
and Ctrl+Alt+C) with always-on behaviour because:

  1. The combined user model "remember to press R before recording, press
    C if you want input to pass through" was opaque and gated common
    use cases on hotkey knowledge.
  2. The Ctrl+Alt+C toggle in windowed mode created an unrecoverable
    state — once activated, the title bar was click-through too and the
    window couldn't be moved.
  3. The Magnification API source rect was hardcoded to the full monitor
    in init() and never updated on runtime re-attach, so any user who
    combined recordable mode with Ctrl+Alt+T got the wrong area
    captured.

Migration

If your %APPDATA%\Tubelight\settings.json from v0.1.3 contained
"recordable": true or "clickthrough_user": true, both fields are now
silently ignored on load. No file rewrite is performed; the obsolete
keys are dropped on the next normal save.

If you relied on toggling click-through within windowed mode, switch to
--overlay-target <window title> or --overlay-region X,Y,W,H at
launch — both modes are click-through by design.

Detailed changes

Changed (breaking UX)

  • Ctrl+Alt+R hotkey removed. The LL keyboard hook no longer wires it.
  • Ctrl+Alt+C hotkey removed. The LL keyboard hook entry and the
    WndProc fallback path both deleted.
  • Menu Audio tab "Recordable" checkbox replaced by greyed-out info
    line. Click-through checkbox same treatment.
  • Help tab keyboard shortcuts list no longer mentions R or C. An
    explanatory line points at ADR-0001.
  • Capture pipeline always routes through Magnification API with our
    HWND in MagSetWindowFilterList(MW_FILTERMODE_EXCLUDE, ...).
    WDA_EXCLUDEFROMCAPTURE is no longer set on the overlay window.

Fixed

  • New MagCapture::set_source_rect(x, y, w, h). Called from
    do_attach_target(), do_attach_region(), do_toggle_fullscreen()
    (entering), do_detach_target() and do_detach_region() (returning
    to full-monitor sampling).

Internal

  • g_recordable_mode atomic defaults to true in its declaration and
    is forced to true at startup. The branch in grab_source() that
    reads it is intentionally kept for ABI / future-proofing.
  • apply_clickthrough_user() is now a no-op stub. The original
    WS_EX_TRANSPARENT toggle code is preserved inside an if (false)
    block for archaeological reference; will be removed in the
    D3D11/D3D12 backend cut (ADR-0002+).

Distribution layout

tubelight-0.1.4-win64.zip
├── tubelight.exe                (v0.1.4)
├── epoxy-0.dll
├── glfw3.dll
├── profiles/                    (16 CRT + 7 signal)
├── docs/
│   ├── adr/
│   │   ├── README.md
│   │   └── 0001-always-on-recordable-and-clickthrough.md   (new)
│   └── manual/                  (HTML + PDF + TXT + 42 PNG assets)
├── CHANGELOG.md
├── LICENSE
└── README.md

v0.1.3 — First public release

Choose a tag to compare

@GS-RUN GS-RUN released this 27 May 20:13

Tubelight v0.1.3

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Repo: https://github.com/GS-RUN/tubelight (now public)

Highlights

This is the first public release of Tubelight. The user manual has
been swept clean of any "private repo" wording and now points to the
public Releases and Issues pages.

Changes

Changed

  • docs/manual/manual.json §2 download instructions, §13 troubleshooting,
    and §15 credits no longer reference a private repo. The §2 example
    filename was upgraded from a fixed tubelight-0.1.0-win64.zip to
    tubelight-<version>-win64.zip so future bumps don't desync.
  • NEXT_STEPS.md: removed the (PRIVATE) tag from the repo line.
  • manual.json meta.version / meta.git_tag bumped to 0.1.3.

Generated

  • manual.html, manual.pdf, manual.es.txt, manual.en.txt
    regenerated from the cleaned single source.

Distribution

tubelight-0.1.3-win64.zip
├── tubelight.exe
├── epoxy-0.dll
├── glfw3.dll
├── profiles/         (16 CRT + 7 signal)
├── docs/manual/      (HTML + PDF + TXT + INTEGRATION.md + 42 PNG assets)
├── CHANGELOG.md
├── LICENSE
└── README.md

What is Tubelight?

A high-fidelity CRT overlay for Windows. Place a real Win32 window over
any application, and the area underneath is processed by an 8-pass
OpenGL pipeline that emulates 16 historical monitors (Sony PVM-8220,
BVM-20F1U, GDM-FW900, Commodore 1084S, Wells-Gardner K7000, X68000
CZ-602D, IBM 5151 amber terminal, Mac Classic 1-bit, …) with 7 signal
chains (RF, composite NTSC/PAL, S-Video, SCART RGB, Component, RGB VGA).

Every profile is calibrated against a primary source (service manual,
crtdatabase, ManualsLib, archive.org, gamesx.com). Phosphor chromaticity,
dot pitch, per-channel persistence — all cited inside
profiles/crts/<id>.json.

See the bundled docs/manual/manual.html for the full user manual in
Spanish and English.

v0.1.2 — Cleanup personal paths

Choose a tag to compare

@GS-RUN GS-RUN released this 27 May 19:57

Tubelight v0.1.2

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Supersedes: v0.1.1 (0 downloads at time of supersede)

Highlights

  • Cleanliness patch: enforced Constitution C1 across versioned files.
    No more D:\AgentWorkspace\... personal paths in docs/manual/, the
    capture scripts, or NEXT_STEPS.md.

Changes

Fixed

  • docs/manual/INTEGRATION.md — removed D:\AgentWorkspace\Tubelight\
    reference; capture-script docs now describe $PSScriptRoot auto-detect.
  • Five PowerShell capture scripts (docs/manual/scripts/*.ps1) now
    resolve repo root relatively to their own location via
    (Resolve-Path (Join-Path $PSScriptRoot "..\..\..")). Defaults work
    on any clone, anywhere. Override with -ExePath / -AssetsRoot /
    -Image if needed.
  • NEXT_STEPS.md — purged the obsolete "manual planning" section that
    contained the personal path.
  • Removed docs/manual/PENDING.md (obsolete v0.1.1 planning doc).

Notes

  • tubelight.exe binary behaviour unchanged — only version string bumped.
  • v0.1.1 release kept on GitHub for history. Use v0.1.2.

Distribution layout

tubelight-0.1.2-win64.zip
├── tubelight.exe
├── epoxy-0.dll
├── glfw3.dll
├── profiles/
│   ├── crts/*.json    (16 CRT profiles)
│   └── signals/*.json (7 signal profiles)
├── docs/
│   └── manual/
│       ├── manual.html
│       ├── manual.pdf
│       ├── manual.es.txt
│       ├── manual.en.txt
│       ├── INTEGRATION.md (cleaned)
│       └── assets/  (42 PNGs ~42 MB)
├── CHANGELOG.md
├── LICENSE
└── README.md

v0.1.1 — Bilingual user manual + Help integration

Choose a tag to compare

@GS-RUN GS-RUN released this 27 May 19:48

Tubelight v0.1.1

Date: 2026-05-27
Author: Alonso J. Núñez (GS·RUN)
License: PolyForm Noncommercial 1.0.0 — commercial: gsrun.editor@gmail.com
Status: PRIVATE release (repo GS-RUN/tubelight not yet public)

Highlights

  • Bilingual user manual (ES/EN) under docs/manual/: 307 KB single-file
    interactive HTML, 1.68 MB printable PDF, 80-col plain TXT, single-source
    bilingual JSON (15 sections, 25 glossary terms). 42 calibrated
    screenshots, every CRT and signal profile cited against its service
    manual or equivalent primary source.
  • Help → Open user manual button integrated into the in-app menu;
    the manual opens in your default browser from a layout-aware path
    resolver with GitHub fallback.
  • Reproducible capture pipeline: PowerShell scripts that drive
    tubelight.exe over a known WinForms test card, anchor via
    --overlay-target, and produce all 42 PNGs deterministically.
  • License switch to PolyForm Noncommercial 1.0.0 (commercial contact
    in metadata).

Manual at a glance

docs/manual/manual.html (single-file, no CDN, WCAG AA):

  • Sidebar with scroll-spy, MiniSearch-style substring search, ES/EN toggle,
    dark/light theme, lightbox, frame-strip galleries, glossary tooltips.
  • Print stylesheet (page-break before each section, hides chrome).
  • 15 sections: Welcome · Install · UI tour · First overlay · 4 overlay
    modes · 16 CRT profiles with cited specs · 7 signal profiles · 8
    fine-tune anatomies · Capture & recording (PNG / MP4 / recordable mode
    • WDA/Magnification deep dive) · Audio · Shortcuts table · 5 use-case
      recipes · 8 troubleshooting flows · Glossary · Credits.

Distribution layout

tubelight-0.1.1-win64.zip
├── tubelight.exe
├── epoxy-0.dll
├── glfw3.dll
├── profiles/
│   ├── crts/*.json    (16 CRT profiles)
│   └── signals/*.json (7 signal profiles)
├── docs/
│   └── manual/
│       ├── manual.html
│       ├── manual.pdf
│       ├── manual.es.txt
│       ├── manual.en.txt
│       ├── INTEGRATION.md
│       └── assets/  (42 PNGs ~42 MB)
├── CHANGELOG.md
├── LICENSE
└── README.md

Known limitations carried over

  • Pass 5 temporal persistence shader is identity; real implementation
    scheduled for v1.1.
  • Magnification API source rect is hardcoded to monitor rect — does not
    follow runtime Ctrl+Alt+T target changes. Use the CLI `--overlay-target <title>` flag for reliable anchoring.
  • Synthetic mouse clicks on ImGui tab bars over WS_EX_LAYERED windows
    don't switch tabs reliably; the per-tab menu screenshots were captured
    manually by a human operator.

Verified against historical hardware

Every CRT profile bundle is validated against a primary source: crtdatabase,
ManualsLib, archive.org Commodore 1084S-D1 Service Manual, gamesx.com X68000
wiki, NEC MultiSync 4FG Service Manual, Wikipedia EIA Phosphor Designations
table. URLs and retrieved_at dates live in each profiles/crts/<id>.json.