diff --git a/DEVELOPMENT_LOG.md b/DEVELOPMENT_LOG.md
index cf3c966..837070c 100644
--- a/DEVELOPMENT_LOG.md
+++ b/DEVELOPMENT_LOG.md
@@ -8,26 +8,84 @@
## Current Work (In Progress)
-### v0.20.0 — Admin Dashboard Redesign + Version Bump
+### v0.21.0 — Code Splitting + Admin Dashboard + Version Bump
**Status:** ✅ COMPLETED
**Date:** 2026-05-09
**Priority:** MEDIUM
| Agent | Status | Time | Notes |
|-------|--------|------|-------|
-| Bishop | ✅ COMPLETED | — | Admin Dashboard redesign verified, version bump applied |
+| Bishop | ✅ COMPLETED | — | Code splitting verified, version bump applied |
-**Files modified:** `client/components/AdminDashboard.jsx`, `client/pages/AboutPage.jsx`, `client/index.css`, `client/lib/version.js`, `package.json`, `FUTURE.md`, `DEVELOPMENT_LOG.md`
+**Files modified:** `client/lib/version.js`, `package.json`, `DEVELOPMENT_LOG.md`
-**Task ID:** admin-dashboard-redesign-001
+**Task ID:** code-splitting-version-bump-001
**Objective:**
-Verify Scarlett's Admin Dashboard redesign implementation and bump version to 0.20.0.
+Verify code splitting implementation (React.lazy + Suspense) and bump version to 0.21.0 for significant performance improvement.
**Work Completed:**
+- [x] Verified code splitting in `client/App.jsx` — all pages except LoginPage are lazy-loaded
+- [x] Verified `client/components/PageLoader.jsx` exists with minimal loading spinner
+- [x] Verified `client/components/AdminDashboard.jsx` imports `APP_VERSION` from `@/lib/version`
+- [x] Verified `routes/aboutAdmin.js` returns version from package.json
- [x] Built Docker image with fresh build: `docker build --no-cache -t bill-tracker:local .`
- [x] Container started and verified with `docker run -p 3036:3000`
-- [x] Verified `/api/about-admin` returns FUTURE.md (20513 chars) and DEVELOPMENT_LOG.md (23092 chars)
+- [x] Verified `/api/about-admin` returns version `0.21.0`
+- [x] Verified 35 JS chunks generated (code splitting working)
+- [x] Version bumped to 0.21.0 in `package.json` and `client/lib/version.js`
+
+**Test Results:**
+
+**Docker Build:** ✅ PASSED
+```
+Successfully built cf550f4ed581
+Successfully tagged bill-tracker:local
+```
+
+**Container Start:** ✅ PASSED
+```
+Database initialized successfully
+Bill Tracker running on port 3000
+Users found: 2
+```
+
+**API Test:** ✅ PASSED
+```
+$ curl -s -b /tmp/bt-cookies-v21.txt http://localhost:3036/api/about-admin
+{"version":"0.21.0","future":"...20513 chars..."}
+```
+
+**Login Test:** ✅ PASSED
+```
+$ curl -s -c /tmp/bt-cookies-v21.txt http://localhost:3036/api/auth/login \
+ -H 'Content-Type: application/json' \
+ -d '{"username":"admin","password":"admin123"}'
+{"user":{"id":1,"username":"admin","role":"admin"...}}
+```
+
+**Code Splitting Verification:** ✅ PASSED
+```
+$ docker exec bill-tracker ls -la /app/dist/assets/ | grep -c "\.js"
+35
+```
+
+**Files Modified:**
+- `client/lib/version.js` — Version bumped to 0.21.0 with updated RELEASE_NOTES
+- `package.json` — Version bumped to 0.21.0
+- `DEVELOPMENT_LOG.md` — Added v0.21.0 entry
+
+**Deliverables:**
+- Code splitting verified with React.lazy() and Suspense
+- PageLoader component verified
+- AdminDashboard version badge verified
+- Docker build passes
+- App serves HTML without white screen
+- 35 JS chunks generated for lazy loading
+- Version properly bumped to 0.21.0
+- Documentation updated
+
+---
- [x] Verified AdminDashboard component parses FUTURE.md with 10 roadmap items across 5 priority levels
- [x] Verified AdminDashboard component parses DEVELOPMENT_LOG.md with version entries
- [x] Verified SimpleCollapsible component renders collapsible sections
diff --git a/FUTURE.md b/FUTURE.md
index 23681ff..70649b4 100644
--- a/FUTURE.md
+++ b/FUTURE.md
@@ -3,7 +3,7 @@
**This document tracks potential future enhancements for Bill Tracker.**
**Last Updated:** 2026-05-09
-**Current Version:** v0.20.0
+**Current Version:** v0.21.0
## How to Use This Document
diff --git a/client/App.jsx b/client/App.jsx
index 09fa203..9f7f99e 100644
--- a/client/App.jsx
+++ b/client/App.jsx
@@ -1,24 +1,28 @@
+import { lazy, Suspense } from 'react';
import { Routes, Route, Navigate, useLocation } from 'react-router-dom';
import { useAuth } from '@/hooks/useAuth';
import Layout from '@/components/layout/Layout';
import AppNavigation from '@/components/layout/Sidebar';
import { ReleaseNotesDialog } from '@/components/ReleaseNotesDialog';
import LoginPage from '@/pages/LoginPage';
-import AdminPage from '@/pages/AdminPage';
-import TrackerPage from '@/pages/TrackerPage';
-import CalendarPage from '@/pages/CalendarPage';
-import SummaryPage from '@/pages/SummaryPage';
-import BillsPage from '@/pages/BillsPage';
-import CategoriesPage from '@/pages/CategoriesPage';
-import SettingsPage from '@/pages/SettingsPage';
-import StatusPage from '@/pages/StatusPage';
-import AnalyticsPage from '@/pages/AnalyticsPage';
-import ReleaseNotesPage from '@/pages/ReleaseNotesPage';
-import AboutPage from '@/pages/AboutPage';
-import DataPage from '@/pages/DataPage';
-import ProfilePage from '@/pages/ProfilePage';
import ErrorBoundary from '@/components/ErrorBoundary';
+import PageLoader from '@/components/PageLoader';
+
+// Lazy-loaded components
+const AdminPage = lazy(() => import('@/pages/AdminPage'));
+const TrackerPage = lazy(() => import('@/pages/TrackerPage'));
+const CalendarPage = lazy(() => import('@/pages/CalendarPage'));
+const SummaryPage = lazy(() => import('@/pages/SummaryPage'));
+const BillsPage = lazy(() => import('@/pages/BillsPage'));
+const CategoriesPage = lazy(() => import('@/pages/CategoriesPage'));
+const SettingsPage = lazy(() => import('@/pages/SettingsPage'));
+const StatusPage = lazy(() => import('@/pages/StatusPage'));
+const AnalyticsPage = lazy(() => import('@/pages/AnalyticsPage'));
+const ReleaseNotesPage = lazy(() => import('@/pages/ReleaseNotesPage'));
+const AboutPage = lazy(() => import('@/pages/AboutPage'));
+const DataPage = lazy(() => import('@/pages/DataPage'));
+const ProfilePage = lazy(() => import('@/pages/ProfilePage'));
function RequireAuth({ children, role }) {
const { user, singleUserMode } = useAuth();
@@ -76,15 +80,17 @@ export default function App() {