Skip to content

Architecture Overview ​

Diagram dan penjelasan cara kerja aplikasi secara menyeluruh.


πŸ—οΈ High-Level Architecture ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              CLOUDFLARE EDGE                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚   Tokyo Edge    β”‚  β”‚  London Edge    β”‚  β”‚  SΓ£o Paulo Edge β”‚              β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚              β”‚
β”‚  β”‚  β”‚  Worker   β”‚  β”‚  β”‚  β”‚  Worker   β”‚  β”‚  β”‚  β”‚  Worker   β”‚  β”‚              β”‚
β”‚  β”‚  β”‚  (SSR)    β”‚  β”‚  β”‚  β”‚  (SSR)    β”‚  β”‚  β”‚  β”‚  (SSR)    β”‚  β”‚              β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚              β”‚
β”‚  β”‚        β”‚        β”‚  β”‚        β”‚        β”‚  β”‚        β”‚        β”‚              β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”  β”‚              β”‚
β”‚  β”‚  β”‚    D1     β”‚  β”‚  β”‚  β”‚    D1     β”‚  β”‚  β”‚  β”‚    D1     β”‚  β”‚              β”‚
β”‚  β”‚  β”‚ (SQLite)  β”‚  β”‚  β”‚  β”‚ (SQLite)  β”‚  β”‚  β”‚  β”‚ (SQLite)  β”‚  β”‚              β”‚
β”‚  β”‚  β”‚  Replica  β”‚  β”‚  β”‚  β”‚  Replica  β”‚  β”‚  β”‚  β”‚  Replica  β”‚  β”‚              β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β”‚
                                      β”‚ HTTPS
                                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              USER BROWSER                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                         SvelteKit App                                β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚    β”‚
β”‚  β”‚  β”‚  Pages   β”‚  β”‚  Forms   β”‚  β”‚   API    β”‚  β”‚   Client State   β”‚    β”‚    β”‚
β”‚  β”‚  β”‚(Routes)  β”‚  β”‚(Actions) β”‚  β”‚ (Loads)  β”‚  β”‚   (Stores)       β”‚    β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Request Flow Diagram ​

1. Page Load (Server-Side Rendering) ​

User Request (e.g., /dashboard)
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Cloudflare Edge β”‚
β”‚     Worker      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ SvelteKit       β”‚
β”‚ hooks.server.ts β”‚
β”‚ - Inject DB     β”‚
β”‚ - Validate Auth β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ +page.server.ts β”‚
β”‚ - load()        β”‚
β”‚ - Query D1      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ SvelteKit       β”‚
β”‚ Render HTML     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Send to Browser β”‚
β”‚ (Complete HTML) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. Form Submission (Form Actions) ​

User Submit Form
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ POST /action    β”‚
β”‚ (No JS needed)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Cloudflare Edge β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ +page.server.ts β”‚
β”‚ - actions {}    β”‚
β”‚ - Validate      β”‚
β”‚ - Insert D1     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Redirect/Result β”‚
β”‚ (Full page or   β”‚
β”‚  JSON response) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Client-Side API Call ​

JS Fetch API
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ +server.ts      β”‚
β”‚ (API Endpoint)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Process Request β”‚
β”‚ - Auth check    β”‚
β”‚ - DB query      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ JSON Response   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” Authentication Flow ​

Registration Flow ​

User                    Frontend                  Backend                    D1
  β”‚                         β”‚                         β”‚                       β”‚
  β”‚ Fill form               β”‚                         β”‚                       β”‚
  │────────────────────────>β”‚                         β”‚                       β”‚
  β”‚                         β”‚ POST /auth/register     β”‚                       β”‚
  β”‚                         │────────────────────────>β”‚                       β”‚
  β”‚                         β”‚                         β”‚ Validate input        β”‚
  β”‚                         β”‚                         β”‚ Hash password         β”‚
  β”‚                         β”‚                         β”‚ Insert user           β”‚
  β”‚                         β”‚                         │──────────────────────>β”‚
  β”‚                         β”‚                         β”‚                       β”‚
  β”‚                         β”‚                         β”‚<──────────────────────│
  β”‚                         β”‚                         β”‚ Create session        β”‚
  β”‚                         β”‚                         β”‚ Set cookie            β”‚
  β”‚                         β”‚<────────────────────────│                       β”‚
  β”‚                         β”‚ Set cookie              β”‚                       β”‚
  β”‚ Redirect to dashboard   β”‚                         β”‚                       β”‚
  β”‚<────────────────────────│                         β”‚                       β”‚
  β”‚                         β”‚                         β”‚                       β”‚

Login Flow ​

User                    Frontend                  Backend                    D1
  β”‚                         β”‚                         β”‚                       β”‚
  β”‚ Credentials             β”‚                         β”‚                       β”‚
  │────────────────────────>β”‚                         β”‚                       β”‚
  β”‚                         β”‚ POST /auth/login        β”‚                       β”‚
  β”‚                         │────────────────────────>β”‚                       β”‚
  β”‚                         β”‚                         β”‚ Find user by email    β”‚
  β”‚                         β”‚                         │──────────────────────>β”‚
  β”‚                         β”‚                         β”‚<──────────────────────│
  β”‚                         β”‚                         β”‚ Verify password       β”‚
  β”‚                         β”‚                         β”‚ Create session        β”‚
  β”‚                         β”‚                         β”‚ Set cookie            β”‚
  β”‚                         β”‚<────────────────────────│                       β”‚
  β”‚                         β”‚ Set cookie              β”‚                       β”‚
  β”‚ Redirect to dashboard   β”‚                         β”‚                       β”‚
  β”‚<────────────────────────│                         β”‚                       β”‚
  β”‚                         β”‚                         β”‚                       β”‚

Google OAuth Flow ​

User                    Frontend                  Backend                    Google
  β”‚                         β”‚                         β”‚                        β”‚
  β”‚ Click "Login with       β”‚                         β”‚                        β”‚
  β”‚  Google"                β”‚                         β”‚                        β”‚
  │────────────────────────>β”‚                         β”‚                        β”‚
  β”‚                         β”‚ GET /auth/google        β”‚                        β”‚
  β”‚                         │────────────────────────>β”‚                        β”‚
  β”‚                         β”‚                         β”‚ Generate state         β”‚
  β”‚                         β”‚                         β”‚ Redirect to Google     β”‚
  β”‚                         β”‚<────────────────────────│                        β”‚
  β”‚                         β”‚ 302 Redirect            β”‚                        β”‚
  β”‚<────────────────────────│                         β”‚                        β”‚
  β”‚ Login to Google         β”‚                         β”‚                        β”‚
  │─────────────────────────────────────────────────────────>β”‚
  β”‚                         β”‚                         β”‚                        β”‚
  β”‚                         β”‚                         β”‚<────────────────────────│
  β”‚                         β”‚                         β”‚ Callback with code     β”‚
  β”‚                         β”‚ GET /auth/google/       β”‚                        β”‚
  β”‚                         β”‚     callback            β”‚                        β”‚
  β”‚                         │────────────────────────>β”‚                        β”‚
  β”‚                         β”‚                         β”‚ Exchange code          β”‚
  β”‚                         β”‚                         β”‚ Get user info          β”‚
  β”‚                         β”‚                         β”‚ Create/update user     β”‚
  β”‚                         β”‚                         β”‚ Create session         β”‚
  β”‚                         β”‚<────────────────────────│                        β”‚
  β”‚ Redirect to dashboard   β”‚                         β”‚                        β”‚
  β”‚<────────────────────────│                         β”‚                        β”‚
  β”‚                         β”‚                         β”‚                        β”‚

πŸ’Ύ Data Flow Patterns ​

typescript
// +page.server.ts
export const load = async ({ locals }) => {
  // βœ… Query di server, data di-embed di HTML
  const users = await locals.db.query.users.findMany();
  return { users };
};

// +page.svelte
<script>
  export let data; // Data sudah ada, no loading state!
</script>

{#each data.users as user}
  <UserCard {user} />
{/each}

Flow:

Request β†’ Server Query β†’ Render HTML β†’ Browser (data langsung ada)
typescript
// +page.server.ts
export const actions = {
  createPost: async ({ request, locals }) => {
    const form = await request.formData();
    // βœ… Works tanpa JavaScript!
    await locals.db.insert(posts).values({ ... });
    return { success: true };
  }
};

// +page.svelte
<form method="POST" action="?/createPost">
  <input name="title" />
  <button type="submit">Create</button>
</form>

Flow:

Form Submit β†’ Server Action β†’ DB Insert β†’ Redirect/Result

Pattern 3: Client Fetch (Use Sparingly) ​

typescript
// +page.svelte
<script>
  import { onMount } from 'svelte';
  
  let users = [];
  
  onMount(async () => {
    // ⚠️ Extra API call, loading state needed
    const res = await fetch('/api/users');
    users = await res.json();
  });
</script>

{#if users.length}
  {#each users as user}
    <UserCard {user} />
  {/each}
{:else}
  <LoadingSpinner />
{/if}

Flow:

Page Load β†’ HTML Render β†’ JS Fetch β†’ Loading State β†’ Display Data

πŸš€ Deployment Architecture ​

Development                          Production
    β”‚                                    β”‚
    β–Ό                                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Local D1     β”‚               β”‚ Cloudflare D1    β”‚
β”‚ (SQLite file)β”‚               β”‚ (Edge replicas)  β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜               β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                                β”‚
       β–Ό                                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ npm run dev  β”‚               β”‚ Cloudflare Pages β”‚
β”‚ Vite dev     β”‚      ────────▢│ + Edge Functions β”‚
β”‚ server       β”‚     Deploy    β”‚ (SvelteKit SSR)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β”‚
                                      β–Ό
                               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                               β”‚   Global CDN     β”‚
                               β”‚  (300+ edges)    β”‚
                               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Performance Characteristics ​

AspectLocal DevProductionNotes
Latency~10-50ms~50-200msDepends on user location
Cold StartInstant<50msEdge functions warm
DatabaseSQLite fileReplicated SQLiteRead: fast, Write: eventual
SSR Time~10ms~5-20msEdge compute is fast
Bundle SizeN/A (dev)~50-100KBCode-split per route

🎯 Scalability Limits ​

ResourceFree TierPaid TierWhen to Scale
D1 Storage500MB$0.75/GB-month> 400MB data
D1 Reads5M/dayUnlimited> 4M queries/day
D1 Writes100K/dayUnlimited> 80K writes/day
Workers100K/day$0.50/M> 90K requests/day
Build Time--> 100 pages β†’ ISR

When to Consider Migration:

  • Database > 5GB β†’ PostgreSQL (Neon, Supabase)
  • Complex queries β†’ Add caching layer
  • Real-time needs β†’ WebSockets + Durable Objects

πŸ“š Next Steps ​

SvelteKit Cloudflare Starter - Build Fast, Deploy Everywhere πŸš€