Rootware Blueprint
Working blueprint · updated 22 Oct 2026

rtware

Practice software for UK dental clinics, starting with endodontics. Web first, then iPhone and iPad. This blueprint separates what the product does from how it gets built.

Main market
United Kingdom
Customers
Dental clinics, endo first
Status
Planning
Radiograph-style drawing of a lower molar with two filled root canals LL6 · FDI 36 Post-op M 20.5 mm D 21.5 mm
A lower first molar after obturation. Endodontics is the first specialist module, built on a general dental chart.
Product

What the product does, who it serves, and the policies it follows.

P1

Overview

Who the product is for and the principles behind it.

Practices

UK dental clinics. The first customers are specialist endodontic practices and general practices that do endodontics. One organization can run several clinics.

People
  • Endodontists and dentists
  • Dental nurses
  • Reception and treatment coordinators
  • Practice managers and owners
  • Referring dentists, outside the practice
Platforms
  • Desktop web for desk work
  • Mobile web for quick lookups and patient pages
  • iPad and iPhone for chairside work, after the web launch
Chart and plan at the centre

Everything clinical hangs off a tooth on the chart and an item on a treatment plan. Specialist modules such as endodontics add depth where a practice needs it.

Referrals both ways

Specialist practices receive referrals and send reports with X-rays. General practices refer out and track what came back. Most dental software handles this badly.

Built for UK practices

GDC numbers, Palmer notation, UK hosting, and a design that's ready for NHS work later.

Experience comes first

Consistent across web and iOS, accessible, and tested with real clinical teams.

Automate the repetitive work

Reminders, forms, reports, recalls and chasing run on their own. People stay in charge of clinical content.

P2

Clinical workflow

The general dental journey the product is built around, with specialist modules on top. Pick a tooth on the example chart to see its entries.

  1. 01RegistrationNew patients book and complete their medical history before the visit.
  2. 02ExaminationCharting, gum screening, X-rays and diagnosis.
  3. 03Treatment planItems per tooth from the price list, with an estimate and consent to sign.
  4. 04TreatmentVisits with clinical notes, completed items and lab work.
  5. 05PaymentInvoices per visit, by card or direct debit.
  6. 06RecallExams and hygiene visits at each patient's interval.

Endodontics First module

Referrals in, endo cases with canal records, reports back to the referrer, and reviews at 6 and 12 months.

Periodontics Next

Full six-point charting when gum screening finds a code 3 or 4. The screening itself is in the core.

Implants, orthodontics Later

Built on the same chart, plan and imaging when there's demand.

Dental chart

Existing restoration Planned treatment Missing or unerupted
LL6
Lower left first molarStored as 36 · shown as LL6

    Example patient. Each mark is a chart entry with surfaces and a state: existing, planned or completed. UK clinicians mostly read Palmer notation, so it's the default display. Storage is always FDI, and primary teeth show with Palmer letters A to E.

    Gum screening (BPE)

    217–14113–23224–27
    347–44143–33234–37

    Recorded at every exam: a code from 0 to 4 for each sixth of the mouth, with * for furcation. A 3 or 4 leads to more detailed charting in the periodontics module.

    Endo module: canal record for tooth 36

    CanalWorking lengthReferenceMaster file
    MB20.5 mmMB cusp25/.06
    ML20.0 mmML cusp25/.06
    D21.5 mmDB cusp35/.04

    Example values for a lower first molar. Each canal is recorded with its working length, reference point, master apical file and obturation technique. The referral report is drafted from these fields.

    P3

    Name and brand

    The product is called Rootware. In the wordmark, the two letters o are drawn as canal openings. A single opening is the app icon: a root seen in cross-section, with its canal filled.

    rtware
    Reversed rtware Dental practice software
    Symbol

    App icon and favicon. Two rings side by side read as a face in a square, and get too thin at 16px.

    Colour
    Ink #102A33
    Canal #D0563A
    Film #2A6B7C
    Paper #F3F6F6
    Clear space

    Keep one ring's height clear on every side of the wordmark.

    Minimum size

    96 px wide on screen. 20 mm in print, where it switches to one colour.

    Symbol on its own

    The symbol is for app icons, favicons and avatars. It never sits next to the wordmark.

    Typefaces

    Outfit appears only in the wordmark. Both it and the interface face are under the open font licence.

    Vector artwork

    The final wordmark is redrawn as outlines, not live text, before it ships anywhere.

    Domains and trade mark
    • rootware.com has been registered since 2003 and is active. getrootware.com was registered in May 2026.
    • rootwarehq.com and userootware.com were free when checked on 22 Oct 2026.
    • rootware.co.uk couldn't be checked automatically. Look it up at a registrar.
    • A company called Rootware Technologies Global exists. Search the UK trade mark register in classes 9 and 42, which cover software, before filing.
    Considered along the way

    With the exact .com free when checked: Mesiora, Chairtide, Periapix, Endodesk, Cuspvale and Molarsmith. Strong but on a prefixed domain: Open Wide.

    All four logo directions and the refined wordmark
    P4

    Users and roles

    Who can do what in a practice. Permissions are fixed in the product. Roles are bundles of permissions that each practice can adjust. Pick a role to see what it allows.

    RolePatient detailsClinical notesSign notesImagingAppointmentsReferralsBillingStaff and rolesAudit logData export
    Endodontist or dentistTreating clinician, GDC registered EditEditOwnEditEditEditView–––
    Hygienist or therapistTreats within their scope, GDC registered EditEditOwnEditEditViewView–––
    Dental nurseCharts chairside, takes radiographs EditDraft–EditViewView––––
    ReceptionistFront desk and treatment coordination EditAlerts––EditEditEdit–––
    Practice managerRuns the practice day to day Edit–––EditEditEditEditView–
    Owner or adminAccount owner, subscription Edit–––EditEditEditEditViewEdit
    Referring dentistExternal portal, later release –––Own–Own––––
    EditCreate and change ViewRead only DraftWrites notes a clinician signs OwnOnly records they're responsible for AlertsMedical alerts, no clinical notes
    Several roles per person

    An owner who also treats patients holds both Owner and Endodontist. Permissions are the union of their roles.

    Practices can adjust roles

    The practice owner, or your team from the backoffice, copies the defaults and edits them.

    Clinicians sign their own notes

    Nurses draft. Only the treating clinician signs, and nobody signs while support is acting as them.

    How it's enforced: T4 Access control
    P5

    Automations

    Built-in automations that take repetitive work off reception and clinicians. Each one can be switched on or off per clinic, with its own timing and wording.

    Referrals 4

    • Online referral formReferrers send tooth, reason and X-rays. It creates the referral and a draft patient, and acknowledges receipt.
    • Missing informationNo radiograph attached sends an automatic request back to the referrer.
    • Triage deadlineReferrals not reviewed within 2 working days are flagged.
    • Report drafts Start hereWhen a case is obturated, the report is built from canals, lengths, materials and X-rays. The endodontist reviews and sends it.

    Before the visit 5

    • Self-bookingAccepted referrals get a link showing slots where the chair and microscope are both free.
    • Reminders Start here48 hours ahead, with confirm and cancel links. No reply after 24 hours creates a task for reception.
    • Pre-visit forms Start hereMedical history and consent go out for remote signing. A change such as a new anticoagulant flags the clinician.
    • DepositsPayment links for long appointments.
    • Cancellation fillA freed slot goes to the waiting list by SMS. The first to accept books it.

    Treatment day 5

    • Note templatesPrefilled notes per procedure, such as an exam, a filling or RCT visit 1, for the clinician to edit and sign.
    • Lab work trackingLab cases not back two days before the fit appointment are flagged to reception.
    • Image matchingIncoming scans are matched to patients by their DICOM tags. Unmatched ones go to a review queue.
    • X-ray evaluationsIR(ME)R requires a recorded clinical evaluation for every exposure, so images without one prompt the clinician.
    • Post-op careInstructions after each visit, and a check-in the next day. A severe pain reply creates an urgent task.

    After treatment 3

    • Restoration reminderThe patient and referrer are reminded to complete the crown or onlay, and completion is tracked.
    • Recalls Start hereExams and hygiene at each patient's interval, and endo reviews at 6 and 12 months, with booking invites and no-show follow-up.
    • Outcome to referrerRecall results go back to the referring dentist.

    Billing 3

    • EstimatesGenerated from the treatment plan and price list, then sent for signing. Acceptance turns the estimate into the plan.
    • Invoices and chasing Start hereIssued at the end of each visit with a payment link, followed by a polite overdue sequence.
    • ReconciliationStripe and GoCardless payouts are matched to invoices and exported to Xero.

    Running the practice 5

    • Morning digestToday's patients, medical alerts, unsigned consents, missing X-rays and balances due.
    • Unsigned notesA nudge at the end of the day, escalated to the manager after 48 hours.
    • Expiry remindersStaff GDC registration, indemnity and CPD, plus equipment servicing and X-ray testing.
    • Subject access requestsOne-click export with a tracked deadline.
    • Retention reviewsRecords past retention are queued for review, never deleted automatically.
    A person sends clinical content

    Reports and anything clinical are drafted automatically and sent by a person.

    Consent and quiet hours

    Every message respects the patient's contact preferences and the clinic's quiet hours.

    Built-in first

    Fixed automations with per-clinic switches, timing and wording. A general rule builder can wait for a later version.

    How it works: T7 Automation engine
    P6

    Document signing

    Consent forms, estimates and questionnaires, signed remotely or in the surgery. Every signature ends as a sealed, tamper-evident PDF. Step through each flow.

      Guardians and young patients

      A parent or guardian signs for under-16s unless the clinician judges the child Gillick competent.

      Evidence, not consent

      The signature records consent. Clinicians still write up the consent discussion in the clinical notes.

      No clinical detail in messages

      Texts and emails name the practice only, because they show on lock screens.

      Corrections mean a new document

      A signed PDF never changes. Fixing it creates a new document and a new signature request.

      How it's built: T6 Signing pipeline
      P7

      Backoffice and support access

      Your team's internal app for running the platform. It sets up practices, plans and roles, and lets support act as a practice user to help.

      Organizations and clinics

      Practice details, locations, time zones and contacts. The owner gets an invite to finish setup.

      Plans

      Choose a plan, set seats, trials and discounts, and override single features for one customer.

      Roles

      Copy the default roles into a practice and adjust them. Changes appear in the practice's audit log.

      Users

      Resend invites, reset 2FA after an identity check, and deactivate accounts.

      Migrations

      Start import batches and review dry-run reports.

      Health

      Storage used, active users, last activity, and failed messages or jobs.

      Acting as a practice user

      1. 1The practice allows accessThe owner or manager grants support access, for one request or as a standing grant with an expiry date.
      2. 2An agent starts a sessionThey pick the user to act as and enter a reason and ticket number.
      3. 3A banner shows on every screenThe practice's admins are notified. Sessions last up to 30 minutes.
      4. 4Everything is loggedEach action records both identities, in your log and in the practice's own audit log.
      Example banner
      • A real user, not root. The agent sees exactly what that user sees. A root account would expose every record, which is hard to justify under UK GDPR.
      • A support account for setup. Each practice has a built-in support user with setup permissions and no clinical access.
      • Clinical access needs permission. Opening patient records requires a grant with clinical scope.
      • Blocked while acting. Signing, changing passwords or 2FA, exporting data, changing billing.

      Subscription lifecycle

      Practices never lose sight of their records for non-payment, because clinicians need them for patient care.

      TrialFull features for a fixed period
      ActivePaid and up to date
      Past dueReminders, full access continues
      Read-onlyAfter a grace period. Records stay viewable
      CancelledData returned, then deleted as the DPA sets out

      What a plan controls

      Number of clinicsClinician seatsiPad appSpecialist modulesDocument signingAutomationsImaging storage
      Separate staff accounts

      Your team signs in with SSO and hardware security keys, from an IP allowlist, on its own subdomain.

      Second approval for destructive actions

      Deleting an organization or running a bulk export needs a second team member to approve.

      How it's built: T4 Access control
      P8

      Design and experience

      Experience is the priority. The aim is consistency, not sameness: the same brand, words, flows and states everywhere, while each platform still feels native.

      Desktop web

      Dense, multi-column screens for reception, managers and clinicians at their desks: calendar, referrals, billing, reports.

      Mobile web

      Quick lookups for staff on the move, and the patient pages for signing and self-booking.

      iPad and iPhone

      Chairside work: Apple Pencil on X-rays, offline consent, large touch targets, native sheets and navigation.

      Medical alerts look the same everywhere

      Allergies and anticoagulants use one locked design on every platform, for patient safety.

      One vocabulary

      The same words in every app, from a shared glossary.

      Accessible by default

      WCAG 2.2 AA on the web, Dynamic Type and VoiceOver on iOS, and dark mode on both.

      Research with real users

      Observe a working endo practice before designing. Test with endodontists, nurses and receptionists.

      Same events, same metrics

      Track identical events on every platform, such as time to book a referral.

      Parity is part of done

      A feature ships everywhere it belongs, or is logged as web-only on purpose.

      Glossary

      Surgery
      The treatment room. Used for chairs and rooms in the calendar.
      Obturation
      Filling the cleaned and shaped canals. Marks the end of active treatment.
      Working length
      The measured length of a canal, in millimetres, from a reference point.
      Recall
      A follow-up review, usually at 6 and 12 months.
      Referring dentist
      The general dentist who sent the patient and receives the report.
      Palmer notation
      UK tooth numbering by quadrant, such as LL6.
      How it's built: T8 Design system
      P9

      Switching from other systems

      Practices won't switch without their patients, appointments, notes and X-rays. How hard that is depends on the system they're leaving.

      Canonical importerBuilt once4–6 weeks
      Spreadsheets and paperEasyAbout 1 week
      DentallyModerate3–6 weeks with API access
      Software of Excellence, ExactHard1–3 months, then fixes per version
      Carestream R4Hard1–3 months, then fixes per version
      Imaging softwareHard1–2 months

      Rough effort for one developer. Each bar is the likely range.

      Why each source differs
      • Dentally is cloud-based with a proper API, but partner access is approved case by case. It shares an owner with Software of Excellence, so a competitor's request may be refused, leaving the practice's own export.
      • Software of Excellence, Exact and R4 are widely installed, often on-premise. Their databases are undocumented and vary by version.
      • Imaging software such as Romexis, Sidexis and CS Imaging exports CBCT as DICOM, but 2D X-rays often sit in proprietary formats. It's often the biggest job by volume.
      How we handle it
      • Service first. Run early migrations by hand with scripts. Productise only the sources the first 5 to 10 customers need.
      • History stays read-only. Old canal details are buried in free text. Import history as it is, and start structured cases from go-live.
      • Balances by cut-off date. Outstanding balances come across as opening balances, not historical invoices.
      • Practices own their data. Their old supplier must return it, though the format may be a raw backup. You act as their processor during migration.
      How it's built: T9 Migration engine
      P10

      Compliance and NHS

      What the law requires from launch, what NHS work would add, and where the company can sit.

      Recommendation Launch private-only, designed for NHS.

      Add a funding type to each treatment plan and keep claims in a separate module. If NHS work is within 12 to 18 months, bring in a Clinical Safety Officer early, because the clinical safety standard expects risk management across the whole lifecycle.

      Required from launch
      • Dental records are special-category health data under UK GDPR and the Data Protection Act 2018.
      • Practices are the data controllers and you are the processor. Sign a data processing agreement with each one, and register with the ICO.
      • Your team touches patient data only on a practice's instructions, so support access needs the practice's permission.
      • Adult dental records are kept for 11 years under the NHS Records Management Code, and children's for longer.
      • Personal data breaches must be reported to the ICO within 72 hours.
      • Simple electronic signatures are valid for consent forms and estimates. The audit trail is what makes them hold up.
      If you take on NHS work
      • Complete the Data Security and Protection Toolkit every year.
      • Meet DCB0129 clinical safety: a named Clinical Safety Officer who is a UK-registered clinician, a risk management plan, a live hazard log and a safety case. The standard is under national review.
      • NHS buyers assess you with DTAC, kept current for each product version. A shorter form applies from April 2026.
      • Buyers commonly ask for Cyber Essentials Plus and a recent penetration test.
      • In England, practices claim on FP17 forms sent through NHSBSA's WebEDI, which means getting on its supplier list.
      • Scotland, Wales and Northern Ireland run separate claims systems.
      Where the company sits
      • You don't need to be based in the UK. Host the data in a UK region.
      • A non-UK business may need a UK GDPR representative. Get a short legal opinion.
      • B2B software sold from Spain to UK practices is normally reverse-charged for VAT. Confirm with an accountant.
      • A UK company helps with trust and NHS procurement. Set one up once there's traction, or before NHS work.
      • EU data adequacy for the UK runs to December 2031, so a later EU expansion can share the platform.
      Watch
      • Diagnostic measurement tools on X-rays can make the viewer medical device software under MHRA rules. Check before building them.
      • Automatic lesion detection on X-rays would bring the same medical device obligations.

      Not legal or tax advice.

      P11

      Product decisions

      What's agreed, what's proposed and waiting for a yes, and what's still open.

      The UK is the main marketAgreed

      Spain and the rest of the EU can follow on the same platform.

      Dental clinics in general, starting with endoAgreed

      Endodontics is the first focus and stays a strength, but the product is for dental clinics broadly.

      The product is called RootwareAgreed

      With the orifice wordmark and a single-ring symbol for app icons and favicons.

      Web first, then iPhone and iPadAgreed

      Native apps follow the web launch and share its API.

      Role-based access with default rolesAgreed

      Endodontist or dentist, dental nurse, receptionist, practice manager, owner, and a referrer portal later.

      A backoffice to run the platformAgreed

      Practices, plans, roles and support access, managed by your team.

      Signing built into the productAgreed

      Remote and in-surgery signing share one pipeline, the practice's roles and its audit log.

      Experience is the priorityAgreed

      One design system for web and iOS, accessible by default.

      Private-only for v1, designed for NHSProposed

      Avoids the NHS toolkit, clinical safety case and claims work at launch.

      Support acts as a real user, not rootProposed

      Plus a built-in support account with no clinical access for setup work.

      Start with five automationsProposed

      Reminders, pre-visit forms, report drafts, recalls and invoice chasing.

      Migrations as a hands-on service firstProposed

      Productise only the sources early customers need.

      Unpaid accounts go read-onlyProposed

      Never a lockout, so clinicians can still see records.

      Palmer notation by defaultProposed

      Stored as FDI, with each user able to switch.

      Chart and treatment plan at the centreProposed

      A general dental chart, gum screening and treatment plans in the core, with endodontics as the first specialist module and periodontics next.

      Hygienists and therapists as a default roleProposed

      They treat within their scope, record gum health and sign their own notes.

      IBM Plex Sans for the interfaceProposed

      Open font licence, so it works on the web and inside the iOS apps. Outfit stays in the wordmark only.

      Plans and pricingOpen

      Per clinician per month is likely. Decide the tiers and what each includes.

      Custom roles in v1Open

      Ship the default roles only, or let practices copy and edit them from launch.

      Support access modelOpen

      Ask the practice for each request, or allow standing grants with an expiry date.

      First migration sourcesOpen

      Decide from the systems the first customers actually use.

      Product designerOpen

      Hire or contract one, ideally with healthcare experience, before the first screens.

      Accounting integrationOpen

      Xero first, with QuickBooks later if customers ask.

      UK companyOpen

      Sell from the existing company at launch, or set up a UK company first.

      Launch domainOpen

      rootware.com is taken. rootwarehq.com and userootware.com were free. Check rootware.co.uk and the UK trade mark register before buying.

      Membership plansOpen

      Many UK private practices sell monthly plans that cover check-ups and hygiene, Denplan being the best known. Decide whether v1 runs them itself or integrates.

      Technical

      How the product is built: stack, architecture, data, security and tooling.

      T1

      Stack

      API first, so the web panel and the iOS apps use the same API from day one. Pick a technology to see why it's there.

      T2

      Services

      Only the gateway is reachable from the internet. Everything else runs on a private network in a UK region. Pick a flow to trace it.

      Clients
      Web panelVue or React
      iPhone and iPadSwiftUI
      Signing pageOwn subdomain
      BackofficeYour team only
      Public edge
      GatewayFrankenPHP, TLS, Mercure
      Private network · UK
      Application
      Symfony APIAPI Platform
      Backoffice appEasyAdmin
      WorkersMessenger
      SchedulerTimed jobs
      Services
      OrthancDICOM, DICOMweb
      GotenbergPDF rendering
      SignerpyHanko
      Data
      PostgreSQLApp and Orthanc
      RedisQueues, cache
      Object storageImages, PDFs
      KMS or HSMSeal key
      External
      PaymentsStripe, GoCardless
      SMS and emailTwilio or similar
      TimestampsTrusted authority
      NHS APIsLater
      TelemetryOpenTelemetry
      Upload an X-ray
        Orthanc is never exposed

        The gateway checks with Symfony before it streams a study, so large image traffic skips PHP.

        Separate databases

        Orthanc keeps its index in its own PostgreSQL database and its files in object storage.

        Backups that agree

        Both databases and object storage back up on one schedule, with point-in-time recovery.

        Backoffice reads platform tables only

        Its database role can't read clinical tables. Patient data is reachable only through the clinic app.

        T3

        Data model

        The patient's chart and treatment plan sit at the centre, with endodontics as the first specialist module on top. The diagram shows the core relationships. The explorer below lists all 40 entities with their fields.

        erDiagram
          Patient ||--o{ ChartEntry : has
          Patient ||--o{ MedicalHistory : completes
          Patient ||--o{ TreatmentPlan : has
          TreatmentPlan ||--|{ TreatmentItem : contains
          Procedure ||--o{ TreatmentItem : prices
          TreatmentItem |o--o{ ChartEntry : draws
          Appointment |o--o{ TreatmentItem : books
          Appointment ||--o| ClinicalNote : records
          TreatmentItem |o--o| LabCase : needs
          TreatmentItem |o--o| EndoCase : "specialist record"
          EndoCase ||--|{ Canal : has
          Referral |o--o{ EndoCase : opens
          Patient ||--o{ Recall : "returns for"
        
          T4

          Access control and impersonation

          How permissions, plan entitlements and support sessions are enforced in Symfony. Every request passes these checks in order.

          Request path
          1. 1FirewallAuthenticates the user. Support sessions carry the agent's ID on the security token.
          2. 2Operation securityAPI Platform checks is_granted on every operation.
          3. 3VotersClinic membership, permission, ownership, plan entitlements and support-session blocks.
          4. 4Tenant scopeA Doctrine extension limits every query to the user's clinics. Postgres row-level security backs it up.
          5. 5Field visibilitySerialization groups per permission, so reception gets patients without clinical notes.
          6. 6AuditRecord views, role changes and support actions are written to the audit log.
          Permission codes

          Fixed in a PHP enum. Roles store lists of these codes.

          patient.viewpatient.editalerts.viewclinical.viewclinical.draftclinical.editclinical.signimaging.viewimaging.editappointment.editreferral.editbilling.viewbilling.editstaff.manageaudit.viewdata.exportsubscription.manage
          What the apps receive from /me
          {
            "user": { "name": "Dr Sam Ellis" },
            "clinic": { "timeZone": "Europe/London" },
            "permissions": ["patient.edit", "clinical.edit",
                            "clinical.sign", "imaging.edit"],
            "entitlements": { "signing": true, "ipadApp": true },
            "impersonation": null,
            "preferences": { "toothNotation": "palmer" }
          }

          Web and iOS hide what a user can't do. The API still checks everything.

          Sketch: who may sign a clinical note
          final class ClinicalNoteVoter extends Voter
          {
              public function __construct(private AccessResolver $access) {}
          
              protected function supports(string $attribute, mixed $subject): bool
              {
                  return $subject instanceof ClinicalNote
                      && Permission::tryFrom($attribute) !== null;
              }
          
              protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
              {
                  $user = $token->getUser();
                  $clinic = $subject->getPatient()->getClinic();
          
                  if (!$user instanceof User || !$this->access->isMember($user, $clinic)) {
                      return false;
                  }
          
                  if ($attribute === Permission::ClinicalSign->value) {
                      if ($token->hasAttribute('impersonator_id')) {
                          return false; // support never signs
                      }
                      if ($subject->getClinician() !== $user) {
                          return false; // only the treating clinician signs
                      }
                  }
          
                  return $this->access->can($user, $clinic, Permission::from($attribute));
              }
          }

          Support sessions

          • The backoffice runs on its own firewall with a PlatformUser provider, behind SSO and WebAuthn security keys.
          • It issues a signed token valid for 60 seconds, carrying the target user, clinic and grant. Its unique ID is stored as a hash so it works once.
          • A custom authenticator on the clinic firewall accepts the token, loads the target user, and sets impersonator_id and impersonation_session_id on the security token.
          • Sessions expire after 30 minutes, and the backoffice can end them early.
          • A voter denies signing, password and 2FA changes, exports and billing changes whenever impersonator_id is set.
          • An audit listener writes both identities on every request.

          Symfony's built-in switch_user only works within one firewall and user provider, which is why staff and practice users need this token handoff.

          Plans and tenants

          • A feature voter reads the plan's entitlements plus any per-customer overrides, so features outside the plan are blocked as well as hidden.
          • Every tenant-owned table carries tenant_id. The Doctrine extension and row-level security both enforce it.
          • The backoffice connects with a separate database role that can read platform tables and nothing clinical.
          • Role and plan changes from the backoffice go to the platform audit log and the practice's audit log.
          T5

          Imaging with Orthanc

          Orthanc is an open-source DICOM server. It stores X-rays and CBCT scans and serves them to the viewer, while Symfony decides who can see them.

          Imaging softwareSensor or CBCT export
          UploadWeb, iPad, or a bridge app later
          OrthancStores and indexes studies
          GatewayChecks access, then streams
          Cornerstone3DViewer in the browser
          Why Orthanc
          • PHP's DICOM libraries are thin and barely used.
          • A REST API Symfony can call with plain HTTP.
          • DICOMweb, which Cornerstone3D reads directly.
          • DICOM's network protocol, so imaging devices can send scans to it.
          Setup
          • DICOMweb plugin for the viewer.
          • PostgreSQL plugin for its index, in a separate database.
          • Object storage plugin for files, in the UK region.
          • Private network only. The gateway authorizes every request.
          Operations
          • Resumable uploads with the tus protocol for large CBCT studies on clinic broadband.
          • Incoming studies matched to patients by DICOM tags, with a review queue.
          • Backed up on the same schedule as the app data.
          • GPL and AGPL licensed. Run it unmodified as a separate service and have a lawyer confirm.
          Bridge app, later

          A small app on the surgery PC that watches the imaging software's export folder or receives DICOM, then uploads securely. Nobody exports files by hand.

          Image analysis, later

          Automatic detection on X-rays would be a separate Python service, and would bring MHRA medical device obligations.

          T6

          Signing pipeline

          Built from open-source parts. The only outside services are an SMS provider and a timestamp authority.

          TemplateVersioned, locked once published
          Render and hashGotenberg, SHA-256
          Capturesignature_pad or PencilKit
          Check hashSigned exactly what was shown
          SealpyHanko, PAdES-B-LTA
          StorePDF in storage, hash in database
          Trust
          • PAdES-B-LTA seals embed validation data and a timestamp, so signatures stay verifiable after certificates expire and across the 11-year retention period.
          • Own CA at launch. It proves a PDF is unaltered, but Adobe Reader shows the signer as unknown. An in-app verification page covers that, and an Adobe-trusted certificate can replace it later with no other changes.
          • Seal key in a KMS or HSM, never in an app container.
          • Paid timestamp authority in production. FreeTSA is fine for development. Never run your own.
          Remote link security
          • The signing page runs on its own subdomain.
          • Links carry a random single-use token, stored only as a hash. Each opens one request and nothing else.
          • Requests expire after 7 days. Codes last 10 minutes, and Symfony RateLimiter locks a request after 5 failed attempts.
          • Staff can cancel or resend. Every step is a SignatureEvent with time, IP and device.
          • Offline iPad signatures keep device time, and the seal adds server time on sync.

          Custom build Chosen

          A few weeks of work, mostly on the audit trail and edge cases. Shares the product's roles and audit log, and in-surgery and remote signing use one pipeline.

          Documenso Fallback

          Open source with templates, an API and webhooks, so it's faster to start. It's a separate Next.js app with its own users and database under AGPL, and a second system to host in the UK and cover in the data protection assessment.

          T7

          Automation engine

          State machines fire events, and handlers decide what to send and to whom. Time-based work runs on a scheduler. Pick a state to see what it triggers.

          TransitionSymfony Workflow
          Domain eventDispatched through Messenger
          HandlerChecks clinic settings, consent, quiet hours
          Message or taskLogged with its outcome
          Scheduled jobs
          • Reminders for appointments 48 hours away.
          • A reception task when a reminder gets no reply after 24 hours.
          • Recall invites as recalls fall due.
          • The morning digest for each clinic.
          • Unsigned note nudges at the end of the day.
          • Expiry checks for registrations, indemnity and equipment.
          • Retention reviews for records past their period.
          Supporting entities

          Settings switch automations per clinic. Templates hold the wording. Every message and task is stored.

          T8

          Design system

          One source for design decisions, generated for web and iOS and checked by screenshot tests. Pick a token to see what each platform gets.

          FigmaDesigners edit tokens with Tokens Studio
          Gittokens.json in the W3C format, changed by pull request
          Style DictionaryGenerates platform files in CI
          Web and iOSCSS and TypeScript, plus Swift

          Mirrored components

          Same names and states on both platforms, each specified once for loading, empty, error and disabled.

          AppointmentCard web · iOSMedicalAlertBanner web · iOSToothBadge web · iOSCanalTable web · iOSCaseStatusPill web · iOSImagingThumbnail web · iOSSignaturePad web · iOSTaskItem web · iOS
          Semantic names

          Tokens are named by meaning, such as color.status.obturated, never by colour.

          Brand assets in the repo

          The Rootware wordmark and symbol ship as SVG next to the tokens, with the canal colour as color.brand.canal, so both platforms use identical artwork.

          Screenshot tests in CI

          Playwright on the web and swift-snapshot-testing on iOS. A token change that breaks a layout fails the build.

          Component review

          Storybook for web components, Xcode previews for SwiftUI.

          One strings source

          Copy exports to web JSON and iOS String Catalogs, checked against the glossary.

          Type mapped to Dynamic Type

          The type scale maps to iOS text styles so user font sizes still apply.

          Behaviour from the server

          Status labels, formatting, permissions and notation come from the API, so both apps agree.

          T9

          Migration engine

          One canonical importer with a thin extractor for each source, instead of a full pipeline per competitor.

          ExtractorsCSV, Dentally API, Software of Excellence and R4 databases, imaging
          Canonical filesOne JSON Lines file per entity
          Import engineValidate, dry run, map, upsert
          DestinationsApp database, legacy records, Orthanc
          Canonical import format
          import/
            manifest.json        source, version, cut-off date
            patients.jsonl
            appointments.jsonl
            medical_history.jsonl
            notes.jsonl
            treatment_plans.jsonl
            balances.jsonl       opening balances only
            documents/           original files
            images.jsonl         manifest for the bridge app
          Engine rules
          • Idempotent. Every row keys on source system and source ID, so re-runs update instead of duplicating.
          • Dry run first. A report with counts, warnings and errors per entity, reviewed before anything is written.
          • Mapping screen. The practice maps practitioners, appointment types and price lists.
          • Top-up run. A final run the night before go-live brings across the last changes.
          • Base charts. Where a source has structured charts, missing teeth and existing restorations import as chart entries marked existing.
          • Legacy stays legacy. Old notes and free-text history land in read-only records, never parsed into structured plans or cases.
          T10

          Engineering rules

          Set these on day one. They're expensive to add later.

          Tenant on every row

          Every tenant-owned table carries tenant_id, enforced by a Doctrine filter and Postgres row-level security.

          UUIDv7 identifiers

          Time-sortable, not guessable, and safe for the iOS apps to create offline.

          Teeth as FDI codes

          A small integer on the record, shown in Palmer or FDI per user. No tooth table.

          Times in UTC

          Stored in UTC and shown in each clinic's time zone.

          Signed notes are locked

          Changes after signing are saved as new versions.

          No hard deletes

          Clinical records are archived, never deleted, for the retention period.

          Log every access

          Opening a patient record writes an audit entry, including the agent's ID during support sessions.

          Signed PDFs never change

          Corrections create a new document and a new signature request.

          Encryption everywhere

          TLS in transit, encryption at rest for databases, storage and backups, and CipherSweet for sensitive fields that need searching.

          2FA for every staff account

          With passkeys and security keys supported.

          Synthetic data outside production

          No real patient data in development, test or staging.

          Observability from the start

          OpenTelemetry traces and metrics across the API and workers.

          T11

          Technical decisions

          What's agreed, what's proposed and waiting for a yes, and what's still open.

          Symfony and API PlatformAgreed

          Checked against the libraries the product needs. Only DICOM is weak in PHP, and Orthanc covers it.

          PostgreSQLAgreed

          JSONB for clinical detail and row-level security for tenants.

          Native SwiftUI for iPhone and iPadAgreed

          One codebase, with PencilKit and offline signing.

          Orthanc for imagingAgreed

          On the private network, behind the gateway.

          Signing from open-source partsAgreed

          Gotenberg, PDF.js, signature_pad and pyHanko.

          Design tokens as the single sourceAgreed

          W3C format in Git, generated by Style Dictionary.

          UK hosting regionAgreed

          For data, backups and object storage.

          Gateway streams images after an access checkProposed

          Keeps large CBCT traffic out of PHP.

          FrankenPHP with its built-in Mercure hubProposed

          One process for serving, TLS and live updates.

          The chart as a list of entriesProposed

          Each finding, restoration or procedure is an entry with surfaces and a state. The current chart is computed from them, so history and audit come free.

          Specialist modules hang off plan itemsProposed

          An EndoCase belongs to a root canal treatment item. Periodontics, implants and orthodontics follow the same pattern and are switched on per plan.

          UUIDv7 identifiersProposed

          Sortable and safe for offline creation.

          Doctrine filter plus row-level securityProposed

          Two layers of tenant isolation.

          Workflow and Scheduler for automationsProposed

          State machines fire events, and the scheduler handles time.

          Token handoff for support sessionsProposed

          A custom authenticator, because switch_user can't cross firewalls.

          Own CA for seals at launchProposed

          Swap in an Adobe-trusted certificate later.

          JSON Lines import formatProposed

          Streams large files and keeps extractors simple.

          Vue or ReactOpen

          Either works for the web panel. Pick the one you'll move fastest in.

          Hosting providerOpen

          AWS London, Azure UK South, or another provider with UK data centres.

          Seal certificateOpen

          Own CA at launch, or Adobe-trusted from day one.

          Timestamp authorityOpen

          Choose a paid provider for production.

          Dentally partner accessOpen

          Apply early. If it's refused, plan around the practice's own export.

          iPad offline syncOpen

          What's available offline, how it's encrypted on the device, and how conflicts resolve.