SnapDragon Dental Labs pairs certified technicians with a fully digital workflow — scan to ship — so every crown, denture, and appliance leaves on schedule and true to shade, margin, and bite.
Real accounts, real access control. New sign-ups start unapproved until an administrator approves them.
Not connected yet. This page needs a Supabase project URL and anon key. Open the file and set SUPABASE_URL and SUPABASE_ANON_KEY near the bottom of the script.
You were signed out automatically after 15 minutes of inactivity to protect patient information. Please log in again.
Accounts are by invitation only.
✓ Almost there
We sent a confirmation link to . Click it to confirm your email, then come back here and log in.
Your account is created but hasn't been approved by an administrator yet. Check back soon, or ask your admin to approve you in the Staff panel.
Set a New Password
Signed in as
New blank form
Select an insurer and group above to load the verification form.
Insurance Verification Form
SnapDragon Dental Labs · plan details load automatically — fill the patient fields, then Print / Save as PDF. Nothing entered here is saved.
Welcome back
Month Year
Filter
Active Cases
Loading…
My Profile
Get the SnapDragon Lab App
Scan a code with your phone's camera, or tap the link, to install the app.
iPhone / iPad
Android
SnapThink
Ambient scribe for the operatory. Record an encounter and it drafts the SOAP note, treatment plan, assistant sheet and lab prescription. The recording is transcribed on your own computer and never leaves it — only the transcript is sent out for drafting.
Test build — not for clinical use
Version 0.2.8 (macOS) / 0.2.9 (Windows), pre-release. Every note it drafts has to be read and corrected before it goes anywhere near a chart.
Don't record a patient without telling them and getting their agreement first.
The audio stays on this computer. The transcript is sent out to be drafted — treat it as you would any other cloud service handling patient information.
Mac: Apple Silicon, macOS 13 or newer. Windows: Windows 10 or 11, 64-bit — 16 GB of memory is enough. Transcription runs on the processor there rather than a graphics chip, so a ten-minute encounter takes around seven minutes to transcribe instead of under twenty seconds.
This copy is issued to you. Please don't pass it on.
How to install — Windows
Run the downloaded SnapThink-Install.exe. It installs for your account only and does not ask for an administrator password.
Windows SmartScreen may warn that the publisher is unrecognised. Choose More info → Run anyway.
It carries its own Python, so nothing else needs installing. If the machine lacks the Microsoft Edge WebView2 runtime it installs that too, on first launch.
It will ask for microphone access.
The first encounter downloads the speech model — about 1.5 GB, once. Be on decent wi-fi for that one.
To upgrade later, just run the new installer — it replaces the old copy in place. Quit SnapThink first.
How to install — macOS
Open the downloaded .dmg and drag SnapThink into the Applications folder beside it.
Right-click SnapThink in Applications and choose Open — not a double-click, the first time. Click Open again when macOS asks. The app is signed by SnapDragon Dental Labs but is still going through Apple's notarisation, so the first launch needs this one confirmation. Every launch after that is a normal double-click.
First launch sets itself up and can take a minute before the window appears.
It will ask for microphone access. SnapThink needs it to record the encounter.
The first encounter you transcribe downloads the speech model — about 1.5 GB, once. It is not in the app. Be on decent wi-fi for that one, and expect the first transcription to be slow while it also warms up. Every one after that is under twenty seconds for a ten-minute encounter.
If you already have an older SnapThink (macOS)
Quit SnapThink first — right-click its Dock icon → Quit. Replacing it while it is running is what leaves a half-copied app that will not open.
Open the new .dmg and drag SnapThink into Applications. Choose Replace when macOS asks.
macOS asks to confirm the first launch again, even though you did this before — it is a new app to it. Right-click → Open once more.
Your first transcription will download a new 1.5 GB model. 0.2.x transcribes on the Mac's GPU instead of the CPU, which is about ten times faster, but it needs its own model file. The old one is not reused.
Nothing you have done is lost. Past drafts and your sign-in history live outside the app, in Library → Application Support → SnapThink, and are untouched by replacing it.
Who is using it
Loading…
Change Password
Google Calendar Sync (Lab-wide)
Connect the lab's Google account (snapdragondentallab@gmail.com) and every case's due date will show up as an event on one shared calendar there — not per practice. Case class, practice, and patient are included on the event.
Checking connection…
Time Clock
Loading…
Recent Shifts
Request Time Off
My Requests
No requests yet.
Submit a Case
Line Items
Filter
—--
—--
Case Status
Loading…
Archived Cases
Cases moved out of the main Case Status list — still here, not deleted.
Loading…
Import Cases
Upload a SnapSync export (.xlsx — Practice, Patient, Case #, Arrival, Due, Notes, Status columns)
and choose which rows to bring in as cases. Arrival becomes the case's submitted date, so
history/calendar views reflect when it actually happened, not today.
Spreadsheet Column
Goes Into
Practice
→
Auto-matched to an existing Clients record if the name matches exactly — override with the "Matched Client" dropdown per row below if it's wrong, ambiguous, or unmatched. Staff/User accounts are never offered here, only Clients. Also always kept as Practice Name (dedicated field, printed on Labels & Receipts) + Notes
Patient
→
Patient Reference
Case #
→
Original Order Number, also appended onto this app's own tracking # with a hyphen (e.g. QWERT82931-1042)
Arrival
→
Submitted Date (backdated, drives history/calendar)
Due
→
Notes (for context — not stored as its own field)
Notes
→
Notes
Status
→
Not applied — every imported case always starts at Submitted (shown here for reference only)
(chosen below, once per batch)
→
Case Type & Case Class
Labels & Receipts
Select one or more cases below, then print a physical case label (one per
case, sized for a DYMO-style label printer) or a receipt (all selected
cases on one thermal-roll strip, with a signature line — selected cases
must all share the same submitter, same as the desktop label tool).
Print Rx gives a prescription sheet per case on plain Letter paper, for
the patient chart.
Loading…
Pan Registry
Every physical pan (with its NFC tag) gets registered here once — the UID becomes that pan's
permanent serial number and can never be changed afterward, even by an Administrator. Only the
label is editable, for renaming a pan later. Register a pan by scanning its tag on the SnapDragon
status device, then typing the UID it displays into the field below.
Loading…
Clients
Practice records for clients who don't have (or don't need) a portal login of their own —
mainly for Import Cases, so an imported case can be attributed to a real, renameable client
instead of always falling back to whichever admin ran the import. Renaming a client here
updates the name shown on every case already attributed to them.
Products
Fee Schedule options:
The price catalog used when adding line items to a case (Case Status tab).
"Remove" deactivates a product rather than deleting it — it drops out of the
picker for new line items but stays intact on any case/statement that already used it.
"Download Fee Schedule" builds a client-facing price sheet (Fixed + Removable
only, Supply items excluded) to send to prospective practices. Optionally address
it to a specific doctor/practice, and apply a custom discount — every discounted
fee schedule is logged below so there's a record of what was offered to whom.
Recent Discounted Fee Schedules
Loading…
Import Products
Upload a price list (.xlsx/.xls) with Description, Category, and Price columns
(case-insensitive — "Normal Price" also matches). Pick which rows to bring in
below before importing; nothing is added until you click Import Selected.
Add Ad Hoc Charge
Bills a client directly for something that isn't tied to any case — Supply-category
items sold to a partner lab, for example. Shows up as an unbilled line item for that
client the same as a case-based one, and gets swept in the next time a statement is
generated for them. Not in the product catalog? Check "Custom line item" and type a
description/price directly instead of picking a product.
Unbilled Charges for This Client
Generate a Statement
Sweeps unbilled line items across a client's cases into one new statement. Add line
items to a case from its "Line Items" button on the Case Status tab first. Leave the
dates blank to roll up everything unbilled, or set a From/To range to invoice just
that period (a line item's date is its case's arrival date).
Tick every doctor to include. Each doctor keeps their own discount — it is applied
to their own line items and the results added together, so nobody’s agreed rate
changes by being put on a shared bill.
Doctors marked Billed by hand are skipped by the monthly automatic run,
so their work is still here when you cut the grouped bill. Set that on the Clients tab.
Open Statements
0 selected
Loading…
Paid Statements
Every paid statement stays here so an old invoice can be re-downloaded any time — search by
clinic name if it's not on the first page.
Loading…
Voided Statements
Voiding releases the statement's line items back to unbilled, so they're swept into
the next statement generated for that client automatically.
Loading…
Revenue Report
Billed vs. paid totals over a date range, broken down by client and by product
category. A statement counts by when it was generated; a line item counts by when it
was added to the case (not by when it was eventually billed) — so the category
breakdown reflects work done in the range even before it's invoiced.
Revenue by Client
Pick a date range and click Run Report.
Revenue by Product Category
Pick a date range and click Run Report.
Cases With No Line Items
Cases submitted in this range (excluding Cancelled) that never got a single line item —
work that's likely going out unbilled. Click a case's tracking number to open and fix it,
or send the list to an Approved Staff member to review.
Pick a date range and click Run Report.
Cases With No Client Assigned
Cases carrying unbilled line items but no client. These can never appear on a
statement — billing matches on a client, and the monthly run skips a case
without one — so the money sits unbilled indefinitely with nothing else
flagging it. Assign a client and the value moves into Projected.
Deliberately ignores the date range above, for the same reason the duplicate
report does: unbillable work does not stop being unbillable because it fell
outside the month you happened to be looking at. Sorted by value, largest first.
Click Run.
Duplicate Patients & Cases
Finds the same patient entered twice. Deliberately ignores the date range above —
“do we have duplicates” is a question about the whole book, not a period.
Names are matched after lowercasing, stripping punctuation and sorting the words, so
White Meredith and Meredith White are treated as one person.
Possible duplicate cases
Same patient, same case type, submitted the same day — the shape a double entry
actually takes. A patient with several cases months apart is normal and is not listed here.
Click Run.
Name spelt more than one way
One patient, several spellings. Not duplicate cases in themselves, but they are how a
duplicate hides from a search — and why the matching above ignores case and word order.
Click Run.
Invite User
Invited emails skip the pending queue entirely — they're approved the moment they sign up, with the role and specialty set below.
Invitation Requests
People who asked for access from the login page. Click Invite to
prefill their email above (pick a role, then Send Invite), or Dismiss
to clear the request.
Loading…
Pending Invitations
Sent but not yet signed up for. Resend if the email got lost or the link expired
— it re-sends the exact same invite, role and specialty included.
Loading…
Staff Approvals
Loading…
Pay Rates
Hourly rate per employee — used to calculate wages when a pay period is generated below.
Staff with no rate set are skipped (with a warning) rather than silently left out of a pay period.
Click "Schedule" to set each employee's usual weekly start times, day by day — a reference
value only for now, not yet tied to any attendance rule.
Loading…
Time Off Requests
Pending
Loading…
Reviewed
Loading…
Timesheet Review
Review logged hours before generating a pay period — fix an obvious mistake (wrong clock-in
time, forgot to clock out) or remove a bad entry. Only entries not yet on a pay period can be edited.
Pick a date range and click Load.
Generate Pay Period
Sweeps every completed, not-yet-paid time entry in this date range into one new pay period,
totaled per employee at their current hourly rate.
Open Pay Periods
Loading…
Paid Pay Periods
Loading…
Resource Library (PDFs)
Shared PDFs shown on the public Resources section of the marketing site
(Rx forms, prep guides, etc.) — visible to everyone, upload/remove is
Administrator-only.
Loading…
Drivers
Location updates only while a driver is clocked in (Payroll Time Clock) and has
opted in from their own driver app — tracking can never be turned on remotely,
only the driver themselves can enable it.
Loading…
Live Map
Shows each currently clocked-in, opted-in driver's latest position and their
trail for the current shift. Updates live — no refresh needed.
No clocked-in, opted-in drivers right now.
Farset F7 Scanner — Android App
The current build for the Farset F7 rugged driver scanner handheld only. Regular staff/practice phones get the app from the Profile tab.
On the lab tablet, tap the Download button above — the .apk saves to the device.
Tap the downloaded file (from the notification, the browser's Downloads, or the Files app).
Android will warn it's from an unknown source. Tap Settings and turn on “Allow from this source”, then go back.
Tap Install, then Open, and sign in. Installing a newer build over an old one keeps its data.
SnapClear — Windows Workstation App
Tray app for every clinic computer — wipes and updates Chrome on a fixed daily schedule so it never interrupts an X-ray in progress, tidies the X-ray temp folder, and lets the front desk report an IT problem straight to the lab. It keeps itself up to date after the first install.
On the workstation, click the Download button above — the installer saves to Downloads.
Run SnapClear-Setup.exe. Windows SmartScreen may warn it's from an unrecognized publisher — click More info, then Run anyway.
Follow the installer. SnapClear starts automatically and runs quietly in the system tray from then on.
Installing a newer build over an old one keeps its settings.
Case Light — SmartThings
The lamp in the lab that flashes green on a new case and orange on a
DS Core order, then returns to teal. It is driven through the
SmartThings cloud, which needs a connected account.
This used to run on a SmartThings Personal Access Token. Those now
expire about a day after they are created — the light stopped
working on 2026-07-26 for exactly that reason, with nothing on screen
to say why. Connecting below uses OAuth instead: the token refreshes
itself, and a nightly job keeps it from going stale.
Checking connection…
Kiosks
Each physical clinic pickup kiosk gets a unique code (PK-###) tying it to one
or more practices — a kiosk covering a shared lobby can be assigned to
several clinics at once. Provision the device with its code, and it looks up
its own assigned clinic(s) from that. "Last check-in" shows whether a unit is
actually reaching the server, not just whether it's plugged in.
Assign to clinic(s)
Loading…
Login Activity
Every successful sign-in, most recent first. Session restores/app relaunches
don't count — only an actual login.
Loading…
Case Status History
Every status change across every case, most recent first.
Loading…
IVF Plan Changes
Every insurance plan created, edited or deleted — who, when, and what it
looked like before. Clinic staff can correct their own insurance data, so
this is the record of what they changed. Expand a row for the exact fields
that differed.
Loading…
Cron Jobs
Every scheduled background job on the server. Disabling a job pauses it in
place — the schedule stays saved, nothing runs until it's re-enabled.
Loading…
Schedule a New Job
Only picks a time for one of this app's own already-built background tasks —
there's no free-text SQL entry here. Time is in UTC, not Mountain Time.
Rules
Every business rule already baked into this app — trigger, check, or
client-side logic — in plain English, so it doesn't have to be
re-discovered by re-reading the code. Edit or add to this list any time.
Loading…
Add a Rule
InfoTech — IT Support Tickets
IT problems reported by the practices. Practices submit these from the public
IT support form using their clinic ID —
no portal login needed, since the person with the broken machine often can’t get into one.
The ID is what gates the form — a submission quoting one we don’t recognise is
refused and logged under Refused Submissions below, never filed as a ticket.
Each accepted submission emails every Administrator and anyone with the InfoTech duty.
The tiles below are open tickets per location — click one to see just that site.
Loading…
Clinic IDs
One ID per location — the code that location quotes on the IT support form. Give it to
the office once; it both proves the request came from them and files the ticket against the
right site. Treat it as a shared password: anyone who has it can open a ticket.
Loading…
The password is only used by the SnapClear tray app on that location’s computers —
it’s never needed on the web form. It is shown once when generated and cannot be read back
afterwards, so write it down before closing the box.
Clinic Computers
Every PC running the SnapClear tray app, and what it last reported. A machine that stops
checking in has stopped clearing Chrome — which otherwise only surfaces when the clinic
complains.
Loading…
Windows Updates
What Microsoft is offering the clinic PCs, and nothing installs until you say so.
Approve an update here and every computer that was offered it installs it at
8pm that evening, then restarts if it has to. Anything you leave
unapproved is left alone, night after night, until you decide otherwise.
Loading…
Clinic Wallpapers
The desktop background on every computer at a location. Upload once, assign per clinic,
change it whenever — each PC picks up a change on its next check-in, within about
five minutes. Nothing needs reinstalling and nobody has to touch the machine.
Loading…
Assigned to
Loading…
Locked-Out Computers
Five wrong workstation passwords in a row locks that address out for 24 hours. Usually it’s
one of ours with a stale password saved — lift it, then reinstall with the current one.
Locking out never blocks the public IT form, so a clinic can always still report a problem.
Loading…
Refused Submissions
The clinic ID is what keeps the public form from being open to the whole internet, so a
submission quoting an ID we don’t recognise is refused outright — no ticket is
created. Those attempts are listed here. After every five from the same address in a day,
every Administrator gets an email. A handful from one address usually means a practice was
given the wrong ID; a long run of different IDs means someone is guessing.
Loading…
IVF Plan Library
The insurance plans each clinic's Insurance Verification form pulls from —
seeded from the blank-IVF documents. Add, edit, deactivate, or remove them
here (no SQL needed). Each clinic has its own library — coverage differs by
clinic (zip/region), so create a clinic, then build its own plan set below.
Choose a clinic.
Edit Plan
Coverage details
DSCORE-TEST SANDBOX
Staging area for the DS Core integration — kept out of the normal
Account tab on purpose so it can be fully tested against DS Core's
sandbox environment before anything goes near production. Connecting
here only ever touches sandbox test data (DS_CORE_ENVIRONMENT is
hardcoded to 'sandbox' below, not switchable from this UI). Reference
spec: supabase/dscore-reference/DS_Core_LAB_API.swagger.json.
Checking connection…
Incoming Orders
Read-only — ds_core_orders is a staging table, not `cases`. Nothing
here creates or touches a real production case; that review/accept
step isn't built yet on purpose (see this table's own comment in
supabase-setup.sql). New orders normally arrive via DS Core's own
webhook, backed up by a poll every 3 minutes (their sandbox
webhook delivery turned out unreliable) — "Poll Now" runs that
same check immediately instead of waiting.
Loading…
Team Messages
Direct messages between approved staff. Only you and the recipient can read a conversation.
Loading…
Select a teammate to start messaging.
Open Pickup Requests
Clinic-wide "cases are ready" pings from a clinic's own portal login or
kiosk device — not tied to specific cases, just a count and a timestamp.
Mark one picked up once handled.
Loading…
Recently Fulfilled
Loading…
Deliver a Case
Scan a case's QR code to mark it delivered. Same action as the Android/iOS apps' own
scan-to-deliver screens — the camera only runs while this tab is open.