diff --git a/HISTORY.md b/HISTORY.md
index dbbe8fe..986203f 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,23 @@
# Bill Tracker — Changelog
+## v0.18.1
+
+### Changed
+- Added a Calendar page with a month grid for user-owned bills and payments, compact day indicators, a legend, monthly progress summary, and day detail dialog.
+- Added a user-scoped `GET /api/calendar` endpoint for one-month calendar data using existing bills, payments, categories, and monthly bill state records without schema changes.
+- Calendar status and totals respect monthly actual amount overrides, skipped bills, existing due-day clamping, and existing tracker-style late/missed status behavior.
+- Added Calendar to the top navigation after Tracker while preserving the existing desktop and mobile nav behavior.
+- Improved mobile and tablet responsive rendering across the top navigation, page headers, dialogs, dense tables, Tracker, Bills, Categories, Settings, Status, Admin, Analytics, and Login views.
+- Preserved the current desktop layout by keeping existing desktop-oriented layouts at `lg` and above while adding mobile/tablet stacking, scrolling, and tap-friendly controls below that breakpoint.
+- Tablet navigation now uses the compact menu to avoid horizontal overflow; user menu, theme toggle, and admin-only navigation remain reachable.
+- Dialogs and destructive confirmations now respect mobile viewport width/height and scroll internally when content is long.
+- Dense Tracker, Bills, Admin, Analytics, and import/history style tables use horizontal scrolling or mobile stacking so actions remain reachable on smaller screens.
+- Tracker and Bills now use stacked mobile/tablet bill rows below `lg`, reducing sideways scrolling for normal bill review, quick payment, and bill actions while preserving the desktop table layouts.
+- Tracker mobile notes stay contained in each bill row, so long notes can truncate or scroll locally without forcing the whole bill list sideways.
+
+### Notes
+- No schema, auth behavior, tracker/payment/bill business logic, admin permissions, or desktop redesign changes were made.
+
## v0.18
### Branding
@@ -14,6 +32,13 @@
- Vite now copies only modern React public assets from `client/public`, preventing legacy `public/*.html`, CSS, and JS files from being emitted into `dist`.
- No backend, auth, tracker, bills, categories, settings, status, admin, or navigation-link behavior was changed.
+### Analytics
+- Added a user-scoped Analytics API at `GET /api/analytics/summary` using existing bills, payments, categories, and monthly bill state data without schema changes.
+- Added an Analytics page with date range controls, category and bill filters, inactive/skipped toggles, chart visibility toggles, and a line/area trend option.
+- Added monthly spending trend, expected vs actual spend, category spending donut, and pay-on-time heatmap views.
+- Added print and browser save-as-PDF report output with print CSS that hides navigation, controls, and interactive actions.
+- Analytics queries are scoped to the signed-in user and do not accept or expose cross-user aggregation.
+
### Security
- **OIDC ID token signature verification** now uses `openid-client@5` for full cryptographic validation via JWKS: signature, issuer, audience, expiry, nonce, and `sub` presence — tokens without a valid signature are rejected
- **OIDC client cache** invalidation path added; cache is keyed by issuer/client/redirect so Admin panel credential changes pick up a fresh client
diff --git a/bill-tracker.code-workspace b/bill-tracker.code-workspace
new file mode 100644
index 0000000..bab1b7f
--- /dev/null
+++ b/bill-tracker.code-workspace
@@ -0,0 +1,8 @@
+{
+ "folders": [
+ {
+ "path": ".."
+ }
+ ],
+ "settings": {}
+}
\ No newline at end of file
diff --git a/client/App.jsx b/client/App.jsx
index 3a20eb4..1e3e1fc 100644
--- a/client/App.jsx
+++ b/client/App.jsx
@@ -6,10 +6,12 @@ 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 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 DataPage from '@/pages/DataPage';
import ProfilePage from '@/pages/ProfilePage';
@@ -73,8 +75,10 @@ export default function App() {
}
>