Product Guide · Part 2

Five screens that orbit the dashboard.

Queue, Appointments, Patients, Medications, Archive — the Solo Mode pages doctors and reception live in when they’re not in the consultation cockpit. Same six-section structure, deeper breakdowns.

15-minute read 5 pages, 23 components Real labels, real flows
Part 1 · Solo Doctor & ReceptionPart 3 · Station Mode
Section 01 · Queue page

Where the day is run, not just monitored.

The Queue page is the operational hub. Reception adds, edits, and removes; the doctor watches in read-only. Both surfaces share the same live stream — no refresh ever needed.

At a glance
  • WhoReception (active) · Doctor (read-only)
  • OutcomeA clean, ordered day
myclinic-system.com/reception/queue
Queue
Manage the patient queue in real time.
4 waiting · 1 in progress
Add to queue
⌘K to focus search
Yousef Hammad…2347
ExaminationFollow-upConsult
Active queue5
Real-time
With doctorReem Al-SayedExamination
1NextYousef HammadExamination
2Mona FaroukFollow-upAppt
3Adham SaadConsultation
4Heba El-BannaExamination
Completed today18
View archive →
Mariam SaadExamination13:54Done
Karim AdelFollow-up13:42Done
Sarah HanyConsultation13:18Done
Floating comments

Numbered callouts on the mockup above.

1
Why

Add to queue, top of the page

The form lives where eyes already land. No accordion, no modal — friction here multiplies across every walk-in.

2
Why

Active queue uses cards, not rows

Cards give room for the multi-line context (specialty, doctor, phone) that mid-day staff actually scan for. Rows would compress this into noise.

3
Why

Position 1 has a Next badge, not a divider

When the doctor is busy, Position 1 means 'next up'. When they're idle, Position 1 has the start authority. The badge encodes both states.

4
Why

Completed Today stays on-page

Reception needs to know what's been done — without leaving for Archive. Six rows max here, then it collapses.

5
Why

Remove only on Waiting rows

An in-progress visit can't be removed; it has to be completed by the doctor. The trash icon disappears the moment the patient is started.

Components

Reusable building blocks.

<AddToQueueCard/>

AddToQueueCard

The single intake surface — patient + visit type → Add.

BehaviourInline form. Patient picker autocompletes by name and phone.
DoKeep open by default. Reception's hand is already on it.
Don'tWrap in an accordion. Saves 80px of vertical space, costs 0.5s per walk-in.
<ActiveQueueList/>

ActiveQueueList

Real-time card list, numbered, with status states.

BehaviourSubscribes to queue:created/updated/removed; auto-renumbers in place.
DoAnimate position changes subtly. Sudden re-orders disorient mid-conversation staff.
Don'tMix completed patients into this list. They belong below.
<CompletedToday/>

CompletedToday

Six most recent done-visits in chronological reverse.

BehaviourCollapses past N=6 to a 'View archive' link.
DoShow timestamp, not just type — reception fields 'when did X leave?' all day.
Don'tPaginate. If you need pagination, you need Archive.
<Remove confirmation/>

Remove confirmation

Single-click toast confirm with Undo.

BehaviourSoft-removes the queue item; persists 8s undo window.
DoDefault to Undo, not 'Are you sure'. Reception removes 5+ entries a day.
Don'tOpen a full modal. The action is too small for that ceremony.
User flow

Adding a walk-in, end-to-end.

01

Search patient

Type last 4 digits of phone, or first 3 of name.

02

Pick visit type

Examination · Follow-up · Consultation.

03

Click Add

New row lands at the bottom of the queue, position N+1.

04

Tell the patient

Their position and rough ETA — both visible.

Pro tips

Get more out of this page.

Speed

⌘+K to search patients

The picker accepts focus from anywhere — no need to click. Power-users add 8+ patients/hour without touching the mouse.

Hygiene

Don't remove 'no shows' yourself

Late patients should be marked No-show on Appointments, not removed from Queue. The status is tracked separately and feeds analytics.

Improvement

Smart-default visit type

Improvement: when a patient is searched and has a recent (< 30 day) prior visit, default the visit type to Follow-up. Saves a click on returning patients.

Section 02 · Appointments page

Where the day is shaped before it starts.

Reception books, confirms, and follows up appointments without leaving the page. Late and no-show flows are first-class — most appointment systems treat them as edge cases, but in a busy clinic they're a Tuesday.

At a glance
  • WhoReception only
  • OutcomePromised time = actual time
myclinic-system.com/reception/appointments
Appointments
Tomorrow at a glance, today in motion.
Live ETArefreshes on queue change
Patients ahead
4
Est. wait
17 min
Doctor delay
+6 min
Next slot
11:15
Awaiting arrival2
Past scheduled time, not yet checked in
Mariam Saad10:30+12 min lateLate
Karim Adel10:45Booked
Today · 06 May 2026
Wed
PatientTimeStatusActions
Reem Al-Sayed09:30Completed
Yousef Hammad10:00ArrivedIn queue
Mariam Saad10:30Late
Sarah Hany11:30Confirmed
Adham Saad12:00Booked
No-show patients1
Heba El-Banna09:00No show
Floating comments

What each numbered region does.

1
Why

Live ETA panel — only when it matters

Hidden when the queue is empty and the doctor is on time. Reception only sees ETA when it's worth telling a patient.

2
Why

Awaiting Arrival is an alert, not a row

When an appointment time has passed and the patient hasn't arrived, the screen surfaces it loudly. Reception decides: arrived, no-show, or wait.

3
Why

Status is the API, badge is the UI

Booked → Confirmed → Arrived → (queued) → Completed is the canonical state machine. Late and No-show are auto-transitions reception can override.

4
Why

Per-row Arrived is the most-used button

One click, no modal. The patient is in front of you — every confirmation step is friction. The action also auto-creates a queue entry.

5
Why

No-show section keeps the day honest

Marked no-shows surface here for the rest of the day. Reception can reinsert (patient eventually arrived) or close (rescheduled).

Components

Reusable building blocks.

<LiveETAPanel/>

LiveETAPanel

Tells reception what to promise — patients ahead, est. wait, doctor delay, next slot.

BehaviourComputed from queue length × Avg session, plus actual vs. scheduled doctor time.
DoRefresh on every queue:updated, not on a timer. Stale ETA is worse than none.
Don'tShow a single 'wait time' number. Patients ahead + delay reads as honest; one number reads as a guess.
<AwaitingArrivalAlert/>

AwaitingArrivalAlert

List of appointments past their scheduled time but not yet checked in.

BehaviourAuto-flips Booked → Late after `noShowDelayMin` setting. Reception can mark Arrived/No-show inline.
DoShow 'X min late' inline. The exact lateness changes the conversation.
Don'tAuto-mark No-show without grace. Manual override is the safety valve.
<AppointmentTable/>

AppointmentTable

Day's appointments with status, queue link, and actions.

BehaviourFilterable by date. Adds 'In queue' badge once `queuedAt` is set.
DoGroup by status visually. Same-status rows scan together.
Don'tShow all 30 days by default. Today is the page; the date picker handles other days.
<NoShowSection/>

NoShowSection

Bottom-of-page list of today's no-shows, with reinsertion path.

BehaviourClosing a no-show row archives it from view but keeps the audit trail.
DoMake reinsertion one click — the patient walked in 30 min late.
Don'tHide it after the day ends. It's part of the audit trail, surfaced here.
User flow

Booking through arrival, in four moves.

01

Book

Quick Add → Book Later → date + time picker.

02

Auto-status

Booked → Confirmed (after reminder) → Late (after threshold).

03

Arrived

Reception clicks Arrived on the row; queue entry auto-creates.

04

Completed

When the doctor completes the visit, status moves to Completed.

Pro tips

Get more out of this page.

Hygiene

Don't manually mark No-show early

Let the auto-threshold trigger. Manual early flags skew future ETA estimates because the system 'learns' patients are no-showing faster than they actually are.

Improvement

Use the running-late SMS

Improvement: a one-click 'running late?' SMS template on the Late status. Reduces no-shows without requiring discretion from busy staff.

Missing

Calendar view, not just a list

Improvement: the page is a list, which is fine for today but unhelpful for next week. A 7-day grid view would let reception spot empty afternoons at a glance.

Section 03 · Patients page

The clinic's patient ledger — searchable, editable, owned.

A single canonical list of every patient who has ever walked through the door. Reception adds and edits; the doctor reads. Every row links into the patient detail page so the full visit history is one click away.

At a glance
  • WhoReception (CRUD) · Doctor (read + edit)
  • OutcomeOne source of truth, no duplicates
myclinic-system.com/reception/patients
Patients
Search, add, edit — your clinic's patient ledger.
Search by name or phone…⌘K
NameAgeDOBPhoneLast visitActions
Reem Al-SayedF341991-08-12+20 106 231 2347Today
Yousef HammadM281997-03-04+20 102 555 021106 May
Mariam SaadF471979-11-23+20 122 414 448829 Apr
Adham SaadM62019-12-08+20 122 414 448829 Apr
Heba El-BannaF521973-05-19+20 100 909 912812 Apr
Karim AdelM381987-07-02+20 111 660 773308 Apr
247 patients · page 1 of 10
Floating comments

What each numbered region does.

1
Why

Search by name OR phone

Phone is unique per clinic; name isn't. Phone-first dedupes the table almost for free.

2
Why

Last-visit column for fast triage

Reception scans this column to spot returning patients (don't book a follow-up if they came yesterday) and lapsed patients (call back).

3
Why

Gender as an icon, not a column header

Venus/Mars saves a column. Gender is glanceable, not sortable.

4
Why

Edit from the row, not the detail page

90% of edits are typo fixes (phone, name spelling). The dialog opens in 50ms; the detail page would mean a route change.

5
Why

Pagination, not infinite scroll

25 per page. Reception remembers 'page 3 has the Salem family' — infinite scroll loses that mental anchor.

Components

Reusable building blocks.

<PatientSearch/>

PatientSearch

Single input, dual-indexed (name and phone, both fuzzy).

BehaviourDebounced 200ms. Maintains URL ?q= so search state survives reload.
DoAuto-focus on page load. Saves a click for the most common reception action.
Don'tAdd an 'Advanced' filter panel. Two indices are enough for 99% of lookups.
<PatientTable/>

PatientTable

Tabular list with name, gender, age, DOB, phone, last visit, notes, actions.

Behaviour25 rows per page; pagination state in URL.
DoTruncate notes after one line; tooltip the full text. Notes are scratchpads, not documents.
Don'tSort by 'last visit' by default — it shifts on every visit and confuses scrollback.
<EditPatientDialog/>

EditPatientDialog

Inline edit of patient identity and contact.

BehaviourOptimistic save with toast; rolls back on server error.
DoSurface the validation error inline (phone format, missing name).
Don'tShow 'last edited by' fields here. That belongs in audit, not in the form.
<AddPatientDialog (reception)/>

AddPatientDialog (reception)

New-patient creation with the four required fields.

BehaviourSame fields as Edit, plus a duplicate-warning toast if phone already exists.
DoMake duplicate phone a soft warning, not a hard block. Edge cases (family sharing a phone) are real.
Don'tAuto-quick-add to queue from this dialog. Two intents = two screens.
User flow

From walk-in to patient record.

01

Search first

Always. Duplicate prevention starts with a search.

02

Add if no match

Name, DOB, gender, phone — minimal viable record.

03

Edit inline later

Spelling, phone updates — no route change.

04

Click into history

Patient name → detail page → full visit timeline + Rx archive.

Pro tips

Get more out of this page.

Speed

Search the last 4 phone digits

Faster than full names, immune to transliteration variance, and exact enough that hits are usually unique.

Hygiene

Don't create duplicates 'just for now'

Two records for the same patient = two history threads. Always reconcile through Edit, never by adding a fresh record.

Missing

Tag chronic patients

Improvement: a tag column (diabetic, hypertensive, pregnant) would let reception triage walk-ins by acuity at a glance.

Section 04 · Medications page

The doctor's curated drug shelf.

A small, opinionated master list — not a copy of a pharmacopoeia. Every medication entered here becomes searchable in the visit form with its default dose pre-filled. Curation is a feature, not a chore.

At a glance
  • WhoDoctor only
  • OutcomeFaster, safer prescribing
myclinic-system.com/doctor/medications
Medications
Your clinic's curated master list.
Search medications…Sort: Last prescribed
NameDefault doseNotesActions
Amlodipine 5 mg1 tab dailyHypertension, first-line
Amoxicillin 500 mg1 cap × 3/day · 7 daysPenicillin allergy contraindicated
Paracetamol 500 mgTDS for 3 days
Sumatriptan 50 mg1 tab when neededMax 2/day, acute migraine
Vitamin D3 1000 IU1 tab weekly
Metformin 500 mg1 tab BD with mealsType II DM
Edit medicationDialog
Amlodipine 5 mg
1 tab daily
Hypertension, first-line
Floating comments

Numbered annotations on the mockup.

1
Why

Search ranks by recency, not alphabet

The medication you prescribed yesterday is more likely to be the one you want today. Recency wins — alphabetical search ranks against it as a fallback.

2
Why

Default dose is pre-filled, then editable

Set 'Amlodipine 5 mg = 1 tab daily' once. Every subsequent prescription starts there; per-patient overrides never touch the master.

3
Why

Notes are for the doctor, not the patient

Cautions, interactions, common pitfalls — surfaced in the prescription form's tooltip but never printed.

4
Why

Edit and Delete sit per-row

The medications page is read-rare, edit-rare. The actions belong on the row, not in a bulk menu — there's no 'select all and merge' use case.

5
Why

Delete is non-destructive to history

Removing a medication from the master list does not touch any past prescription. The patient still has their record.

Components

Reusable building blocks.

<MedicationTable/>

MedicationTable

Master-list table with name, default dose, notes, actions.

BehaviourSorted by name; client-side filtered by search.
DoShow 'last prescribed' as a hover hint. Drives quarterly cleanup.
Don'tPaginate. A curated list is at most ~150 items — render them all.
<MedicationDialog (Add/Edit)/>

MedicationDialog (Add/Edit)

Single dialog for both create and update — three fields.

BehaviourSubmits via /api/medications; Add appends, Edit patches by id.
DoValidate name uniqueness server-side. Two 'Amoxicillin 500 mg' entries break the search ranking.
Don'tAllow deleting a medication that's in an active queue's prescription draft. Server returns 409.
User flow

Curating the shelf, quarterly.

01

Sort by 'last prescribed'

Surface stale entries — anything > 12 months is a cleanup candidate.

02

Update doses

If your default has drifted (e.g. you now prescribe a different dose), edit once.

03

Remove dead entries

Delete the misspelled duplicate. Past prescriptions are untouched.

04

Add new

Anything you've found yourself typing as free-text twice deserves a master entry.

Pro tips

Get more out of this page.

Discipline

Curation > completeness

20 well-chosen medications you actually prescribe beat 200 imported from a generic database. Search is faster and ranking is meaningful.

Hygiene

Beware misspelled duplicates

'Amoxicilin' and 'Amoxicillin' both will appear in search and split prescription history across two threads. Server-side uniqueness on name prevents this.

Improvement

Smart-suggest from history

Improvement: detect when free-text drug names appear in 3+ visits and propose a master-list entry. Catches drift without manual quarterly review.

Section 05 · Archive page

Every visit. Every prescription. Filterable.

The archive is the long-term memory of the clinic — every completed visit with diagnosis, notes, and prescription, retrievable by patient, type, or date range. Built for the moments when reception or the doctor needs to answer a question that didn't exist when the visit happened.

At a glance
  • WhoDoctor (read) · Reception (read, filter)
  • OutcomeAudit-ready, clinically retrievable
myclinic-system.com/doctor/archive
Archive
Every completed visit, retrievable.
1,847 visits total
hypertensionname · phone · diagnosis · notes
TypeAll types
From 2026-01-01
To 2026-05-06
DatePatientTypeDiagnosisNotesPrescription
2026-05-06 14:32Reem Al-Sayed34yExaminationStable hypertensionBP 128/82. No new symptoms.Amlodipine 5 mg · 1 tab daily
2026-04-18 11:04Reem Al-Sayed34yFollow-upIron deficiency anemiaHb 9.8 → 11.2 after 6w supplementation.Ferrous sulfate 200 mg · 1 tab daily · 8 weeks
2026-04-12 16:48Mariam Saad47yExaminationEssential hypertension, newly diagnosedBP 152/94 across 3 readings. Lifestyle counselling.Amlodipine 5 mg · 1 tab dailyBendroflumethiazide 2.5 mg · 1 tab AM
2026-03-29 09:12Karim Adel38yConsultationDiscussed prior labs. No Rx.
312 visits matching · page 1 of 13
Floating comments

Annotations on the mockup.

1
Why

Search across four fields at once

Name, phone, diagnosis text, notes text — all matched in one query. Reception types 'asthma' and finds every visit that mentioned it, by anyone.

2
Why

Date range, not 'this week'

Hardcoded ranges (today/week/month) feel friendlier but answer fewer real questions. A from/to picker handles all of them.

3
Why

Diagnosis is bold; notes are mono

Diagnosis is the answer. Notes are the workings. Typography reinforces which is which during a 5-second scan.

4
Why

Prescription as a stack of pills

Each med renders as a small chip with name + dose. Quick visual diff between visits without opening anything.

5
Why

Pagination keeps the page snappy

25 visits × diagnosis + notes + Rx is already a heavy row. Scroll past 25 and you wanted a date filter anyway.

Components

Reusable building blocks.

<ArchiveFilters/>

ArchiveFilters

Search + type select + date range, with a 'Clear' shortcut.

BehaviourFilter state lives in URL params; deep-linkable.
DoShow the active filter pills above the table. Hidden state is forgotten state.
Don'tAuto-apply on every keystroke. Debounce 300ms — long-form text typing shouldn't hit the API per character.
<VisitRow/>

VisitRow

Dense visit row: date, patient, type, diagnosis, notes, Rx.

BehaviourNotes preserve whitespace (whitespace-pre-line); tooltip the full text on truncation.
DoMake patient name a link to the patient detail page.
Don'tAllow editing here. Archive is read-only — edits belong on the patient or visit record itself.
<DateRangeFilter/>

DateRangeFilter

From/to date inputs with empty=open.

BehaviourValidates 'from <= to' inline; auto-swaps if reversed.
DoDefault empty. Don't pre-select 'last 7 days' — the user came here for a reason, let them choose.
Don'tUse a calendar grid. Native date inputs are faster on every device.
User flow

Finding 'that visit, last spring'.

01

Search a keyword

Diagnosis or notes text — usually one word is enough.

02

Narrow the date

From/to picker; 'last spring' is roughly Mar–May.

03

Optionally filter type

Examination only; skips the routine consultations.

04

Read the row

Diagnosis, notes, prescription — all inline.

Pro tips

Get more out of this page.

Speed

Bookmark filtered URLs

Filter state is in the URL. Save 'all hypertension follow-ups in the last 90 days' as a bookmark — opens to the same view every time.

Compliance

Archive is the audit

Every visit, prescription, and edit is timestamped here. When compliance asks for a record, this page is the answer — export-ready.

Missing

Group by diagnosis

Improvement: a 'group by diagnosis' toggle would surface chronic-care patterns at the practice level — your top 10 diagnoses across all patients.

What’s next

Solo Mode is covered. Now the multi-doctor world.

Parts 3–5 cover Station Mode and the admin layer. Same six-section structure, same fidelity — everything you saw here, scaled to specialties, routing, and admin oversight.

Part 3 · live

Station Mode · entry surface

Multi-doctor clinics with specialties and routing. Same data model, more knobs.

Read it
Part 4

Station Doctor & Reception

The multi-doctor counterparts to Part 1.

Part 5

Admin & financials

Suspension controls, audit, performance, billing. The behind-the-scenes layer.