ADR 0037 - Rejected: dynamic image insertion
- Status: rejected
- Date: 2026-05-17
- Spec target: XTL 0.1 (rejection; no spec change)
- Affects: ADR-0034 (Corollary 2 / 3 application)
Context
JXLS ships a jx:image command that lets a template author embed
an image whose binary source is supplied at render time:
<!-- JXLS-style, conceptual -->
jx:image(href="${item.logoPath}", x="1", y="1")
The same shape appears in xltpl and several JXLS forks. The
typical use case is per-customer logos, signature images, or QR
codes that vary row-to-row.
The natural XTL spelling would be something like:
{{ IMAGE([LogoPath]) }}
{{ @image [QRBase64] }}
This ADR records the decision not to ship that feature in XTL 0.1 (or 1.0). The rejection is deliberate, not an oversight, so that future proposers see the rationale before reopening the question.
Per ADR-0034 Corollary 3, this is the first feature-level rejection ADR following that informational principle.
Considered Options
A. Ship dynamic image insertion in 0.1. Adds a new directive or function with binary-data semantics.
B. Ship a static image-anchor preservation only (ADR-0036 item 1) and reject runtime image insertion. Templates ship images already in the file; the engine preserves them; no runtime binary pipeline.
C. Defer (no decision yet). Leaves the question open and recurring.
Decision
Adopt B. Dynamic image insertion is out of scope for XTL 0.1 and not on the roadmap to 1.0.
Why rejected
Five distinct objections, each sufficient on its own:
1. The use case is narrow in practice
Audit of real Korean vendor templates (거래명세서, 정산서, 발주서, 인보이스) over the conversation that produced ADR-0033 surfaced: every observed image was a static company logo or stamp, authored once into the template, not a per-row dynamic asset. The "per-customer logo" scenario JXLS targets is real but vanishingly rare in the operations workflows XTL is designed for. Authoring effort for a feature with thin demand is wasted authoring effort that delays features with broad demand.
2. Binary-data pipeline breaks the browser story
XTL's browser flow (xl3.io) operates on two .xlsx files: a
template and a source data workbook. Both are self-contained.
A dynamic image feature requires additional binary inputs at
render time — file paths the browser cannot resolve, base64
blobs that bloat the source workbook, or external URLs the
engine would need to fetch. Each shape breaks one of XTL's
design axes:
- File paths → host-specific I/O leak; browser cannot resolve.
- Base64 in cells → source-workbook size explosion; not how operators author data.
- Fetched URLs → introduces a network surface; security implications; cannot run offline.
The static-image preservation in ADR-0036 sidesteps all three: images live in the template (where author already put them), not in the source data.