Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision bffb3489e63eba9af277f3b587d2938a1ef8bfd9)
+++ src/services/i18n.js	(revision 137cca552d3f0dbb017538eee312a41f1badc430)
@@ -69,4 +69,27 @@
     'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigenaar', 'admin.th_created': 'Aangemaakt',
     'admin.th_username': 'Gebruikersnaam', 'admin.th_email': 'E-mail', 'admin.th_role': 'Rol', 'admin.th_joined': 'Lid sinds',
+    // Welkom / first-run
+    'welcome.title': 'Welkom bij Klonkt',
+    'welcome.tagline': 'Een zelf-gehost publicatieplatform.',
+    'welcome.have_account': 'Al een account? Inloggen',
+    'welcome.note': 'Maak je beheerdersaccount aan om te beginnen — daarna is registratie gesloten.',
+    'welcome.nosite': 'Hoi {user}! Er is nog geen site ingesteld.',
+    // Auth (login/register)
+    'auth.admin_login_title': 'Beheerder inloggen',
+    'auth.username_or_email': 'Gebruikersnaam of e-mail',
+    'auth.password': 'Wachtwoord',
+    'auth.forgot': 'Wachtwoord vergeten?',
+    'auth.google_btn': 'Inloggen met Google',
+    'auth.public_sub': 'Log in om te reageren en je favorieten te bewaren.',
+    'auth.admin_box_q': 'Beheerder?',
+    'auth.admin_box_sub': 'Log in met gebruikersnaam & wachtwoord',
+    'auth.google_unavail': 'Inloggen met Google is op deze site nog niet ingesteld.',
+    'auth.create_admin': 'Beheerder aanmaken',
+    'auth.reg_intro': 'Eerste keer opzetten — maak je beheerdersaccount aan. Dit kan maar één keer.',
+    'auth.f_username': 'Gebruikersnaam (3-32 tekens, letters/cijfers/_-)',
+    'auth.f_email': 'E-mail',
+    'auth.f_password': 'Wachtwoord (min 8 tekens)',
+    // Bottom-tab (mobiel)
+    'tab.home': 'Home', 'tab.search': 'Zoek', 'tab.write': 'Schrijven', 'tab.profile': 'Profiel',
   },
   en: {
@@ -126,4 +149,24 @@
     'admin.th_slug': 'Slug', 'admin.th_title': 'Title', 'admin.th_owner': 'Owner', 'admin.th_created': 'Created',
     'admin.th_username': 'Username', 'admin.th_email': 'Email', 'admin.th_role': 'Role', 'admin.th_joined': 'Joined',
+    'welcome.title': 'Welcome to Klonkt',
+    'welcome.tagline': 'A self-hosted publishing platform.',
+    'welcome.have_account': 'Already have an account? Log in',
+    'welcome.note': 'Create your admin account to get started — registration closes after that.',
+    'welcome.nosite': 'Hi {user}! No site is configured yet.',
+    'auth.admin_login_title': 'Admin login',
+    'auth.username_or_email': 'Username or email',
+    'auth.password': 'Password',
+    'auth.forgot': 'Forgot password?',
+    'auth.google_btn': 'Sign in with Google',
+    'auth.public_sub': 'Log in to comment and save your favorites.',
+    'auth.admin_box_q': 'Admin?',
+    'auth.admin_box_sub': 'Log in with username & password',
+    'auth.google_unavail': 'Google sign-in isn’t set up on this site yet.',
+    'auth.create_admin': 'Create admin',
+    'auth.reg_intro': 'First-time setup — create your admin account. This can only be done once.',
+    'auth.f_username': 'Username (3-32 chars, letters/digits/_-)',
+    'auth.f_email': 'Email',
+    'auth.f_password': 'Password (min 8 chars)',
+    'tab.home': 'Home', 'tab.search': 'Search', 'tab.write': 'Write', 'tab.profile': 'Profile',
   },
   de: {
@@ -183,4 +226,24 @@
     'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigentümer', 'admin.th_created': 'Erstellt',
     'admin.th_username': 'Benutzername', 'admin.th_email': 'E-Mail', 'admin.th_role': 'Rolle', 'admin.th_joined': 'Mitglied seit',
+    'welcome.title': 'Willkommen bei Klonkt',
+    'welcome.tagline': 'Eine selbstgehostete Publishing-Plattform.',
+    'welcome.have_account': 'Schon ein Konto? Anmelden',
+    'welcome.note': 'Lege dein Administrator-Konto an, um zu starten — danach ist die Registrierung geschlossen.',
+    'welcome.nosite': 'Hallo {user}! Es ist noch keine Seite eingerichtet.',
+    'auth.admin_login_title': 'Administrator-Anmeldung',
+    'auth.username_or_email': 'Benutzername oder E-Mail',
+    'auth.password': 'Passwort',
+    'auth.forgot': 'Passwort vergessen?',
+    'auth.google_btn': 'Mit Google anmelden',
+    'auth.public_sub': 'Melde dich an, um zu kommentieren und Favoriten zu speichern.',
+    'auth.admin_box_q': 'Administrator?',
+    'auth.admin_box_sub': 'Mit Benutzername & Passwort anmelden',
+    'auth.google_unavail': 'Google-Anmeldung ist auf dieser Seite noch nicht eingerichtet.',
+    'auth.create_admin': 'Administrator anlegen',
+    'auth.reg_intro': 'Ersteinrichtung — lege dein Administrator-Konto an. Das geht nur einmal.',
+    'auth.f_username': 'Benutzername (3-32 Zeichen, Buchstaben/Ziffern/_-)',
+    'auth.f_email': 'E-Mail',
+    'auth.f_password': 'Passwort (min. 8 Zeichen)',
+    'tab.home': 'Start', 'tab.search': 'Suche', 'tab.write': 'Schreiben', 'tab.profile': 'Profil',
   },
 };
Index: src/views/pages/auth-login.ejs
===================================================================
--- src/views/pages/auth-login.ejs	(revision bffb3489e63eba9af277f3b587d2938a1ef8bfd9)
+++ src/views/pages/auth-login.ejs	(revision 137cca552d3f0dbb017538eee312a41f1badc430)
@@ -7,5 +7,5 @@
 %>
 <div class="container auth-page">
-  <h1><%= _admin ? 'Beheerder inloggen' : 'Inloggen' %></h1>
+  <h1><%= _admin ? t('auth.admin_login_title') : t('nav.login') %></h1>
   <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %>
   <%
@@ -38,17 +38,17 @@
       <% } %>
       <label>
-        <span>Gebruikersnaam of e-mail</span>
+        <span><%= t('auth.username_or_email') %></span>
         <input type="text" name="username" value="<%= username %>" required autofocus autocomplete="username">
       </label>
       <label>
-        <span>Wachtwoord</span>
+        <span><%= t('auth.password') %></span>
         <input type="password" name="password" required autocomplete="current-password">
       </label>
-      <button type="submit" class="btn btn-primary">Inloggen</button>
-      <p class="auth-link auth-link-muted"><a href="/auth/reset-request">Wachtwoord vergeten?</a></p>
+      <button type="submit" class="btn btn-primary"><%= t('nav.login') %></button>
+      <p class="auth-link auth-link-muted"><a href="/auth/reset-request"><%= t('auth.forgot') %></a></p>
     </form>
   <% } else if (googleReady) { %>
     <%# Publieke login: alleen Google, voor luisteraars/fans. %>
-    <p class="auth-sub">Log in om te reageren en je favorieten te bewaren.</p>
+    <p class="auth-sub"><%= t('auth.public_sub') %></p>
     <a class="btn btn-google" href="/auth/google<%= (typeof next !== 'undefined' && next) ? '?next=' + encodeURIComponent(next) : '' %>">
       <svg class="g-icon" width="18" height="18" viewBox="0 0 18 18" aria-hidden="true">
@@ -58,8 +58,8 @@
         <path fill="#EA4335" d="M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58A9 9 0 0 0 .96 4.95l3.01 2.33C4.68 5.16 6.66 3.58 9 3.58z"/>
       </svg>
-      <span>Inloggen met Google</span>
+      <span><%= t('auth.google_btn') %></span>
     </a>
   <% } else { %>
-    <div class="alert">Inloggen met Google is op deze site nog niet ingesteld.</div>
+    <div class="alert"><%= t('auth.google_unavail') %></div>
   <% } %>
 
@@ -69,6 +69,6 @@
       <span class="auth-admin-box-icon" aria-hidden="true">🔑</span>
       <span class="auth-admin-box-text">
-        <strong>Beheerder?</strong>
-        <small>Log in met gebruikersnaam &amp; wachtwoord</small>
+        <strong><%= t('auth.admin_box_q') %></strong>
+        <small><%= t('auth.admin_box_sub') %></small>
       </span>
       <span class="auth-admin-box-arrow" aria-hidden="true">&rarr;</span>
Index: src/views/pages/auth-register.ejs
===================================================================
--- src/views/pages/auth-register.ejs	(revision bffb3489e63eba9af277f3b587d2938a1ef8bfd9)
+++ src/views/pages/auth-register.ejs	(revision 137cca552d3f0dbb017538eee312a41f1badc430)
@@ -1,5 +1,5 @@
 <div class="container auth-page">
-  <h1>Beheerder aanmaken</h1>
-  <p class="auth-intro">Eerste keer opzetten — maak je beheerdersaccount aan. Dit kan maar één keer.</p>
+  <h1><%= t('auth.create_admin') %></h1>
+  <p class="auth-intro"><%= t('auth.reg_intro') %></p>
   <% if (error) { %><div class="alert alert-error"><%= error %></div><% } %>
   <form method="post" action="/auth/register" class="auth-form">
@@ -8,16 +8,16 @@
     <% } %>
     <label>
-      <span>Gebruikersnaam (3-32 tekens, letters/cijfers/_-)</span>
+      <span><%= t('auth.f_username') %></span>
       <input type="text" name="username" value="<%= username %>" required autofocus autocomplete="username" pattern="[a-zA-Z0-9_-]{3,32}">
     </label>
     <label>
-      <span>E-mail</span>
+      <span><%= t('auth.f_email') %></span>
       <input type="email" name="email" value="<%= email %>" required autocomplete="email">
     </label>
     <label>
-      <span>Wachtwoord (min 8 tekens)</span>
+      <span><%= t('auth.f_password') %></span>
       <input type="password" name="password" required minlength="8" autocomplete="new-password">
     </label>
-    <button type="submit" class="btn btn-primary">Beheerder aanmaken</button>
+    <button type="submit" class="btn btn-primary"><%= t('auth.create_admin') %></button>
   </form>
 </div>
Index: src/views/pages/welcome.ejs
===================================================================
--- src/views/pages/welcome.ejs	(revision bffb3489e63eba9af277f3b587d2938a1ef8bfd9)
+++ src/views/pages/welcome.ejs	(revision 137cca552d3f0dbb017538eee312a41f1badc430)
@@ -1,14 +1,14 @@
 <div class="container welcome-page">
-  <h1>Welcome to Klonkt</h1>
-  <p class="welcome-tagline">A self-hosted publishing platform.</p>
-  
+  <h1><%= t('welcome.title') %></h1>
+  <p class="welcome-tagline"><%= t('welcome.tagline') %></p>
+
   <% if (!user) { %>
     <div class="welcome-actions">
-      <a href="/auth/register" class="btn btn-primary">Beheerder aanmaken</a>
-      <a href="/auth/login" class="btn">Al een account? Inloggen</a>
+      <a href="/auth/register" class="btn btn-primary"><%= t('auth.create_admin') %></a>
+      <a href="/auth/login" class="btn"><%= t('welcome.have_account') %></a>
     </div>
-    <p class="welcome-note">Maak je beheerdersaccount aan om te beginnen — daarna is registratie gesloten.</p>
+    <p class="welcome-note"><%= t('welcome.note') %></p>
   <% } else { %>
-    <p>Hi <%= user.username %>! No site is configured yet.</p>
+    <p><%= t('welcome.nosite', { user: user.username }) %></p>
   <% } %>
 </div>
Index: src/views/partials/bottom-tab.ejs
===================================================================
--- src/views/partials/bottom-tab.ejs	(revision bffb3489e63eba9af277f3b587d2938a1ef8bfd9)
+++ src/views/partials/bottom-tab.ejs	(revision 137cca552d3f0dbb017538eee312a41f1badc430)
@@ -52,5 +52,5 @@
       <polyline points="9 22 9 12 15 12 15 22"/>
     </svg>
-    <span class="bottom-tab-label">Home</span>
+    <span class="bottom-tab-label"><%= t('tab.home') %></span>
   </a>
 
@@ -62,5 +62,5 @@
       <line x1="21" y1="21" x2="16.65" y2="16.65"/>
     </svg>
-    <span class="bottom-tab-label">Zoek</span>
+    <span class="bottom-tab-label"><%= t('tab.search') %></span>
   </button>
 
@@ -76,5 +76,5 @@
         <line x1="5" y1="12" x2="19" y2="12"/>
       </svg>
-      <span class="bottom-tab-label">Schrijven</span>
+      <span class="bottom-tab-label"><%= t('tab.write') %></span>
     </a>
   <% } %>
@@ -106,5 +106,5 @@
         <span class="bottom-tab-avatar"><%= user.username.charAt(0).toUpperCase() %></span>
       <% } %>
-      <span class="bottom-tab-label">Profiel</span>
+      <span class="bottom-tab-label"><%= t('tab.profile') %></span>
     </button>
   <% } else { %>
@@ -119,5 +119,5 @@
         <line x1="15" y1="12" x2="3" y2="12"/>
       </svg>
-      <span class="bottom-tab-label">Inloggen</span>
+      <span class="bottom-tab-label"><%= t('nav.login') %></span>
     </a>
   <% } %>
