Changelog
All notable changes to Image Optimizer are recorded here. Format follows Keep a Changelog.
- v0.4.0Landing & SEO
Added
- Static Site Generation (SSG) with @angular/ssr — 9 routes prerendered.
- Path-based i18n routing: /vi/, /en/, /vi/optimize, /vi/about, /vi/changelog, /vi/blog.
- Full landing page with 6 sections: Hero, Features (8 cards), How-it-works (3 steps), Comparison (vs TinyPNG/Squoosh), FAQ (8 questions), CTA.
- Marketing chrome: sticky header with nav + theme/lang switcher + "Open app" CTA; footer with links + copyright.
- About page: project story, tech stack, privacy commitment, open source, Support CTA, contact.
- Changelog page (this one) with versioned timeline.
- Central SeoService: title, description, OG/Twitter cards, canonical, hreflang × 3 (vi/en/x-default), JSON-LD.
- JSON-LD: SoftwareApplication, FAQPage, BreadcrumbList, AboutPage.
- 1200×630 SVG OG image with branding.
- theme-color meta tags for mobile chrome (light + dark).
- `npm run verify:seo` script validates prerendered HTML.
Changed
- Settings gear button moved from a floating FAB inside the app to an inline header button — only visible on /optimize.
- Theme toggle + Lang switcher moved out of image-uploader into shared/ui — reused by marketing header + app shell.
- Lang switcher now navigates via Router (preserves current path) instead of just updating a signal.
- Support modal migrated to CDK Dialog — accessible focus trap + Esc + outside click closes.
- AppShellLayout lazy-loaded via loadComponent — marketing routes no longer bundle CDK Dialog/PresetManager.
- v0.3.0Presets & Watermarks
Added
- Save multiple config presets (name + format + resize + watermark + naming).
- Export / Import presets as JSON — reuse across machines.
- Up to 5 watermarks per image (text or PNG logo).
- Watermarks support position, opacity, and size as % of image width.
- Drag-reorder watermarks + drag-reorder files before exporting zip.
- Bulk naming: prefix, suffix, auto-numbering with configurable start index.
Changed
- Watermark refactored to a discriminated union (TextWatermarkConfig | ImageWatermarkConfig) for stricter typing.
- MAX_WATERMARKS = 5 also enforced when importing presets to guard against client-side DoS.
- v0.2.0Polish & Locale
Added
- i18n: Vietnamese + English. Defaults to navigator.language, persisted in localStorage.
- Dark mode via CSS variables — follows prefers-color-scheme, manual toggle available.
- HEIC support (iPhone photos) via heic2any.
- Optional EXIF preservation (GPS, timestamps) when compressing JPEG → JPEG.
- Keyboard shortcuts: Ctrl/⌘ + O opens file picker, Ctrl/⌘ + S downloads zip, Esc closes modals.
- Tooltips show exact byte sizes.
Fixed
- Memory leak: ObjectURL is revoked when clearing the list or removing a file.
- Duplicate file names in zip — auto-appends (1), (2), …
- v0.1.0Initial release
Added
- Drag-drop multiple images or click to browse.
- 3 compression presets: Light (high quality), Medium (balanced), Max (smallest output).
- Output formats: JPEG or WebP.
- Resize modes: Auto (per preset), Width, Height, or Percent.
- Concurrent processing up to 3 images via RxJS mergeMap — never freezes the browser.
- Quality comparison modal with original vs compressed slider.
- Per-file real-time progress via Angular Signals.
- Download individual files or bundle everything as .zip via JSZip.