nathanrenting.dev
Project · v0.1 release candidate

TherapyVault · secure video platform for therapy

A private video platform where therapists safely share recorded sessions with their own clients. No public URLs, no YouTube link with "anyone with the link can view". Everything sits behind signed URLs with granular per-client access grants, optionally time-limited, view-limited or download-limited.

Hand-drawn architecture sketch: therapist uploads to VAULT (notebook with a lock), MFA shield for admin, three clients with access grants (forever / time-limited / view-limited), audit-log notebook at the bottom, annotations 'no public URLs', 'access-grant evaluator', 'GDPR'.

Whiteboard sketch · the shape of the system

Problem

WeTransfer is not GDPR-compliant for healthcare data. YouTube unlisted is not access control. SharePoint is enterprise overkill. Vimeo Pro

TherapyVault is the specific answer: one place where the therapist uploads and the client watches securely, with the legal and technical foundation a healthcare context demands.

What's in v0.1

AreaStatus
AuthEmail+password, password reset, MFA (TOTP), session management, RBAC
Video uploadResumable multipart (tus protocol) up to 10 GB, to R2 / S3 / MinIO
Video streamingSigned-URL playback with range support, no public URLs
Access controlPer grant: forever / time-limited / view-limited / download-limited
Coupons5 types: free access, % off, fixed off, download credit, view credit
PaymentsStripe (one-time + subscriptions) + Mollie stub behind a PaymentProvider interface
DashboardsTherapist, Client, Admin
GDPRData-export ZIP + scheduled deletion with grace period
i18nEN + NL from day one (next-intl)
Audit logEvery sensitive mutation is recorded

Stack

Frontend + API
Next.js 15 (App Router) + TypeScript + Tailwind + shadcn/ui
Auth
Auth.js v5, credentials + Argon2id hashing + TOTP MFA
Database
PostgreSQL 16 + Prisma 6
Storage
Cloudflare R2 (S3-compatible); provider abstraction supports S3, B2, MinIO, local
Uploads
tus protocol via @tus/server
Payments
PaymentProvider interface with Stripe-live + Mollie stub behind it
Email
console stub (v0.1): react-email templates that render to logs
Rate-limit
Redis token-bucket with in-memory fallback
Logging
pino structured JSON + separate AuditLog table
Tests
Vitest unit/integration + Playwright e2e

Security primitives

No public URLs. Every video stream goes through a signed URL that the server only issues after an access-grant check. Range headers are supported without the URL ever leaking outside the session.

MFA mandatory for admins. Pairing a TOTP app is a first-login requirement; no access to admin dashboards without it.

Argon2id as the password hash with memory-hard parameters.

GDPR by design. Client-data export as a ZIP, account deletion via a scheduled job with a grace period, an AuditLog table for all sensitive mutations.

Payment-provider abstraction. Stripe live, Mollie behind the same interface: switch to iDEAL without touching the business logic.

Roadmap

VersionWhat
v0.1 (now)All critical security primitives, production-deployable
v0.2UI polish, multi-bitrate HLS transcoding, push notifications, real email provider
v0.3+Custom domain per therapist, white-label, live sessions

Status

v0.1 release candidate. An SMTP provider and real email templates are the next step toward launch. Client and specific use case under NDA.