# ADR 0004: Astro + Svelte for Frontend - **Status**: Accepted - **Date**: 2025-02-01 - **Track**: Software ## Context KoproGo targets low carbon footprint (< 0.5g CO2/request) which requires minimal JavaScript in the browser. We need a frontend that: 1. Renders fast with minimal JS 2. Provides interactivity where needed (forms, dashboards) 3. Supports multi-language (FR, NL, EN) 4. SEO-friendly for marketing pages 5. Easy deployment (static hosting) ## Decision We chose **Astro** as the meta-framework with **Svelte** for interactive components. **Astro** provides: - **Zero JS by default**: Only ships JavaScript for interactive components - **Islands Architecture**: Hydrate only what's needed - **Framework agnostic**: Can mix Svelte, React, Vue in same project - **Static Site Generation**: Build to static HTML/CSS/JS **Svelte** for interactivity: - **No virtual DOM**: Compiles to vanilla JS, smaller bundles - **Reactive by default**: Simple syntax without hooks/lifecycle boilerplate - **Excellent DX**: Less code than React/Vue for same functionality ## Consequences **Positive**: - ✅ **Minimal JavaScript**: Astro pages ship ~0-5KB JS vs 100KB+ React SPAs - ✅ **Fast load times**: Static HTML loads instantly, JS hydrates progressively - ✅ **Low carbon**: Less data transfer = less energy = lower CO2 - ✅ **SEO-friendly**: Server-rendered HTML crawlable by search engines - ✅ **Developer experience**: Svelte's syntax is clean and intuitive **Negative**: - ⚠️ **Smaller ecosystem**: Fewer Svelte component libraries than React - ⚠️ **Server rendering**: Complex real-time features need separate architecture **Measured results**: - Bundle size: ~15KB JS (gzipped) for interactive pages - Initial load: < 1s on 3G - Lighthouse scores: 95+ across all metrics ## Alternatives Considered 1. **React + Next.js**: - ✅ Largest ecosystem, most developers - ❌ Heavy bundles (100KB+ baseline) - ❌ Complex hydration (CLS issues) - **Verdict**: Rejected due to JS size 2. **Vue + Nuxt**: - ✅ Good DX, lighter than React - ❌ Still ships more JS than needed - **Verdict**: Close second, Astro+Svelte preferred for performance 3. **HTMX + Go templates**: - ✅ Minimal JS, server-driven - ❌ Limited interactivity without custom JS - **Verdict**: Considered for future admin panel, too limiting for MVP ## Next Steps - ✅ Implement core pages (login, dashboard, buildings) (**Done**) - ⏳ Add Storybook for component documentation - ⏳ Optimize images (WebP, lazy loading) - ⏳ Evaluate Astro DB for user preferences (Phase 2) ## References - Astro: https://astro.build - Svelte: https://svelte.dev - Islands Architecture: https://jasonformat.com/islands-architecture/