Changelog
All notable changes to this project will be documented in this file.
[1.9.0] - 2026-04-21
Added
- Build a Simple Blog Page — new "Before you start — what the pieces are" section orienting absolute beginners (what a website actually is, what HTML / CSS / JS each do, per-OS instructions for creating a folder and blank files in Finder / File Explorer / Linux file managers, why a word processor will not work, and what the
file://URL prefix means), plus a new Step 6 — Get this live on the internet with two full deployment walkthroughs: Option A AWS S3 static hosting (free-tier account, bucket creation with public-access block unchecked, file upload, static-website-hosting toggle, public-read bucket-policy JSON snippet, bucket-website endpoint) with caveats on HTTPS via CloudFront / billing / Netlify-Pages alternatives; Option B VPS + nginx (ssh in,apt install nginx,scpthe files up, move to/var/www/blog, minimalserver {}block at/etc/nginx/sites-available/blog, symlink intosites-enabled,nginx -tandsystemctl reload nginx) linking to the deeper VPS + nginx chapter for hardening and HTTPS; closes with an "S3 vs VPS vs Netlify" decision table
Changed
- Build a Simple Blog Page — plain-English glosses added on first use for semantic HTML, the DOM, CSS custom properties, localStorage, media query, and
<script type="module">; VS Code recommendation now explains why (syntax highlighting, not a word processor); Summary gained a deployment bullet
[1.8.0] - 2026-04-20
Added
- Build a Simple Blog Page — new Step 4 "Responsive header and footer" covering a mobile nav toggle with
aria-expanded/aria-controls+.visually-hiddenutility, a@media (max-width: 40rem)query, the adjacent-sibling combinator pattern ([aria-expanded="true"] + nav) for CSS-driven disclosure, and a multi-column footer that stacks via the samerepeat(auto-fit, minmax())trick — plus a decision table contrastingauto-fit/minmax()against@mediaqueries
Changed
- Build a Simple Blog Page — cross-reference links threaded through every step: Step 2 links to the CSS beginners' chapters on box model / colors & typography / Flexbox, plus CSS Grid / Responsive Design / CSS Custom Properties for the "two things worth understanding" notes; Step 3 links to DOM and Events chapters; the relative-dates row links to the Intl API Formatting guide; Step 5 (fetch) links to Working with Data and the Async/Await guide; Vite section links to the VPS deploy chapter; Next steps expanded with targeted chapter links plus Web Performance. Summary and "What you will build" updated to mention the responsive header and multi-column footer; previous "Step 4 -- load posts from a JSON file" renumbered to Step 5 (optional)
[1.7.0] - 2026-04-20
Added
- Build a Simple Blog Page guide — a standalone, super-beginner start-to-finish tutorial for building a working blog page with only HTML, CSS, and vanilla JavaScript (semantic markup, CSS Grid layout with
auto-fit/minmax, CSS custom properties driving adata-themedark-mode toggle,Intl.RelativeTimeFormatfor human-readable dates,localStoragepersistence, click-to-filter tags), plus an optional Step 4 that moves posts intoposts.jsonviafetchwith atype="module"/ top-level-awaitvariant, and a bonus section on when and how to adopt Vite (dev server, HMR, production build, "when is Vite worth it?" decision table) — sits at/build-a-blog, linked from the sidebar after Semantic HTML and from the home page under More Topics
[1.6.0] - 2026-04-20
Added
- Changelog page at
/changelog, rendered directly from the rootCHANGELOG.mdso the release history is browsable on the site
Changed
- Footer restructured from four thin columns (Content / Legal / Socials / Tech) into four balanced columns: Docs (AEM, Strapi, JavaScript, Java, Design Patterns), Guides (Docker, Linux, Git, Testing), More (Projects, Other, Changelog, Imprint), and Connect (LinkedIn, Xing, GitHub, Gitlab) — surfaces top content hubs, mirrors the navbar, and merges profile + repo links
- Copyright line hyphen upgraded to an em-dash
[1.5.0] - 2026-04-20
Added
- AEM Dispatcher Configuration guide — AEMaaCS vs AEM 6.5 comparison, two-layer Virtual Host Matching (Apache vhost + Dispatcher
virtualhosts.anywith farm ordering andlocalhostpitfall), Cache Warming (sitemap-driven, post-deploy, targeted), Debugging Toolkit (DISP_LOG_LEVELlevels, "why didn't this cache?" 7-step decision tree, inspection commands), Security Headers placement (CDN / Apache / Sling filter decision table), Health Check Endpoints (Dispatcher-only vs end-to-end, Kubernetes liveness/readiness split) - AEM Testing guide — expanded from stub into a full reference: test pyramid, tooling choices table, AEM Mocks vs Sling Mocks distinction,
AemContextAPI reference,ResourceResolverTypematrix (RESOURCERESOLVER_MOCK / JCR_MOCK / JCR_OAK / JCR_JACKRABBIT trade-offs), content loading patterns (JSON, Filevault XML, binary), eight concrete test patterns (Sling Model, request-adaptable model, OSGi service, service-user resolver, servlet, JCR-SQL2 query, Context-Aware Config, WireMock external HTTP), UI.tests module with WebdriverIO, Dispatcher validation CI gate, JaCoCo setup, smoke checklist, and common pitfalls
Changed
/llms.txt— added the five new beginner guides (TypeScript, Docker, Git, Testing, Linux), added links to Dialog Validation, JCR Queries and API, Context-Aware Configuration, Testing, and Security basics, fixed the broken/aem/infrastructure/dispatcher/URL to point at/aem/infrastructure/dispatcher-configuration/, removed the stale/git/entry now that the Git beginners guide is in the top section
[1.4.0] - 2026-04-20
Added
- AEM Dialog Validation guide —
validate()trigger table with.checkValidity()imperative example, "Two ways to declare a validator" subsection (validationattribute vsgranite:data/foundation-validationchild node), per-item multifield validation with partner-field revalidation, async/server-side validation with debounced fetch and cached results, expanded built-in validators split into field-level attributes and registeredfoundation.*validators, "Styling the invalid state" CSS section, and a 5-step debugging checklist - AEM Touch UI Component Dialogs — Adobe's native
cq-dialog-dropdown-showhide/cq-dialog-checkbox-showhidepattern, FieldSet grouping widget with persistence explanation (Well vs FieldSet vs Multifield comparison), fullcq:editConfigreference (drop targets, inline editors, refresh listeners, disabling default toolbar actions), link-tuple pattern (label + URL + target) with a security-awarerelSling Model
Changed
- AEM Dialog Validation guide — template validator now null-safe (
var value = (raw == null ? "" : String(raw)).trim()), selectors updated to~=space-separated-word match so fields with multiple validators still trigger - AEM Touch UI Component Dialogs —
cq-msm-lockablesection expanded from a passing mention to a full explanation (mechanics, pitfalls, composite-multifield example), Tags field extended withrootPathscoping and aTagManager-based Sling Model reader - AEM Touch UI Component Dialogs — Validation section trimmed to a declarative quick-reference that links to the dedicated Dialog Validation page, removing duplicated content
[1.3.2] - 2026-04-20
Fixed
- AEM JCR guide — SQL2 example no longer teaches query injection via user-controlled locale concatenation; now shows an allowlist pattern for caller-supplied values
- AEM JCR guide — Session API example rewritten to use
getServiceResourceResolverwith a sub-service; removed hardcodedadmin:admincredentials, fixed wrong port (4503→4502for author), dropped unusedTransientRepositoryimport, moved credentials warning out of the code fence into a:::dangeradmonition - AEM JCR guide — Groovy queries migrated from the deprecated
'sql'language to'JCR-SQL2'; xpath cleanup example rewritten as JCR-SQL2; added dev-only console warning - AEM JCR guide — fixed stray footnote marker (
>) and an orphan comment line that rendered outside its code fence; dropped obsoletejackrabbit-standalone-2.4.0.jarversion reference - AEM Context-Aware Configuration guide — HTL
<script>interpolation now uses explicit@ context="scriptString"to defend against XSS if HTL's auto-context misfires;HeaderModelnull-checks the config returned from.as(...) - AEM Security basics — service-user mapping section now distinguishes AEMaaCS (repoinit +
ui.config) from 6.5 (OSGi Console / Users admin UI) delivery
Changed
- AEM Architecture — moved
WCMUsePojoout of the Sling Models comparison table into a dedicated "legacy" aside to avoid implying it is still a current choice - AEM curl examples across Architecture, Groovy Console, Content Fragments, GraphQL, and Servlets guides now carry a consistent "Local SDK / dev only" note above every
admin:adminblock
[1.3.1] - 2026-04-20
Fixed
- Removed duplicate "Git" entry in the sidebar caused by a standalone
docs/git.mdcolliding with thedocs/git/beginners-guide category (both claimed slug/git); standalone reference removed and intro link updated to point at the beginners guide
[1.3.0] - 2026-04-20
Added
- Enabled Umami session replay by default via
recorder.jswithdata-sample-rate="0.25",data-mask-level="moderate", anddata-max-duration="300000"attributes
Changed
- Migrated Umami script host to
umami.lucanerlich.com
[1.2.1] - 2026-04-18
Fixed
- Removed
sitemap.lastmod: 'date'which caused Docker production builds to fail because the build container has no git worktree
[1.2.0] - 2026-04-18
Added
- TypeScript beginner guide (12 chapters) — basic types through advanced mapped types, utility types, and real-world usage with React and Node.js
- Docker beginner guide (12 chapters) — first container through multi-stage builds, Docker Compose, secrets, registries, and production hardening
- Git beginner guide (12 chapters) — first commit through rebasing, collaborative workflows (GitHub Flow, GitFlow, trunk-based), and hooks
- Testing beginner guide (12 chapters) — Jest/Vitest and JUnit 5, mocking with Mockito, TDD, React Testing Library, Playwright e2e, and coverage
- Linux beginner guide (12 chapters) — filesystem navigation through bash scripting, networking, package management, and VPS hardening
- Navbar restructured into Language and Guides dropdowns to accommodate the expanded content
Fixed
- Quoted
@-prefixed YAML keywords in testing and TypeScript frontmatter that caused build failures
[1.1.2] - 2026-04-18
Added
- GitHub Actions CI workflow — builds on every PR and push to
main, catching broken links before deployment - Projects and Other sections added to the top navbar for direct discoverability
- Preconnect hints for Algolia DocSearch domains to reduce search latency
- Frontmatter (title, description, tags, keywords, sidebar position) added to all four project pages
- Description added to the Projects category generated-index page
- Content column added to the footer with links to Projects and Other
Changed
- Twitter card type upgraded to
summary_large_imagefor full-width social share previews - OG image (
avatar-ai.jpg) compressed from 404 KB to 120 KB at 1200×1200 - Navbar logo alt text corrected from the Docusaurus placeholder to "Luca Nerlich logo"
- Purple accent colour in light mode adjusted to
#2d2aa8to pass WCAG AA contrast future.experimental_fasterconfig key renamed tofuture.fasterfor Docusaurus 3.10.0/projects/and/other/category slugs made explicit so navbar links resolve correctly- Node.js version in
.nvmrccorrected fromv16.15.0tov22 engines.npminpackage.jsoncorrected toengines.pnpm- Image alt text on GoAccess and Discord Analyzer pages made descriptive
Removed
- Unused
blog/authors.ymland emptyblog/directory - Dead
.font-greenCSS rule - Dead
"className": "archive"attribute from the Other category config
[1.1.1] - 2026-04-13
Fixed
- Fixed missing closing quotes in QueryBuilder predicates code example
- Fixed Groovy closure arrow syntax and incorrect
slingRequestbinding in JCR guide - Updated Groovy Console GitHub link to current
orbinson/aem-groovy-consolerepository - Fixed outdated file upload component path in practice projects
- Added security warning for hardcoded credentials in client-side JavaScript example
- Clarified RTE sanitization vs HTL escaping layers in HTL Templates chapter
- Marked
currentDesignas deprecated in AEMaaCS - Corrected Dispatcher filter matching to explain last-match-wins semantics
- Added authentication headers to GraphQL curl examples
Added
- Introduced
sling:resourceSuperTypeand proxy component inheritance in JCR & Sling chapter - Added
@Referencecardinality and target filter examples in OSGi Fundamentals - Added
@Defaulttype-specific annotation variants table in Sling Models chapter - Added multifield
compositevs non-composite explanation in Component Dialogs - Added file upload Sling Model reading example in Component Dialogs
- Documented
customheaderlibs.htmllookup mechanism and breakpoint customization in Templates chapter - Added GraphQL field name case sensitivity note and field name mapping explanation
- Expanded Dispatcher stat file mechanics with flush action explanation and query string caching behavior
- Added
.cfg.jsonformat requirement and AEMaaCS-only note for environment variable placeholders - Added
@ObjectClassDefinitionconfig interface example in Deployment chapter - Added warning about not closing request-scoped resolvers in Architecture reference
[1.1.0] - 2026-04-13
Added
- Added
/llms.txtroute following the llmstxt.org proposal, providing LLM-friendly site information with curated links to all documentation sections