Releases: GS-RUN/tubelight
Release list
v0.2.0-rc.0 — Phase 3d complete: DX12 + WGC overlay
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
viaWDA_EXCLUDEFROMCAPTURE. - Global hotkeys (focus-independent, via the low-level keyboard
hook):Ctrl+Alt+Qquit,Ctrl+Alt+1..8toggle pass,Ctrl+Alt+0
all on,Ctrl+Alt+Ffreeze. - Non-intrusive window: borderless modes use
WS_EX_NOACTIVATE | WS_EX_TOOLWINDOWso the overlay doesn't steal
focus or clutter the taskbar.
CLI
--renderer dx12now drives the overlay (was beta-only / shader-only).--helpand the--renderererror 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-testregression smoke green (CRT-processed monitor capture PNG).--overlay-fullscreen,--overlay(windowed) and
--overlay-targetall render the first frame and run steadily.- Injected
Ctrl+Alt+Qexits 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
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-onlymode 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):
IRenderBackendabstraction. 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.cmakebuild-time GLSL→DXIL pipeline.- 8 fragment shaders refactored to explicit
layout(std140, binding=0) uniform PassUniforms {...}blocks for deterministic HLSL cbuffer output. Pipelinemigrated toIRenderBackendresource 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 §M1for 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
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 —glReadPixelsto 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
glReadPixelswrites 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
synchronousglReadPixels. 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 newVideoRecordermembers
(pbos_[],pbo_write_idx_,pbo_filled_) andkPboCountconst.src/overlay/capture_to_disk.cpp:start()initialises the PBO
ring withGL_STREAM_READhint;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 computeskip_pass5once per frame and
the loop's enable-check now consults it.- Version bumps: CMake 0.1.5 → 0.1.6;
kVersionstring; 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
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
-
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. -
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.cppmain 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.
kVersionand ImGui Help tab footer bumped to match.manual.jsonmeta 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)
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+Rhotkey. 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-regionand
--overlay-fullscreenare 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:
- 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. - The
Ctrl+Alt+Ctoggle in windowed mode created an unrecoverable
state — once activated, the title bar was click-through too and the
window couldn't be moved. - The Magnification API source rect was hardcoded to the full monitor
ininit()and never updated on runtime re-attach, so any user who
combined recordable mode withCtrl+Alt+Tgot 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+Rhotkey removed. The LL keyboard hook no longer wires it.Ctrl+Alt+Chotkey removed. The LL keyboard hook entry and the
WndProcfallback 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
RorC. An
explanatory line points at ADR-0001. - Capture pipeline always routes through Magnification API with our
HWND inMagSetWindowFilterList(MW_FILTERMODE_EXCLUDE, ...).
WDA_EXCLUDEFROMCAPTUREis 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()anddo_detach_region()(returning
to full-monitor sampling).
Internal
g_recordable_modeatomic defaults totruein its declaration and
is forced totrueat startup. The branch ingrab_source()that
reads it is intentionally kept for ABI / future-proofing.apply_clickthrough_user()is now a no-op stub. The original
WS_EX_TRANSPARENTtoggle code is preserved inside anif (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
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 fixedtubelight-0.1.0-win64.zipto
tubelight-<version>-win64.zipso future bumps don't desync.NEXT_STEPS.md: removed the(PRIVATE)tag from the repo line.manual.jsonmeta.version/meta.git_tagbumped to0.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
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 moreD:\AgentWorkspace\...personal paths indocs/manual/, the
capture scripts, orNEXT_STEPS.md.
Changes
Fixed
docs/manual/INTEGRATION.md— removedD:\AgentWorkspace\Tubelight\
reference; capture-script docs now describe$PSScriptRootauto-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/
-Imageif 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.exebinary 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
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.exeover 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.
- WDA/Magnification deep dive) · Audio · Shortcuts table · 5 use-case
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 runtimeCtrl+Alt+Ttarget changes. Use the CLI `--overlay-target <title>` flag for reliable anchoring. - Synthetic mouse clicks on ImGui tab bars over
WS_EX_LAYEREDwindows
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.