Image Optimizer
Open app →

Changelog

All notable changes to Image Optimizer are recorded here. Format follows Keep a Changelog.

  1. 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.
  2. 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.
  3. 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), …
  4. 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.