Technical Choices Rationale: Why Svelte & SvelteKit?
Platform: Digital Workspace Ecosystem
Created: 2025-10-27
Last Updated: 2025-10-27
šÆ Executive Summary
Platform ini menggunakan SvelteKit sebagai fullstack framework dengan Svelte 5 sebagai client-side rendering. Dokumentasi ini menjelaskan mengapa pilihan ini dibuat dan bagaimana ini mendukung visi platform: Transparansi, Integritas, Kedaulatan, dan Kesederhanaan.
Core Principles of This Platform
- Transparansi (Transparency) - Open source, auditable code
- Integritas (Integrity) - Honest, accountable, no hidden agendas
- Kedaulatan Data (Data Sovereignty) - User owns their data
- Keep It Simple - Minimal, intuitive, no bloat
- Not Bloated - Lean, fast, efficient
š Framework Comparison
Quick Comparison Table
| Aspect | Svelte | React | Vue | Angular |
|---|---|---|---|---|
| Runtime Size | ā 0KB (compiled) | ā ~42KB | ā ļø ~34KB | ā ~143KB |
| Boilerplate | ā Minimal | ā Verbose | ā ļø Moderate | ā Heavy |
| Learning Curve | ā HTML/JS | ā ļø JSX | ā ļø Template | ā Complex |
| TypeScript | ā Native | ā ļø Optional | ā ļø Optional | ā Native |
| Performance | ā Compile-time | ā ļø Runtime VDOM | ā ļø Runtime VDOM | ā ļø Runtime |
| Bundle Size | ā Tiny | ā Large | ā ļø Medium | ā Very Large |
| Developer UX | ā Native-like | ā ļø Abstracted | ā ļø Templates | ā Complex |
| Community | ā ļø Growing | ā Huge | ā Large | ā ļø Enterprise |
| Open Source | ā MIT | ā MIT | ā MIT | ā MIT |
š Why Svelte for Client-Side Rendering?
1. Zero-Runtime Overhead
Svelte adalah compiler, bukan framework runtime.
// Svelte: What you write
<script>
let count = 0;
function increment() {
count += 1;
}
</script>
<button onclick={increment}>{count}</button>
Compiled output:
// Pure JavaScript - no framework overhead
let count = 0;
function increment() { count += 1; updateButton(); }
function updateButton() {
document.querySelector('button').textContent = count;
}
React equivalent (needs runtime):
import React, { useState } from 'react'; // ~42KB framework
function Counter() {
const [count, setCount] = useState(0); // VDOM overhead
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
Why it matters:
- ā Smaller bundles = Faster load times
- ā Less JavaScript = Better mobile performance
- ā Lower carbon footprint = Sustainable computing
- ā Edge-friendly = Cloudflare Workers compatible
2. Native HTML/JSS (Not Template Language)
Svelte feels like HTML:
<!-- Natural, readable, no learning curve -->
<div class="card">
{#if isOpen}
<p>{content}</p>
{/if}
</div>
React (JSX):
// Requires learning JSX, feels abstracted
<div className="card">
{isOpen && <p>{content}</p>}
</div>
Vue (Template syntax):
<!-- Requires learning template directives -->
<div v-if="isOpen" class="card">
<p>{{ content }}</p>
</div>
Why it matters for this project:
- ā Lower barrier to entry for contributors
- ā Easier for Indonesian developers to contribute
- ā Less cognitive overhead = More productive
- ā Aligns with transparency (code is readable)
3. Reactive by Default
Svelte reactivity is automatic:
<script>
let count = 0; // Automatically reactive
function increment() {
count += 1; // Change triggers UI update
}
</script>
<button onclick={increment}>{count}</button>
No hooks, no abstractions, just JavaScript:
// Svelte 5 Runes (new!)
let count = $state(0); // Explicit state
let doubled = $derived(count * 2); // Computed value
let effect = $effect(() => console.log(count)); // Side effect
Compare to React:
// Need to import, use hooks, remember rules
import { useState, useEffect, useMemo } from 'react';
function Component() {
const [count, setCount] = useState(0);
const doubled = useMemo(() => count * 2, [count]);
useEffect(() => console.log(count), [count]);
// ... 3 more functions to learn
}
Why it matters:
- ā New contributors can start immediately
- ā Less "gotchas" = Fewer bugs
- ā No mental overhead for reactivity rules
- ā Predictable behavior
4. Type Safety Built-In
SvelteKit + TypeScript = Native Integration:
// Automatic type inference for props
<script lang="ts">
import type { PageData } from './$types';
// Types are inferred automatically
let { data }: { data: PageData } = $props();
// Full autocomplete and type checking
let user = data.user; // TypeScript knows the structure!
</script>
No type manual setup needed!
Compare to other frameworks:
- React: Requires manual prop types or separate setup
- Vue: TypeScript support is add-on, not native
- Angular: Native but heavy and over-engineered
Why it matters:
- ā Fewer bugs before runtime
- ā Better IDE support
- ā Self-documenting code
- ā Refactoring safety
5. Performance: Compile-Time Optimization
Svelte compiles to optimized JavaScript:
Bundle size comparison (Hello World app):
- Svelte: 1.2 KB (pure JS)
- React: 43 KB (runtime required)
- Vue: 34 KB (runtime required)
- Angular: 250 KB+ (full framework)
Runtime performance:
Benchmark (1000 components update):
- Svelte: 2.8ms (direct DOM updates)
- React: 15.3ms (VDOM diff + update)
- Vue: 12.7ms (VDOM diff + update)
Why it matters for this platform:
- ā Fast even on slow connections (Indonesia)
- ā Lower hosting costs (less bandwidth)
- ā Better mobile experience
- ā Aligns with "lightweight" platform vision
6. Open Source & Transparent
Svelte is MIT License (open source):
// You can see exactly what code is generated
// No hidden magic, no proprietary runtime
// Everything is transparent and auditable
Community-driven development:
- ā Growing community (especially in 2024-2025)
- ā Active maintainers and contributors
- ā No corporate control (unlike React/Facebook)
- ā Aligns with our "transparency" values
Why it matters:
- ā Platform philosophy: Transparent technology
- ā No vendor lock-in
- ā Community over corporation
- ā Build trust with users
7. Edge Computing Ready
SvelteKit works perfectly with Cloudflare Workers:
// Zero-config edge deployment
// Server functions run on edge
// Client code is pre-compiled
// No Node.js runtime needed
Cloudflare compatibility:
- ā Runs on Cloudflare Workers
- ā Small bundle = Fast cold starts
- ā Globally distributed
- ā Aligns with our "edge-first" architecture
š Why SvelteKit for SSR?
1. Full-Stack in One Framework
SvelteKit handles everything:
// routes/docs/[slug]/+page.server.ts
export async function load({ params }) {
// Server-side logic
const data = await fetchFromDatabase(params.slug);
return { data }; // Automatically serialized
}
<!-- routes/docs/[slug]/+page.svelte -->
<script lang="ts">
let { data } = $props(); // Server data available!
</script>
<h1>{data.title}</h1>
No need to:
- ā Setup separate API layer
- ā Configure routing manually
- ā Handle data fetching logic
- ā Manage state synchronization
Why it matters:
- ā Faster development
- ā Less boilerplate = Less bugs
- ā Easier for new contributors
- ā Unified mental model
2. Static Generation by Default
SvelteKit prerenders by default:
// All pages are prerendered at build time
// HTML is generated statically
// SEO-friendly from day 1
Production build size:
.svelte-kit/cloudflare/
āāā index.html (prerendered)
āāā docs/VISION_AND_MANIFESTO.html (static)
āāā index.js (edge worker - minimal)
Why it matters:
- ā SEO-friendly documentation
- ā Fast first contentful paint
- ā Better accessibility
- ā Work offline (with service worker)
3. Type-Safe End-to-End
Full TypeScript support across client & server:
// Server load function
export async function load({ params }) {
return {
slug: params.slug,
html: "..."
};
}
// Auto-generated types (no manual setup!)
import type { PageData } from './$types';
let { data }: { data: PageData } = $props();
// TypeScript knows data.slug and data.html exist!
Why it matters:
- ā Catch bugs at compile time
- ā Refactoring safety
- ā Self-documenting code
- ā Better IDE experience
4. File-Based Routing
Intuitive routing structure:
routes/
āāā +page.svelte ā / (home)
āāā about/
ā āāā +page.svelte ā /about
āāā docs/
ā āāā +page.svelte ā /docs (index)
ā āāā [slug]/
ā āāā +page.server.ts ā /docs/[slug] (dynamic)
ā āāā +page.svelte
No routing config needed!
Compare to Next.js:
// Need to configure manually
export async function getStaticPaths() { ... }
export async function getStaticProps() { ... }
Why it matters:
- ā Easy to understand for new contributors
- ā Less configuration = Less errors
- ā Visual code organization
- ā Faster onboarding
5. Edge Deployment Support
Native Cloudflare Pages integration:
// svelte.config.js
import adapter from '@sveltejs/adapter-cloudflare';
export default {
kit: { adapter: adapter() }
};
That's it! One line configuration.
Compare to Next.js:
- Need to configure
next.config.js - Need to handle edge runtime exceptions
- Need to bundle separations
- More configuration complexity
Why it matters:
- ā Simple deployment
- ā Edge-first architecture (our choice!)
- ā Global performance
- ā Lower latency
6. Middleware & Hooks System
Easy to add cross-cutting concerns:
// src/hooks.server.ts
export async function handle({ event, resolve }) {
// Auth, logging, etc.
const response = await resolve(event);
return response;
}
No need for complex middleware systems!
šÆ Decision Matrix: Why SvelteKit Wins
For Digital Workspace Ecosystem
| Criteria | SvelteKit | Next.js | Nuxt | Remix |
|---|---|---|---|---|
| Bundle Size | ā Smallest | ā Large | ā ļø Medium | ā ļø Medium |
| Learning Curve | ā Lowest | ā ļø Medium | ā ļø Medium | ā ļø Medium |
| Edge Support | ā Native | ā ļø Partial | ā ļø Partial | ā Good |
| TypeScript | ā Native | ā Good | ā Good | ā Good |
| Developer UX | ā Excellent | ā ļø Good | ā ļø Good | ā ļø Good |
| Community Size | ā ļø Growing | ā Huge | ā Large | ā ļø Small |
| Documentation | ā Excellent | ā Excellent | ā Excellent | ā Good |
| Performance | ā Best | ā ļø Good | ā ļø Good | ā ļø Good |
| Simplicity | ā Best | ā Complex | ā ļø Moderate | ā ļø Moderate |
| Open Source | ā MIT | ā MIT | ā MIT | ā MIT |
Winner: SvelteKit (Best overall score for our needs)
š¤ Alternatives Considered
1. React + Next.js (Not chosen)
Pros:
- ā Huge ecosystem
- ā Large community
- ā Many libraries
Cons:
- ā Larger bundle size
- ā Complex mental model
- ā More boilerplate
- ā Verbose syntax
- ā Not edge-native
Decision: Not chosen because bundle size and learning curve don't align with our "accessible" philosophy.
2. Vue + Nuxt (Not chosen)
Pros:
- ā Good performance
- ā Template syntax is familiar
- ā Good documentation
Cons:
- ā Still has runtime overhead
- ā Template directives learning curve
- ā Less edge-native than Svelte
- ā Growing slower than Svelte
Decision: Not chosen because Svelte offers better performance and simpler syntax.
3. Angular (Not considered)
Why not:
- ā Too heavy for this project
- ā Steep learning curve
- ā Over-engineered for our needs
- ā Enterprise-focused (we're community-focused)
Decision: Not considered - doesn't align with "lightweight" philosophy.
š” Real-World Examples
Example 1: Our Documentation Pages
What we built:
<!-- Dynamic markdown rendering -->
<script lang="ts">
let { data } = $props();
let showSticky = $state(false);
function checkScroll() {
// Direct DOM manipulation
const article = document.querySelector('article');
showSticky = window.scrollY < article.offsetHeight;
}
</script>
{#if showSticky}
<div class="fixed bottom-4">
<a href="/docs">ā Back</a>
</div>
{/if}
Why this works in Svelte:
- ā Direct DOM access (no abstraction)
- ā
Automatic reactivity (
$state) - ā Conditional rendering is simple
- ā No hooks or lifecycle management needed
In React, this would be:
import { useState, useEffect } from 'react';
function Component({ data }) {
const [showSticky, setShowSticky] = useState(false);
useEffect(() => {
const handleScroll = () => {
const article = document.querySelector('article');
setShowSticky(window.scrollY < article.offsetHeight);
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return showSticky ? <div>...</div> : null;
}
More verbose, more setup!
Example 2: Form Handling
Svelte form:
<script>
let email = '';
let error = '';
async function handleSubmit() {
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ email })
});
if (!response.ok) {
error = 'Login failed';
}
}
</script>
<form onsubmit={handleSubmit}>
<input bind:value={email} type="email" />
{#if error}<p class="error">{error}</p>{/if}
<button>Submit</button>
</form>
Simple, intuitive, no abstractions!
React equivalent:
import { useState, useCallback } from 'react';
function Form() {
const [email, setEmail] = useState('');
const [error, setError] = useState('');
const handleSubmit = useCallback(async (e) => {
e.preventDefault();
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ email })
});
if (!response.ok) {
setError('Login failed');
}
}, [email]);
return (
<form onSubmit={handleSubmit}>
<input value={email} onChange={(e) => setEmail(e.target.value)} />
{error && <p className="error">{error}</p>}
<button>Submit</button>
</form>
);
}
More hooks, more setup!
š Alignment with Platform Values
1. Transparansi (Transparency)
- ā Code is readable (like HTML/JS)
- ā No hidden abstractions
- ā Community-driven
- ā MIT License
- ā Open source framework
- ā Full transparency of compiled code
2. Integritas (Integrity)
- ā Honest assessment of trade-offs
- ā No marketing hype
- ā Community over corporation
- ā Practical solutions over buzzwords
- ā Accountable development practices
3. Kedaulatan Data (Data Sovereignty)
- ā Open source framework
- ā No vendor lock-in
- ā Can self-host everything
- ā Full control over infrastructure
4. Keep It Simple
- ā Minimal boilerplate
- ā Intuitive syntax (like HTML)
- ā Lower learning curve
- ā Fewer concepts to master
- ā No need to learn "framework patterns"
- ā Better for new contributors
5. Not Bloated
- ā Small bundle size (1.2KB vs 43KB)
- ā Zero runtime overhead
- ā Fast load times
- ā Mobile-friendly
- ā Lightweight dependencies
- ā Edge-deployable
š Resources for Contributors
Getting Started with SvelteKit
- Official Docs: https://kit.svelte.dev
- Svelte Tutorial: https://svelte.dev/tutorial
- Svelte 5 Runes: https://svelte.dev/docs/svelte-compiler#runes
- Examples: https://github.com/sveltejs/kit/tree/master/examples
Learning Path for New Contributors
- Day 1: Read Svelte tutorial (2-3 hours)
- Day 2: Build a small component
- Day 3: Understand SvelteKit routing
- Day 4: Start contributing to this project!
Why This Stack is Sustainable
- ā Svelte is growing rapidly (2024-2025)
- ā SvelteKit is stable and production-ready
- ā Community is supportive
- ā Documentation is excellent
- ā Future-proof (compiler-based approach)
ā ļø Trade-offs & Challenges
Honest Assessment: What We Need to Anticipate
While SvelteKit is an excellent choice for this project, the team and contributors should be aware of these challenges:
1. Smaller Ecosystem vs React/Vue
Challenge:
npm search "react-*" ā 250,000+ packages
npm search "vue-*" ā 50,000+ packages
npm search "svelte-*" ā 5,000+ packages
What it means:
- ā ļø Fewer pre-built components available
- ā ļø Less Stack Overflow solutions
- ā ļø Fewer tutorials and guides
- ā ļø Less third-party integration ready-made
Impact on this project:
- Most UI components need to be built from scratch
- Need to adapt React/Vue components manually
- May take longer to find solutions for specific problems
Mitigation:
- ā Create reusable component library for this project
- ā Document common patterns and solutions
- ā Build design system early
- ā Use web standards (works across frameworks)
2. Smaller Community & Learning Resources
Challenge:
| Resource Type | React | Vue | Svelte |
|---|---|---|---|
| Stack Overflow | 1M+ questions | 350K+ | 50K+ |
| YouTube Tutorials | 10M+ videos | 3M+ | 200K+ |
| Third-party Docs | Extensive | Good | Growing |
| Job Market | Huge | Large | Small but growing |
What it means:
- ā ļø Harder to find answers to specific problems
- ā ļø Fewer video tutorials in Indonesian
- ā ļø Less Stack Overflow coverage
- ā ļø Smaller job market (if contributors want career)
Impact on contributors:
- New contributors might struggle to find resources
- Indonesian speakers may have fewer localized materials
- Need more self-learning and experimentation
Mitigation:
- ā Maintain comprehensive project documentation
- ā Create "Common Problems & Solutions" guide
- ā Encourage contributors to document their learnings
- ā Build internal knowledge base
- ā Provide mentorship for new contributors
3. Less Enterprise Adoption
Challenge:
Companies using each framework:
- React: Facebook, Netflix, Airbnb, Twitter (millions of sites)
- Vue: Alibaba, Xiaomi, Nintendo
- Svelte: The New York Times, 1Password, Square (growing, but smaller)
What it means:
- ā ļø Fewer "proven at scale" examples
- ā ļø Less confidence from enterprise stakeholders
- ā ļø Harder to convince clients/business of tech choice
- ā ļø Fewer enterprise tools integration
Impact on this project:
- May need to justify tech choice to stakeholders
- Less "safe choice" perception
- Need to prove scalability ourselves
Mitigation:
- ā Emphasize the technical benefits (performance, bundle size)
- ā Show real-world usage (NYT, 1Password)
- ā Build and document scaling experiences
- ā Focus on outcomes, not framework popularity
4. Migration & Learning Curve
Challenge for Contributors with React/Vue Background:
Common confusions:
// They might expect:
import { useState, useEffect } from 'react'; // ā Not needed in Svelte
// React pattern:
const [count, setCount] = useState(0); // ā Verbose
// Svelte pattern (what they need to learn):
let count = 0; // ā
Automatic reactivity
What it means:
- ā ļø Contributors need to "unlearn" React patterns
- ā ļø Different mental model
- ā ļø Need training/support initially
- ā ļø Slower onboarding for experienced developers
Impact on productivity:
- Contributors with React experience might be slower at first
- Code reviews need to catch "React-style" mistakes
- Need more documentation on "how we do things here"
Mitigation:
- ā Create migration guide: "Coming from React?"
- ā Pair programming with experienced Svelte developers
- ā Code review with focus on "Svelte way"
- ā Internal training sessions
- ā Start with small tasks to learn patterns
5. Less Mature Tooling
Challenge:
Development tools maturity:
- React DevTools: Mature, feature-rich
- Vue DevTools: Good
- Svelte DevTools: Growing, but less features
What it means:
- ā ļø Debugging can be harder
- ā ļø Fewer IDE extensions
- ā ļø Less profiling tools
- ā ļø Slower feature development in tooling
Impact on development:
- Debugging performance issues takes more effort
- Need to rely on browser DevTools more
- Less visibility into component state
Mitigation:
- ā Use browser DevTools effectively
- ā Add console logging strategically
- ā Create debugging guide
- ā Contribute to Svelte DevTools if needed
- ā Use Chrome DevTools performance profiling
6. Job Market & Career Impact
Challenge:
Job market in Indonesia (2024):
- React developers: High demand, 2000+ jobs
- Vue developers: Medium demand, 500+ jobs
- Svelte developers: Low demand, 50+ jobs
What it means:
- ā ļø Harder to find Svelte jobs in Indonesia
- ā ļø Contributors may need to learn React for career
- ā ļø Fewer companies understand the tech
- ā ļø Less "resume value" in traditional hiring
Impact on contributors:
- May limit career options in Indonesia
- Need to learn React anyway for market
- Less opportunity to use at other companies
Mitigation:
- ā Emphasize learning transferable skills
- ā Document that Svelte skills = better understanding of web fundamentals
- ā Svelte knowledge makes you better at React/Vue
- ā Focus on building portfolio, not just framework
- ā Be honest: "Learn Svelte here, but know React is still in demand"
7. Breaking Changes & Churn
Challenge:
Framework evolution:
- Svelte 3 ā Svelte 4 ā Svelte 5 (major changes in short time)
- Svelte 5 Runes is a significant paradigm shift
Recent major changes:
// Old way (Svelte 4):
let count = 0;
function increment() {
count += 1; // Automatic reactivity
}
// New way (Svelte 5 Runes):
let count = $state(0); // Explicit state
function increment() {
count += 1; // Still works
}
What it means:
- ā ļø Code might need updates when framework changes
- ā ļø Breaking changes more frequent than React
- ā ļø Need to keep up with framework evolution
- ā ļø More refactoring required over time
Impact on maintenance:
- Need to stay updated with Svelte changes
- Migration guides needed
- May break existing code
- Requires ongoing education
Mitigation:
- ā Pin Svelte version for stability
- ā Document breaking changes
- ā Create upgrade guides
- ā Test extensively after updates
- ā Stay informed about roadmap
8. Third-Party Integration Challenges
Challenge:
Integration with popular services:
// React has official libraries:
import { GoogleMapsReact } from 'google-maps-react'; // ā
Official
import { StripeProvider } from 'react-stripe-js'; // ā
Official
// Svelte equivalents may be missing or less mature:
// Most packages need manual integration
// Or need to create adapters
What it means:
- ā ļø Popular services prioritize React
- ā ļø Need to create our own wrappers
- ā ļø Integration takes more time
- ā ļø May need to use vanilla JavaScript instead
Impact on feature development:
- Adding Google Maps: Easy in React, harder in Svelte
- Payment integration: More setup needed
- Chart libraries: Fewer options
- Form builders: Need to build ourselves
Mitigation:
- ā Use vanilla JavaScript when possible
- ā Create reusable integration utilities
- ā Document integration patterns
- ā Build project-specific adapters
- ā Use Web Components (framework agnostic)
šÆ Honest Comparison: React vs Svelte for This Project
If We Chose React Instead:
Pros:
- ā Larger ecosystem (easier to find solutions)
- ā More developers available in Indonesia
- ā More learning resources in Indonesian
- ā Easier to hire contributors
- ā More third-party integrations
- ā Larger community support
Cons:
- ā Larger bundle size (43KB vs 1.2KB) - Bloated!
- ā More boilerplate - Not simple!
- ā More complex mental model - Not simple!
- ā Steeper learning curve - Not accessible!
- ā Less edge-friendly (Cloudflare)
- ā Doesn't align with "keep it simple, not bloated" philosophy
Why We Still Chose Svelte:
Despite these challenges, we chose Svelte because:
- Keep It Simple: Minimal boilerplate, intuitive syntax
- Not Bloated: Smallest bundle size, zero runtime overhead
- Performance: Fast load times matter for our users
- Edge deployment: Cloudflare is critical for our architecture
- Open source values: Community over corporation
- Transparency: Readable code, no hidden magic
- We can mitigate ecosystem issues by building internal tools
š”ļø Risk Mitigation Strategy
How We Address These Challenges:
| Challenge | Mitigation Strategy | Owner | Timeline |
|---|---|---|---|
| Small Ecosystem | Build internal component library | Design team | Q1 2025 |
| Limited Resources | Create comprehensive docs | All contributors | Ongoing |
| Learning Curve | Mentorship program | Core team | Q1 2025 |
| Job Market | Emphasize transferable skills | All | Always |
| Breaking Changes | Pin versions, test updates | DevOps | Ongoing |
| Integration | Create adapter library | Backend team | As needed |
š When to Consider Alternatives
Re-evaluate SvelteKit choice if:
We can't find contributors (after 6 months)
- ā Consider React if community isn't growing
Performance gains don't matter (users on fast internet always)
- ā React is more convenient if speed isn't priority
We need specific integrations that only exist for React
- ā Weigh whether to change stack or build integration
Team expertise heavily favors React
- ā Consider if training cost > ecosystem benefit
None of these apply yet, so SvelteKit remains the right choice.
š” Final Thoughts: Balanced Perspective
SvelteKit is not perfect, but it's the right choice for this project because:
Core Platform Values:
Transparansi (Transparency)
- ā Open source, auditable code
- ā No hidden abstractions
- ā Community-driven development
Integritas (Integrity)
- ā Honest about trade-offs (this document!)
- ā No marketing hype
- ā Practical solutions
Kedaulatan Data (Data Sovereignty)
- ā User owns their data
- ā Can self-host
- ā No vendor lock-in
Keep It Simple
- ā Minimal boilerplate
- ā Intuitive syntax
- ā Lower learning curve
- ā No framework-specific patterns to memorize
Not Bloated
- ā Smallest possible bundle (1.2KB)
- ā Zero runtime overhead
- ā Fast, efficient, lightweight
- ā Mobile-friendly
We acknowledge the challenges and commit to:
- Building tools to mitigate ecosystem gaps
- Creating documentation to support contributors
- Being honest about trade-offs
- Keeping it simple and avoiding bloat
- Adapting if needed
This is not a "one-size-fits-all" choice.
For a project focused on:
- ā Transparency
- ā Integrity
- ā Data Sovereignty
- ā Keep It Simple
- ā Not Bloated
- ā Edge deployment
- ā Open source values
SvelteKit is the best fit.
ā Conclusion
SvelteKit was chosen because:
- Keep It Simple: Lowest learning curve, intuitive syntax, minimal boilerplate
- Not Bloated: Smallest bundle size (1.2KB), zero runtime overhead, efficient
- Performance: Fast load times, edge-ready, mobile-friendly
- Developer UX: Most pleasant to use, feels like HTML/JS
- Transparency: Readable code, no hidden abstractions, open source
- Type Safety: Built-in, no manual setup needed
- Full-Stack: Everything in one framework
This choice helps us:
- ā Attract more contributors (simpler to learn)
- ā Build faster (less boilerplate)
- ā Deploy easier (smaller bundles)
- ā Maintain better (code is readable)
- ā Scale globally (edge deployment)
- ā Stay true to "keep it simple, not bloated" principle
We acknowledge challenges:
- ā ļø Smaller ecosystem
- ā ļø Less resources in Indonesian
- ā ļø Smaller job market
- ā ļø Need to build more ourselves
And we commit to:
- ā Keep it simple - avoid unnecessary complexity
- ā Avoid bloat - keep dependencies minimal
- ā Mitigate challenges through documentation
- ā Build internal tools and libraries
- ā Support contributors learning curve
- ā Be honest about trade-offs
š References
- SvelteKit Documentation
- Svelte Tutorial
- Why Svelte (Official Blog)
- Svelte 5 Runes
- Cloudflare Pages Deployment
Created: 2025-10-27
Author: Sandikodev
Status: Active Technical Decision
Version: 1.0