Changelog¶
All notable changes to OktaPT will be documented in this file.
[2026-05-26]¶
Added¶
- Group Messaging (Web): Therapists can now create group conversations with multiple participants from the messages page. A new multi-select participant picker lets doctors search for other therapists in their tenant and add them to a named group thread. Existing one-on-one conversations show an "Add participant" button to invite additional therapists. Gated by the
multiProviderGroupMessagingtenant feature flag. - Calendar OCR Import (Admin Daily Review): The
/admin/daily-reviewpage now has an "Import from Calendar" button. Upload or drag-and-drop a screenshot of a Google Calendar showing patient appointments, and the system uses GPT-4.1-mini to extract patient names, then matches them against the tenant's patient list using exact and fuzzy matching. Matched patients are pre-selected for the daily review; unmatched names (external patients not yet in the system) can optionally be included for reference.
Changed¶
- Personalized Video Prescription Suggestions: Prescription values for personalized exercise videos are now generated via a dedicated async suggestion service. When a doctor selects a patient and exercise during the video recording flow, the mobile app prefetches a prescription suggestion in the background. The suggestion resolves through a three-tier fallback: AI analysis of the patient's exercise history and condition (via GPT-4.1-mini), most recent historical prescription for the exercise, or conservative defaults (3 sets × 10 reps). Results are cached in Redis for 10 minutes. Two new API endpoints support the flow:
POST /v2/personalized-exercise-videos/prescription-suggestions(start) andGET /v2/personalized-exercise-videos/prescription-suggestions/:id(poll).- The doctor-facing video list now shows processing-state videos (created, uploading, queued, failed) alongside completed ones, so therapists can track uploads without leaving the patient detail screen
Fixed¶
- Personalized Video Injection Reliability: Refactored the injection service to be more resilient when injecting exercises into patient HEPs, with improved idempotency checks and cleaner separation between prescription resolution and workout injection.
[2026-05-20]¶
Added¶
- Mobile Doctor Dashboard Redesign: Rebuilt the mobile doctor home around a patient list with at-a-glance compliance grades (A+ → F), a "My patients" vs "All patients" toggle, a "Seeing today" pinned section, tenant-wide search, a dedicated patient detail screen, and a new Quick Analysis view that surfaces flags, suggested clinical notes, the patient's upcoming session, and their last completed session with elevated pain/exertion highlighted.
- Compliance grades and activity stats come from the same backend service that powers the admin Daily Review tool
- Each patient row shows a grade chip, last-visit chip with a stale indicator after 14 days, and flag chips for elevated pain/exertion, long inactivity, excessive exercises, and never-started states
- Action grid on the patient detail screen exposes Start Test, Record Exercise Video, Manage HEP, and View Videos — each gated by its tenant feature flag
- Two Section Info popovers explain what movement tests and personalized videos are, useful for therapists trying these features for the first time
- Daily Review (Admin): New
/admin/daily-reviewadmin tool. Pick a tenant, therapist, date, and set of patients on that therapist's caseload, then download a multi-page printable PDF briefing. Each patient page shows compliance grade with reason, 7/14/30-day session counts, AI-style suggested talking points, the upcoming session's exercises (with personalized videos marked), and the last completed session's exercises with elevated pain/exertion flagged. Gated to admin users only. - Patient Re-onboarding (Mobile): When a patient was invited but never finished signing up, the patient detail screen now shows a one-tap Re-onboard patient flow. Choose to send the invite email, copy a fresh magic link, or display a QR code for in-clinic scanning. Generating a new link invalidates any prior token for that patient. If the patient has no date of birth on file, the modal collects it first.
- Personalized Video Library Picker (Mobile): When recording a personalized exercise video, doctors can now tap Choose from Library to pick an existing clip from their phone instead of recording a new one. Library videos longer than two minutes are rejected up front. Exercise search now lists the full library by default — no need to type to see what's there.
Changed¶
- Doctor Patient Summary API:
/doctorpatient-list endpoints now return per-patient compliance grade, activity stats, last completed date, and next upcoming session inline (developer-facing). Reuses the sharedgradeFromActivityandgetPatientSummaryStatshelpers extracted from the Daily Review service. - Invite Token Hashing: Patient invite and QR-code tokens now use SHA-256 + indexed unique lookup instead of bcrypt + loop-and-compare. The raw tokens are already 256 bits of entropy from
crypto.randomBytes, so bcrypt's slowness bought nothing and would block indexed lookup. Pre-2026-05-14 tokens are invalidated; the welcome and confirm pages now surface a clear migration message asking patients to request a fresh invite from their therapist. - Personalized Video Storage Layout: Personalized exercise videos now save to region/env/tenant-scoped paths in both S3 and Cloudflare (
personalized-video/{region}/{env}/tenant-{id}/video-{videoId}-{uuid}.mp4in S3) for clearer ops visibility and per-environment isolation. Pre-existing videos keep their old paths — the change is forward-only. - Mobile SDK Upgrade + Performance: Expo and React Native dependencies bumped to the latest stable; eslint config migrated to flat config; assorted performance and stability passes across the doctor dashboard, patient onboarding modal, and video flows.
Fixed¶
- Web Logout: Reworked the auth-state handling so logout reliably clears the session state, refresh cookies, and any in-memory tokens. Adds shared cookie and route helpers used by the header, login page, and HTTP client.
- Onboarding Migration Copy: The
/onboarding/welcomeand/onboarding/confirmpages now explain the May 14 invite-system upgrade when an older link fails, instead of showing the generic "Invalid Link" message. - Personalized Video Upload Reliability: Reworked the mobile video upload pipeline to use a shared signed-URL helper with consistent retries and progress reporting, and added new backend tests around upload completion and storage naming.
[2026-05-13]¶
Added¶
- Patient Dashboard Refresh (Web): Reworked the patient dashboard streak display. The daily streak number now lives inside the 7-day row as its own column, and rest days vs. completed days use distinct blue/green colors with red for over-limit misses. A new card below the streak prompts patients to install the mobile app with a one-tap link (auto-detects iOS, Android, or desktop). The headline switches to a streak-aware message once the patient is 2+ days into a streak.
Changed¶
- Anonymous Exercise Video Access: The exercise detail route now returns video sources for unauthenticated requests, so shareable exercise links no longer require a login to play the demo video.
- Guidelines UI Polish: Library collections are now collapsed by default in the doctor view, and the generation picker modal opens automatically when adding context to a plan.
- Admin Nav Cleanup: Removed the unused "New Patients" tab from the admin navigation menu.
Fixed¶
- Exercise Thumbnails: Fixed an intermittent issue where exercise thumbnails could fail to render after plan generation.
[2026-05-11]¶
Fixed¶
- Exercise Drag-and-Drop Reordering: Fixed an issue where dragging an exercise within a workout could leave the order out of sync between the UI and the saved plan.
- Smart Notifications — Minor Admin Fixes: Smaller observatory and notification-management polish in the admin area.
[2026-05-08]¶
Fixed¶
- Smart Notifications — Patient Overrides Tenant Scoping: Per-patient overrides now correctly pass the patient's tenant when looking up policy, preventing overrides from being read against the wrong tenant policy in multi-tenant admin sessions.
[2026-05-06]¶
Added¶
- New Clinic Tenants: Added Ivy Rehab and Upstream Rehabilitation as platform tenants with brand configurations and logos.
[2026-05-04]¶
Added¶
- Email Campaigns (Admin): New
/admin/email-campaignspage for sending targeted markdown email blasts via SendGrid. Build a recipient list from tenant filters + user-type + presets (therapists with no patients, recent therapists with no patients, therapists with no active patients, patients inactive for N days, patients with no therapist), deselect individuals, or import a CSV of emails with add/only/intersect blending. Compose in English or Russian, preview, send a test, then send to the full list with 2-second per-recipient throttling. Distinct from Feature Announcements (broadcast to all therapists) and Notification Management (transactional sends). - Guidelines: 2-Level Hierarchy & Delaware Import Script: Guidelines now support a parent-child hierarchy — a Collection guideline can group its child Link, PDF, and Note guidelines (one level deep). Added
scripts/importUniversityDelawareGuidelines.tsas a worked example of bulk ingestion, seeding the company-wide library with University of Delaware PT guidelines grouped by body region.
Changed¶
- Guidelines Admin Polish: Several bug fixes in the admin area around editing, tagging, and tenant defaults. Updated the default From-address for admin-originated emails.
[2026-05-03]¶
Added¶
- Guidelines System: Doctors and admins can now store, organize, and retrieve clinical reference materials — links, uploaded PDFs, markdown notes, and collections. Guidelines are scoped by visibility (company-wide, tenant, physician, or patient-specific) and categorized with a hierarchical tag taxonomy supporting translations. Uploaded content is automatically chunked for AI consumption, enabling the AI assistant to cite relevant clinical guidelines when generating plans.
- PDFs (up to 25 MB) are uploaded directly to object storage via presigned URLs; links are fetched and extracted server-side with SSRF protection
- AI-visible guidelines are served to the plan generator as structured chunks with source citations
- Doctors can save default guideline selections at the patient, physician, or clinic level — defaults cascade (patient → physician → tenant) and are pre-selected during plan generation
- Tag definitions support translations and parent-child hierarchies
- Gated by the
guidelinestenant feature flag - Personalized Exercise Filter (Mobile): The mobile exercise picker now includes a "Personalized" segment that filters to exercises the therapist has already recorded a personalized video for the selected patient. Complements the existing All Exercises, My Private, and Favorites segments.
Changed¶
- Mobile Video Handling Refactor: Unified exercise video handling across all video providers (Cloudflare Stream, Kinescope, YouTube, S3) into a priority-based source selection system. The mobile app now uses a structured
ExerciseMediatype withvideoSourcesandphotoSourcearrays instead of checking individual provider fields, improving consistency and making it easier to add new video sources.
[2026-04-29]¶
Added¶
- Promotion Campaigns: New tenant-scoped promotional campaigns. Admins can create branded partner campaigns at
/admin/promotions— set a campaign slug, landing/success copy, partner display name, free-months reward, and one or many promo codes (single-add or bulk import). Therapists visit/therapist-promo/<slug>(on the tenant's domain), enter a code, and either sign up with the reward applied automatically or — if already registered — log in and add the promotion from their profile. Each campaign has a built-in analytics dashboard tracking signups per day, patients invited and consented, workouts scheduled and completed, with a per-therapist breakdown.- Codes have optional max-redemption caps and active windows; redemption uses serializable database transactions so caps cannot be exceeded by concurrent redeems
- Three redemption sources are tracked:
SIGNUP(code entered on signup form),CAMPAIGN_PAGE(code validated on the partner landing page first, then signup), andPROFILE(existing therapist applies code from their profile) - Gated by the
promoCodeCapturetenant feature flag
- Admin User CSV Export: New "Export to CSV" button on
/admin/user-management. Filter by one or more tenants and one or more user types (or leave empty for all), then download a 20-column CSV including names, contact info, account status, GDPR consent state, last device platform, and connection counts. Output is RFC 4180–compliant with a UTF-8 BOM so Excel reads Cyrillic names correctly.
Changed¶
- Doctor Auto-Approval at Signup: New doctor accounts are now approved immediately at signup instead of requiring a manual admin approval step. Therapists can log in and start working as soon as they finish registration. The admin approval toggle on
/admin/user-managementis preserved and now functions as a revoke control for cases where an account needs to be disabled.
[2026-04-27]¶
Added¶
- Personalized Exercise Filter (Web): When a therapist opens the exercise picker from a patient-scoped flow, the picker now shows pill-style scope buttons with a new "Personalized" option that filters to exercises the therapist has already recorded a personalized video for that patient. The other scopes ("All Exercises", "My Exercises", "Favorites") replace the old folder dropdown. Mirrors the existing mobile picker behavior.
- Plan Creation Thumbnails: Exercise thumbnails now render throughout the AI plan generation flow — initial plan creation modal, edit plan modal, day workout preview, plan comparison view, and the selected-exercise card list. AI-generated exercises previously arrived without media data, so the picker now hydrates them on the fly and the therapist sees the same thumbnails before, during, and after AI suggestions are applied.
Changed¶
- Exercise Media Architecture (developer-facing): Consolidated exercise media handling into a shared module across API, mobile, and web. The API now returns a structured
mediaobject on exercise responses (videoSources[]+photoSource) alongside the existing flat fields for backward compatibility. Adds first-class support for therapist-uploadeds3videos in the priority chain, signed-URL caching, and a newscripts/auditExerciseMedia.tsaudit tool. No user-visible behavior change. See Exercise Media Type Refactor for the full breakdown.
[2026-04-20]¶
Changed¶
- Workout Details — Exercise Media: The therapist's workout details modal now displays personalized exercise videos and uploaded exercise media inline. Previously, personalized videos only appeared during patient workout playback; therapists can now review them when examining any completed session.
Fixed¶
- Doctor–Patient Authorization on Legacy Routes: Legacy workout routes now enforce doctor–patient access verification, ensuring doctors can only view workout data for patients they are connected to.
Added¶
- New Clinic Tenants: Added HSS and Synergy Health & Wellness as platform tenants with brand configurations and logos.
- HIPAA Compliance FAQ: Added a HIPAA compliance question to the Otera Health homepage FAQ (bilingual English/Russian).
[2026-04-14]¶
Fixed¶
- Welcome Email & Reminder Links: Therapist welcome emails and daily workout reminder CTAs on tenants whose stored domain was missing an
https://prefix previously produced broken login links. Tenant domains are now normalized through a single shared helper before email send, so the CTA always points at a valid URL. The normalizer also rejects non-http URL schemes (ftp:,mailto:,javascript:), closing a small scheme-injection surface on tenant-configured domains.
[2026-04-13]¶
Changed¶
- Marketing Homepage Redesign:
/is now brand-aware. Each deployment resolves to one of three homepages based on its build: a full Otera Health clinic-buyer site, a Russian-market OKTA Health variant, or a minimal tenant-branded login gateway for the 12 custom-tenant clinics. Custom-tenant deployments auto-detect their parent marketing brand (Otera or OKTA) from the runtime hostname, so the "Learn more" link always points back to the right marketing site. - The original patient-first landing page is preserved verbatim at
/patientsso SEO traffic and patient-intent visitors still have a home. - Both
/and/patientsare public routes — no login required.
[2026-04-09]¶
Added¶
- Patient–Therapist Feedback Loop: Patients and therapists now exchange structured workout feedback inside the existing conversation thread.
- When a patient finishes a workout with any flagged exercises (pain ≥ 7, exertion ≥ 9, or written comments), a Patient Feedback Summary card is automatically posted to the conversation with each connected therapist, listing the flagged exercises with pain/exertion badges and any patient comments. Therapists receive a push notification.
- Therapists can open a new Session Viewer screen (mobile) or session detail modal (web) to review the patient's workout exercise-by-exercise and leave post-exercise notes (up to 1000 characters per exercise). After a 5-minute coalescing window, all notes for that session are bundled into a single Therapist Notes card posted back to the conversation, and the patient receives a single push notification.
- Note editing is currently mobile-only; web users can review sessions but not edit notes inline.
- Available on web and mobile, gated by the
feedbackNotificationstenant feature flag.
[2026-04-08]¶
Added¶
- App Entrance Tracking: The platform now detects when patients open the app without completing a workout. After a 2-hour window, if no real workout was logged that day, an inferred workout is created from the patient's current exercise plan. Therapists see an "App Entrance" badge on these sessions in the workout table; patients see an "App Visit" badge in their workout history.
- If the patient completes a real workout before the window expires, the entrance is automatically canceled
- Re-opening the app extends the 2-hour window
- Inferred workouts count toward streaks and RTM billing
- Available on both web and mobile
- Gated by the
appEntranceTrackingtenant feature flag
[2026-04-07]¶
Added¶
- Circuit Workout Mode: Patients can now choose between "Regular" and "Circuit" playback modes before starting a workout. Regular mode completes all sets of each exercise before moving to the next. Circuit mode rotates through exercises one set at a time within each block (Warm Up, Main Session, etc.), similar to a gym circuit training format. The option appears automatically when a workout block contains two or more exercises.
- Available on both web and mobile
- In circuit mode, intermediate sets auto-advance to the next exercise without showing the feedback modal; feedback is collected only on the final set of each exercise
- Exercise list is locked (no manual reordering) while in circuit mode
Changed¶
- Admin Workout Stats — Contact Info: The Done Workouts Stats admin table now displays patient email and phone number in a dedicated Contact column.
[2026-04-06]¶
Added¶
- Rich Daily Reminder Emails: Daily workout reminder emails now include the full exercise list with sets, reps, and duration for each exercise, AI-generated anatomical benefit summaries explaining how the workout connects to the patient's condition, and per-exercise form and activation cues. Uses the patient's next incomplete workout, last 3 completed workouts, and injury context to generate personalized content via GPT. Emails are bilingual (English/Russian) with a branded "Start Your Workout" CTA button linking to the patient's tenant domain.
- Rich content is generated at send time (not pre-cached) for freshness
- If AI generation fails, falls back to the existing basic email template
- Deep Link Landing Page: New
/start-workoutweb page that notification email CTAs can link to. On iOS, the URL triggers a Universal Link that opens the app directly when installed. On desktop or when the app is not installed, the page recommends the mobile app with platform-specific download links and a "Continue to Login" fallback. Supports?email=query parameter for login pre-fill.
Changed¶
- Notification Email CTA URLs: Email notifications now resolve tenant-specific domains dynamically via
CtaUrlService, replacing hardcoded domain references. CTA URLs include email pre-fill for frictionless login.
[2026-04-05]¶
Added¶
- Notification Observatory: Admin tool for real-time observation of notification dispatch decisions. Browse all patient notification profiles with filtering by engagement segment and mode, and forecast upcoming notification opportunities for any patient — showing the full 13-point anti-annoyance filter evaluation, channel selection, cached content status, and celebration potential.
- Admin Scripts: Admin page for running one-off maintenance scripts. Currently supports an apology email script: identify patients who received erroneous notifications within a configurable time window, preview affected users, selectively exclude individuals, and send branded bilingual apology emails via SendGrid.
- Personalized Exercise Auto-Injection: When a therapist records a personalized exercise video, the exercise is now automatically added to the patient's upcoming workouts with AI-generated prescription defaults (sets, reps, duration). Uses GPT to analyze patient history and exercise characteristics, with fallback to conservative defaults if AI is unavailable.
[2026-04-02]¶
Added¶
- Smart Notifications: AI-powered notification engine that sends personalized workout reminders and celebration messages to patients via push and email. The system classifies patients into 6 engagement segments (Never Started, Early, Building, Streaking, Lapsing, Dormant), computes optimal send times by learning each patient's workout habits, and generates personalized content using GPT-4 with handwritten template fallback.
- Anti-annoyance safeguards: 13-point checklist filters every notification — checks quiet hours, daily/weekly caps, minimum gap, workout completion status, and more
- Post-workout celebrations: Automatic congratulatory notifications after workout completion, with special messages for streak milestones (5, 10, 25, 50, 100, 200, 365 days)
- Patient controls (mobile): Patients can configure timing mode (Off, Fixed Time, Smart), intensity (Minimal, Normal, Motivational), quiet hours, and per-type toggles from the mobile app
- Admin tools (web): Policy management per clinic, per-patient overrides with pause/unpause, notification testing with content preview, and suppression analytics dashboard
- Push notification infrastructure: Mobile device token registration via Expo Notifications, channel-aware delivery (push-first for active users, email-first for new patients)
- Gated by the
smartNotificationstenant feature flag
Fixed¶
- Various stability and timezone fixes across admin panel and notification delivery
[2026-03-30]¶
Added¶
- Patient Exercise History & Video Library: Patients can now browse their complete exercise history and view personalized videos recorded by their therapist. The Past Workouts page adds an "Exercises" tab (when personalized videos are enabled) with two sub-tabs: "Personalized" shows doctor-recorded demonstration videos, and "All Exercises" shows every exercise the patient has completed with set counts and completion dates. Videos play in a full-screen modal.
- Available on web, mobile, and via new API endpoints (
GET /v2/exercises/my-history,GET /v2/personalized-exercise-videos/my-videos)
[2026-03-26]¶
Added¶
- Admin Panel — Patient-Therapist Assignments: Admins can now assign patients to therapists from any tenant directly in the admin area. A two-column picker lets admins search and select a patient and therapist within a tenant, then confirm the assignment.
[2026-03-24]¶
Fixed¶
- Mobile Reduce Motion Accessibility: Animations in the AI onboarding flow and workout feedback modal now respect the device's "Reduce Motion" accessibility setting, preventing motion-triggered discomfort for sensitive users.
[2026-03-19]¶
Added¶
- Admin Panel — Therapist Onboarding: Admins can now bulk-onboard therapists via manual entry or CSV upload directly from the admin area. Each invite includes a customizable branded welcome email with an auto-generated password. Supports single or batch therapist creation with real-time validation and a test-email preview.
- Doctor Patient Onboarding API: Backend support for doctor-initiated patient invites, supplementing the existing mobile onboarding flow.
[2026-03-18]¶
Added¶
- HEP Prescription Notes & Tolerances: Doctors can now set pain tolerance, exertion tolerance, and add clinical notes per exercise when prescribing HEP dosages from the mobile app.
- Mobile HEP Unsaved Changes Guard: The HEP editor now warns doctors before navigating away with unsaved changes, showing a summary of pending edits with options to save, discard, or cancel. The swipe-back gesture is disabled while edits are in progress.
Fixed¶
- Exercise Prescription Saving: Prescribed pain tolerance, exertion tolerance, and exercise notes now persist correctly when saving HEP plans.
[2026-03-17]¶
Added¶
- Admin Panel — Feature Announcements: Admins can now compose and send feature update emails to therapists directly from the admin area. Announcements support markdown formatting with a live preview, locale selection (English/Russian), and can be pre-filled from existing documentation templates. Includes a confirmation step and rate-limited delivery via SendGrid.
[2026-03-16]¶
Added¶
- Admin Panel — User Management: Admins can now view, search, filter, and delete users across all tenants from a dedicated management page. Doctor accounts can be approved or unapproved via toggle switches. Includes sortable columns and a safety confirmation modal for deletions.
- Admin Panel — Create Admin: Admins can create new admin accounts directly from the admin area with email and password.
- Admin Panel — Feature Flags UI: Admins can now toggle per-tenant feature flags from a visual dashboard instead of updating the database directly.
- Admin Panel — Access Guardrails: Admin routes are now protected by centralized middleware on both frontend and backend, replacing per-controller authorization checks.
- Knosis PT Tenant: Added Knosis PT as a new clinic tenant with custom branding and logo.
Fixed¶
- Mobile HEP Session Loading: The doctor's HEP management view now automatically reschedules overdue patient workouts before displaying sessions, preventing stale past-dated workouts from appearing. Default session window increased from 5 to 10 days.
[2026-03-15]¶
Added¶
- Mobile HEP Management: Doctors can now view and edit patient home exercise plans directly from the mobile app. Plans are organized by session (day), with inline dosage editing for sets, reps, duration, and weight. An AI composer lets doctors describe changes in natural language and preview AI-suggested modifications before applying them.
- Gated by the
therapistMobileHepManagementtenant feature flag
Fixed¶
- Doctor Messages: Fixed an issue with doctor message delivery on mobile.
[2026-03-13]¶
Added¶
- Mobile Exercise Management: Doctors can now browse, search, filter, create, edit, and delete exercises directly from the mobile app. The new Exercises tab includes tag-based filtering with AND/OR mode, segment views (All Exercises, My Private, Favorites), video and photo capture via device camera, and favorite toggling with haptic feedback.
- Gated by the
therapistExerciseManagementtenant feature flag
[2026-03-12]¶
Changed¶
- API Modular Architecture: Refactored the backend from a monolithic entry point into a modular structure with a
createApp()factory, dedicated database client module, and singleton service management. Legacy routes (5700+ lines) are extracted to a separate module. External client modules (OpenAI, S3, Telegram) use lazy-initialized singletons. CORS origins are now configurable via environment variable.
Added¶
- API Test Infrastructure: Added Jest-based test suite with Prisma mocking, supertest helpers, JWT token generation for authenticated tests, and fixture data. Initial test coverage includes auth middleware, tenant middleware, messages, user authentication, and workouts.
[2026-03-09]¶
Added¶
- Doctor Mobile Patient Onboarding: Doctors can now invite and onboard new patients directly from the mobile app. The onboarding form collects name, email, and date of birth, with optional therapist assignment when the feature is enabled. After sending the invite, doctors can generate a QR code for in-clinic patients or share the invite link.
[2026-03-04]¶
Changed¶
- Mobile Onboarding Polish: Improved the mobile AI workout builder onboarding flow with tenant-themed colors, animated input focus states, haptic feedback on back buttons, redesigned plan preview cards with day badges, a loading spinner during AI analysis, and styled follow-up question cards. Also moved several hardcoded strings to translation files.
[2026-03-03]¶
Added¶
- RTM Time-Based Billing in Dashboard: Time-based billing codes (98979, 98980, 98981) now appear alongside workout-based codes in the unified Billable Codes table. The billing store fetches both tracks in parallel, and status updates for time records automatically sync across all related codes for the same patient and month.
- Streak Recalculation Script: New admin tool (
npm run recalculate-streaks) that replays all patients' full workout history to recompute streak values. Runs in dry-run mode by default; pass--applyto write changes. Processes users in batches and reports a detailed before/after diff.
Fixed¶
- Streak Week-Transition Logic: Fixed a bug where the streak evaluation could double-process a week boundary crossing, potentially breaking streaks that should have survived. Also fixed a case where exceeding rest days in the current week (after a valid week transition) wasn't properly detected.
[2026-03-02]¶
Changed¶
- Mobile AI Onboarding Experience: The AI-powered patient intake flow on mobile now shows real-time visual progress as the AI processes responses and generates workout plans. Instead of raw streaming text, patients see an animated stage checklist (analyzing, evaluating, building synopsis, generating plan), rotating contextual tips, and content sections — synopsis, plan overview, goals, and individual workouts — that appear progressively as they're generated.
- Plan sections stream in as partial data, so patients can start reading the synopsis while workouts are still being built
- Follow-up questions appear individually as they become ready, rather than all at once when generation completes
[2026-02-27]¶
Added¶
- Personalized Exercise Videos: Doctors can now record custom exercise demonstration videos for individual patients from the mobile app. Select a patient, search for an exercise, and record up to 2 minutes of video. The personalized video automatically replaces the default exercise video in that patient's workout playback once processing completes.
- Videos are uploaded to S3 and transcoded to Cloudflare Stream in the background
- When a newer video is recorded for the same patient and exercise, the previous one is automatically deactivated
- Gated by the
therapistPersonalizedExerciseVideotenant feature flag - Exercise Auto-Canonicalization: When a therapist creates a new exercise, the system automatically checks for duplicates using both exact name matching and AI-powered fuzzy matching. Duplicate exercises are merged transparently -- all workout references, tags, favorites, templates, and personalized videos are repointed to the canonical exercise.
- Stage 1: fast exact match on normalized name (lowercase, trimmed, collapsed whitespace)
- Stage 2: AI fuzzy match (gpt-4.1-mini) for near-duplicates like abbreviations, plurals, and word order variations, with a 93% confidence threshold
- Full audit trail of all merge and skip decisions
- Gated by the
exerciseAutoCanonicalizationtenant feature flag - Doctor "Manage" Tab (Mobile): Doctors now see a dedicated "Manage" tab in the mobile app for quick access to recently completed clinical assessments with patient name badges.
- In-Clinic Patient Management (Mobile): Doctors can add patients to a session-persistent "in-clinic" list on their dashboard. Each patient card provides quick actions to start a clinical assessment or record a personalized exercise video.
Changed¶
- Mobile App Consolidation: The separate "Clinics" mobile apps (Okta Health Clinics, Otera Health Clinics) have been deprecated. All app store links and redirect pages now point to the main Okta Health and Otera Health apps. Old clinic-specific pages (
/mobile-oktaclinics,/mobile-oteraclinics) automatically redirect to the consolidated pages. - Mobile Feature Flags: The mobile app now fetches per-tenant feature flags from the server on authentication and when returning to the foreground, enabling conditional feature visibility (e.g., personalized video recording) without requiring an app update.
[2026-02-23]¶
Added¶
- Clinical Assessment Patient Assignment: Doctors can now assign completed clinical assessments to specific patients for record-keeping. An "Assign to Patient" button on the results screen opens a searchable patient picker; the assigned patient's name then appears on assessment cards in the dashboard and recent tests list. Supports reassignment and unassignment.
- Clinics with the "All Active Patients" feature enabled see all organization patients in the picker; otherwise only the doctor's directly connected patients appear
Changed¶
- Exercise Query Consolidation: Centralized exercise visibility logic into a shared helper, ensuring consistent filtering (active + public-or-owner) across all exercise-related endpoints.
- Mobile Workout Experience: Reworked the mobile workout screens with loading skeletons, smoother video loading for Kinescope exercises, animated progress bars, redesigned feedback modal, and various Android layout fixes.
- Video player now shows a thumbnail placeholder while loading for all video sources (Kinescope, Cloudflare, YouTube)
- Exercise list and feedback modals converted from RN Modal to inline overlays to fix Android WebView/Camera layering issues
- Extracted shared workout styles into a dedicated styles module
Fixed¶
- Mobile AI Workout Plans: Mobile app AI workout plan endpoints now return exercises from the user's own clinic instead of always querying the default tenant. Previously, non-default-tenant users could receive empty or incorrect exercise lists.
[2026-02-19]¶
Added¶
- Mobile Role Separation: The mobile app now routes patients and doctors through separate screen flows with access control. Patients see workouts, plan management, and messaging; doctors see clinical assessment tools. A RoleGuard component prevents cross-role navigation, and a new shared HTTP client replaces duplicated auth/fetch logic across all services.
Changed¶
- Streak Calculations: Streak logic now uses the patient's device timezone for all date comparisons, preventing issues where late-night workouts could register on the wrong calendar day.
- Streak Days Off: Users can now take up to 3 rest days per week (Mon–Sun) without breaking their daily streak. A 4th missed day in a week breaks the streak. Users who start a new streak mid-week only have days counted from their first workout onward.
- The weekly day calendar now shows rest days in blue (allowed) and missed days in red (exceeded limit), instead of marking all missed days as red.
- A "rest days remaining" indicator appears below the weekly calendar on both mobile and web.
- The web dashboard now syncs the user's timezone on every visit, matching the mobile app's existing behavior.
- Mobile Navigation: Redesigned the mobile tab bar with a floating pill-shaped design, per-tab accent colors, animated indicators, and a compact streak widget in the dashboard header showing daily streak count and a weekly calendar.
[2026-02-16]¶
Added¶
- Clinical Video Assessment (Doctor): Doctors can now record patient movement videos and receive AI-powered clinical analysis. The doctor describes the test, records up to 2 minutes of video, and the system processes it through a multi-stage pipeline: frame extraction, MediaPipe pose estimation with skeleton overlays, biomechanical metric derivation, and a 3-pass GPT analysis (visual, biomechanical, cross-validation). Results include an overall assessment, key findings, recommendations, and a scrollable gallery of pose overlay frames.
- Doctor-Specific Mobile Dashboard: Doctors now see a simplified mobile dashboard with just a "Start Test" button and access to the Profile tab. Patient-oriented tabs (Messages, History) and workout UI are hidden for the doctor role.
- Clinical Video Processing Service: New Python/FastAPI microservice (
clinical-video-service) that handles video frame extraction, MediaPipe Pose landmark detection, skeleton overlay generation, and joint angle metric derivation. Runs in Docker on port 8000.
[2026-02-15]¶
Added¶
- AI Plan Generation — File Attachments: Therapists can now attach images and PDF files alongside their clinical notes when generating AI workout plans. Attached files are sent to the AI model for analysis, enabling richer context for plan generation.
- AI Plan Generation — Assistant Side Panel: After an AI plan is generated, therapists can open a side panel to refine the plan through conversation. Ask the AI to adjust exercises, change difficulty, or modify the plan, and review proposed changes in a comparison view before accepting.
- AI Plan Generation — Drag-and-Drop Attachments: Therapists can now drag and drop files directly onto the notes input area instead of using the attach button.
- AI Plan Editing — Chat File Attachments: Therapists can now attach files directly in the AI assistant chat when refining a plan. Attach a new MRI scan or updated referral mid-conversation via the paperclip button or by dragging files onto the chat panel, and the AI will incorporate the new context into its suggestions.
Changed¶
- AI Plan Generation — Loading Experience: Replaced the streaming text display with a skeleton card UI that shows day cards appearing progressively as the AI generates each workout, providing a clearer sense of progress.
[2026-02-13]¶
Changed¶
- RTM Billing Dates: Bill dates for workout-based and time-based RTM codes now land on the first Sunday on or after the billing period ends, since RTM codes (except 98975) cannot be billed on service days.
- Workout codes (98985/98977): bill date is the first Sunday on or after the 30-day window end
- Time codes (98979/98980/98981): new bill date field set to the first Sunday on or after the calendar month end
[2026-02-12]¶
Added¶
- All Active Patients Dashboard: Therapists can now view all active patients across their entire clinic in a dedicated sub-tab on the doctor dashboard. This feature is controlled per clinic via feature flag.
- Therapist-Patient Assignment: Therapists can now assign patients to other therapists within the same clinic. Available from the "All Active Patients" table (therapist column with quick-assign buttons) and from the patient management modal. During patient invite, therapists can also pre-assign additional therapists. This feature is controlled per clinic via feature flag.
Changed¶
- RTM Billing Insights: Simplified the insights dashboard and projected codes calculator to focus on code counts and trends, removing the expected revenue calculations.
- Date of Birth Input: The three-field DOB input now displays a human-readable date preview below the fields so users can verify the date they entered.
- Cross-Therapist Plan Editing: Any therapist within the same clinic can now edit any patient's workout plan, regardless of which therapist is assigned to that patient.
Fixed¶
- Login & Signup Navigation: Fixed an issue where stale authentication state could persist when navigating to the login or signup pages, which could cause unexpected behavior. The app now clears any leftover session data before showing these pages.
[2026-02-09]¶
Added¶
- RTM Time-Based Billing (CPT codes 98979, 98980, 98981): The system now automatically tracks how much time therapists spend managing each patient per calendar month and generates the appropriate billing codes.
- Time is tracked automatically in the background as therapists view patient details, edit plans, send messages, and use other patient-facing screens
- New "Time Tracking" sub-tab in the In Progress view shows all patients with their accumulated time, progress toward billing thresholds, and projected codes
- Time-based codes appear in the Billable Codes table and Insights dashboard alongside existing workout-based codes
- Therapists can set custom reimbursement rates for each time-based code
- Before marking a time code as billed, therapists must confirm that synchronous communication (phone/video) occurred
[2026-02-05]¶
Changed¶
- Date of Birth Input Redesign: Replaced HTML5 date picker with three separate text input fields (day, month, year) for birthday entry across the platform. This improves mobile usability and provides consistent behavior across browsers.
- Field order is determined by domain: MDY (Month/Day/Year) for US domains, DMY (Day/Month/Year) for international domains
- Auto-advance focus when field is complete
- Input validation on blur with user-friendly error messages
- Leap year handling and invalid date detection (Feb 30, Apr 31, etc.)
Added¶
DOBFieldInputcomponent (components/ui/DOBFieldInput.tsx) - Reusable date of birth input with three separate fieldsuseDateFormathook (lib/hooks/useDateFormat.ts) - Runtime domain detection for date format preferencedateValidationutilities (lib/utils/dateValidation.ts) - Date validation and formatting functions
[2026-02-03]¶
Added¶
- Extended RTM CPT Billing Dashboard. We now show an inprogress and insights tabs. The inprogress tab shows a kanban board of patients grouped by their RTM progress status. The insights tab shows a dashboard of analytics and trends for the RTM billing data.
- Added filtration and sorting to the RTM CPT Billing Dashboard.
[2026-02-02]¶
Added¶
- RTM CPT Billing Dashboard: First version of billing codes dashboard for CPT codes 98975, 98985, and 98977. Therapists can view and manage RTM billing records, mark items as billed or won't bill, and refresh calculations for all tenant patients. Feature is toggleable per tenant via feature flag.
[2026-02-01]¶
Added¶
- Added logging for all interactions with the AI endpoints
Fixed¶
- Edit Plan modal no longer shows "unsaved changes" confirmation when closing without making any changes
[2026-01-31]¶
Added¶
- AI-Assisted Plan Editing: Therapists can now modify patient workout plans using natural language instructions (e.g., "make this workout easier" or "remove all dumbbell exercises")
[2026-01-30]¶
Added¶
- Drag and drop exercise reordering: Exercises can now be reordered within a workout via drag and drop
- Exercise block ordering: Exercises now automatically reposition in the workout list when their block type is changed (e.g., moving from Main Session to Warm Up)