Installation
macOS (Current Release)
Download the .dmg file from the download page. Open the disk image and drag ClinicalFlow into your Applications folder. On first launch, macOS may ask you to confirm you want to open an app from an identified developer — click Open.
Supported on macOS 11.0 (Big Sur) or later. Optimized for Apple Silicon (M1, M2, M3, M4).
File sizes: The installer is approximately 50 MB. On first launch, ClinicalFlow will prompt you to download a Whisper speech recognition model (465 MB for Small) if you choose offline mode.
Windows & Linux
Windows and Linux builds are in development. Currently, ClinicalFlow is macOS-only. Sign up for notifications on the download page to be notified when these platforms become available.
First Launch & PIN Setup
When you open ClinicalFlow for the first time, you’ll be asked to create a numeric PIN (4–8 digits). This PIN encrypts all clinical data stored on your device using AES-256 encryption.
You’ll enter this PIN every time you open the app. ClinicalFlow never stores your PIN in plaintext — only an Argon2id cryptographic hash is saved for verification.
Important: If you forget your PIN, your data cannot be recovered. The encryption is designed so that only you can access patient information. Write your PIN down and store it securely. The only recovery option is a full PIN reset, which permanently deletes all data.
After creating your PIN, the Welcome Wizard guides you through initial setup.
Welcome Wizard
The Welcome Wizard runs once after PIN creation and walks you through a 5-screen setup flow:
| Screen | Title | What You Do |
| Welcome | “Welcome to ClinicalFlow” | Introduction screen. Click Get Started to begin. |
| Step 1 of 4 | “Choose Your Language” | Select from 37 supported languages. This sets your transcription, note generation, and UI language. |
| Step 2 of 4 | “Choose Your Mode” | Select Online (Deepgram + Claude, recommended) or Offline (Whisper + Ollama, privacy-first). You can switch anytime in Settings. |
| Step 3 of 4 | “Online Setup” or “Offline Setup” | Online: Enter and test your Deepgram and Claude API keys. Offline: Verify Whisper model is ready and test Ollama connection. |
| Step 4 of 4 | “You’re All Set!” | Quick-start tips showing essential keyboard shortcuts. Click Start Using ClinicalFlow. |
After completing the wizard, it never appears again. The welcomeCompleted flag is saved in your configuration. To re-run the setup, delete your auth.json file (see Log Files for file locations).
Demo Mode
ClinicalFlow includes two built-in demo encounters to help you explore the app without a real patient visit.
Accessing Demo Mode
Triple-click the Help button (3 clicks within 400ms). A picker modal appears with two demo scenarios.
Medical Demo
A multi-problem internal medicine encounter with James Robinson (patient), Dr. Patel (physician), and Maria (medical assistant). Covers Type 2 diabetes, hypertension, peripheral neuropathy, and left knee osteoarthritis. The transcript plays back word-by-word with waveform animation (~24 entries).
Dental Demo
A comprehensive dental encounter with Ms. Ramirez (patient) and Dr. Chen (dentist). Covers MOD caries, endodontic failure, impacted wisdom tooth, and a 4-phase treatment plan. The transcript loads instantly (15 entries), the dental chart auto-populates with findings, and the dental_general template is auto-selected.
Demo mode is a great way to test different note templates, dental charting, medical coding, and the verification system before using ClinicalFlow in a real encounter.
System Requirements
Online Mode (Minimum)
| Operating System | macOS 11.0+ (Apple Silicon recommended) |
| RAM | 4 GB |
| Disk Space | ~1 GB (app + bundled Whisper model) |
| Internet | Required (for Deepgram and Claude API calls) |
| Microphone | Any USB or built-in microphone |
| API Keys | Deepgram (free tier: $200 credit) + Anthropic |
Offline Mode (Recommended)
| Processor | Apple Silicon (M1 or later) |
| RAM | 8 GB recommended (Whisper + Ollama) |
| Disk Space | ~8 GB (app + Whisper model + Ollama model) |
| Internet | Not required (one-time internet needed for initial Ollama model download) |
| Dependencies | Ollama (free, separate install from ollama.com) |
Recording Basics
The record button is the large circular button at the bottom center of the app. Press it or hit Space to start recording. The button pulses red and a timer counts up in the header.
Controls
| Action | Button | Shortcut |
| Start / Stop recording | Record button (red circle) | Space or Cmd+R |
| Pause / Resume | Pause button (appears during recording) | P |
During Recording
- The timer in the header counts up (MM:SS format)
- The waveform visualizer animates at 60 FPS to show audio input level
- Transcript entries appear in real time in the left panel
- Each entry shows the speaker name, timestamp, and transcribed text
- The transcript auto-scrolls to the latest entry (can be toggled off in Settings)
Maximum Session Duration
Sessions are limited to 4 hours of continuous recording. When this limit is reached, recording stops automatically.
Crash Recovery
ClinicalFlow writes audio data to disk continuously during recording (flushing every ~10 seconds). If the app crashes mid-recording, your audio is preserved up to the last flush. On restart, ClinicalFlow recovers the session automatically.
Online Transcription (Deepgram)
Online mode uses Deepgram Nova-3 Medical, a cloud-based speech recognition model optimized for clinical encounters. It provides the highest accuracy and real-time speaker diarization.
Setup
- Sign up at deepgram.com (free tier includes $200 of credit)
- Create an API key in your Deepgram dashboard
- Open ClinicalFlow Settings → Transcription → paste your API key → click Save
The connection indicator in the header will show Online — connected when the key is valid.
How It Works
Audio is captured from your microphone, encoded as 16-bit PCM at 16 kHz mono, and streamed to Deepgram over an encrypted WebSocket connection (WSS). Deepgram returns transcription results with word-level timestamps and speaker labels. A keepalive signal is sent every 8 seconds, and utterance boundaries are detected after 1,500ms of silence.
Keyterm Boosting
ClinicalFlow sends up to 100 medical terms to Deepgram as keyterm parameters, drawn from the corrections dictionary and medical dictionary. This improves recognition accuracy for clinical terminology.
Speaker Diarization
Deepgram automatically identifies different speakers in the audio stream. ClinicalFlow maps these speaker IDs to the speakers you’ve defined in the sidebar.
Offline Transcription (Whisper)
Offline mode uses a local Whisper Small model (465 MB, multilingual) running via a whisper-server HTTP sidecar. No audio ever leaves your machine.
How It Works
Audio is captured in 3-second chunks with 0.5-second overlap. Each chunk is sent as a 16 kHz mono WAV to the local whisper-server via HTTP POST. The server keeps the model loaded in memory between requests for fast inference. Chunks below a 200 RMS silence threshold are skipped to avoid processing silence.
Model Details
| Model file | ggml-small.bin (multilingual) or ggml-small.en.bin (English-only) |
| Size | 465 MB each |
| Startup timeout | 30 seconds for model loading |
| Request timeout | 10 seconds per chunk |
| Temperature | 0.0 (deterministic) |
| Threads | Auto-detected (minimum 4) |
| Network binding | 127.0.0.1 only (no external access) |
No speaker diarization: Whisper does not provide speaker diarization. In offline mode, you can manually switch speakers in the sidebar, or use the 1.5-second silence detection heuristic to auto-switch.
Microphone Setup
ClinicalFlow uses your system’s default audio input device. Audio is captured at 16 kHz, 16-bit signed mono via the native audio stack (cpal on Rust).
For best results, use an external USB microphone positioned between you and the patient. Built-in laptop microphones work but capture more ambient noise.
On macOS, you’ll need to grant microphone permission on first launch: System Settings → Privacy & Security → Microphone → enable ClinicalFlow.
Languages (37)
ClinicalFlow supports 37 languages across the full pipeline: transcription, medical term corrections, note generation, and date formatting.
| Region | Languages |
| English (4) | en-US, en-GB, en-AU, en-IN |
| Romance (8) | Spanish, Latin American Spanish, French, Italian, Portuguese, Brazilian Portuguese, Dutch, Romanian |
| Germanic (4) | German, Swedish, Danish, Norwegian |
| Asian (10) | Japanese, Korean, Chinese (Simplified), Chinese (Traditional), Hindi, Tamil, Telugu, Thai, Vietnamese, Indonesian, Malay |
| Slavic (8) | Russian, Ukrainian, Polish, Czech, Slovak, Bulgarian, Croatian, Slovenian |
| Other (3) | Arabic, Hebrew, Turkish, Finnish, Hungarian, Greek |
Correction Dictionaries
Medical term corrections are available for 6 languages, totaling 204 patterns:
| Language | Patterns |
| English | 82 |
| Spanish | 30 |
| French | 29 |
| German | 21 |
| Portuguese | 21 |
| Italian | 21 |
Languages without dedicated correction dictionaries use the base transcription engine output without post-processing.
Medical Term Corrections
Speech-to-text engines frequently garble medical terminology. ClinicalFlow applies a post-processing step after transcription that fixes common errors using 204 regex patterns across 6 languages.
What Gets Corrected
| Category | Examples |
| Drug names | “metforming” → metformin, “lipator” → Lipitor, “hydroclorothiazide” → hydrochlorothiazide |
| Conditions | “hypertention” → hypertension, “dye-a-beet-eez” → diabetes, “arithemia” → arrhythmia |
| Abbreviations | “bee pee” → BP, “ee kay gee” → EKG |
| Vital signs | Catches unrealistic values like “BP 1420 over 88” and flags for review |
Custom Dictionary
Corrections are loaded from language-specific JSON files in the app’s data directory (corrections.json for English, corrections-es.json for Spanish, etc.). You can edit these files to add corrections specific to your specialty:
[
{ "pattern": "\\bmetforming\\b", "flags": "gi", "replacement": "metformin" },
{ "pattern": "\\byour-custom-term\\b", "flags": "gi", "replacement": "CorrectTerm" }
]
ClinicalFlow reloads the corrections file on each app launch. Changes take effect on the next recording.
Hallucination Filtering
Whisper occasionally produces false positive text output from silence or background noise. ClinicalFlow filters these automatically before they reach the transcript.
What Gets Filtered
- Whisper meta-tags:
[blank_audio], (silence), (blank audio), (no audio)
- Background sounds:
(music), (laughter), (coughing), (breathing), (footsteps), and similar
- YouTube/social media artifacts: “subscribe”, “like and subscribe”, “thank you for watching” (training data leakage from Whisper)
- Generic filler: “thank you.”, “goodbye.”, “the end.”, single-word outputs
- Structural patterns: Fully parenthesized strings, repeated words/phrases, empty output
Not configurable. The hallucination filter is hardcoded in the Rust backend (audio.rs). It cannot be modified without recompiling the application.
Medical Vocabulary Conditioning
ClinicalFlow conditions the Whisper model with a prompt containing 55+ medical terms to improve recognition of clinical terminology. This prompt is passed to whisper-server via the --prompt flag.
Term Categories
| Category | Count | Examples |
| Medications | 62 | metformin, lisinopril, atorvastatin, gabapentin, warfarin |
| Conditions | 80+ | hypertension, atrial fibrillation, COPD, osteoarthritis |
| Anatomy | 21 | cervical, thoracic, lumbar, bilateral, anterior, posterior |
| Vitals | 9 | systolic, diastolic, blood pressure, heart rate, SpO2 |
| Labs | 12 | A1c, CBC, BMP, CMP, TSH, lipid panel, creatinine |
| Dental | 35+ | caries, periodontitis, mesial, occlusal, buccal, pulpitis |
Not user-configurable. The medical vocabulary prompt is compiled into the Rust binary. Changing it requires editing audio.rs and recompiling.
Speaker Management
The sidebar’s Speakers section lets you define who is in the encounter. Each speaker gets a name, a role, and a unique color that appears in the transcript.
Adding a Speaker
Click the + button in the Speakers section. Enter a name (e.g., “Dr. Martinez”) and select a role. ClinicalFlow automatically assigns a color.
Switching the Active Speaker
Click a speaker’s name in the sidebar to make them the active speaker. All subsequent transcript entries will be attributed to this speaker until you switch again or auto-detection switches for you.
Removing a Speaker
Click the × button next to a speaker’s name. Existing transcript entries from that speaker are preserved.
Roles & Colors
Each speaker can be assigned one of three roles. The role determines how the speaker’s words are categorized in the generated clinical note:
| Role | Abbreviation | Note Categorization |
| Physician | Dr | Statements go to Objective, Assessment, and Plan sections |
| Patient | Pt | Statements go to Subjective (chief complaint, symptoms, history) |
| Other | Ot | Context-dependent; can represent a nurse, family member, translator, or other participant |
Each speaker has a unique color in the transcript, displayed as a left border on each entry for easy visual scanning.
Auto-Detection
When Auto-detect speakers is enabled (Settings → Recording), ClinicalFlow uses two methods to automatically switch speakers:
- Diarization data (online mode) — Deepgram provides speaker IDs with each transcript segment, and ClinicalFlow maps these to your defined speakers.
- Silence detection (both modes) — After 1.5 seconds of silence, ClinicalFlow may switch the active speaker. This works best in clear turn-taking conversations.
Auto-detection is not perfect. You can always manually click a speaker in the sidebar to correct it.
Cloud AI (Claude Haiku 4.5)
Cloud AI uses Anthropic’s Claude Haiku 4.5 (claude-haiku-4-5-20251001) to generate clinical notes. It provides the highest quality output with the most natural clinical language.
Setup
- Sign up at console.anthropic.com
- Create an API key (starts with
sk-ant-)
- Open ClinicalFlow Settings → AI Note Generation → select Cloud AI
- Paste your API key and click Save
- Click Test to verify the connection
Technical Details
| Model | claude-haiku-4-5-20251001 |
| Temperature | 0.3 (generation), 0.1 (verification pass) |
| Max tokens | 2,048 per request |
| Timeout | 120 seconds |
| Typical input | ~1,500 tokens (transcript + system prompt) |
| Typical output | ~800 tokens per note |
Cost
A full online encounter (Deepgram transcription + Claude note generation with verification) costs approximately $0.10–$0.15 per encounter for a 15-minute visit. This is separate from your ClinicalFlow subscription — you pay Deepgram and Anthropic directly through your own API keys.
How It Works
When you click Generate Note (or press G), ClinicalFlow sends the full transcript to Claude along with a detailed clinical prompt that specifies the note template, evidence-extraction rules, safety constraints, and output structure. Claude’s response streams back in real time — you see the note being written section by section.
Ollama (Local AI)
Ollama runs AI models entirely on your local machine. No data leaves your computer. It’s free, open-source, and supports dozens of models.
Installation
- Download Ollama from ollama.com/download
- Install and launch it (it runs in the background)
- Open Terminal and pull a model:
ollama pull llama3.1:8b
- In ClinicalFlow Settings → AI Note Generation → select Ollama
- Click Test to verify the connection, then Refresh to load available models.
Recommended Models
| Model | Size | Quality | Speed |
llama3.1:8b | 4.7 GB | Good | Fast |
mistral:7b | 4.1 GB | Good | Fast |
gemma2:9b | 5.4 GB | Very Good | Medium |
llama3.1:70b | 39 GB | Excellent | Slow (needs 64GB+ RAM) |
Configuration
Default server URL: http://localhost:11434. ClinicalFlow includes 3 automatic retries for transient failures.
Rule-Based Fallback
If both Cloud AI and Ollama are unavailable, ClinicalFlow falls back to a rule-based note generator. This deterministic system extracts information using pattern matching: vital sign patterns, medication mentions, symptom descriptions, and exam findings.
Rule-based notes are less polished than AI-generated ones but provide a reliable baseline that captures key data points. Select it explicitly in Settings → AI Note Generation → Rule-Based.
Two-Pass Verification
ClinicalFlow’s verification system runs a second AI pass after generating a note. This auditor checks every claim against the original transcript.
| Check | Description | Example |
| Hallucination | Findings not supported by the transcript | Note says “lungs clear” but no lung exam was discussed |
| Contradiction | Same finding appears as both positive and negative | “denies chest pain” but Assessment says “chest pain” |
| Omission | Something discussed but missing from the note | Labs ordered but not in the Plan |
| Categorization | Items in the wrong section | A new medication listed as “continued” |
The verification pass runs at temperature 0.1 for maximum precision. Toggle in Settings → AI Note Generation → Verification pass.
Verification requires AI. The verification pass uses the same AI engine as note generation (Cloud AI or Ollama). It is not available with the rule-based engine.
Clinical Prompt System
ClinicalFlow uses a carefully engineered prompt to guide AI note generation. The prompt includes:
- Template specification — Exact section headers and structure for the selected template (from all 20 built-in templates)
- Evidence-extraction rules — Every line must trace back to something explicitly stated in the transcript
- Omission logic — If a system or exam component was not discussed, it is omitted (not listed as “not assessed”)
- Pertinent negatives — Only negatives the patient explicitly denied are included
- Medication categorization — Separates new prescriptions, continued medications, and dosage changes
- Multilingual output — For non-English languages, an OUTPUT LANGUAGE directive generates clinical content in the target language while keeping section headers in English for the note parser
- Dental chart integration — When a dental template is selected, dental chart findings are serialized into the prompt
- Medical/dental coding — When auto-coding is enabled, a separate coding prompt generates ICD-10, CPT, E&M, or CDT codes from the note content
Template Overview
ClinicalFlow includes 20 built-in note templates across 5 categories, plus the ability to create custom templates. Select a template from the dropdown (#formatSelector) in the sidebar, or change your default in Settings.
General Templates (3)
| Template | Key | Sections |
| SOAP Notes | soap | Subjective, Objective, Assessment, Plan |
| HPI-Focused | hpi | Patient Demographics, Chief Complaint, History of Present Illness, Review of Systems, Physical Examination, Assessment & Plan |
| Problem-Oriented | problem | Visit Overview, Problem 1 (SOAP per problem), Medications Summary, Follow-Up |
Behavioral Health Templates (2)
| Template | Key | Sections |
| DAP Note (Psychiatry) | dap | Data, Assessment, Plan |
| BIRP Note (Behavioral) | birp | Behavior, Intervention, Response, Plan |
Specialty Templates (10)
| Template | Key | Sections |
| Cardiology | cardiology | Cardiac History, Cardiovascular Examination, Diagnostics, Assessment, Plan |
| Orthopedics | orthopedics | History, Musculoskeletal Examination, Imaging, Assessment, Plan |
| Pediatrics | pediatrics | Growth & Development, History, Physical Examination, Assessment, Plan |
| OB/GYN | obgyn | OB/GYN History, Physical Examination, Labs & Studies, Assessment, Plan |
| Emergency / Urgent Care | emergency | Triage, History of Present Illness, Physical Examination, Medical Decision Making, Disposition |
| Dermatology | dermatology | History, Lesion Description, Assessment, Plan |
| Neurology | neurology | Neurological History, Neurological Examination, Diagnostic Studies, Assessment, Plan |
| Ophthalmology | ophthalmology | Ophthalmic History, Examination, Assessment, Plan |
| Preventive / Wellness | wellness | Preventive Health, Health Screening, Physical Examination, Counseling & Education, Plan |
| Procedure Note | procedure | Pre-Procedure, Procedure, Findings, Post-Procedure |
Dental Templates (5)
Dental templates automatically enable the interactive dental chart in the sidebar.
| Template | Key | Sections |
| General Dental Exam | dental_general | Chief Complaint, Dental History, Extraoral Examination, Intraoral Examination, Radiographic Findings, Dental Chart Findings, Assessment, Treatment Plan |
| Periodontal Exam | dental_periodontal | Chief Complaint, Periodontal History, Periodontal Examination, Radiographic Findings, Dental Chart Findings, Assessment, Treatment Plan |
| Endodontic Evaluation | dental_endodontic | Chief Complaint, Endodontic History, Diagnostic Testing, Radiographic Findings, Dental Chart Findings, Assessment, Treatment Plan |
| Oral Surgery Consult | dental_oral_surgery | Chief Complaint, Surgical History, Clinical Examination, Radiographic Findings, Dental Chart Findings, Assessment, Surgical Plan |
| Prosthodontic Evaluation | dental_prosthodontic | Chief Complaint, Prosthodontic History, Clinical Examination, Radiographic Findings, Dental Chart Findings, Assessment, Treatment Plan |
Custom Templates
Click + Custom Template in the template dropdown to create your own. Provide a name, define section names, and optionally write a custom AI prompt. Custom templates are stored in the ms-custom-templates config key as a JSON array.
Interactive Dental Chart
When any dental template is selected, a Dental Chart section appears in the sidebar with an “Edit Chart” button. Clicking opens a full-screen SVG dental chart modal.
The chart supports both 32-tooth adult (permanent) and 20-tooth primary (deciduous) dentition with a toggle switch. Teeth use ADA Universal numbering: adult teeth 1–32, primary teeth A–T.
Tooth States (8)
Click any tooth to open a two-tier popup. Select from 8 color-coded clinical states:
| State | Color | Hex |
| Healthy | Green | #34D399 |
| Decay / Caries | Red | #F87171 |
| Missing | Gray (40% opacity) | #64748B |
| Restored | Blue | #60A5FA |
| Implant | Purple | #A78BFA |
| Root Canal | Amber | #FBBF24 |
| Fracture | Orange | #FB923C |
| Impacted | Magenta | #E879F9 |
Surface Marking
For states that affect specific surfaces (decay, restored, fracture), a second tier of surface buttons appears after selecting the state:
| Tooth Type | Surfaces |
| Posterior (molars/premolars) | M (Mesial), O (Occlusal), D (Distal), B (Buccal), L (Lingual) |
| Anterior (canines/incisors) | M (Mesial), I (Incisal), D (Distal), F (Facial), L (Lingual) |
Anatomical validation prevents impossible surface combinations. Click outside the popup to save your selection.
AI Integration
Dental chart findings are automatically serialized into the AI prompt during note generation. The format includes dentition type, tooth number, state, and affected surfaces.
Response Parsing
When the AI generates a note mentioning dental findings, ClinicalFlow can parse findings back to the chart. Acronym protection prevents false surface detection for 18 common dental abbreviations: FPD, RPD, ZOE, FGC, PFM, MTA, SDF, BOP, CAL, TMD, TMJ, GBI, OHI, DI, CI, CEJ, PDL, and IPR.
Export
The dental chart SVG and findings table are included in PDF and text exports when enabled in Settings (ms-settings-dentalChartInExport and ms-settings-dentalFindingsInExport).
Periodontal Charting Overview
ClinicalFlow includes a full periodontal charting mode that overlays on the dental chart. When a dental template is active, a “Perio Mode” toggle appears in the dental chart modal. Enabling perio mode transforms the chart into a 6-point probing depth entry system.
Accessing Perio Mode
- Select any dental template (General Dental, Periodontal Exam, etc.)
- Open the dental chart modal via Edit Chart
- Toggle the Perio Mode switch at the top of the chart
What Perio Mode Adds
- 6-point probing depths per tooth (MB, B, DB, ML, L, DL)
- Bleeding on probing (BOP) markers per site
- Recession measurements per site
- Mobility grades (I, II, III) per tooth
- Furcation involvement grades (I, II, III) for multi-rooted teeth
- Clinical attachment level (CAL) auto-calculated from probing depth + recession
All perio data is serialized into the AI prompt during note generation and included in PDF/text exports.
Voice-Driven Entry
Probing depths and perio findings can be entered by voice during a live recording. The perio voice parser recognizes natural dictation patterns and maps them to specific teeth and sites.
Supported Voice Commands
| Voice Input | Parsed As |
| “Tooth 3, probing 3-2-4-3-2-3” | 6-point depths for tooth #3: MB=3, B=2, DB=4, ML=3, L=2, DL=3 |
| “Tooth 14, bleeding mesial and distal” | BOP marked on MB, ML, DB, DL sites of tooth #14 |
| “Tooth 19, recession 2 millimeters buccal” | 2mm recession on B site of tooth #19 |
| “Tooth 30, mobility grade 2” | Mobility II for tooth #30 |
| “Tooth 3, furcation grade 1” | Furcation I for tooth #3 |
Voice-entered data populates the perio chart in real time. You can also click individual sites on the chart to enter or correct values manually.
Tip: For fastest entry, dictate all 6 probing depths for a tooth as a sequence of numbers (e.g., “3-2-4-3-2-3”). The parser maps them left to right: MB, B, DB, ML, L, DL.
Measurements & Data Points
Each tooth in perio mode tracks the following data points:
| Measurement | Sites | Range | Description |
| Probing Depth (PD) | 6 per tooth | 1–15 mm | Distance from gingival margin to base of sulcus/pocket |
| Recession (REC) | 6 per tooth | 0–15 mm | Distance from CEJ to gingival margin |
| Bleeding on Probing (BOP) | 6 per tooth | Yes / No | Bleeding observed upon gentle probing |
| Clinical Attachment Level (CAL) | 6 per tooth | Calculated | PD + REC (auto-calculated, not manually entered) |
| Mobility | 1 per tooth | Grade I–III | Lateral and vertical tooth movement |
| Furcation | 1 per tooth | Grade I–III | Bone loss at furcation of multi-rooted teeth only |
Color Coding
Probing depths are color-coded for quick visual assessment:
| Depth | Color | Clinical Significance |
| 1–3 mm | Green | Normal / healthy sulcus |
| 4–5 mm | Yellow / Amber | Moderate pocketing — monitor or treat |
| 6+ mm | Red | Deep pocket — active periodontal disease likely |
Documentation Completeness Scoring
ClinicalFlow automatically calculates a documentation completeness score for each perio charting session. This helps ensure thorough documentation before generating notes or exporting.
How Scoring Works
The score is a percentage (0–100%) based on the ratio of documented data points to expected data points for the teeth present in the chart. Missing teeth are excluded from the calculation.
| Component | Weight | Criteria |
| Probing depths | Primary | All 6 sites recorded for each present tooth |
| BOP | Secondary | BOP status recorded for probed sites |
| Recession | Secondary | Recession values recorded where applicable |
| Mobility | Supplemental | Mobility recorded for teeth with deep pockets |
| Furcation | Supplemental | Furcation recorded for multi-rooted teeth with bone loss |
Score Display
The completeness score appears as a badge in the perio chart header. Scores below 80% display a warning suggesting the provider complete additional measurements before generating the note.
Note: The completeness score is informational — it does not prevent note generation. You can generate a note at any completeness level.
Automatic Billing Codes
ClinicalFlow automatically generates billing codes from the generated note content when auto-coding is enabled (ms-settings-autoCoding). Codes appear in a read-only panel (#codingPanel) below the note sections with colored confidence badges.
Confidence Levels
| Level | Meaning |
| High | Strong, specific documentation supports this code |
| Medium | Documentation supports but lacks some specificity |
| Low | Code is inferred from context; documentation is indirect |
Codes are read-only with a copy-to-clipboard option. No direct editing of suggested codes in the UI.
Medical Coding (ICD-10 + CPT)
For medical (non-dental) templates, ClinicalFlow generates:
- Up to 8 ICD-10-CM diagnosis codes with confidence levels
- Up to 4 CPT procedure codes with confidence levels
- E&M level assessment (Level 1–5) based on number of problems addressed, data complexity, and risk of morbidity/mortality
The system uses only real, valid ICD-10-CM and CPT codes.
Dental Coding (CDT + Dental ICD-10)
For dental templates, ClinicalFlow generates CDT D-codes and dental-specific ICD-10 codes. The dental coding engine enforces 4 strict guardrails:
1. Strict Domain Gate
Only CDT D-codes and dental ICD-10 codes are allowed. CPT codes (00100–99499), E&M levels, and non-dental codes are strictly forbidden. Every procedure code must begin with “D”.
2. Depth & Severity Escalator
Never defaults to the shallowest/generic code. If “approaching pulp” or “deep caries” is documented, codes escalate to K04.0/K04.1 rather than K02.51. If “bone loss” or “deep pockets >5mm” is documented, periodontal codes escalate from K05.10 to K05.311+.
3. Structural vs. Positional Trauma
Every injury is classified into exactly one track:
- Track A (structural failure): cracked/fractured → K03.81, S02.5XXA, D2740, D7140
- Track B (positional displacement): loosened/luxated → S03.2XXA, M26.30, D7270, D4921
Codes from both tracks are never assigned to the same tooth.
4. Etiology of Absence
For every missing tooth, the reason is determined. Default is acquired (K08.111–K08.409) unless the transcript explicitly states “congenitally absent”, “agenesis”, or “hypodontia” → then congenital (K00.0).
Audit Flags
After billing codes are generated, ClinicalFlow runs an audit pass that checks for common documentation and coding issues. Audit flags appear as collapsible alerts below the coding panel.
What the Audit Checks
| Flag Type | Description | Example |
| Unsupported code | A suggested code lacks sufficient documentation in the note | ICD-10 code assigned but the condition is only mentioned in the transcript, not the note |
| Specificity gap | A more specific code could be used based on the documentation | Unspecified laterality when the note clearly states “left knee” |
| Missing linkage | A procedure code is present without a supporting diagnosis code | CPT procedure assigned without a corresponding ICD-10 diagnosis |
| E&M mismatch | The E&M level does not align with documentation complexity | Level 5 suggested but only 2 problems documented |
| Duplicate domain | Overlapping codes that may trigger payer rejections | Two ICD-10 codes covering the same condition at different specificity levels |
Interacting with Flags
Each flag is collapsible — click to expand for details and the specific code(s) involved. Flags are informational only and do not modify the suggested codes. They help providers review and correct coding before submission.
Clinical Warnings
Separate from audit flags, ClinicalFlow generates clinical warnings when the note content suggests potential safety or quality concerns. Warnings appear as highlighted alerts in the coding panel.
Warning Categories
| Warning | Trigger |
| Drug interaction | Two or more medications mentioned that have known major interactions |
| Allergy conflict | A prescribed medication matches a documented allergy |
| Missing follow-up | A significant finding is documented but no follow-up plan is specified |
| Incomplete assessment | A problem is mentioned in the transcript but absent from the Assessment section |
Important: Clinical warnings are AI-generated suggestions, not clinical decisions. Always apply independent clinical judgment. ClinicalFlow is a documentation tool, not a clinical decision support system.
Inline Editing
After note generation, each section is editable directly in the note panel. Click on any section content to make changes. Edits are saved to the active session automatically.
PDF Export
Press E or click the Export PDF button. ClinicalFlow uses a native Swift html2pdf sidecar (WebKit createPDF) to generate a professional PDF with header, formatted sections, disclaimer footer, and optional dental chart.
PDFs are saved to the app’s exports directory with the filename ClinicalFlow_Note_YYYY-MM-DD_HH-MM.pdf.
Text Export
Press T to download the transcript as a plain text file. A native save dialog lets you choose the location. The default filename is ClinicalFlow_Transcript_YYYY-MM-DD.txt.
Copy to Clipboard
Click the Copy button in the note panel header to copy the entire note as plain text. Paste it directly into your EHR (Epic, Cerner, Athena, or any system that accepts text input).
Export Actions
ClinicalFlow provides configurable export actions that appear in the note panel toolbar after note generation. You can enable or disable individual actions to streamline your workflow.
Available Actions
| Action | Description | Default |
| Export PDF | Generate a formatted PDF with header, note sections, dental chart, and disclaimer | Enabled |
| Copy to Clipboard | Copy the entire note as plain text for pasting into an EHR | Enabled |
| Download Transcript | Save the raw transcript as a .txt file | Enabled |
| Send to EHR | Push the note to a connected EHR system via HL7 (requires EHR integration setup) | Hidden until configured |
| Generate Narrative | Create an insurance-ready narrative from the note and coding data | Enabled |
Action visibility is managed in Settings. Disabled actions are hidden from the toolbar entirely, keeping the interface clean.
Session Archiving
When you click New Session (or press N), ClinicalFlow archives the current encounter. The archive includes the full transcript, generated note, audio recording, dental chart data, coding results, and all session metadata.
Archives are named YYYY-MM-DD_HH-MM_PatientName, encrypted with AES-256-GCM, and sorted newest-first in the archive browser. Audio is stored as a separate unencrypted WAV file.
EHR Integration
ClinicalFlow can export clinical notes to Electronic Health Record systems using the HL7 v2 messaging standard. This allows direct transmission of generated notes into your EHR without manual copy-paste.
Setup
Configure EHR integration in Settings → Advanced → EHR Integration:
| Field | Description |
| Facility Name | Your practice or facility name (included in HL7 MSH segment) |
| Facility ID | Your facility’s OID or identifier for HL7 routing |
| Default Patient MRN | Default Medical Record Number for outgoing messages (can be overridden per session) |
How It Works
- After note generation, click Send to EHR in the export toolbar
- ClinicalFlow packages the note into an HL7 v2 ORU^R01 message
- The message includes patient identifiers, note sections, coding data, and dental findings
- The HL7 message is sent to the configured endpoint
Compatibility: HL7 v2 is supported by most EHR systems including Epic, Cerner, Athena, eClinicalWorks, and NextGen. Contact your EHR vendor for interface setup requirements.
PMS Bridge
The Practice Management System (PMS) Bridge connects ClinicalFlow to your dental or medical practice management software for bidirectional data exchange.
Supported Systems
| System | Protocol | Data Exchanged |
| Dentrix | Database bridge | Patient demographics, treatment plans, billing codes |
| Eaglesoft | Database bridge | Patient demographics, treatment plans, billing codes |
| Open Dental | Database bridge | Patient demographics, treatment plans, billing codes |
| Custom / Other | Configurable | Depends on system capabilities |
Configuration
Configure PMS Bridge in Settings → Advanced → PMS Bridge:
| Field | Description |
| PMS System | Select your practice management software from the dropdown |
| Host | Database server hostname or IP (e.g., localhost) |
| Port | Database port number |
| Database | Database name |
| Username / Password | Database credentials (encrypted at rest) |
Use the Test Connection button to verify connectivity before saving. A successful test confirms ClinicalFlow can reach the PMS database.
Network: The PMS Bridge connects over your local network. Ensure the PMS database is accessible from the machine running ClinicalFlow. No data is sent to external servers.
Insurance Narrative Generation
ClinicalFlow can generate insurance-ready narratives from the clinical note and billing codes. These narratives are formatted for insurance claim submissions and pre-authorization requests.
What the Narrative Includes
- Clinical justification — summarizes the patient’s condition and why the treatment is medically/dentally necessary
- Supporting documentation — references specific findings from the examination
- Procedure rationale — links each procedure code to the clinical indication
- Diagnosis correlation — maps ICD-10 or dental ICD-10 codes to the documented findings
Generating a Narrative
After note generation with coding enabled, click Generate Narrative in the export toolbar. The AI processes the note content, billing codes, and dental chart data to produce a cohesive narrative. The narrative can be copied to clipboard or exported as part of the PDF.
Tip: Insurance narratives work best when the clinical note is thorough. Enable the verification pass to ensure completeness before generating the narrative.
General & Advanced Tabs
The Settings drawer is organized into two tabs accessible via a segmented control at the top:
| Tab | Contains | Purpose |
| General | Account, Appearance, AI & Transcription, Recording, Dental | Day-to-day settings you may adjust frequently |
| Advanced | EHR Integration, PMS Bridge, Language, Security | Configure-once integrations and system settings |
Click a tab to switch views. Your selected tab is remembered for the duration of the session.
Appearance
| Setting | Options | Description |
| Theme | Dark / Light | Switches the entire app between dark and light color schemes. Dark is the default. |
Transcription Settings
| Setting | Options | Description |
| Mode | Online / Offline | Online uses Deepgram Nova-3 Medical. Offline uses Whisper Small. Switch anytime. |
| Deepgram API Key | Text input (masked) | Your Deepgram API key. Encrypted at rest. |
| Recognition Language | 37 languages | Primary language for speech recognition. Applies to both modes. |
AI Engine Settings
| Setting | Options | Description |
| Engine | Cloud AI / Ollama / Rule-Based | Which system generates clinical notes. |
| Anthropic API Key | Text input (masked) | Required for Cloud AI. Encrypted at rest. |
| Ollama Server URL | Text input | Default: http://localhost:11434 |
| Ollama Model | Dropdown + Refresh | Default: llama3.1:8b. Click Refresh to load available models. |
| Verification Pass | On / Off | Runs a second AI pass to audit the note. Doubles generation time. |
| Auto Coding | On / Off | Automatically generate billing codes after note generation. |
Recording Settings
| Setting | Default | Description |
| Auto-scroll transcript | On | Automatically scrolls to the latest transcript entry. |
| Show timestamps | On | Displays MM:SS markers on each transcript entry. |
| Auto-detect speakers | On | Automatically switches speakers based on diarization or silence. |
| Highlight medical terms | Off | Color-codes 1,300+ recognized conditions, medications, procedures, and anatomy terms. |
| Include dental chart in export | On | Adds dental chart SVG to PDF exports. |
| Include dental findings in export | On | Adds dental findings table to exports. |
EHR Integration Settings
Found in Settings → Advanced tab → EHR Integration card.
| Setting | Type | Description |
| Facility Name | Text input | Your practice or facility name for HL7 message headers. |
| Facility ID | Text input | OID or identifier used for HL7 routing. |
| Default Patient MRN | Text input | Default Medical Record Number. Can be overridden per session. |
PMS Bridge Settings
Found in Settings → Advanced tab → PMS Bridge card.
| Setting | Type | Description |
| PMS System | Dropdown | Select: Dentrix, Eaglesoft, Open Dental, or Custom. |
| Host | Text input | Database server hostname or IP address. |
| Port | Number input | Database port number. |
| Database | Text input | Database name on the server. |
| Username | Text input | Database login username. |
| Password | Text input (masked) | Database login password. Encrypted at rest. |
| Test Connection | Button | Verifies connectivity to the PMS database. |
Language Settings
Found in Settings → Advanced tab → Language card.
| Setting | Options | Description |
| Recognition Language | 37 languages | Sets the primary language for speech recognition, medical term corrections, note generation, and UI labels. Applies to both online and offline transcription modes. |
Security Settings
| Setting | Options | Description |
| Auto-lock | 2 / 5 / 10 / 15 / 30 min / Never | Locks after inactivity. Default: 5 minutes. When page is hidden: 60 seconds. Deferred during active recording. |
PIN Reset: There is no PIN change feature. To change your PIN, you must use “Reset PIN” which permanently destroys all data (config, sessions, archives, auth) and starts fresh.
Keyboard Shortcuts
| Shortcut | Action | Context |
| Space | Start / Stop recording | Not in input/textarea |
| P | Pause / Resume recording | While recording |
| G | Generate clinical note | When idle, entries exist |
| E | Export note as PDF | When note generated |
| N | New session | Always (confirm if data exists) |
| T | Download transcript | When entries exist |
| Cmd/Ctrl+R | Toggle recording | Always |
| Cmd/Ctrl+F | Search transcript | Always |
| Cmd/Ctrl+, | Open Settings | Always |
| Escape | Close all modals | Always |
Encryption at Rest
ClinicalFlow encrypts all files containing protected health information using AES-256-GCM with keys derived from your PIN via PBKDF2-HMAC-SHA256 (100,000 iterations).
What Is Encrypted
| File | Contains | Encrypted? |
config.json | API keys, settings, preferences | ✓ Yes |
sessions/active.json | Current transcript, note, dental chart, coding | ✓ Yes |
sessions/archive/*.json | Past encounter data | ✓ Yes |
auth.json | PIN hash (Argon2id), welcome flag | ✗ No (needed before decryption) |
sessions/archive/*.wav | Audio recordings | ✗ No (binary audio) |
exports/* | PDFs and text files | ✗ No (user-exported) |
logs/*.log | Operational logs | ✗ No (sanitized, no PHI) |
Each encrypted file has a unique random salt (16 bytes) and nonce (12 bytes) prepended to the ciphertext. Total overhead: 28 bytes per file. Writes are atomic (write to .tmp, then rename) to prevent corruption.
PIN & Lock Screen
The PIN serves two purposes: authentication (proving you’re authorized) and key derivation (your PIN is the cryptographic key that unlocks encrypted files).
- PIN is verified using Argon2id hashing (memory-hard, resistant to brute force)
- Only the hash is stored (in
auth.json), never the PIN itself
- PIN length: 4–8 numeric digits
- No lockout after failed attempts — the encryption itself is the protection
- Auto-lock default: 5 minutes of inactivity (60 seconds when page is hidden)
- Auto-lock is deferred during active recording to prevent data loss
Network Requests
| Destination | Data Sent | When | Encryption |
wss://api.deepgram.com | Audio stream (16-bit PCM, 16 kHz) | During online recording | WSS (TLS 1.2+) |
https://api.anthropic.com | Transcript text + clinical prompt | During Cloud AI note generation | HTTPS (TLS 1.2+) |
http://localhost:11434 | Transcript text + prompt | During Ollama note generation | None (localhost only) |
https://*.supabase.co | Auth tokens, license checks | Subscription verification | HTTPS (TLS 1.2+) |
Full offline mode: When both transcription (Whisper) and note generation (Ollama or Rule-Based) are set to local, ClinicalFlow makes zero outbound network connections (except periodic subscription verification if applicable).
HIPAA Considerations
ClinicalFlow implements HIPAA technical safeguards: encryption at rest (AES-256-GCM), unique user authentication (PIN), automatic logoff (auto-lock), audit logging (sanitized, no PHI), transmission security (TLS for all network requests), Content Security Policy headers, and localhost-only Whisper binding.
For full HIPAA compliance, your organization also needs Business Associate Agreements (BAAs) with Deepgram and Anthropic if using online features, plus organizational policies covering training, incident response, and access management.
ClinicalFlow is not a covered entity. It is a tool. HIPAA compliance is a shared responsibility between the software (technical safeguards), the API providers (BAAs), and your organization (policies and procedures).
Data Handling Summary
| Question | Answer |
| Where is data stored? | Locally at ~/Library/Application Support/com.clinicalflow.ai/ |
| Is data encrypted? | Yes. AES-256-GCM with PIN-derived keys (config, sessions, archives). |
| What data leaves my device? | Only when using online features: audio to Deepgram, transcript to Anthropic, auth tokens to Supabase. |
| Can ClinicalFlow see my data? | No. There are no ClinicalFlow analytics or telemetry servers. |
| How do I delete my data? | New Session clears active data. Delete individual archives. Or uninstall to remove everything. |
| What if I lose my PIN? | Encrypted data is unrecoverable. Reset PIN destroys all data. |
Plans & Billing
ClinicalFlow uses Supabase for authentication and Stripe for payment processing.
| Detail | Value |
| Free trial | 14 days with full access |
| Pro Monthly | $25/month |
| Pro Annual | $250/year (saves $50) |
| Default seats | 3 per checkout |
| Offline grace period | 30 days — if network verification fails but was verified within 30 days, cached status is trusted |
| Verification interval | Every 7 days maximum |
Subscription States
| State | App Access |
trial | Full access, shows days remaining |
active | Full access |
past_due | Full access with payment warning |
expired | Locked — shows upgrade options |
Manage your subscription through the in-app billing portal, which opens Stripe’s management interface.
Note: Subscription costs are separate from API costs. You pay Deepgram and Anthropic directly through your own API keys for transcription and AI note generation.
Microphone Issues
“No microphone found”
Ensure a microphone is connected. Check System Settings → Sound to confirm it’s recognized. Try unplugging and replugging USB microphones.
“Microphone access denied”
macOS: System Settings → Privacy & Security → Microphone → enable ClinicalFlow.
Transcription Issues
Poor transcription accuracy
- Use an external USB microphone instead of built-in laptop mic
- Reduce ambient noise (fans, HVAC, other conversations)
- Speak clearly and at a normal pace
- Check that the correct language is selected in Settings
Deepgram connection failed
- Verify your API key in Settings
- Check your internet connection
- Check status.deepgram.com for outages
- Switch to offline mode as a workaround
Ollama Issues
“Ollama not connected”
- Make sure Ollama is running:
ollama list in Terminal
- If not installed, download from ollama.com
- Check the server URL in Settings (default:
http://localhost:11434)
Out of memory
Switch to a smaller model (e.g., llama3.1:8b instead of llama3.1:70b) or use Cloud AI.
Note Generation Issues
Note seems incomplete or inaccurate
- Ensure the transcript is complete before generating
- Enable the verification pass to catch omissions
- Check that speakers are correctly labeled
- Try a different template that better matches the encounter type
Cancel a stuck generation
The Generate button becomes a Cancel button during generation. Click it to abort. ClinicalFlow uses an AbortController to cleanly cancel API calls. Timeout is 120 seconds.
Export Issues
PDF export shows blank page
Try exporting again. If the issue persists, use Copy to Clipboard as an alternative.
Save dialog doesn’t appear
Check that ClinicalFlow has file access permissions in System Settings → Privacy & Security → Files and Folders.
Crashes & Recovery
App crashed during recording
Your audio is safe. ClinicalFlow writes to disk every ~10 seconds. On restart, the session is recovered automatically.
App crashed during note generation
The transcript is preserved. Regenerate the note from the saved transcript after restart.
Low memory warning
ClinicalFlow monitors available system memory. Warnings appear at <2 GB free. Close other applications or switch to a smaller model.
Log Files
ClinicalFlow writes structured logs for debugging. Logs never contain patient data.
File Locations
| Content | Path |
| Logs | ~/Library/Application Support/com.clinicalflow.ai/logs/ |
| All data | ~/Library/Application Support/com.clinicalflow.ai/ |
Log files are named clinicalflow-YYYY-MM-DD.log, rotated daily, and auto-cleaned after 30 days.
System Architecture
ClinicalFlow is a desktop application built with Tauri v2. The frontend is vanilla HTML/CSS/JavaScript (17 modules, ~6,065 lines) running in a native webview. The backend is Rust (6 modules, ~2,200 lines), handling audio capture, file encryption, and system integration. No JavaScript frameworks are used.
Component Overview
┌─────────────────────────────────────────────────────┐
│ Tauri Webview │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ Transcript │ │ Note Panel │ │ Sidebar │ │
│ │ Panel │ │ (editable) │ │ │ │
│ │ │ │ │ │ Speakers │ │
│ │ Real-time │ │ 20 templates │ │ Templates │ │
│ │ entries │ │ Dental chart │ │ Settings │ │
│ │ 1,300+ terms │ │ Coding panel │ │ Archive │ │
│ └──────────────┘ └──────────────┘ └───────────┘ │
│ │
│ 17 JS modules — UI, prompts, templates, dental, │
│ notes, coding, subscription, audio, settings │
└─────────────────────┬───────────────────────────────┘
│ invoke() / listen()
│ (26 Tauri IPC commands)
┌─────────────────────┴───────────────────────────────┐
│ Rust Backend │
│ │
│ audio.rs — cpal capture, whisper-server, │
│ hallucination filter, vocab prompt │
│ storage.rs — Encrypted sessions, config, │
│ archives, PDF export, logging │
│ crypto.rs — AES-256-GCM, PBKDF2 key derivation │
│ auth.rs — Argon2id PIN, auto-lock, AppState │
│ logging.rs — Tracing, daily rotation │
│ lib.rs — App setup, command registration │
└─────────────────────┬───────────────────────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────────┐ ┌─────────┐ ┌──────────────────┐
│whisper-server│ │html2pdf │ │ Local Storage │
│ (3.44 GB) │ │ (62 KB) │ │ │
│ │ │ Swift │ │ auth.json │
│ ggml-small │ │ WebKit │ │ config.json 🔒 │
│ 465 MB model │ │ PDF gen │ │ active.json 🔒 │
│ HTTP sidecar │ │ │ │ archive/*.json🔒 │
│ 127.0.0.1 │ │ │ │ archive/*.wav │
└──────────────┘ └─────────┘ │ logs/*.log │
└──────────────────┘
External Services (online mode only):
┌───────────────┐ ┌───────────────┐ ┌──────────────┐
│ Deepgram API │ │ Anthropic API │ │ Supabase │
│ WSS streaming │ │ HTTPS (Claude)│ │ Auth + Stripe│
└───────────────┘ └───────────────┘ └──────────────┘
┌───────────────┐
│ Ollama │
│ localhost │
│ :11434 │
└───────────────┘
🔒 = AES-256-GCM encrypted with PIN-derived key
Data Formats
File Storage Structure
~/Library/Application Support/com.clinicalflow.ai/
├── auth.json PIN hash + welcome flag
├── config.json [ENCRYPTED] Settings & API keys
├── sessions/
│ ├── active.json [ENCRYPTED] Current session
│ └── archive/
│ ├── 2026-02-23_18-45_PatientName.json [ENCRYPTED]
│ └── 2026-02-23_18-45_PatientName.wav Audio recording
├── exports/
│ ├── ClinicalFlow_Note_2026-02-23.pdf
│ └── ClinicalFlow_Transcript_2026-02-23.txt
└── logs/
└── clinicalflow-2026-02-23.log
All session data is stored as JSON files (no database). Sessions include entries, speakers, note sections, dental chart state, and coding results.
How ClinicalFlow Compares
An honest comparison of where ClinicalFlow fits relative to other AI clinical documentation tools.
ClinicalFlow’s Strengths
- Offline mode. Most AI scribes are cloud-only. ClinicalFlow runs with zero internet.
- 20 specialty templates + dental & perio charting. Covers general, behavioral health, 10 specialties, 5 dental templates, full periodontal charting, and custom templates.
- Automatic billing codes with audit flags. ICD-10, CPT, E&M, and CDT coding with audit flags and clinical warnings.
- EHR & PMS integrations. HL7 v2 export to EHR systems, PMS Bridge for Dentrix/Eaglesoft/Open Dental, and insurance narrative generation.
- Transparent pricing. $25/month with 14-day free trial. Cloud API costs separate and pay-as-you-go.
- Data stays local. In offline mode, nothing leaves your machine. No ClinicalFlow servers.
- Open architecture. Bring your own API keys, choose your AI models.
- Encryption at rest. PIN-based AES-256 encryption is not standard in most scribe tools.
Where Others May Have an Advantage
- Deep EHR integration. Products like Nuance DAX, Abridge, and Suki offer embedded EHR integration. ClinicalFlow supports HL7 v2 export but does not embed directly inside EHR interfaces.
- Ambient listening. Some products run continuously without pressing a button. ClinicalFlow requires explicit start/stop.
- Multi-user and team features. Enterprise products offer multi-provider support, shared templates, and admin dashboards. ClinicalFlow is single-user.
- Mobile apps. Some competitors have iOS/Android apps. ClinicalFlow is macOS desktop-only.
- Cross-platform. ClinicalFlow currently runs only on macOS (Apple Silicon). Windows and Linux are planned.
Summary Table
| Feature | ClinicalFlow | Typical Cloud Scribe |
| Offline mode | ✓ Full offline available | ✗ Cloud-only |
| Note templates | 20 built-in + custom | Varies |
| Dental charting | ✓ Interactive 32+20 teeth | ✗ Rarely available |
| Periodontal charting | ✓ 6-point probing, voice entry | ✗ Not available |
| Billing codes | ✓ ICD-10, CPT, E&M, CDT | Varies |
| Audit flags | ✓ Coding audit + clinical warnings | Varies |
| Monthly cost | $25/mo + API usage | $100–$400/month |
| Data residency | Local device | Vendor’s cloud |
| Encryption at rest | ✓ AES-256-GCM | Varies |
| EHR integration | ✓ HL7 v2 export, copy/paste, PDF | Direct Epic/Cerner |
| PMS Bridge | ✓ Dentrix, Eaglesoft, Open Dental | Varies |
| Insurance narrative | ✓ AI-generated | ✗ Rarely available |
| Mobile app | ✗ macOS desktop only | Often ✓ |
| Languages | 37 | Varies (often fewer) |
ClinicalFlow is best for: Independent practitioners, small practices, dental offices, rural clinics, international settings without reliable internet, and any provider who wants control over their data and costs.
Version History
v1.0.0 — Initial Release
February 2026
- Dual-mode transcription: Deepgram Nova-3 Medical (online) and Whisper Small (offline, 465 MB)
- AI note generation: Claude Haiku 4.5 (cloud), Ollama (local), and rule-based fallback
- 20 built-in note templates across 5 categories (General, Behavioral Health, Specialty, Dental, Preventive) plus custom templates
- Two-pass verification system for hallucination, contradiction, and omission detection
- Interactive dental chart: 32-tooth adult + 20-tooth primary, 8 states, 5-surface marking
- Periodontal charting: 6-point probing depths, BOP, recession, mobility, furcation, voice-driven entry
- Documentation completeness scoring for perio charting sessions
- Medical coding: ICD-10 (up to 8), CPT (up to 4), E&M level assessment
- Dental coding: CDT D-codes + dental ICD-10 with 4 guardrails
- Audit flags and clinical warnings for coding review
- Multi-speaker management with 3 roles (Physician, Patient, Other) and 1.5s silence detection
- Medical term post-processor with 204 correction patterns across 6 languages
- Whisper hallucination filtering and medical vocabulary conditioning (55+ terms)
- PIN-based authentication with AES-256-GCM encryption at rest (PBKDF2 100k iterations, Argon2id)
- Auto-lock after configurable inactivity (default: 5 minutes)
- EHR integration via HL7 v2 export
- PMS Bridge for Dentrix, Eaglesoft, and Open Dental
- Insurance narrative generation from notes and billing codes
- PDF export (Swift WebKit sidecar), text export, clipboard copy, configurable export actions
- Session archiving with transcript, note, audio, dental chart, and coding data
- Continuous WAV save (~10s intervals) for crash recovery
- Structured logging with PHI sanitization (30-day retention)
- Settings drawer with General/Advanced tabs and squircle card layout
- Dark and light themes
- 37-language support (full pipeline: transcription + corrections + notes + UI)
- 1,300+ medical term highlighting in transcript
- Welcome wizard (5-screen setup) and 2 demo scenarios (medical + dental)
- Subscription/licensing via Supabase + Stripe (14-day trial)
- 10 keyboard shortcuts
- Built with Tauri v2 for macOS (Apple Silicon)