This release includes breaking changes for platform teams planning a safe upgrade.
Published 1mo
Build & Package
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
business-documents
cv-templates
declarative-api
document-generation
invoice-template
java
+12 more
java-17
layout-engine
maven
pagination
pdf
pdf-generator
pdf-lib
pdf-library
pdfbox3
report-generation
snapshot-testing
template-engine
Summary
AI summaryUpdates Templates v2, Bug fixes, and Public API across a mixed release.
Full changelog
v1.6.5 — 2026-05-30
Templates v2
- Added the
CenteredHeadlineCV preset to thecv/v2layered
template surface, including its isolated theme tokens, visual
regression baselines, and reusableSubheadline/
SectionHeader.flatSpacedCapswidget support. - Added the Mint Editorial template set: a two-page, two-column
editorial CV presetMintEditorial(centred spaced-caps masthead with
a full-width mint accent rule; sidebar contact / interests / education /
expertise / skill-bars / social beside a profile / experience / awards /
references main column) and its pairedMintEditorialLetter, both on
CvTheme.mintEditorial()and with visual regression baselines. - Added two reusable
cv/v2/widgets:SkillBar(data-driven proficiency
bar — spaced-caps label above a track with a level-positioned marker;
no bar when the level is absent) andIconTextRow(inline icon + text
row, optionally a single click target), withWidgetSmokeTestcoverage. - Added optional proficiency levels to
SkillGroupvia the new
CvSkillrecord andSkillsSection.Builder.leveledGroup(...). Fully
backward-compatible: name-only skills carry no level and every existing
name-based renderer is unaffected. - Added
MintEditorial.Options(and a matchingMintEditorialLetter.Options)
— an additive masthead colour API (accent, rule, name, and an optional
full-width page-1 header band) whose defaults reproduce the stock render
exactly, so the committed look and the parity baselines are unchanged.
Public API
PageBackgroundFillband helpers. AddedtopBand,bottomBand,
band,topBandPoints, andbandPointsfactory methods for full-width
horizontal background bands (top, bottom, or arbitrary vertical offset;
ratio- or point-based), complementing the existing column helpers and
building on the v1.6.5 y-coordinate fix below.
Bug fixes
PageBackgroundFilly-coordinate. A partial-height page-background
fill (heightRatio < 1.0) was painted from the page bottom upward
instead of from theyRatiotop edge the API documents, so a band with
yRatio = 0rendered at the bottom of the page. Fills now convert the
top-down ratios to the PDF bottom-up origin correctly
(y = (1 - yRatio - heightRatio) * pageHeight); full-page and
full-height column fills are unchanged. Adds top-/bottom-/mid-band
regression tests.GraphCompose.document().pageBackgrounds(emptyList())now actually
clears. The builder's Javadoc promised that an explicit empty list
overrides any earlierpageBackground(color)on the same builder, but
the implementation skipped empty lists, sopageBackground(LIGHT_GRAY)
followed bypageBackgrounds(List.of())still emitted the grey
background. The guard is removed; the empty list is now the documented
clear. Adds a regression test.distributeRowSlotWidthsweights / children mismatch. When a row
was constructed with aweightslist whose size did not match the
number of children (only reachable by bypassingRowBuilderand
building aRowNodedirectly), the engine's row distribution code
walked off the end of theweightslist with a raw
IndexOutOfBoundsException. Both row-distribution call sites
(LayoutCompiler#distributeRowSlotWidths,NodeDefinitionSupport#measureRow)
now reject the mismatch with anIllegalArgumentExceptionwhose
message names both sizes and the expected fix.RowNode's canonical
constructor already validated this at construction time; the new
engine guards are defence-in-depth for any path that bypasses it
(e.g. reflection-based deserialization). Adds regression tests for
the canonical-constructor IAE and theRowBuilder.build()ISE.
Build
byte-buddyis now<scope>test</scope>. Mockito already excludes
its transitivebyte-buddyand the project pins a single version in a
standalone dependency; that dependency was missing a scope, so the
published POM advertisedbyte-buddyas a compile dependency even
though no production code references it. Setting<scope>test</scope>
keeps the version pin but keepsbyte-buddyout of consumers' runtime
classpath (mvn dependency:treeshows it only as:test).- CI
exec-maven-pluginversion drift removed. The CI workflow's
three benchmark steps invoked
org.codehaus.mojo:exec-maven-plugin:3.5.0:javadirectly, while
benchmarks/pom.xmlalready declaredexec-maven-pluginat3.6.3
for local runs — a silent version split between CI and local invocations
that grew the surface area to keep aligned. CI now calls the configured
plugin viaexec:java, picking up the pinned3.6.3from
benchmarks/pom.xml. No behaviour change; one fewer hardcoded version
to bump.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About GraphCompose 2.0
All releases →Related context
Related tools
Earlier breaking changes
- v2.0.0 Package rename: layered template packages dropped `.v2` suffix; update imports.
- v2.0.0 Removed dormant ECS engine internals (EntityManager, SystemECS, Entity components, render pipeline).
- v2.0.0 Removed linkOptions() accessor; use linkTarget() and ExternalLinkTarget.options().
- v2.0.0 Removed PDF‑typed document‑chrome overloads on DocumentSession; use backend‑neutral metadata/watermark/protect/header/footer.
- v2.0.0 Removed DSL name-aliases DocumentSession.builder() and DocumentDsl.text(); use builder() and paragraph().
Beta — feedback welcome: [email protected]