Release Date: March 2026 Codename: Clean House
A comprehensive housekeeping release. No new user-facing features — instead, a full security audit, dependency modernization, test coverage expansion, and infrastructure hardening. 32 of 33 audit items completed across five parallel audits.
A full security audit identified 20 issues across critical, high, medium, and low severity. All critical and high issues are resolved:
- Lucia auth removed — the deprecated authentication library was replaced with ~160 lines of direct session management. Removed
lucia,@lucia-auth/adapter-drizzle, andoslodependencies entirely. - Session cookies hardened —
httpOnly: true,sameSite: "lax", andsecureflag in production - Security headers — new middleware adds CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, and HSTS
- SSRF protection — link-preview endpoint now blocks private IPv4/IPv6 ranges and metadata endpoints
- Error sanitization — production error responses no longer leak stack traces or database schema details
- Password policy — minimum increased from 6 to 8 characters
- CSV import limits — 5 MB file size and 50,000 row maximum
- Persistent rate limiting — moved from in-memory to SQLite-backed
rateLimitstable, survives restarts
| Package | Before | After |
|---|---|---|
| Nuxt | 3.15.1 | 4.4.2 |
| Stripe | 17.5.0 | 20.4.1 |
| TypeScript | 5.7.2 | 5.9.3 |
| Zod | 3.23.8 | 4.3.6 |
| @libsql/client | 0.14.0 | 0.17.0 |
| @nuxt/test-utils | — | 4.0 |
| @vite-pwa/nuxt | — | 1.1.1 |
Removed @nuxt/devtools (bundled in Nuxt 4) and all Lucia-related packages.
Test coverage expanded significantly across the most critical untested areas:
| Area | New Tests |
|---|---|
| Auth endpoints (login, register, logout, password change, sessions) | 38 |
| Entry CRUD operations | 33 |
| Admin API (users, stats, sessions) | 26 |
| Sync engine (content hashing, conflicts, operations) | 25 |
| Billing/Stripe (checkout, portal, webhooks, subscriptions) | 40 |
| Component tests (login, forgot-password, reset-password) | 47 |
| Total | 209 |
Plus 4 Playwright E2E smoke tests and fixes for 7 previously failing logger tests.
- Request IDs generated per request via
00.request-id.tsmiddleware console.errormigrated to structured logger in server code- Logger supports timestamps, levels, prefixes, and arbitrary context
All 73+ API endpoints now return a consistent structured error format:
{ "error": { "code": "ERROR_CODE", "message": "Human-readable message", "details": {} } }Previously, internal endpoints used raw { statusCode, statusMessage } while v1 endpoints used structured helpers. Now every endpoint uses shared helpers (apiError, unauthorized, notFound, validationError, internalError, forbidden), making error handling predictable for all API consumers.
- CONTRIBUTING.md created — practical guide for new contributors
- Admin API fully documented in API-SPECIFICATION.md
- Version references updated to v0.5.0 across all docs
- Specs 001–005 marked as Completed
- Debug
console.logstatements cleaned fromuseTranscription.tsandVoiceRecorder.vue db: anyreplaced with properDatabasetype in entryEngine.ts- Fixed Zod v4
z.record()calls across 7 files (breaking change: now requires key schema)
One item deferred to v0.6.0:
- Tailwind v4 —
@nuxtjs/tailwindcssmodule is not yet compatible with v4
Breaking Changes: None. All existing data is preserved.
Self-hosted users: This is a drop-in upgrade. Back up your database before deploying — the Nuxt 4 migration is low-risk but the framework version jump is significant.
Production operators: Review the Recommendations for Tada Living section for operational security steps (key rotation, header verification, rate limit monitoring).
See specs/v050-housekeeping-audit.md for the complete audit report covering all 33 items across 5 audit areas (security, dependencies, test coverage, documentation, code quality).
"Maintenance isn't the boring part — it's what makes everything else possible."
v0.5.0 has no features to announce. That's the point. The security audit found real vulnerabilities. The dependency updates prevent accumulating debt. The 209 new tests catch regressions before users see them. The structured logging makes incidents debuggable. None of this is visible in the UI, but all of it makes the next feature release safer, faster, and more confident.
Thank you for using Ta-Da!