--- id: wiki-2026-0508-remote-rehabilitation title: Remote Rehabilitation category: 10_Wiki/Topics status: verified canonical_id: self aliases: [telerehabilitation, telerehab, digital rehabilitation] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [rehabilitation, telehealth, devops, monitoring, healthtech] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: typescript framework: nextjs-supabase-webrtc --- # Remote Rehabilitation ## 매 한 줄 > **"매 clinic 의 walls 의 dissolving — 매 patient 의 home 의 becoming 의 PT studio"**. Remote rehabilitation (telerehab) 의 PT/OT/cognitive therapy 의 delivering 의 video, sensors, gamified exercises 의 via. 2026 의 standard care 의 stroke recovery, post-op orthopedics, chronic pain — 매 reimbursement (CPT 98975-98981) 의 mainstream 의 making. ## 매 핵심 ### 매 modalities - **Synchronous**: 매 live video PT session — 매 therapist 의 form correction 의 real-time. - **Asynchronous**: 매 patient 의 records exercise 의 video 의, 매 therapist 의 reviews 의 later. - **RPM (Remote Patient Monitoring)**: 매 wearables 의 ROM, gait, HR 의 streaming 의 dashboard 의. - **DTx (Digital Therapeutics)**: 매 prescription apps — 매 Akili EndeavorRx, 매 Pear reSET (deprecated). ### 매 tech stack 의 typical - **Video**: WebRTC (Daily, Twilio Video, Zoom SDK) — 매 HIPAA BAA 의 require. - **Pose estimation**: MediaPipe Pose, 매 Apple Vision Pro Body Tracking, 매 Google ML Kit. - **Wearables**: Apple Watch, Whoop, IMU patches (BioStamp). - **Backend**: FHIR R5 의 EHR integration 의, 매 HL7 Bulk Data API. ### 매 응용 1. 매 stroke recovery — 매 mirror therapy 의 VR 의. 2. 매 post-ACL 의 ROM tracking 의 IMU 의. 3. 매 chronic low back pain 의 Hinge Health-style 의 daily exercises. ## 💻 패턴 ### Pose-based form scoring (MediaPipe + TS) ```typescript import { PoseLandmarker, FilesetResolver } from '@mediapipe/tasks-vision'; const vision = await FilesetResolver.forVisionTasks( 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10/wasm' ); const pose = await PoseLandmarker.createFromOptions(vision, { baseOptions: { modelAssetPath: '/pose_landmarker_full.task' }, runningMode: 'VIDEO', numPoses: 1, }); function squatDepthScore(landmarks: any[]): number { const hip = landmarks[24], knee = landmarks[26], ankle = landmarks[28]; const angle = Math.atan2(hip.y - knee.y, hip.x - knee.x) - Math.atan2(ankle.y - knee.y, ankle.x - knee.x); const deg = Math.abs((angle * 180) / Math.PI); return deg < 90 ? 1.0 : Math.max(0, 1 - (deg - 90) / 30); } ``` ### WebRTC 의 HIPAA-compliant session 의 ```typescript import Daily from '@daily-co/daily-js'; const call = Daily.createCallObject({ audioSource: true, videoSource: true, dailyConfig: { useDevicePreferenceCookies: true }, }); await call.join({ url: signedRoomUrl, // server-issued, BAA-covered token: patientJWT, }); call.on('recording-started', (e) => logToFHIR(e.recordingId, encounterId)); ``` ### IMU streaming 의 ROM tracking ```typescript const device = await navigator.bluetooth.requestDevice({ filters: [{ services: ['battery_service', 'heart_rate'] }], optionalServices: ['0000fff0-0000-1000-8000-00805f9b34fb'], }); const server = await device.gatt!.connect(); const svc = await server.getPrimaryService('0000fff0-0000-1000-8000-00805f9b34fb'); const ch = await svc.getCharacteristic('0000fff1-0000-1000-8000-00805f9b34fb'); await ch.startNotifications(); ch.addEventListener('characteristicvaluechanged', (e: any) => { const dv = e.target.value as DataView; const quat = [dv.getFloat32(0), dv.getFloat32(4), dv.getFloat32(8), dv.getFloat32(12)]; pushROM(quaternionToEulerDeg(quat)); }); ``` ### FHIR Observation 의 exercise log ```typescript const obs = { resourceType: 'Observation', status: 'final', category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: 'activity' }] }], code: { coding: [{ system: 'http://loinc.org', code: '82290-8', display: 'ROM knee flexion' }] }, subject: { reference: `Patient/${patientId}` }, effectiveDateTime: new Date().toISOString(), valueQuantity: { value: maxFlexionDeg, unit: 'deg', system: 'http://unitsofmeasure.org' }, }; await fetch(`${FHIR_BASE}/Observation`, { method: 'POST', headers, body: JSON.stringify(obs) }); ``` ### Adherence nudging (server cron) ```typescript export default async (req: Request) => { const { data: due } = await sb .from('patients') .select('id, phone, plan_id') .lt('last_session_at', new Date(Date.now() - 86400_000).toISOString()); await Promise.all( due!.map((p) => twilio.messages.create({ to: p.phone, from: TWILIO_FROM, body: '오늘 의 5분 의 PT routine 의 done?', })) ); return new Response('ok'); }; ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | post-acute stroke | hybrid (sync video 2x/wk + async daily) | | chronic pain (>3mo) | async-first DTx (Hinge, Sword) | | post-op week 1-2 | sync-heavy + RPM continuous | | medicare reimbursement 의 target | RTM/RPM (CPT 98975-77 + 98980-81) | **기본값**: hybrid sync+async + IMU/wearable RPM, FHIR-backed. ## 🔗 Graph - 변형: [[Pose Estimation]] - 응용: [[Stroke Recovery]] - Adjacent: [[WebRTC]] ## 🤖 LLM 활용 **언제**: exercise plan generation, session note summarization, patient-facing Q&A (with guardrails). **언제 X**: clinical diagnosis, dosage decisions, medical advice 의 unsupervised 의. ## ❌ 안티패턴 - **Consumer Zoom 사용**: BAA 없음 — HIPAA violation. - **PHI 의 client-side log**: console.log 의 patient name — 매 audit fail. - **Pose model 의 cloud-only**: latency >200ms — 매 form correction 의 useless. - **Adherence ignore**: 매 70%+ patients drop off by week 3 — nudging 없으면 ROI zero. ## 🧪 검증 / 중복 - Verified (CMS RTM/RPM 2025 final rule, Hinge Health 의 BMJ 2024 RCT, MediaPipe Pose docs). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — telerehab tech stack + FHIR/WebRTC/pose patterns |