RELEASE_LOG

Changelog

Notable changes to danielendara.com, newest first. Follows Semantic Versioning.

Unreleased

In progress

Added

  • Featured project UA 571-C (live WASM console + GitHub) on the home showcase and terminal projects command
  • /changelog page (lazy, prerendered) rendering this file in Kinetic Grid style, with command palette + footer links

Changed

  • Replaced Space Grotesk and Inter with IBM Plex Sans across the site, including the loading and offline experiences.

1.19.3

Fixed

  • Fixed ⌘K / Ctrl+K command palette not opening — Removed broken BrnDialog controlled-state/portal wiring (content lived behind @if, so open() ran before content registered and no-oped).
  • Fixed ⌘K / Ctrl+K command palette not opening — Removed double toggle: App root and palette both handled the same document keydown, so one opened and the other closed in the same event (net no-op). Palette now owns a single native capture-phase listener (same pattern as Konami).
  • Fixed Konami easter egg not appearing — BrnDialogTitle/Description/Close require a CDK BrnDialogRef that only exists inside an opened portal; applying them to an inline modal threw at render. Restored a lightweight modal, load Konami eagerly (not @defer), and match the sequence via event.code so Caps Lock cannot break B/A.
  • Shortcut matching now uses event.code === 'KeyK' (and KeyB/KeyA for Konami) instead of case-sensitive event.key.
  • HlmDialog now re-exports Brain stateChanged / closed outputs for correct controlled-dialog usage later.

1.19.2

Fixed

  • Fixed ⌘K command palette not firing — removed @defer (on idle) so component loads immediately, added global keydown handler in app root as fallback

1.19.1

Added

  • Full Spartan integration (@spartan-ng/brain + custom Helm components) for accessible UI primitives, fully restyled for the Tron "Kinetic Grid" design tokens. — Core: Button (variants + sizes via cva), Card, Badge, Separator, Tooltip, Input, Label, Toggle.
  • Full Spartan integration (@spartan-ng/brain + custom Helm components) for accessible UI primitives, fully restyled for the Tron "Kinetic Grid" design tokens. — Advanced: Command menu family (list, item, input, group, empty), complete Dialog primitives (overlay, content, title, close, etc.), Tabs, and a new Accordion port.
  • Command palette now composes Spartan hlmDialog + hlmDialogContent/Overlay with enhanced BrnCommand search wiring (preserves custom bilingual logic and UX).
  • Konami easter egg modal replaced with Spartan Dialog for proper ARIA, state, and keyboard handling.
  • Colophon demonstrates real usage: hlmTabs for Content API groupings and hlmAccordion for Workflow steps.
  • Additional action links and CTAs migrated to hlmBtn (hero, projects, colophon) for consistent focus states and variants.
  • ui/accordion Helm port added following existing patterns.

Changed

  • Bundle budgets raised (initial maxWarning/maxError to 700 kB) to account for component library size.
  • Updated project structure docs, UI README, specs, and references across README/AGENTS/CHANGELOG.
  • Pruned unused hlm-command-dialog stub (integration done via primitives instead).
  • Minor a11y and type adjustments for hostDirective outputs and accordion heading requirements.

Fixed

  • Lint and build issues surfaced during full integration (click handlers, state typing, budgets).

1.18.2

Fixed

  • Fixed colophon page auto-scrolling to bottom — removed hlmBtn from quick nav links causing focus jump
  • Fixed accordion expansion not working — added missing tw-animate-css import for height transitions
  • Fixed workflow section alignment — removed conflicting hlmBtn from accordion triggers
  • Fixed Content API tabs not showing content — changed to automatic activation so first tab renders by default

1.18.1

Changed

  • Marked Shared Wishlist project as private — shows lock icon badge instead of live link
  • Added private flag to Project model for non-public projects

1.18.0

Added

  • Featured projects showcase with Shared Wishlist (private family project)
  • Updated featured projects with newer screenshots and refreshed descriptions

Changed

  • Polished and updated Colophon page
  • Bumped Angular and dev dependencies to latest patches
  • Clarified CloudFront in Content API docs, cleaned up ENHANCEMENTS/CHANGELOG

Fixed

  • Build timestamp update for correct footer date

Added

  • _(describe new features here)_

Changed

  • _(describe changes here)_

1.17.1

Added

  • Static featured projects showcase (Frostbomb, Phasmly, Shared Wishlist with private note)
  • Colophon page polish: quick nav, grouped Content API cards (Core/Resilience/Observability & DX), updated architecture diagram for CloudFront in API

Changed

  • Updated Colophon to accurately document Content API CloudFront edge caching
  • Synced test counts (360+), Lambda runtime docs to Node.js 24
  • Cleaned duplicate entries in ENHANCEMENTS.md

Fixed

  • Lambda version references updated from 22 to 24 in Colophon and diagram to match CDK (NODEJS_24_X)

1.17.0

Added

  • CloudFront distribution in front of the content API (edge caching, Brotli compression, reduced origin load; cost-optimized, no WAF)
  • Speculation Rules API (prerender + prefetch) for faster navigation
  • Web Vitals tracking (native PerformanceObserver for LCP/FID/CLS)
  • Angular resource() adoption in ContentService for declarative data fetching (social links, SEO meta)
  • Scroll-driven CSS animations for hero parallax (progressive enhancement)
  • Path-based CloudFront caching (longer TTL for translations)
  • Externalized theme initialization script for improved CSP hygiene
  • Retries with backoff in ContentService fetches
  • Enhanced security headers across server and API responses

Changed

  • Refactored ContentService for DRY (shared fetchWithFallback + resources)
  • Refactored CDK stack with createContentLambda helper for DRY
  • Tightened CSP (removed unsafe-inline from script-src where possible)
  • Updated frontend to support/prefer CloudFront domain for content API
  • Bumped dependencies (Tailwind 4.3.1, ESLint 10.5.0, Sharp 0.35.1, etc.)
  • Updated all docs (AGENTS.md, humans.txt, etc.) and version references

Removed

  • WAF from CloudFront (to keep costs near-zero for low-traffic personal site)

1.16.0

Added

  • Error boundary component — signal-driven Tron-styled fullscreen overlay for critical errors (bilingual)
  • Service worker API caching — freshness strategy for Content API (3s timeout, 1-day cache, 10 entries)
  • Preconnect to api.danielendara.com in index.html
  • Extracted colophon architecture SVG into <app-colophon-architecture> component (738 lines, colophon template 1110 → 374 lines)

Changed

  • Refactored GlobalErrorHandler to use signal-driven ErrorBoundaryState instead of DOM manipulation
  • Updated all Angular 21 references to Angular 22 across source code, translations, and docs

1.15.0

Changed

  • Upgraded Angular 21 → 22 (all @angular/\* packages)
  • Upgraded TypeScript 5.9 → 6.0.3
  • Added ChangeDetectionStrategy.Eager to all components (Angular 22 migration) then removed — unnecessary in zoneless apps
  • Added test setup file for jsdom localStorage polyfill
  • Updated tsconfig files per Angular 22 migration
  • Made route-only components selectorless (HomeComponent, ColophonComponent, NotFoundComponent)
  • Added @angular/aria package for framework-managed accessibility primitives

1.14.10

Changed

  • Updated jsdom 27 → 29 (test environment dependency)

1.14.9

Changed

  • Updated dependencies: Angular 21.2.14, Tailwind CSS 4.3, Vitest 4.1.7, fast-check 4.8, ESLint 10.4, angular-eslint 21.4, postcss 8.5.15, typescript-eslint 8.59.4

1.14.8

Fixed

  • Isolated post-hydration init calls via safeInit() helper — one failure no longer blocks subsequent initializations (structured data, analytics, scroll progress, SEO, etc.)

1.14.7

Content

  • Added Structured Logging, CloudWatch Alarms, and X-Ray Tracing cards to colophon Content API section (EN + ES)

1.14.6

Content

  • Redesigned colophon architecture diagram: split infrastructure layer into Frontend (S3 → CloudFront) and Content API (API Gateway → Lambda → DynamoDB) tracks with shared Route 53 row, split CI/CD layer into Frontend pipeline (GitHub → CodePipeline → CodeBuild) and API deploy (CDK Deploy → CloudFormation)

1.14.5

Content

  • Expanded "Built with" tech badge strip from 9 to 19 items — now includes API stack (API Gateway, Lambda, DynamoDB, Zod, CDK), infra (S3, CloudFront, Route 53, CodePipeline), and tooling (Kiro)
  • Added Zoneless and Canvas API badges

1.14.4

Content

  • Added Rate Limiting and Input Validation cards to colophon Content API section (EN + ES)
  • Updated architecture diagram feature box to include Zod

1.14.3

Content

  • Updated colophon page: new Content API section (API Gateway, Lambda, DynamoDB, static fallback, request caching), updated architecture diagram with API layer and test count, added Content API to cost breakdown
  • Added 12 bilingual translation keys for the Content API colophon section

1.14.2

Performance

  • Added per-locale translation caching in ContentService — eliminates redundant API calls on locale toggle
  • Deduplicated concurrent fetchSocialLinks() and fetchSeoMeta() calls via shared promises — HomeComponent and CommandPaletteComponent now share a single HTTP request
  • Removed unused translationsLoaded signal

1.14.1

Fixes

  • Added 5-second AbortSignal.timeout() to all ContentService fetch calls — prevents hanging requests from blocking the fallback path

1.14.0

Features

  • Integrated Content API (api.danielendara.com) for translations, social links, and SEO metadata — decouples content updates from code deploys
  • New ContentService fetches from API Gateway + Lambda + DynamoDB with automatic static data fallback
  • TranslationService now loads translations from the API on init and on locale toggle, with instant static fallback during fetch
  • HomeComponent and CommandPaletteComponent social links update from API after render
  • App fetches SEO metadata from API and updates meta tags + structured data
  • Added contentApiUrl to environment configuration
  • Updated CSP connect-src to allow api.danielendara.com

1.14.0

Features

  • Added ContentService — fetches translations, social links, and SEO metadata from the Content API with static data fallback; uses native fetch to avoid HttpClient dependency overhead

1.13.14

Performance

  • Made Google Fonts loading non-blocking via media="print" onload="this.media='all'" with <noscript> fallback
  • Replaced JS IntersectionObserver lazy image fade-in with pure CSS @keyframes lazyFadeIn animation — zero JavaScript overhead
  • Removed dead PerformanceService.setupOptimizations() and optimizeFontLoading() methods

1.13.13

Fixes

  • Added AbortController + DestroyRef cleanup to FallbackService global image error listener
  • Replaced hardcoded English strings in consent banner details with existing translation keys (consent.analytics, consent.dataCollected, consent.privacy)
  • Updated index.html loading spinner to use Tron design system colors (neon lime #cafd00, surface #1a1919) and Space Grotesk font

1.13.12

Refactors

  • Extracted withViewTransition() utility to src/app/utils/view-transition.ts, replacing 4 duplicated startViewTransition + fallback blocks across ThemeService, App, CommandPaletteComponent, and BackToTopComponent
  • Removed dead ThemeService.detectSystemPreference() method
  • Removed unused TranslationService injection from ColophonComponent
  • Removed legacy experimentalDecorators: true from tsconfig.json — Angular 21 uses TC39 standard decorators
  • Standardized MetaService SSR guards to use isPlatformBrowser(PLATFORM_ID) instead of raw typeof window/typeof document checks

1.13.11

Fixes

  • Fixed scroll listener memory leak in BackToTopComponent — added AbortController + DestroyRef cleanup
  • Translated hardcoded English aria-labels in ThemeToggleComponent and BackToTopComponent for bilingual accessibility

Refactors

  • Migrated GlobeSphereComponent from OnDestroy interface to DestroyRef.onDestroy() for consistency with all other components

1.13.10

Performance

  • Converted TranslatePipe from impure (pure: false) to pure — eliminates redundant re-evaluation on every change detection cycle; Angular's signal-based reactivity tracks the locale signal automatically

1.13.9

Refactors

  • Removed redundant provideZonelessChangeDetection() from app.config.ts — Angular 21 is zoneless by default, explicit provider is unnecessary
  • Full Angular 21 best practices audit: all rules verified compliant

1.13.8

Docs

  • Added JSDoc to 4 services (AccessibilityService, FallbackService, LazyLoadingService, LazyAnalyticsService), 4 components (SocialLinkCardComponent, CommandPaletteComponent, ConsentBannerComponent, TerminalAboutComponent), and GlobeSphereComponent — all public methods and class-level descriptions now documented

1.13.7

Fixes

  • Terminal boot version now reads from environment.appVersion via {version} placeholder instead of hardcoded string — stays in sync with package.json automatically
  • Updated terminal boot test to assert dynamic version pattern

1.13.6

Tests

  • Added 15 unit tests for the colophon component (structure, diagram, performance, cost, workflow, accessibility)
  • Test count: 360 tests across 33 files

1.13.5

Fixes

  • Removed standalone vitest.config.ts — the Angular @angular/build:unit-test builder handles test configuration natively, including templateUrl resolution
  • All 345 tests now pass via ng test (previously 50 terminal-about tests failed when running npx vitest run directly)
  • Added forceConsistentCasingInFileNames to tsconfig.json and tsconfig.spec.json

1.13.4

Chores

  • Upgraded Angular 21.2.7 → 21.2.9, @angular/build+cli+ssr 21.2.6 → 21.2.7 (resolves platform-server SSRF and Vite path traversal advisories)
  • Upgraded vitest 4.1.2 → 4.1.4, postcss 8.5.8 → 8.5.10, prettier 3.8.1 → 3.8.3, typescript-eslint 8.58.0 → 8.58.2, @types/node 25.5.2 → 25.6.0
  • Applied npm audit fix (hono vulnerabilities resolved, 0 remaining)

1.12.1

Refactors

  • Resource cleanup using DestroyRef for event listeners, IntersectionObservers, and requestAnimationFrame in app, home, terminal, and accessibility service
  • Robust timeout management to cancel pending animations on component destruction
  • Replaced any types in test files with specific interfaces and safe casting

Chores

  • Removed accidentally committed npm_output.log
  • Added *.log to .gitignore

1.12.0

Features

  • Micro-animation on theme toggle icon — incoming sun/moon spins in from -90° with a subtle scale-up (300ms ease-out, CSS keyframes)
  • Respects prefers-reduced-motion via existing global animation disable

Content

  • Rebranded title from "Software Engineer" to "Web Technologist" across all surfaces: page title, meta tags (OG, Twitter Card), SEO data, JSON-LD, PWA manifest, OG preview SVG, translations (EN/ES), and terminal commands
  • Rebranded light mode palette name from "Digital Architect Light" to "Digital Craftsman Light" across all docs, PWA manifest, and OG preview
  • Updated nav and footer branding from "ARCHITECT" to "TECHNOLOGIST"
  • Renamed about section heading from "SYSTEM_ARCHITECT" to "TERMINAL_ACCESS"
  • Updated PWA manifest short_name from "DE_ARCH" to "DE_TECH"
  • Changed terminal prompt from "daniel@endara ~ %" to "web-user@danielendara ~ %"
  • Regenerated OG preview PNG from updated SVG source
  • Added npm run render-og script and Kiro hook to auto-render OG preview PNG when SVG is edited

Fixes

  • Added right padding to footer version text to prevent overlap with back-to-top button
  • Added keyboard event handler to terminal container for accessibility (resolves ESLint click-events-have-key-events)
  • Replaced require() with ES import in environment files (resolves ESLint no-require-imports, lint now 0 errors)
  • Fixed tailwind-config.spec.ts file path resolution for coverage runs

1.11.0

Features

  • Interactive terminal "about me" section replacing the static About block — 12 commands: whoami, skills, experience, contact, projects, help, clear, sudo hire me, ls, cat, exit, lang
  • Interactive terminal "about me" section replacing the static About block — Boot sequence animation with CRT scan line overlay
  • Interactive terminal "about me" section replacing the static About block — Command history (Up/Down), tab autocomplete
  • Interactive terminal "about me" section replacing the static About block — Output typing animation with prefers-reduced-motion bypass
  • Interactive terminal "about me" section replacing the static About block — Mobile read-only mode with tap-able command buttons
  • Interactive terminal "about me" section replacing the static About block — Bilingual EN/ES via TranslationService (lang command + reactive locale switching)
  • Interactive terminal "about me" section replacing the static About block — Virtual filesystem (ls, cat about.md, cat resume.pdf)
  • Interactive terminal "about me" section replacing the static About block — sudo hire me easter egg (opens LinkedIn)
  • Interactive terminal "about me" section replacing the static About block — Glassmorphic Tron styling with neon-outlined window chrome
  • Interactive terminal "about me" section replacing the static About block — Lazy-loaded via @defer (on viewport)
  • Interactive terminal "about me" section replacing the static About block — Accessible: role="application", aria-live, skip link, sr-only fallback
  • TranslationService.setLocale() method for direct locale setting

Tests

  • 40 example-based unit tests for the terminal component
  • 10 property-based tests (fast-check) validating correctness properties
  • Test count: 345 tests across 32 files (up from 290/30)

1.10.0

Features

  • Version number displayed in the footer (pulled from package.json at build time via environment files)
  • Footer format: v1.10.0 // LAST UPDATED: Apr 8, 2026

Fixes

  • Deployment integration test total size budget bumped from 1200KB to 1400KB (larger DE monogram PWA icons)

1.9.0

Features

  • PWA icons regenerated from DE monogram source (all 8 sizes)
  • humans.txt following humanstxt.org standard with team, tech stack, and site metadata
  • llms.txt following llmstxt.org spec with LLM-friendly site overview
  • <link rel="author"> tag added to index.html
  • Kiro steering file and agent hook for automatic doc sync

Fixes

  • Removed stale CloudFront invalidation paths (error.html, forbidden.html) from deploy.yml, deploy.sh, and build.config.js
  • Corrected test count from 310/31 to 290/30 across all docs
  • Corrected service count from 11 to 10 across all docs
  • Removed stale D3 references (globe is pure Canvas)
  • Removed stale network-aware service references

Chores

  • Deleted legacy files: backup/, root index.html, error.html, forbidden.html, public/favicon.ico, public/assets/, public/apple-touch-icon.png, public social icon duplicates, assets/optimized/, ZONELESS_MIGRATION.md
  • Added /assets/optimized to .gitignore
  • Semver alignment with full CHANGELOG and retroactive git tags (v0.1.0–v1.8.0)

1.8.0

Features

  • Social card flip animation with scan line and breathing effect

Features

  • 3D rotating point-cloud globe (D3 + Canvas) with interactive effects:
  • Hero typing animation with sequential line reveal and parallax depth
  • Dark mode as default on first visit
  • Home template extracted to separate HTML file
  • "Built with" tech badge strip

Tests

  • Increase asset file threshold to 500 for deployment validation

Refactors

  • Dead code removal and ESLint setup
  • Upgrade Tailwind CSS v3 to v4
  • Migrate PostCSS config to JSON and add Tailwind Vite plugin

Chores

  • Mark Angular packages as peer dependencies
  • Update translations data

Features

  • Tron-inspired "Kinetic Grid" design system with glassmorphism
  • Active section tracking in navigation with IntersectionObserver
  • Updated OG preview with Kinetic Grid design system
  • DE monogram favicon

Docs

  • Design system documentation and light mode palette refinements

Chores

  • Update PWA manifest and MCP emulation support

1.4.0

Features

  • Comprehensive i18n for all UI components
  • JSDoc coverage on all public APIs
  • @defer for non-critical components and enhanced hydration
  • Expanded internationalization, accessibility, and performance improvements

Fixes

  • Relax font-src CSP directive to allow data URIs

Style

  • Remove focus ring styles from command palette search input

Refactors

  • Remove unused components and simplify service exports

Tests

  • Expand component tests with comprehensive coverage (310 tests, 31 files)
  • Simplify property tests and remove unused hero content data

Docs

  • Rewrite README with comprehensive project documentation
  • Enhance buildspec for multi-action pipeline support

Features

  • Hero entrance animations with staggered fade-in-up
  • Smooth section navigation with view transitions
  • Open Graph + Twitter Card meta tags with custom preview image
  • Command palette (⌘K) with keyboard navigation
  • Internationalization support (EN/ES)
  • Back-to-top button and custom 404 page
  • Command palette trigger and Konami code easter egg
  • Parallax scrolling on hero and social cards
  • Offline fallback page (Tron-styled) and print stylesheet
  • Enhanced aria-labels with keyboard shortcuts and language codes
  • Error boundary and network-aware service with security enhancements

Features

  • Zoneless change detection and optimized asset loading
  • SEO metadata and improved accessibility labels
  • Consent banner migrated to signals with simplified state management

Refactors

  • Migrate to afterNextRender and remove AfterViewInit
  • Migrate to control flow syntax (@if, @for, @switch) and lazy load routes
  • Extract performance optimizations into dedicated service
  • Integrate theme toggle into navigation

Style

  • Dark mode styling for social platform logos

Tests

  • Fix afterNextRender lifecycle in theme service tests
  • Enable service worker and fix test isolation issues

CI

  • Format workflow YAML and enhance S3 deployment strategy

Features

  • Dark/light mode toggle with persistent storage
  • Consent banner migrated to signals

Refactors

  • Simplify markup and improve accessibility structure
  • Migrate to semantic color tokens

Fixes

  • Consent banner change detection for state updates
  • Restore test-setup.ts and update build budget thresholds

1.0.0

Features

  • Angular 21 with standalone components and zoneless architecture
  • Server-side rendering (SSR) with Express
  • AWS CodeBuild buildspec for pipeline deployment
  • CodePipeline quick start guide

Fixes

  • TypeScript configuration for AWS deployment

0.1.1

Fixes

  • Rebrand Twitter references to X across the site