Help Index β€” click any topic to jump to it
Getting started
⚠ Installation & GDPR πŸš€ Getting Started 🏠 Welcome Dashboard πŸ” Access Levels βš™ Setup πŸ”‘ Licence
Patient records
πŸ‘€ Patients πŸ“‹ Sessions 🦴 Examination πŸ“Ž Attachments βœ‰ Letters πŸ“„ Documents
Clinical pages
πŸ“‹ Case History (P2) πŸ’Š Prescriptions & Treatment (P3) πŸ“‹ Treatment Plan ☯ Five Elements & Astrology (P5) πŸ‘£ Podiatry & Chiropody (P6)
Practice management
πŸ“… Schedule πŸ’· Accounts πŸŽ“ CPD πŸ“‡ Contacts πŸ“¦ Stock & Products πŸš— Mileage Log πŸ“Š Self Assessment πŸ’Ύ Backup πŸ”’ Security & Encryption
Research & data
πŸ” Audit & Search πŸ“Š Statistics πŸ“€ Import / Export
Installation guides
πŸ§™ Setup Wizard πŸ“¦ Synology NAS Installation 🫐 Raspberry Pi Installation 🍎 Mac Installation πŸͺŸ Windows Installation 🩺 Clinical Reference
⚠ GDPR πŸš€ Start 🏠 Dashboard πŸ‘€ Patients πŸ“‹ Sessions 🦴 Exam πŸ“‹ P2 πŸ’Š P3 πŸ“‹ Plan ☯ P5 πŸ‘£ P6 πŸ“… Schedule πŸ’· Accounts βœ‰ Letters πŸ“„ Documents πŸŽ“ CPD πŸ“‡ Contacts πŸ“¦ Stock πŸ” Audit πŸ“Š Stats πŸ“€ Import/Export βš™ Setup πŸ”‘ Licence πŸ” Access πŸ§™ Wizard πŸ“¦ NAS 🫐 Pi 🍎 Mac πŸͺŸ Windows 🩺 Clinical
⚠ Installation Requirements & Data Protection
Important β€” please read before using with real patient data.
This system handles sensitive personal health information. You have legal obligations under UK GDPR and the Data Protection Act 2018 before going live with real patients.

Testing vs live use

You may test with dummy records on any server, as demonstrated at soul-trade.com/cspractice. Once you begin entering real patient data, ensure your server meets the security requirements below β€” HTTPS enabled, field encryption turned on (Setup β†’ Security), and config.php backed up securely. With these in place, an internet-accessible shared hosting server is a perfectly valid live environment.

Minimum technical requirements

ComponentMinimumRecommended
PHP PHP 8.0+ PHP 8.2 or 8.3
Database MySQL 5.7+ or MariaDB 10.4+ MySQL 8.0+
Web server Apache 2.4 with mod_rewrite Apache 2.4 or Nginx
SSL certificate Required for any live use Let's Encrypt (free) or commercial cert
Hosting Private intranet or dedicated server Self-hosted on practice premises or UK-based private server
Backups Daily automated database backup Daily backup with off-site copy, tested monthly

Internet vs intranet β€” why it matters

An intranet installation runs on a server that is only accessible from within your practice network (or via VPN). Patient data never leaves your building. This is the recommended approach for any practice holding real patient records. This can be as simple as using an older computer (e.g. a Raspberry Pi 4 β€” around Β£55 new, silent, pocket-sized, uses 3W of power and runs 24/7 β€” an old Mac or Windows laptop, or NAS device running Linux) and simply copy/pasting the commands shown in the 🫐 Raspberry Pi installation guide, Apple Mac installation guide or the Windows installation guide β€” all written for non-technical practitioners.

An internet installation is accessible from anywhere β€” convenient for multi-site practices, but requires stronger security measures: strong passwords, regular security updates, firewall rules, and ideally IP whitelisting.

With HTTPS and field encryption enabled (Setup β†’ Security), shared hosting is a legitimate and proportionate choice for most practices. Before going live with real patient data on an internet server, ensure:
  • HTTPS / SSL enabled β€” free via Let's Encrypt, usually one click in your host's control panel
  • Field encryption enabled β€” Setup β†’ Security, back up your config.php key immediately
  • Strong unique passwords for all user accounts
  • Registered with the ICO as a data controller
  • A privacy policy in place for your practice
  • Consider a DPIA if processing sensitive health data at scale

Intranet setup options

  • Local server on practice premises β€” a small dedicated machine (e.g. a Raspberry Pi 4, old Mac or Windows laptop or desktop, or NAS device running Linux) running Apache, PHP and MySQL. Accessible only on your practice WiFi. Low cost, high control.
  • Practice network with VPN β€” server on your local network, accessible remotely via VPN tunnel. Practitioners can access from home or between sites securely.
  • Private cloud server (UK-based) β€” a virtual private server (VPS) with a UK hosting provider, firewall-restricted to your IP addresses. Examples: Mythic Beasts, Bytemark, IONOS UK. Avoid US-based providers unless you have specific legal advice on international data transfers.

UK GDPR obligations for healthcare practitioners

Patient health data is special category data under UK GDPR (Article 9). As a data controller you are required to:

  • Register with the ICO β€” most healthcare practitioners must register as data controllers. Annual fee applies (currently Β£40–£60 for small organisations). Check ico.org.uk.
  • Privacy notice β€” provide patients with a clear privacy notice explaining what data you hold, why, how long you keep it, and their rights. This can be a leaflet or a statement on your website.
  • Lawful basis β€” for healthcare, the lawful basis is typically vital interests or legitimate interests combined with explicit consent for special category health data.
  • Retention policy β€” NHS guidelines recommend retaining adult patient records for 8 years after last treatment (longer for children). You must define and document your retention period.
  • Data subject rights β€” patients can request a copy of their data (Subject Access Request), ask for corrections, or request deletion. You must be able to respond within 30 days.
  • Data breach procedure β€” you must have a process for identifying and reporting data breaches to the ICO within 72 hours if required.

Professional body requirements

The GOsC, GCC, CNHC and other UK regulatory bodies all require members to comply with data protection law as a condition of registration. Your indemnity insurance provider may also have specific requirements around clinical record keeping and data storage.

Recommended reading

  • ICO Guide to UK GDPR β€” ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources
  • NHS Records Management Code of Practice β€” england.nhs.uk
  • GOsC Standards of Practice β€” osteopathy.org.uk
  • CNHC Code of Conduct β€” cnhc.org.uk
In summary: Test freely with dummy data on any server. Before entering real patient data, enable HTTPS and field encryption, register with the ICO, and have a privacy notice ready for patients. With these in place, shared hosting is a perfectly valid live environment β€” and this is not just good practice, it is a legal requirement.
πŸ“Ž Attachments

Each patient record has an Attachments tab for storing scanned documents, X-ray reports, GP letters, referral notes, insurance forms and any other files relating to that patient.

Supported file types

PDF, JPG, PNG, GIF and WebP. Maximum file size 10MB per file. For larger files (e.g. high-resolution X-rays) reduce the scan resolution before uploading.

Uploading a file

Open the patient record, click the Attachments tab, and use the upload form. You can:

  • Add a title to describe the document (e.g. "GP referral letter Jan 2025")
  • Optionally link to a session β€” useful for X-rays or reports from a specific visit
  • Optionally link to a letter β€” useful for the incoming letter that prompted an outgoing referral
  • Add notes about the document

Viewing files

Uploaded files appear as a card grid. PDFs show a document icon, images show a thumbnail preview. Click Open to view the file in a new browser tab. PDFs open directly in the browser; images display inline.

Emails

Emails don't need a separate attachment mechanism β€” copy and paste the relevant content into the patient's yellow notes field or save it as a letter record. For emails with important attached documents, save the attachment as a PDF and upload it here.

Server setup required

Attachments are stored in a folder called cs_attachments located one level above the web root β€” outside publicly accessible directories. This must be created manually and the path configured in config.php:

define('ATTACH_PATH', '/full/path/to/cs_attachments');

See the Mac or Windows installation guide for the correct path for your setup.

GDPR note: Uploaded files containing patient data are subject to the same data protection obligations as all other patient records. Files are served through the application (not accessible by direct URL) and require login to view. However, ensure your server backup process includes the cs_attachments folder β€” it is outside the web root and may not be included in standard web backups automatically.

Access control

All logged-in users can view attachments. Only Medium Level and above can upload or delete files.

πŸ” Audit & Search

The Audit page is accessed from the main navigation. It provides a cross-tab query builder that searches across all clinical fields simultaneously β€” demographics, conditions, examination findings, medicines, treatments, practice details and dates. This is the feature that makes structured data entry pay off.

Example: Find all female patients aged 20–45 with neck conditions, SLR positive, showing improvement of 50% or more, referred by their own GP β€” across any combination of fields. Tag the results as a yellow cohort for further analysis, then clear the tag when done.

Building a search

The left panel is the query builder. Start with one empty row β€” choose a field from the dropdown, the input type changes automatically to match:

  • Text fields β€” free text, searches for any match containing your value
  • Select fields β€” dropdown of available values (Sex, Smoker, Prognosis etc.)
  • Boolean fields β€” ticked fields like State Acute, Maintenance, New Condition β€” just shows "is set", no value needed
  • Age range β€” min and max age in years
  • Date range β€” from and to date pickers
  • SLR degrees β€” finds patients with SLR at or below the value entered
  • Improvement min % β€” finds patients at or above the improvement level

Click + Add criterion to add more rows. All criteria are combined with AND β€” every condition must be met. Click Search to run.

Searchable fields

GroupFields
DemographicsSex, Age range, Postcode, Employment type
ConditionPrimary condition, Secondary conditions, Therapy type, State (acute/chronic), New condition, Maintenance, Nerve radiation
HistoryPMH/Cranial, Past medical history, Patient notes (yellow), Accident/RTA, Condition duration
ExaminationExam findings, Better, Worse, Smoker, Improvement %, SLR left, SLR right
Clinical (P3)Diagnosis, Prognosis, Treatment history, Medicine history, Movement/Emotion, Five Element
SessionsSession treatment, Session condition, Session notes, Session medicine
PracticePractice location, Referral source, Practitioner
DatesLast seen range, First contact range, Date of birth range, Date added range
Tip: Session notes and patient notes search the free-text fields β€” great for finding patients where you noted a specific symptom, treatment response or clinical observation that isn't captured in a structured field.

Results

Results show Name, Age, Sex, Primary condition, Location, Last seen, Treatment, Improvement and Practitioner. Click any name to open that patient record. Results are limited to 500 β€” if your search returns the limit, refine your criteria.

Tagging a cohort

Once you have a results list, click 🏷 Tag cohort to reveal the colour picker. Select a colour and click Apply Tag β€” all matching patients are tagged with that colour simultaneously. You can then filter the Patients list by that colour to work with the cohort.

Colours carry no fixed meaning β€” you decide what each colour represents for a given audit project. Clear the colour when your analysis is complete.

Tip: For statistics to work accurately, treatment values must contain no spaces, hyphens or commas β€” e.g. SoftTissue not Soft Tissue. This is already enforced in the treatment value list.

Open text search

At the top of the Search Criteria panel is a free-text search box. Type any word or phrase and it searches across all major text fields simultaneously β€” name, address, notes, precautions, condition, treatment history, diagnosis, session notes and treatment plan titles and goals. Useful for "I know it's in there somewhere" searches.

Encryption and address search: when field encryption is enabled, address fields are stored as ciphertext and cannot be searched with plain text queries. To search by address (e.g. street name or town), go to Setup β†’ Security, click Decrypt all records then Disable encryption, perform your search, then re-enable encryption when done. Name, condition, notes and treatment fields are not encrypted and are always searchable.

Saving searches

After running a search, a Save this search panel appears below the query builder. Give it a name, an optional description, and optionally tick Share with all users to make it available to all practitioners. Saved searches appear in the Saved Searches panel and can be run again with one click.

πŸ“Š Statistics

The Statistics page is accessed from the main navigation. It has three tabs β€” Practice Dashboard, Clinical, and Cohort β€” filtered by year and practitioner.

Practice Dashboard

Summary cards at the top show sessions this month, sessions this year, sessions all time, income this month, income this year, new patients and active patients. Below these are four charts:

  • Sessions per month β€” bar chart of the last 12 months
  • Income per month β€” bar chart of the last 12 months
  • Top conditions β€” horizontal bar chart of the most common presenting conditions for the selected year
  • Referral sources β€” doughnut chart showing how patients found the practice

Clinical tab

Deeper clinical analysis for the selected year:

  • Sex breakdown β€” doughnut chart of patient sex distribution
  • Age breakdown β€” bar chart by age group
  • Improvement distribution β€” doughnut showing what percentage of sessions resulted in each level of reported improvement
  • Treatment frequency β€” horizontal bar of most used treatments
  • Average improvement by condition β€” table showing mean improvement % per condition (minimum 3 sessions)
  • Average sessions per patient by condition β€” table showing how many sessions on average it takes per condition

Cohort / Audit tab

Select a colour-tagged patient cohort to analyse. Colour-tagged cohorts are created on the Audit page β€” search for patients, then tag the results with a colour. The cohort tab then shows:

  • Summary cards β€” patient count, total sessions, average sessions per patient, average improvement
  • Six charts β€” conditions, sex, age, therapy type, improvement distribution, treatments used

This is the research view β€” tag a cohort on the Audit page, then come here to see the statistical breakdown of that specific group.

Filters

Year and practitioner dropdowns at the top apply across all three tabs. Select a specific practitioner to see their individual statistics, or leave on All practitioners for the whole practice.

Tip: For the income figures to be accurate, make sure fee receipts are recorded in Accounts rather than just on session records. The statistics draw income from the Accounts module.
πŸ“‹ Case History (Page 2)

The Case History page is the detailed clinical intake record β€” accessed via the πŸ“‹ Case History button on any patient record. It has four tabs, each saving independently so you can fill them in stages without losing work.

The mosaic input pattern

Throughout Page 2, input works on the mosaic principle β€” choose a value from the dropdown, click the ↓ arrow, and it appends to the yellow text field below on a new line. You can then type freely in the text field to add your own words. Come back and add more at any time. Type the first letter of a value to jump to that part of the list.

The yellow text field is what gets saved β€” it becomes a cumulative, readable clinical record that also feeds the audit search engine.

Tab 1 β€” Medical History & Cranial

  • Past Medical History & Cranial β€” mosaic field covering Surgery, RTA, Fracture, Ca, Hysterectomy, Children, Serious illness, Operations, and cranial findings (Stuck, Free, Torsion, Equal)
  • Secondary Conditions β€” mosaic field for concurrent presenting complaints, same value list as primary condition
  • Condition Duration β€” how long the condition has been present and in what units
  • Accident / RTA β€” type of trauma and how long ago
  • Pain Map β€” interactive front and back body diagram. Select a paint colour (yellow = mild through to purple = very severe), then click any body zone to colour it. Click again to change colour. Accumulated over time β€” update when the pain picture changes.

Tab 2 β€” Examination

Seven satellite dropdowns (Structural, CV/Resp, Abdominal, Neurological, Smell, Eyes/Skin, Bowels/Tongue) each feed into one central yellow findings text box. Choose a finding from any satellite, click ↓, and it appends to the findings record.

  • State β€” Acute, Chronic, New condition, Maintenance, Nerve radiation
  • SLR β€” straight leg raise in degrees, left and right
  • Better / Worse β€” aggravating and relieving factors
  • Smoker β€” status and how long ago if ex-smoker
  • Improvement β€” percentage improvement reported by patient
  • Pain Colour Indicator β€” overall pain intensity summary
Tip: Tab 2 captures the patient-level baseline examination picture. Per-session examination changes are recorded in the session form and tracked separately in the Examination tab of the patient record.

Tab 3 β€” Movement & Emotion

A mosaic snapshot of the patient's lifestyle and emotional context β€” one of the most clinically useful fields in the system. "Dog, gardening, recently divorced, fragile, needs holiday" tells you more about a patient in five seconds than a structured questionnaire.

The value list covers exercise, hobbies, mobility, social situation, emotional state, beliefs and lifestyle. All values are editable in Setup β†’ Value Lists β†’ Movement & Emotion.

The Five Elements dropdown (Wood / Fire / Earth / Metal / Water) sets a colour indicator and shows the associated organ systems, season, emotion and characteristics. Links to the Five Elements & Pulse History page (coming soon).

Tab 4 β€” GPs & Admin

  • GP β€” linked from the Contacts database. Used to auto-populate GP referral letters. Note: the GP dropdown will be empty on a fresh installation β€” add your GPs first via Contacts β†’ New Contact (type: GP), then return here to link them to patients.
  • Other Therapists β€” free text list of other healthcare providers
  • Referral Source β€” how this patient found the practice
  • Relationship β€” patient's relationship to the practice (Patient, Son, Daughter, Husband, Wife etc.)
  • Insurance β€” insurance company

Editing value lists

All the dropdown lists in Page 2 are editable in Setup β†’ Value Lists. The page shows an index at the top β€” click any list name to jump to it. Add new values with the + Add button. Remove values with the βœ• button. Changes take effect immediately. Other editable value lists are in Contacts (GPs and therapists), Medicines and in Setup where you can add practice locations (and practitioners who are the Users)

Clinical note: As Jolyon wrote in the original CrystalSolutions documentation β€” "This is not a comprehensive input of therapeutic case history taking, which we expect to be on the patient's written notes. It is designed to allow the practitioner to record quickly the pertinent facts, and thus allow quality audit β€” with final reference to the patient's written notes."
πŸ’Š Prescriptions & Treatment (Page 3)

Page 3 is accessed via the πŸ’Š Rx button on any patient record. It records the prescribing and treatment picture β€” diagnosis, prognosis, medicines prescribed and treatments given β€” all using the mosaic append pattern.

Layout

The page is divided into four quadrants:

  • Top left β€” Medicine History β€” five dropdown lists feeding one yellow text box
  • Bottom left β€” Treatment History β€” treatment list with date stamp button feeding a yellow text box
  • Top right β€” Differential Diagnosis β€” mosaic dropdown feeding a yellow text box
  • Bottom right β€” Prognosis β€” mosaic dropdown feeding a yellow text box

Medicine History

Five separate dropdown lists each feed the same central medicine history text box:

  • Standard β€” conventional prescription and OTC medicines
  • Supplement β€” vitamins, minerals and nutritional supplements
  • Herbal β€” herbal medicines and tinctures
  • Homeopathic A–N β€” homeopathic remedies A through N
  • Homeopathic O–Z β€” homeopathic remedies O through Z

Select from any list, click ↓ to append to the medicine history. Type the first letter to jump to that part of the list. The text box is fully editable β€” add dosages, frequencies and notes freely.

Treatment History

The treatment list covers the full range of techniques used across therapy types:

GOT Β· AK Β· Meridian Β· Mobilize Β· Recommend Β· TreatmentIncluded Β· HVT Β· Cranial Β· Facial Β· SoftTissue Β· Hydrotherapy Β· StrainCounterStrain Β· MET Β· Naturopathic Β· Osteopathy Β· Acupuncture Β· Chiropractic Β· Physiotherapy Β· Chiropody Β· Counselling Β· Reiki Β· Herbalism Β· Aromatherapy Β· Reflexology

The πŸ“… Date button inserts today's date as a divider β€” useful for building a chronological treatment record across multiple visits.

No spaces, hyphens or commas in treatment values β€” this ensures the statistics and audit engine can search and count treatments accurately.

Differential Diagnosis

Choose from the diagnosis value list (Musculoskeletal, Neurological, Visceral, Cranial, Naturopathic etc.) and append to the diagnosis text box. Add your own clinical detail freely in the text box.

Prognosis

Excellent / Good / Fair / Guarded / Poor / Refer β€” append and annotate as the clinical picture evolves.

Medicine lists

The standard medicine, supplement, herbal and homeopathic lists are large reference lists. They can be managed via Setup β†’ Value Lists. A dedicated medicines management interface with search and pagination will be added in a future version for easier management of the full lists.

Clinical note: Page 3 records the prescribing picture at patient level β€” a cumulative history. Per-session medicines and treatments are also recorded on the session form for session-by-session audit. Both feed the audit search engine.
πŸ“‹ Treatment Plan

The Treatment Plan is accessed via the πŸ“‹ Plan button on any patient record. It records a structured plan of up to 5 clinic-based and 5 home-based goals, tracks achievement, and produces a printable summary to show the patient.

Milestone 1 β€” Clinic Based (Practitioner Goals)

Up to 5 practitioner-led goals β€” techniques, referrals or clinical objectives. Choose from the dropdown list or type your own. Goals show in red when still to do. Click the checkbox when a goal is achieved β€” it turns green with strikethrough. A positive image for both patient and practitioner.

Milestone 2 β€” Home Based (Patient Goals)

Up to 5 patient-led goals β€” exercise, lifestyle, self-care. Same layout and colour coding as Milestone 1. The same goal list is available for both milestones.

Review tab

Shows both milestones side by side with a progress bar (e.g. 3/5 achieved) and achievement dates. The Print / Show Patient button opens a clean printable page β€” red for still to do, green strikethrough for achieved. This can be printed and given to the patient or displayed on screen during the consultation.

Goal value list

The Treatment Plan Goals list is editable in Setup β†’ Value Lists β†’ Treatment Plan Goals. Add your own goals, remove ones you don't use. Both milestones share the same list.

Clinical use: The treatment plan is designed to be shown to the patient β€” a shared agreement between practitioner and patient about what will be done in clinic and what the patient will do at home. Checking off achieved goals provides positive reinforcement and a clear record of progress.
πŸ‘£ Podiatry & Chiropody (Page 6)

The Podiatry page is accessed via the πŸ‘£ Podiatry button which sits to the left of the Edit Baseline button at the top right of the Examination Findings card on the patient's Examination tab.

Six finding groups

GroupExample findings
GeneralVerrucae, Diabetes, Flat foot, Orthotics, Gait
ForefootBunions, Morton's neuroma, Metatarsalgia, Hallux Rigidus
ToeHammer toe, Ingrown toenails, Dorsal corns
AnkleAchilles tendonitis, Ankle sprain, Peroneal tendon injury
MidfootPlantar fasciitis, Lisfranc's injury, Cuboid compression
HindfootHaglund's deformity, Tarsal tunnel syndrome, Heel spur

How to use

Select Left, Right or Both at the top. Choose a finding from any dropdown and click β†’ to append to the yellow notes field as:

Left Β· Forefoot Β· Bunions

Type the first letter in any dropdown to jump to that part of the list. The notes field is fully editable β€” add your own observations freely.

Where findings appear

Podiatry notes appear as a read-only yellow card at the bottom of the Examination tab on the patient record, with an Edit link back to Page 6. They are stored separately from the baseline examination findings.

Value lists

All six podiatry finding lists are editable in Setup β†’ Value Lists β€” look for the six Podiatry entries in the index. Add new conditions, remove ones you don't need.

🩻 Imaging & X-ray (Page 4)

Page 4 is accessed via the 🩻 Imaging button on any patient record. It provides a dedicated store for imaging records β€” X-rays, MRI, CT scans, ultrasound and other investigations β€” separate from the general attachments system.

Adding an imaging record

Each imaging record captures:

  • Date, imaging type and region β€” e.g. X-ray Β· Lumbar
  • Requested by β€” GP, self-referred, specialist, hospital etc.
  • Findings checkboxes β€” grouped into Disc, Vertebrae, Alignment, Soft tissue and Other. Quick-tick common findings (disc degeneration, osteophytes, scoliosis etc.) without typing
  • Practitioner's interpretation β€” your own clinical notes on the findings
  • Radiologist's / specialist's report β€” paste the formal report text
  • Image upload β€” attach the actual scan image (JPG, PNG, WebP) or a PDF report, up to 20MB

Viewing imaging records

Saved records appear as cards showing a thumbnail of the image. Click a thumbnail to open it full-screen in a lightbox viewer. PDF reports open in a new tab. Finding tags (disc degeneration, osteophytes etc.) are shown as small pills on each card.

Image files

Images are stored in the attachments/[patient_id]/imaging/ folder on the server β€” separate from general attachments. Make sure this folder is writable by the web server. Supported formats: JPG, PNG, WebP, GIF and PDF.

Tip: For large X-ray files, reduce the image resolution before uploading β€” a 1500px wide JPEG is perfectly readable on screen and will be a fraction of the original DICOM file size.
☯ Five Elements & Astrology (Page 5)

Page 5 is accessed via the ☯ Elements button on any patient record. It requires a Date of Birth to be recorded for the astrological calculations. It has five tabs.

Aide memoire: Page 5 is a constitutional reference tool β€” a rapid structured snapshot of the patient's elemental and astrological profile. The detail of your five elements assessment and astrological interpretation lives in your written notes. This page finds the pattern quickly and prompts the right questions.

Tab 1 β€” Five Elements

An interactive pentagon showing the five elements in their generating cycle. Click any element in the pentagon to make it central β€” all text panels, the organ line, the pulse dropdown and the colour scheme update instantly to reflect that element.

  • Left panel β€” elemental personality text (the Wood person has high morals...)
  • Centre β€” the pentagon with generating cycle (outer) and controlling cycle (inner dashed lines). The organ/emotion/taste/smell line shows below it.
  • Right panel β€” direction and environmental text (Wood = East, growth, new beginnings...)
  • Controls β€” element dropdown, Yin/Yang/Strong/Weak radio buttons, pulse quality dropdown (auto-set from element), two practitioner note boxes

Tab 2 β€” Feng Shui

The same five elements component with the panels repositioned β€” direction text on the left, pentagon in the centre, personality text on the right. The same click-to-recentre interaction applies.

Tab 3 β€” Pulse History

A structured pulse recording tool. Set a date, select quality and value for each of the 6 positions (3 left hand, 3 right hand), then click the ↓ arrow to append a timestamped entry to the pulse history record:

02/10/2024 * +5 +4 +3 +5 +4 +3 * floating sinking rapid hesitant slow hesitant

The history accumulates over time, providing a longitudinal pulse record for comparison across visits. Left hand positions shown in red/green/blue, right hand in green/yellow/red.

Tab 4 β€” Astrology (3 sub-tabs)

Western β€” sun sign calculated automatically from DOB. Shows the sign symbol, dates, element, modality and ruling planet. Below are the full sign description (yellow), sign group text (blue) and modality text (red). The sign can be overridden via dropdown if needed.

Chinese β€” zodiac animal, element and yin/yang calculated from birth year, with character description. Note: simplified calculation β€” for births in January or February check the exact Chinese New Year date.

Indian β€” a reference table showing the correspondence between Western signs, Indian (Vedic) signs and Chinese signs with their elements. The current patient's sign is highlighted.

Tab 5 β€” Profile

Step-by-step instructions for building a complete five elements and astrological profile for a patient. Explains the workflow from DOB entry through to syndrome identification.

Recommended workflow

  • Ensure DOB is recorded on the patient record
  • Click ☯ Elements β†’ Profile tab to read the instructions
  • Check Chinese sign element (Astrology β†’ Chinese)
  • Check Western sign element (Astrology β†’ Western)
  • Compare both with the Five Elements tab β€” adjust if needed
  • Note the organ syndromes shown below the pentagon
  • Record pulse findings on the Pulse History tab after each relevant session
πŸš€ Getting Started
The design philosophy of CrystalSolutions:
This system is an aide memoire β€” a structured clinical prompt, not a replacement for written notes. It allows a practitioner to record quickly the pertinent facts of a patient's history and treatment (perhaps quickly input some notes at the end of a busy day), and thus enable quality audit β€” with final reference to the patient's written notes found alphabetically. Put simply, it allows you to find a patient by condition, treatment and a myriad of other factors β€” age, sex, address, examination findings β€” which is impossible with a simple alphabetic written system on its own. The detail lives in your written notes. This system finds the patient, tells the story, and makes the connections.

First steps after installation

Before adding patients, configure the system in Setup:

  • Setup β†’ Practice β€” enter your practice name, address, therapy type and currency symbol. This information appears on letters and receipts.
  • Setup β†’ Locations β€” add your practice location(s). If you work across multiple sites, add each one here and set a default location per user.
  • Setup β†’ Users β€” add any additional practitioners or reception staff. Set their access level appropriately.
  • Setup β†’ Schedule β€” add your appointment types (e.g. New Patient 60 mins, Follow-up 30 mins) and treatment rooms.
  • Setup β†’ Value Lists β€” customise the occupation and therapy type dropdowns.

Recommended first-use order

  • 1. Configure Setup as above
  • 2. Add your GP contacts (Contacts β†’ New Contact, type GP)
  • 3. Add your first patient
  • 4. Record baseline examination findings for that patient
  • 5. Record their first session
  • 6. Write a letter if needed
Tip: Button tooltips are on by default β€” hover over any button to see what it does. Once you're familiar, turn them off in Setup β†’ Practice.

Changing your password

Go to Setup β†’ Password. You'll need to enter your current password before setting a new one. Minimum 8 characters.

🏠 Welcome Dashboard

The welcome page serves two purposes β€” a public-facing introduction to CrystalSolutions for visitors who aren't logged in, and a daily practice dashboard for logged-in users. The two views are different: the public view shows the feature overview; the logged-in view shows live practice data.

Dashboard panes

The logged-in dashboard shows up to six collapsible panes β€” each only appears if there is data to show:

  • πŸ“Œ Practice Noticeboard β€” the practice-wide note from Setup β†’ Practice. Visible to all users. Edit it in Setup to leave notes for all staff: "Buy couch rolls", "Ring Blair re Thursday".
  • πŸ“ Recent Activity β€” the 8 most recently added patients and sessions across the practice, with who added them and when. Useful for monitoring trial users or multi-practitioner activity.
  • πŸ• Due for Review β€” patients who haven't been seen within the practice review period. Only shows if a review period is set in Setup. Click any name to go to their record; "all" link filters the patient list.
  • πŸ’Š Recent Medicines β€” medicines and remedies recorded in recent sessions, grouped by patient with the improvement rating shown as a green badge.
  • πŸ“‹ Treatment Plans β€” active treatment plans with achieved/to-do counts and a progress bar. Links directly to each patient's plan.
  • πŸ‘£ Podiatry Notes β€” patients with podiatry notes recorded, showing a preview and linking to their podiatry page.

Collapsible panes

Each pane has a small hide / show link in the top right. Click hide to collapse a pane β€” it stays collapsed on that device until you show it again. This is stored in your browser's local storage, so each device remembers its own settings independently.

The Modules section (the feature cards β€” Patients, Sessions, Audit etc.) also has a single hide/show toggle. Once you know the system, hide the modules to keep the dashboard clean.

The Design Philosophy card at the top has its own hide/show. New users should read it; experienced practitioners can hide it permanently.

Turning off the welcome screen

If you'd prefer to go straight to the patient list after login rather than seeing the dashboard, go to Setup β†’ Practice and uncheck Welcome screen on/off. You'll land on the Patients list every time instead.

Public landing page

When someone visits the CrystalSolutions URL without being logged in, they see the public version of the welcome page β€” the feature overview, design philosophy and pricing. This is intentional: the URL can be shared as a product overview. The clinical dashboard is only visible after login.

πŸ‘€ Patients

Adding a new patient

Click + New Patient from the Patients list. The only required field is Surname β€” all other fields can be filled in later. After saving you'll be taken directly to the patient record.

Searching for patients

The search bar on the Patients list searches across: surname, forename, phone, mobile, email and postcode. You can also filter by status (New, Existing, Regular etc.) and by practice location.

Sorting the patient list

Click any column header to sort the patient list by that column β€” click again to reverse the order. An arrow (↑ ↓) shows the current sort. Available sorts:

  • Name β€” alphabetical by surname (default)
  • Status β€” group by New, Existing, Regular etc.
  • Practitioner β€” all patients of a specific practitioner together
  • Last Seen β€” most or least recently seen first
  • Added β€” date the record was created, newest first β€” useful for monitoring recent additions during a trial or when a new practitioner joins

Review flags

If a review period is set in Setup β†’ Practice, a πŸ• clock icon appears next to the Last Seen date for any patient who hasn't been seen within that period. Hovering shows "Due for review". The same patients appear in the Due for Review pane on the welcome dashboard and in Audit β†’ Quick Searches.

The patient record β€” top strip

The coloured strip at the top of every patient record shows the key clinical facts at a glance:

  • Name, DOB, age, sex β€” always visible
  • Primary condition β€” the original presenting complaint, set once and rarely changed
  • Therapy type and practice location
  • Precautions β€” shown in bold red if recorded (allergies, pacemakers, anticoagulants etc.)
  • Arrow buttons ↑ ↓ β†’ β€” set the patient's current trajectory (improving, worsening, stable)
  • Colour tag β€” for grouping patients in audit projects (see below)
  • Priority star β˜… β€” shown when Priority is ticked in Edit

Patient record tabs

  • Details β€” contact information, GP, insurance, practice details, and the yellow notes field
  • Clinical β€” presenting condition, precautions, past medical history, other therapists. Also shows a read-only summary of Page 3 fields (diagnosis, prognosis, medicine history, treatment history) if populated β€” each with an Edit link going straight to Page 3.
  • Sessions β€” full treatment history, most recent first
  • Examination β€” baseline examination findings, plus a read-only summary of Page 2 history fields and the pain map thumbnail
  • Letters β€” all letters written for this patient
  • Attachments β€” uploaded files (PDFs, images) linked to this patient

The three note types

TypeAppearancePurpose
Yellow notes Yellow background, black text Per-patient narrative notepad. Informal, free text. Record secondary conditions, memorable details, date-stamped observations. "Great guitarist β€” came in with neck pain after long recording session."
Precautions Bold red text Safety-critical information β€” latex allergy, pacemaker, anticoagulants, contrast media reactions. Shown prominently on all views.
Practice notes Small turquoise text Practice-wide noticeboard β€” the same text appears on every patient record. Use for admin reminders relevant to all staff: "Buy couch roll", "Parking suspended 15th-17th".

The colour tag β€” audit and research tool

The colour dots in the patient top strip are a temporary grouping tool for audit work, not a permanent clinical indicator. For example:

  • Search for all female patients aged 20–40 with neck conditions
  • Set them all to Yellow using the colour tag
  • Filter the patient list by Yellow to work with that cohort
  • Clear the colour when your analysis is complete

Colours available: Green, Yellow, Red, Blue, Grey and Clear. They carry no fixed clinical meaning β€” you decide what each colour represents for a given project.

Primary condition vs session condition

The Primary Condition on the patient record is the original presenting complaint β€” it's set once at first contact and reflects why this person became your patient. It doesn't change when they come in with something different one week.

Each Session records its own primary and secondary condition for that visit. Secondary conditions and evolving presentations are captured in the yellow notes and per-session records.

Clinical note: If a long-standing patient presents with a new unrelated condition, consider whether to update their primary condition or simply record it in the session and yellow notes. Most practitioners leave the original condition in place.
πŸ“‹ Sessions

Save button at the top

Both the new session and edit session forms have a Save Session button in the page header β€” right next to the patient name. No need to scroll to the bottom of a long form just to save, especially useful on mobile or when you only need to update a few fields.

Collapsible sections

The Examination Findings and Fee cards each have a small hide/show link in their title bar. If you rarely use examination findings in sessions, hide that section β€” it stays hidden on that device until you show it again (stored in browser local storage). This keeps the form compact for quick end-of-day data entry.

Recording a session

Sessions are individual treatment appointments. Add a new session from the patient record (+ Session button) or from the Sessions list. Sessions require Medium Level access or above β€” reception staff can view sessions but cannot add or edit them.

Therapy type default

The Therapy Type field on a new session pre-fills automatically from the practice default set in Setup β†’ Practice. You can override it for any individual session. This saves time for single-discipline practices where every session is the same therapy type.

Podiatry from within a session

The Examination Findings card on the session form has a πŸ‘£ Podiatry button in the top right. This opens the patient's podiatry page in a new tab so you can record podiatry findings alongside the session β€” without losing your place in the session form.

Session fields

  • Date β€” defaults to today
  • Primary condition β€” what you treated this visit
  • Secondary condition β€” any concurrent presenting complaint
  • State β€” Acute, Sub-acute, or Chronic
  • Nerve radiation β€” free text description of any radiation pattern
  • SLR β€” straight leg raise result in degrees (left and right)
  • Worse / Better β€” aggravating and relieving factors
  • Accident β€” whether trauma is involved and how long ago
  • Treatments β€” what techniques you used
  • Treatment notes β€” free text clinical notes
  • Improvement β€” patient's reported improvement level
  • Maintenance β€” whether this is a maintenance visit
  • Medicines β€” standard medications, supplements, herbs, homeopathics
  • Fee and payment β€” amount, paid status, payment method

Examination findings in sessions

The session form includes all 7 examination tabs. You only need to record what has changed from the baseline β€” the baseline findings are shown as hints (blue dots). If nothing has changed neurologically, leave the Neurological tab blank.

The session view shows changed findings highlighted in blue with a "new" badge, making it easy to see what was different at that visit compared to the patient's baseline.

Tip: The Sessions list (top nav) shows all sessions across all patients, filterable by date range, practitioner, location, condition and paid status β€” useful for end-of-month income reconciliation.
🦴 Examination Findings

Baseline vs session findings

Examination findings work on a two-tier system:

  • Baseline β€” recorded on the patient record, updated only when there is a significant change to the overall clinical picture. This is the reference against which future sessions are compared.
  • Session changes β€” recorded per-session, only when findings differ from the baseline. If cranial nerve examination is normal and unchanged, leave it blank.

The 7 examination tabs

TabWhat it covers
🧠 NeurologicalCranial nerves I–XII individually, Valsalva, reflexes
🦴 Structural / OrthopaedicFP, SLR, ADAMS, KEMPS, percussion, compression, distraction, ROM restrictions, Tinnels, sacroiliac
🫁 AbdominalTenderness, guarding, quadrant locations, hernia, aortic pulse, organ enlargement
πŸ‘… Bowels / TongueBowel habit, IBS, colitis, blood/fatty stools, tongue appearance
πŸ‘ Eyes / SkinBP signs, pupils, skin conditions, jaundice, cyanosis
πŸ«€ CV / RespiratorySOB, pulse quality, oedema, breath sounds, cough type
πŸ‘ƒ Smell / HearingCharacteristic smells, halitosis, hearing changes, tinnitus
Red flag findings: Several examination findings indicate the need for urgent referral. The red flag field on the patient record should be set whenever a finding warrants GP notification. Use the GP referral letter template to document this formally.

Audit trail

The patient examination page shows the full history of session-level changes with dates, each linking back to the original session record. This provides a longitudinal record of how the clinical picture has evolved over time.

History and pain map on the Examination tab

The Examination tab on the patient record also shows a read-only summary of the Page 2 case history fields β€” secondary conditions, condition duration, accident/RTA, PMH & cranial text, and the examination findings mosaic. The pain map (front and back body diagram) appears as a compact thumbnail alongside these fields, with only the painted zones coloured. All fields link back to Page 2 for editing.

Podiatry & Chiropody

The Examination tab has a πŸ‘£ Podiatry button in the top right of the baseline findings card. This opens a dedicated podiatry page with six finding groups β€” General, Forefoot, Toe, Ankle, Midfoot and Hindfoot β€” each with a dropdown value list. Select Left / Right / Both, choose a finding and click β†’ to append to the podiatry notes field. Podiatry notes are stored separately from the baseline examination findings and shown in their own card at the bottom of the Examination tab when recorded.

πŸ“… Schedule

Views

  • Week view (default) β€” a time grid from your diary start to end time, with one column per day. Click any empty slot to book an appointment.
  • Day view β€” single day, same grid. Click a day number in week view to jump to day view for that date.
  • Month view β€” calendar overview. Shows up to 3 appointments per day. Click a day to go to day view.

Booking an appointment

Click any empty time slot or the + New Appointment button. The booking form lets you set:

  • Patient β€” select from your patient list
  • Appointment type β€” automatically sets the duration (configurable in Setup β†’ Schedule)
  • Duration β€” overridable per booking
  • Room / Resource β€” if you have multiple treatment rooms
  • Notes β€” clinical or admin notes for this appointment
  • Special needs β€” downstairs room required, extra time, latex allergy etc. Shown prominently in orange.
  • Confirmed β€” tick when patient has confirmed attendance
  • Send reminder β€” flag for reminder (reminder sending infrastructure will be added in a future version)
  • Recurring β€” set a repeat pattern (weekly, fortnightly, monthly) with an end date

Entry types

  • Appointment β€” patient booking
  • Blocked β€” unavailable time (grey)
  • Admin β€” administration time
  • Holiday β€” practitioner holiday or absence

Viewing other practitioners' diaries

Use the practitioner dropdown at the top of the schedule to switch between diaries. Administrators can view all diaries. The Side by side button (admin only) shows all practitioners in columns simultaneously.

Editing another practitioner's appointments

If you try to edit an appointment belonging to another practitioner, you will be asked to enter that practitioner's password. This prevents accidental changes to someone else's diary while still allowing reception staff to make bookings on behalf of practitioners.

Marking attendance

Click an appointment to open the popup, then click βœ“ Attended to mark the patient as attended. This can be done by reception at the time of the appointment. Attended appointments are shown with reduced opacity.

Diary settings

Click βš™ Diary Settings to configure your personal diary preferences:

  • Day start and end time
  • Appointment slot duration (15, 20, 30, 45, 60, 90 mins)
  • Show or hide weekends

Each practitioner has their own diary settings. Administrators can set settings for any user.

Tip: The slot duration sets the grid granularity β€” it doesn't restrict appointment length. A 30-minute slot grid can still have 60-minute appointments that span two slots.
πŸ’· Accounts

Income tab

Records payments received from patients. Each receipt records: date, patient (optional), amount, payment method, status (stored/pending/void), practitioner and notes.

Income receipts can be added by reception staff (Low Level access). Only Medium Level and above can add expenditure or delete records.

Expenditure tab

Records business outgoings. Expense types include: courses, equipment, materials, postage, rent, software, stationery and more. Each expense records: date, type, recipient, amount, payment method, and optional tax rate.

The Debit / Credit field distinguishes outgoing payments from refunds received.

Filtering

Filter by year and month. The summary bar at the top always shows the filtered totals for Income, Expenditure and Net β€” useful for monthly reconciliation and annual returns.

Payment methods

Cash, Cheque, Debit Card, Credit Card, BACS, Insurance, Trade, Unpaid, Gratis.

Tip: For end-of-year accounts, filter to the full year and use the Net total as your starting point. The accounts module is a cash book β€” for VAT returns and formal accounts you'll still need your accountant, but this gives them clean data to work from.
βœ‰ Letters

Writing a letter

Open a patient record and click βœ‰ Letter. Choose a template or start blank. The letter is pre-populated with patient and practice details via merge variables.

Merge variables

Templates use {{double curly braces}} for merge fields. Available variables:

VariableFills with
{{patient_name}}Patient's full name
{{patient_address}}Patient's full address
{{patient_dob}}Patient's date of birth
{{gp_name}}Patient's GP name (from linked contact)
{{gp_address}}Patient's GP address
{{practitioner}}Logged-in practitioner's name
{{practice_name}}Practice name from Setup
{{practice_address}}Practice address from Setup
{{letter_date}}Today's date
{{presenting_condition}}Most recent session's primary condition
{{treatments}}Most recent session's treatments

Starter templates

  • Appointment Reminder β€” includes appointment date/time placeholders
  • Discharge Letter to Patient
  • GP Referral Letter β€” includes patient details, presenting complaint, examination findings placeholder
  • GP Letter β€” Treatment Report
  • Dietary Advice Letter
  • General Letter β€” blank template

Audit trail

Every saved letter is stored against the patient record with the date, recipient, subject and the name of who wrote it. Letters appear in the Letters tab of the patient record and in the main Letters list.

GP referral tip: For the GP referral template to auto-populate the GP's name and address, make sure the patient has a GP linked in their record (Edit β†’ GP field) and that GP's details are in Contacts.
πŸ“„ Documents

The Documents module stores two types of document: Practice Documents (contracts, policies, GDPR notices β€” not linked to any patient) and Patient Documents (consent forms, insurance authorisations, GDPR sign-offs β€” stored directly against a patient record).

Creating a patient document

Open a patient record and click πŸ“„ Document in the quick-action strip. Choose a template or start blank. The document is pre-populated with patient and practice details via merge variables. Give it a name, optionally record a signed date, edit the body, and save.

Creating a practice document

Go to Documents in the main navigation, select the Practice Docs tab, and click + New Practice Document. Choose a template (e.g. Associate Contract, GDPR Privacy Notice) or start blank. Practice documents are not linked to any patient β€” they are available to all staff to view and print.

Merge variables

Templates use {{double curly braces}} for merge fields. Variables are merged automatically when you choose a template. You can also click any variable chip to insert it at the cursor position while editing.

VariableFills with
{{patient_name}}Patient's full name
{{patient_address}}Patient's full address
{{patient_dob}}Patient's date of birth
{{practitioner}}Logged-in practitioner's name
{{practice_name}}Practice name from Setup
{{practice_address}}Practice address from Setup
{{doc_date}}Today's date
{{presenting_condition}}Most recent session's primary condition
{{associate_name}}Free text β€” fill in manually (contracts)
{{associate_address}}Free text β€” fill in manually (contracts)

Starter templates

  • Associate Contractor Agreement β€” self-employed practitioner contract with commission tiers
  • GDPR Privacy Notice β€” patient-facing data protection notice
  • Patient Consent Form β€” treatment consent with signature line
  • Cancellation Policy β€” 24-hour notice policy
  • Insurance Authorisation Letter β€” patient-addressed letter for insurer use

Signed date

Patient documents have an optional Signed Date field. Once recorded, the date shows in green in the Documents tab β€” useful for tracking which patients have signed their consent form. Unsigned documents show a dash.

Printing and PDF

Open any document and click Print / PDF. The document renders with a practice letterhead (practice name and address from Setup) and prints cleanly β€” use your browser's "Save as PDF" option to generate a PDF copy.

Three-tab layout

The Documents page has three tabs:

  • Practice Docs β€” contracts, policies and practice-level documents
  • Patient Docs β€” all patient documents across the practice, with search by patient or document name
  • Templates β€” manage the document template library (Admin only)

Access control

ActionAccess required
View any documentAll staff
Create / edit / delete documentsMedium Level
Create / edit / delete templatesAdmin
Tip: Patient documents appear in both the patient's own Documents tab and in the Patient Docs tab of the main Documents page β€” so you can find all consent forms across all patients in one place, or filter by name.
πŸŽ“ CPD β€” Continuing Professional Development

Recording CPD

Each entry records: date, category, title, provider, hours, whether a certificate is held, notes and a reflection. The reflection field is required by most UK regulatory bodies for audit purposes.

CPD categories

  • Course / Workshop
  • Conference / Seminar
  • Webinar / Online Learning
  • Reading / Research
  • Supervision / Mentoring
  • Peer Review
  • Teaching / Presenting
  • Clinical Observation
  • Self-directed Study
  • Other

Printing for your regulatory body

Click Print / Export to open a clean print-ready version of your CPD log. This opens in a new tab and triggers the print dialog automatically. It includes all entries for the selected year, your reflection notes, and a total hours summary showing verified vs unverified hours.

Filter by year before printing to produce your annual CPD return. The GOsC and other regulatory bodies typically require a minimum of 30 hours per year.

Multiple practitioners

Each practitioner sees only their own CPD log. Administrators can switch between practitioners using the dropdown at the top of the CPD page.

Tip: Log CPD as you go rather than trying to reconstruct it at annual review time. A brief reflection written immediately after a course is much more valuable than one written six months later.
πŸ“‡ Contacts

What contacts are for

Contacts stores GPs, specialists, referrers, associates and other healthcare providers. A patient can have a GP linked to their record β€” when you write a GP referral letter, the GP's name and address auto-populate from this contact record.

Contact types

GP, Specialist, Physiotherapist, Osteopath, Chiropractor, Acupuncturist, Herbalist, Homeopath, Naturopath, Counsellor, Podiatrist, Reflexologist, Aromatherapist, Insurer, Solicitor, Associate, Supplier, Staff, Reception, Other.

Suppliers: Use the Supplier type for companies you buy stock from β€” homeopathic pharmacies, supplement wholesalers, equipment suppliers. Once added, they appear in the Supplier dropdown when adding products in the Stock module.

Dual address

Each contact can have two addresses β€” typically a surgery/practice address (A) and a home address (B). The secondary address is hidden by default and expands when needed.

Linked patients

When viewing a GP contact record, all patients who have that GP linked to their record are listed at the bottom β€” useful for managing practice populations and referral relationships.

πŸ“¦ Stock & Products

What the stock module does

The stock module tracks dispensary products and practice supplies β€” quantities in stock, reorder levels, purchase and sale transactions, and supplier links. Low stock items appear as a warning on the welcome dashboard.

First time setup β€” do this in order:
1. Add your suppliers first in Contacts (use type = Supplier)
2. Add your products in Stock, linking each to a supplier if relevant
3. Set a reorder level on each product so the low stock alert fires correctly
Only then will the Products Sold section in sessions work properly.

Two tabs

Products & Remedies β€” things you sell or dispense to patients: supplements, homeopathic remedies, herbal preparations, and other saleable items.

Practice Supplies β€” consumables you use but don't sell: couch roll, gloves, equipment, office supplies.

Adding a product

Click + Add Item on the relevant tab. Fill in the name, category, unit, cost price, sale price, and reorder level. Link a supplier if you have one set up in Contacts.

The Unit field should contain a word describing the unit of measure β€” not a quantity. For example:

  • Arnica 30c (Products & Remedies) β†’ Unit: bottles
  • Couch roll (Practice Supplies) β†’ Unit: rolls
  • Needles β†’ Unit: boxes or each

Setting opening stock

There is no opening stock field on the product form β€” stock levels are built entirely from transactions. After adding a new product, set your opening balance like this:

  1. Add the product with the correct unit label, prices and reorder level
  2. Click + Stock on the product card
  3. Choose type Purchase, enter your current stock quantity and today's date
  4. Save β€” the stock level updates immediately

This establishes your opening balance and appears correctly in the transaction history. The online demo has working examples of both a remedy (Arnica) and a practice supply (Couch rolls) if you want to see how it should look.

The reorder level is the quantity at which the low stock alert fires β€” set it to your normal re-order point, e.g. if you reorder when you have 5 bottles left, set it to 5.

Recording stock movements

Click + Stock on any product card to record a transaction. Four types are available:

  • Purchase β€” stock received from a supplier. Increases stock qty.
  • Sale to patient β€” sold directly from the dispensary. Decreases stock qty.
  • Adjustment β€” stock count correction. Enter a positive number to increase (e.g. you found extra stock) or a negative number to decrease (e.g. correcting a counting error). Use this when the change doesn't fit neatly into purchase, sale or write-off.
  • Write off β€” expired or damaged stock. Always decreases stock qty β€” enter the quantity to remove as a positive number.

Products sold during a session

When editing a session, a Products Sold / Used card appears below Medications and above Fee. Select a product from the dropdown β€” it shows current stock levels β€” enter the quantity, and the price auto-fills from the product's sale price (which you can override). Stock decrements automatically when you save the session. If you edit and re-save, the stock is recalculated correctly.

The Products Sold section is optional β€” leave it blank if no products were dispensed. Rows with no product selected are ignored on save.

Low stock alert

Any active product whose stock quantity is at or below its reorder level appears in the amber ⚠ Low Stock pane on the welcome dashboard. Click Manage stock β†’ to go directly to the stock page. The alert only fires if a reorder level greater than zero has been set.

Transaction history

Click History on any product card to see a full log of all stock movements β€” purchases, sales, adjustments and write-offs β€” with date, quantity, price and the patient if a session sale was linked. Use the From / To date filter to narrow to a period, then click Print / PDF to print or save as PDF from your browser. A totals row at the bottom shows units in, units out, net movement and total value for the filtered period.

Inactive products

Products you no longer stock can be deactivated (Administrator only) rather than deleted. Inactive products are hidden by default but their transaction history is preserved. Click Show inactive to view them.

βš™ Setup

Practice tab

Sets the practice name, address, default practitioner, therapy type, currency symbol, tax rate, date format, review period and the practice-wide noticeboard. Also controls hover tips and the welcome screen.

Practice Noticeboard

The πŸ“Œ Practice Noticeboard field (in the Practice tab) shows its content on the welcome dashboard for all logged-in users. Use it for day-to-day practice reminders: "Order couch rolls", "Ring Blair re Thursday", "Parking suspended 15th–17th". It's not patient-specific β€” it's a shared practice whiteboard visible the moment anyone logs in.

Hover tips & welcome screen

Two checkboxes sit side by side in the Practice tab:

  • Hover tips on/off β€” button tooltips appear when you hover over buttons. Useful for new users; turn off once your team knows the system.
  • Welcome screen on/off β€” controls whether the welcome dashboard appears after login. Turn off to go straight to the patient list. The welcome screen can also be used as a permanent practice dashboard β€” collapsing the modules and philosophy sections leaves just the clinical panes.

Locked tabs

Users who don't have access to certain Setup tabs (e.g. Medium Level users who can't access Locations, Value Lists etc.) still see those tabs in the Setup tab bar β€” but they're greyed out with a πŸ”’ lock icon. Hovering shows which access level is required. This lets lower-access users see what the system is capable of without being able to change restricted settings.

Review Period

Set a default review period (e.g. 6 Months, 12 Months) to flag patients who haven't been seen within that time. Once set, a πŸ• review flag appears in four places:

  • Patient list β€” a πŸ• clock icon next to the Last Seen date for overdue patients
  • Patient record β€” a yellow banner at the top showing how long since their last visit, with a quick + Book Session button
  • Welcome dashboard β€” a "Due for Review" pane showing the most overdue patients
  • Audit page β€” a "Due for Review" quick search button that shows all overdue patients in the patient list

The review message (optional) appears in the patient record banner β€” useful for a standard reminder such as "Consider booking a maintenance appointment."

Password tab

Change your own login password. Requires your current password. Minimum 8 characters.

Locations tab

Add and manage practice locations. Each location has a full address, phone and email. The default location table at the bottom lets you set which location each user is based at β€” this pre-selects the location when adding patients and sessions.

Schedule tab

Manage appointment types (name, default duration, colour) and treatment rooms/resources. Changes here affect all practitioners. The colour assigned to an appointment type is used in the diary grid.

Colour Labels tab

Label each of the five audit colours to describe what cohort they currently represent. For example: Green = "Female patients, low back, under 45", Red = "Maintenance patients due review". Labels appear as tooltips on colour dots throughout the system β€” on patient records, the Audit page and Statistics. Clear the label when the audit project is complete.

Locations, Schedule, Colour Labels tabs

Available to High Level and Administrator. Locations manages practice sites. Schedule manages appointment types and treatment rooms. Colour Labels sets the meaning of each audit colour tag.

Value Lists tab

Available to High Level and Administrator. Shows all dropdown lists used across the system with an index at the top. High Level users can add new values to any list. Only Administrators can delete values β€” this prevents one practitioner accidentally removing entries needed by another.

Users tab

Administrator only. Create and manage user accounts, access levels and enabled status. You cannot delete your own account or reduce your own access level.

πŸ”‘ Licence

CrystalSolutions requires a licence key to operate without restrictions. Keys are in the format CS-XXXX-XXXX-XXXX-XXXX and are provided when you purchase the software.

Activating your licence

Go to Setup β†’ Licence (Administrator only). Enter your licence key, name and email address, then click Activate. The licence is stored in the database and applies to the whole installation β€” all users benefit from a single activation.

Without a licence

An unactivated installation works fully but is limited to 10 patient records β€” enough to verify the system works for your practice before committing to purchase. All existing records remain fully accessible and editable β€” the limit only prevents adding new patients beyond 10. A banner appears at the top of every page while in trial mode.

Purchasing a licence

Licences are available at soul-trade.com/software.html β€” Β£85 one-off, no subscription. Once you have your key, go to Setup β†’ Licence and activate it to unlock unlimited use.

Locked tabs in Setup

Non-Administrator users see the Licence tab in Setup as a greyed-out πŸ”’ locked tab. This is expected β€” only Administrators can manage the licence. High Level and Medium Level users can see it exists but cannot access it.

The licence key format

Keys encode the product (CrystalSolutions or PraxisClinic), edition (Standard or Pro) and purchase date. They are cryptographically signed and verified offline β€” no internet connection is required for activation or verification.

Moving to new hardware

Your licence key can be activated on any number of installations you own β€” there is no machine binding. If you move CrystalSolutions to a new server, simply activate the same key in Setup β†’ Licence on the new installation.

πŸ“€ Import / Export

Import/Export is in the main navigation. High Level access or above required.

Export tab

Five CSV export buttons β€” Patients, Sessions, Income, Expenditure and Contacts. Each downloads a UTF-8 CSV file that opens correctly in Excel, Numbers or any spreadsheet. Exports include all fields including clinical data from Pages 2 and 3.

GDPR: Exported files contain personal health data. Store them securely, do not email them unencrypted, and delete them when no longer needed.

Import tab

Import patients from any CSV file β€” FileMaker export, another practice management system, or a spreadsheet. Two steps:

  • Step 1 β€” Upload your CSV file. A preview of the first few rows is shown.
  • Step 2 β€” Map each column to the correct field. Common field names (including FileMaker field names) are auto-detected. Columns you don't need can be skipped.

Rows without a surname are skipped. All other validation errors are reported after the import with a count of imported vs skipped records.

FileMaker users: In FileMaker go to File β†’ Export Records, choose Comma-Separated Values (.csv), and export your patient layout. CrystalSolutions will auto-detect common FileMaker field names in the column mapping step.

Patient Record Export tab

Export a single patient's complete record as a printable document. Select the patient and which sections to include (contact details, clinical, Pages 2 and 3, sessions, letters, attachments). Opens as a clean print-ready page β€” use Print β†’ Save as PDF in your browser to generate a PDF.

The πŸ“€ Export button on every patient record goes directly here. Useful for subject access requests, referrals, or patient handover.

Subject Access Requests: You have 30 days to respond. This export provides the complete patient record. Seek legal advice before withholding any clinical notes from a SAR.
πŸ” Access Levels

The four access levels

LevelTypical userKey permissions
Low Level Receptionist / admin View patients and sessions, add patients, add income receipts, book appointments, view letters and contacts. Cannot add sessions, write letters, add expenditure, access CPD or Setup.
Medium Level Practitioner Everything Low Level can do, plus: add and edit sessions, write letters, add expenditure, log CPD, access Setup (Practice and Password tabs only).
High Level Senior practitioner Everything Medium Level can do, plus: view and edit all practitioners' sessions and records. Setup access including Locations, Schedule, Value Lists (add only β€” cannot delete) and Colour Labels. Import/Export access.
Administrator Practice owner / manager Full access including user management, delete any record, delete value list entries, side-by-side diary view.

Diary access

All access levels can view the schedule and book appointments. Editing another practitioner's existing appointment requires entering that practitioner's password β€” this prevents accidental changes while still allowing reception to manage bookings.

Note: Access levels are enforced on the server β€” simply knowing a URL does not grant access. Attempting to access a restricted page redirects to the patient list with an access denied message.
πŸ§™ Setup Wizard

The Setup Wizard (setup_wizard.php) is included in every CrystalSolutions distribution. It installs the system in your browser in five steps β€” no command line, no manual file editing. The same wizard works identically on Synology NAS, Windows (XAMPP), Mac (MAMP), Raspberry Pi and Linux.

Before running the wizard

  • Copy all CrystalSolutions files to your web server folder (see the relevant installation guide for your platform)
  • Create an empty MySQL / MariaDB database and a database user with full privileges on it β€” do this in phpMyAdmin or via the command line before starting the wizard
  • Leave config.php as-is β€” the wizard will overwrite it with your settings

Running the wizard

Open a browser and go to http://[your-server]/cspractice/setup_wizard.php. The wizard walks through five steps:

  • Step 1 β€” Pre-flight checks β€” confirms PHP version, required extensions, folder permissions and that the sql/ folder is present. Any failed check is shown with a clear explanation.
  • Step 2 β€” Database β€” enter your database host, name, username and password. The wizard tests the connection live and won't proceed if it can't connect.
  • Step 3 β€” Practice details β€” practice name, default therapy type, currency and the base URL (auto-guessed from your server address β€” check it carefully).
  • Step 4 β€” Admin account β€” create your Administrator login: username, display name and password (minimum 8 characters).
  • Step 5 β€” Install β€” shows a summary for review, then runs all database migrations, saves practice settings, creates your admin user and writes config.php. A full installation log is shown.

After installation

When the wizard completes you'll see a Go to CrystalSolutions β†’ button. Click it and log in with the admin account you just created.

Important: Delete setup_wizard.php from your server immediately after installation. Leaving it in place is a security risk β€” anyone who can reach your server URL could run it again.

If config.php can't be written

On some servers (particularly NAS devices with strict folder permissions), the wizard may not be able to write config.php automatically. If you see this error, create config.php manually β€” drag it into the web folder via Finder or File Station. The simple installer (cs_install.php) is often easier on NAS devices as it detects an existing config.php and skips the write step automatically.

A complete config.php requires all constants including APP_ROOT, DB_CHARSET, DATE_DISPLAY, DATE_SHORT, DATE_DB, DEMO_MODE and DEV_MODE β€” a partial file will cause a white page. See the installation guide for the full template.

Re-running the wizard

The wizard is blocked if config.php already contains real database credentials β€” a security measure to prevent accidental reinstallation. To re-run it, replace config.php with the original placeholder version from the distribution zip.

πŸ“¦ Synology NAS Installation Guide

Why a NAS?

Many small practices already have a Synology or QNAP NAS for file storage and backups. These devices run 24/7, consume very little power, and most modern models support PHP and MariaDB β€” making them ideal CrystalSolutions servers. No additional hardware needed.

Requirements

  • DSM 7.x (most Synology NAS devices from 2018 onwards)
  • At least 1GB RAM (2GB recommended)
  • Internet access during package installation

Step 1 β€” Install Web Station

Open Package Center β†’ search for Web Station β†’ Install. Web Station provides Apache/Nginx and PHP support on your NAS.

Step 2 β€” Install and configure PHP 8

In Web Station β†’ Script Language Settings β†’ click your PHP 8.2 user defined profile β†’ Extensions tab. Enable: pdo_mysql, mysqli, gd. These are the key ones needed for CrystalSolutions to run. (pdo, mbstring and fileinfo may not appear in the list β€” that's fine, they are built into Synology's PHP and don't need enabling separately. We couldn't add them and installation worked correctly without them.)

Step 3 β€” Install MariaDB 10

Package Center β†’ search MariaDB 10 β†’ Install. Set a strong root password when prompted β€” write it down. MariaDB is fully MySQL-compatible and works with CrystalSolutions without any changes.

Step 4 β€” Install phpMyAdmin (recommended)

Package Center β†’ search phpMyAdmin β†’ Install. Use this to create the database and user before running the setup wizard.

Step 5 β€” Create the database

Open phpMyAdmin β†’ log in as root β†’ click New in the left panel β†’ name the database crystalsolutions β†’ select utf8mb4_unicode_ci collation β†’ Create. Then create a database user with full privileges on that database.

Step 6 β€” Create a web folder

In File Station, navigate to the web shared folder β†’ create a new folder called cspractice. The full path will be /volume1/web/cspractice.

Step 7 β€” Configure Web Station

Web Station β†’ Web Service Portal β†’ Create β†’ choose your PHP 8 profile β†’ set Document Root to /volume1/web/cspractice. Note the port (usually 80 or 8080).

Step 8 β€” Upload CrystalSolutions files

Use File Station or an FTP client (Fetch, Cyberduck, FileZilla) to copy all CrystalSolutions files into /volume1/web/cspractice.

Step 9 β€” Run the Setup Wizard

From any browser on your network, open http://[nas-ip-address]/cspractice/setup_wizard.php. Follow the five steps. The base URL will typically be http://192.168.x.x/cspractice β€” check your NAS IP address in DSM β†’ Control Panel β†’ Network.

Tip: Assign a static IP to your NAS in your router settings (DHCP reservation by MAC address). This ensures CrystalSolutions is always at the same address on your network.

Step 10 β€” Delete the wizard and log in

Delete setup_wizard.php from File Station. Then open http://[nas-ip]/cspractice and log in with the admin account you created.

File permissions

If file attachments aren't working, the attachments/ folder may need write permissions. In File Station, right-click the attachments folder β†’ Properties β†’ Permissions β†’ ensure the web server user (usually http) has read/write access.

Permissions greyed out? They are being inherited from the parent folder. Fix: File Station β†’ right-click the folder β†’ Properties β†’ Permission β†’ click Advanced Options β†’ select Make inherited permissions explicit β†’ click Save. The checkboxes will now be editable. This applies to both the attachments/ folder and the main cspractice/ folder if the installer cannot write config.php.

Automated backups

Use Hyper Backup (available in Package Center) to schedule nightly backups of the MariaDB database. Back up to a USB drive, another NAS, or a Synology C2 cloud destination. Include the cspractice web folder to back up attachments.

Diagnostic tool

The check_db.php script verifies your database connection, checks all tables are present and reports on PHP extensions and licence status. Upload it to your cspractice/ folder, visit it in a browser, then delete it after use.

Re-installation β€” foreign key errors

If MySQL gives a 1451 error when dropping tables, run the following as a single block in phpMyAdmin SQL tab (select all, paste, click Go):

SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS sessions;
DROP TABLE IF EXISTS appointments;
DROP TABLE IF EXISTS letters;
DROP TABLE IF EXISTS attachments;
DROP TABLE IF EXISTS treatment_plans;
DROP TABLE IF EXISTS treatment_plan_items;
DROP TABLE IF EXISTS cpd_entries;
DROP TABLE IF EXISTS diary_settings;
DROP TABLE IF EXISTS accounts_income;
DROP TABLE IF EXISTS accounts_expenditure;
DROP TABLE IF EXISTS value_lists;
DROP TABLE IF EXISTS processed_txns;
DROP TABLE IF EXISTS contacts;
DROP TABLE IF EXISTS patients;
DROP TABLE IF EXISTS practices;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS settings;
SET FOREIGN_KEY_CHECKS = 1;

Or simpler: phpMyAdmin β†’ Operations tab β†’ Drop database, then recreate it fresh.

QNAP NAS: The process is very similar β€” use Web Server and phpMyAdmin from the QNAP App Center, and MySQL/MariaDB for the database. The setup wizard runs identically once files are in place.
🫐 Raspberry Pi Installation Guide

Why a Raspberry Pi?

A Raspberry Pi 4 or Pi 5 is the ideal practice server for CrystalSolutions:

  • Costs around Β£55–£80 new (Pi 4 2GB or Pi 5 2GB)
  • About the size of a credit card β€” fits behind a monitor, in a drawer, or in a cupboard
  • Completely silent β€” no fan, no noise
  • Uses only 3–5 watts β€” costs pennies per year to run 24/7
  • Runs Linux (Raspberry Pi OS) β€” stable, secure, free
  • Restarts automatically after power cuts

What you need

  • Raspberry Pi 4 or Pi 5 (2GB RAM minimum, 4GB recommended)
  • MicroSD card β€” 16GB minimum, 32GB recommended (Class 10 or better)
  • USB-C power supply (official Pi power supply recommended)
  • A network cable (Ethernet) or WiFi connection to your practice router
  • A keyboard and monitor for initial setup only β€” not needed afterwards
Kit recommendation: The official Raspberry Pi starter kit (Pi 4, case, power supply, MicroSD) costs around Β£80–£90 and includes everything you need. Available from raspberrypi.com, Pimoroni, or The Pi Hut.

Step 1 β€” Install Raspberry Pi OS

On any computer, download the Raspberry Pi Imager from raspberrypi.com/software. Insert your MicroSD card, open the Imager, choose Raspberry Pi OS Lite (64-bit) as the operating system, select your MicroSD card, and click Write.

Before writing, click the βš™ settings icon to:

  • Set a hostname (e.g. cspractice)
  • Enable SSH
  • Set a username and password (remember these)
  • Configure your WiFi if not using Ethernet

Step 2 β€” First boot and connect

Insert the MicroSD into the Pi, connect power and Ethernet, and wait 2 minutes for first boot. From any other computer on the same network, open Terminal (Mac) or Command Prompt (Windows) and type:

ssh pi@cspractice.local

Enter your password when prompted. You are now connected to the Pi.

Step 3 β€” Update and install the stack

Copy and paste these commands one at a time. Wait for each to finish before running the next:

sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2 php php-mysql php-mbstring mysql-server
sudo systemctl enable apache2 mysql
sudo systemctl start apache2 mysql

Step 4 β€” Secure MySQL and create the database

sudo mysql_secure_installation

Answer Yes to all questions and set a root password. Then:

sudo mysql -u root -p
CREATE DATABASE crystalsolutions CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'csuser'@'localhost' IDENTIFIED BY 'choose-a-strong-password';
GRANT ALL PRIVILEGES ON crystalsolutions.* TO 'csuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Step 5 β€” Install CrystalSolutions

sudo mkdir -p /var/www/html/cspractice
sudo chown -R pi:pi /var/www/html/cspractice

Copy the CrystalSolutions files into /var/www/html/cspractice/ using a tool like FileZilla (SFTP, free) or the scp command. Edit config.php with your database credentials.

Step 6 β€” Enable mod_rewrite

sudo a2enmod rewrite
sudo nano /etc/apache2/sites-available/000-default.conf

Find the <Directory /var/www/html> section and change AllowOverride None to AllowOverride All. Save with Ctrl+O, exit with Ctrl+X, then:

sudo systemctl restart apache2

Step 7 β€” Run the Setup Wizard

From any browser on your network, open http://[pi-ip-address]/cspractice/setup_wizard.php and follow the five steps. The wizard creates the database tables, saves your practice settings, creates your admin user and writes config.php automatically. See the Setup Wizard section for full details.

If you prefer to run SQL migrations manually, install Adminer:

sudo wget -O /var/www/html/adminer.php https://www.adminer.org/latest.php

Visit http://[pi-ip]/adminer.php, log in and run the SQL files from the sql/ folder in order.

Step 8 β€” Find your Pi's IP address

hostname -I

This shows your Pi's IP address (e.g. 192.168.1.50). Set it as a static IP in your router settings. CrystalSolutions is then accessible from any device on your network at:

http://192.168.1.50/cspractice

Automated database backups

nano ~/backup-cs.sh

Paste this content:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/home/pi/backups"
mkdir -p "$BACKUP_DIR"
mysqldump -u csuser -p'your-password' crystalsolutions \
  > "$BACKUP_DIR/crystalsolutions-$DATE.sql"
find "$BACKUP_DIR" -name "*.sql" -mtime +30 -delete
chmod +x ~/backup-cs.sh
crontab -e
# Add this line:
0 2 * * * /home/pi/backup-cs.sh

Remote access with Tailscale (optional)

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Install Tailscale on the Pi and on each device that needs remote access. Sign in with the same account. The Pi gets a fixed Tailscale IP accessible from anywhere β€” perfect for home visits or a second site.

Not technical? The installation only needs to be done once. If these steps look daunting, ask a tech-savvy friend, local IT person or student β€” it's a 45-minute job for anyone comfortable with Linux. What to ask for: "I need Apache, PHP and MySQL installed on a Raspberry Pi, with a folder set up as a website."
Total cost estimate (Raspberry Pi intranet setup):
Raspberry Pi 4 starter kit: Β£80–£90 Β· USB drive for backups: Β£10–£15 Β· Software: free
Ongoing: Β£0/month β€” about Β£1–£2/year in electricity
🍎 Mac Installation Guide

Recommended hardware

Any Mac Mini (2018 or later) makes an excellent practice server. The 2023 M2 Mini is ideal β€” fast, silent, uses only 6–12W, and will last many years. For a dedicated server, 8GB RAM and 256GB SSD is sufficient for a small practice.

Used Mac Mini tip: Buy from Back Market, eBay or Apple Refurbished. A 2018 Mac Mini with 8GB RAM costs around Β£200–£280 and will run this system without any difficulty. Avoid the 2014–2017 models β€” spinning disk versions are very slow.

Step 1 β€” Install Homebrew

Homebrew is the macOS package manager. Open Terminal (Applications β†’ Utilities β†’ Terminal) and paste:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Follow the prompts. On Apple Silicon Macs (M1/M2/M3) it installs to /opt/homebrew. On Intel Macs it installs to /usr/local.

Step 2 β€” Install PHP, MySQL and Caddy

brew install php mysql caddy

This installs PHP 8.3, MySQL 8, and Caddy (a modern web server that handles SSL automatically).

Step 3 β€” Start MySQL and set a root password

brew services start mysql
mysql_secure_installation

Follow the prompts to set a root password. Choose Yes to all security questions.

Step 4 β€” Create the database

mysql -u root -p
CREATE DATABASE crystalsolutions CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'csuser'@'localhost' IDENTIFIED BY 'choose-a-strong-password';
GRANT ALL PRIVILEGES ON crystalsolutions.* TO 'csuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Step 5 β€” Install CrystalSolutions

Create the web root folder and copy the CrystalSolutions files into it:

mkdir -p /Users/Shared/www/cspractice
# Copy the CrystalSolutions files into /Users/Shared/www/cspractice/
# Edit config.php with your database credentials

Step 6 β€” Configure Caddy

Create a file called Caddyfile in your home folder:

:80 {
    root * /Users/Shared/www
    php_fastcgi unix//opt/homebrew/var/run/php-fpm.sock
    file_server
    encode gzip
}

Then start Caddy and PHP-FPM:

brew services start php
brew services start caddy

Step 7 β€” Find your local IP address

Go to System Settings β†’ Network β†’ your WiFi connection β†’ Details. Note the IP address (e.g. 192.168.1.50). Set it to be static in your router settings so it never changes.

CrystalSolutions is now accessible from any device on your network at:
http://192.168.1.50/cspractice

Step 8 β€” Run the Setup Wizard

From any browser on your network, open http://[mac-ip-address]/cspractice/setup_wizard.php and follow the five steps. See the Setup Wizard section for full details. Delete the wizard file after installation.

To run SQL migrations manually instead, install Adminer:

curl -o /Users/Shared/www/adminer.php https://www.adminer.org/latest.php

Visit http://[mac-ip]/adminer.php, log in, select the crystalsolutions database, and run each SQL file from the sql/ folder in order.

Step 9 β€” Auto-start on boot

The brew services command already configures PHP, MySQL and Caddy to start automatically when the Mac boots. Make sure the Mac Mini is set to restart automatically after a power failure: System Settings β†’ Energy β†’ Options β†’ Start up automatically after a power failure.

Remote access with Tailscale (optional)

To access the system from outside the practice (home visits, second site, working from home):

  • Download Tailscale from tailscale.com β€” free for personal use
  • Install on the Mac Mini server and on each device that needs remote access
  • Sign in with the same Tailscale account on all devices
  • The Mac Mini gets a fixed Tailscale IP (e.g. 100.64.x.x) β€” use this to access CrystalSolutions from anywhere

Automated database backups

Create a backup script. Open Terminal and create the file:

nano ~/backup-cs.sh

Paste this content:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/Users/Shared/backups"
mkdir -p "$BACKUP_DIR"
/opt/homebrew/bin/mysqldump -u csuser -p'your-password' crystalsolutions \
  > "$BACKUP_DIR/crystalsolutions-$DATE.sql"
# Keep only last 30 days
find "$BACKUP_DIR" -name "*.sql" -mtime +30 -delete

Make it executable and schedule it daily at 2am:

chmod +x ~/backup-cs.sh
crontab -e
# Add this line:
0 2 * * * /Users/your-username/backup-cs.sh

Time Machine will then back up these SQL dump files along with everything else. Test your backup by restoring a dump file to a test database.

Total cost estimate (Mac Mini intranet setup):
Used 2018 Mac Mini: Β£200–£280 Β· External backup drive: Β£40–£60 Β· Software: free
Ongoing: Β£0/month (no hosting fees, no subscription)

Just testing? Use MAMP instead

If you want to try CrystalSolutions on your Mac before committing to a full installation, MAMP is much simpler β€” no Terminal, no Homebrew, no configuration files.

  1. Download MAMP (free version) from mamp.info β†’ install and open
  2. Click Start β€” Apache and MySQL indicators turn green
  3. Copy all CrystalSolutions files to /Applications/MAMP/htdocs/cspractice/
  4. Open phpMyAdmin at http://localhost:8888/phpmyadmin β†’ create database crystalsolutions with collation utf8mb4_unicode_ci
  5. Visit http://localhost:8888/cspractice/cs_install.php β€” use localhost as host, root as username, root as password (MAMP default)
  6. Delete cs_install.php after installation
MAMP tip: Default port is 8888. To use port 80 (cleaner URLs): MAMP β†’ Preferences β†’ Ports β†’ set Apache to 80. Then use http://localhost/cspractice/ instead.

MAMP is ideal for testing and development. For a permanent practice server, use the Homebrew/Caddy setup above β€” it runs as a proper background service and starts automatically on boot.

Not technical? The installation only needs to be done once. If the steps above look daunting, ask a tech-savvy friend, a local IT person, or a student β€” it's a straightforward 30–45 minute job for anyone comfortable with computers. Once it's running, day-to-day use requires no technical knowledge at all. What to ask for: "I need PHP, MySQL and a web server installed on this Mac, and a local folder set up as a website."
πŸͺŸ Windows Installation Guide

Recommended hardware

Any Windows PC or laptop with Windows 10 or 11 will work. For a dedicated practice server, a used mini-PC (Beelink, Intel NUC, or similar) is ideal β€” compact, quiet and power-efficient. Budget Β£100–£200 for a used unit with 8GB RAM and an SSD.

Windows tip: A used Dell OptiPlex or HP EliteDesk small form factor PC makes an excellent practice server. Available on eBay for Β£80–£150 with Windows 10 Pro, i5 processor and SSD. Runs silently and uses very little power.

Option A β€” XAMPP (easiest, recommended for beginners)

XAMPP bundles Apache, PHP and MySQL into a single installer with a graphical control panel. It's the quickest way to get running.

1. Download and install XAMPP

Download from apachefriends.org β€” choose the PHP 8.3 version. Run the installer, accepting defaults. Install to C:\xampp.

2. Start Apache and MySQL

Open the XAMPP Control Panel (Start Menu β†’ XAMPP Control Panel). Click Start next to Apache and MySQL. Set both to start automatically by clicking the checkbox on the left.

3. Create the database

Open a browser and go to http://localhost/phpmyadmin. Click New in the left panel, name the database crystalsolutions, set collation to utf8mb4_unicode_ci, and click Create.

Then go to User Accounts β†’ Add user account. Create a user csuser with host localhost, set a strong password, and tick Grant all privileges on crystalsolutions.

4. Install CrystalSolutions

Copy the CrystalSolutions files into C:\xampp\htdocs\cspractice\. Leave config.php as-is β€” the Setup Wizard will configure it.

5. Run the Setup Wizard

Open a browser and go to http://localhost/cspractice/setup_wizard.php. Follow the five steps β€” the wizard creates all database tables, saves your practice settings, creates your admin user and writes config.php. See the Setup Wizard section for full details. Delete the wizard file after installation.

To run SQL migrations manually instead: in phpMyAdmin, select the crystalsolutions database β†’ SQL tab β†’ run each file from the sql/ folder in order.

6. Access from other devices

Find your local IP: open Command Prompt (Win+R β†’ cmd) and type ipconfig. Note the IPv4 address (e.g. 192.168.1.60). Set it as a static IP in your router.

Windows Firewall may block access from other devices. Go to Windows Defender Firewall β†’ Allow an app β†’ allow Apache HTTP Server for private networks.

CrystalSolutions is then accessible at: http://192.168.1.60/cspractice

Option B β€” Laragon (more powerful, cleaner)

Laragon (laragon.dev) is a modern alternative to XAMPP β€” faster, cleaner, and easier to manage multiple PHP versions. Download the full version, install it, and follow the same steps as XAMPP above. The web root is C:\laragon\www\.

Enabling mod_rewrite (Apache)

CrystalSolutions uses .htaccess for URL handling. In XAMPP, open C:\xampp\apache\conf\httpd.conf in Notepad, find the line #LoadModule rewrite_module and remove the #. Also find AllowOverride None for the htdocs directory and change it to AllowOverride All. Restart Apache.

Remote access with Tailscale (optional)

Same as Mac β€” download Tailscale from tailscale.com, install on the server PC and on each device that needs remote access, sign in with the same account. The server gets a fixed Tailscale IP accessible from anywhere.

Automated database backups

Create a batch file for daily backups. Open Notepad and save as backup-cs.bat:

@echo off
SET DATE=%date:~10,4%-%date:~4,2%-%date:~7,2%
SET BACKUP=C:\backups\crystalsolutions-%DATE%.sql
IF NOT EXIST C:\backups mkdir C:\backups
"C:\xampp\mysql\bin\mysqldump.exe" -u csuser -pyour-password crystalsolutions > %BACKUP%

Schedule it: open Task Scheduler (Start β†’ Task Scheduler), create a Basic Task, set it to run daily at 2:00 AM, and point it to your batch file. Copy the backup folder to an external drive or cloud storage regularly.

Windows-specific security notes

  • Set a Windows login password on the server PC β€” do not use auto-login
  • Enable Windows Update and keep it current
  • Change the MySQL root password from the default (XAMPP ships with a blank root password β€” fix this immediately in phpMyAdmin β†’ User Accounts)
  • Consider enabling BitLocker drive encryption (available on Windows 10/11 Pro) to protect patient data if the machine is stolen

Useful free tools for Windows

  • HeidiSQL β€” excellent MySQL GUI for Windows, easier than phpMyAdmin for some tasks
  • Notepad++ β€” for editing config.php and other files
  • WinSCP β€” if you ever need to transfer files to a remote server
  • Tailscale β€” secure remote access without port forwarding
Total cost estimate (Windows mini-PC intranet setup):
Used Dell OptiPlex / HP EliteDesk: Β£80–£150 Β· External backup drive: Β£40–£60 Β· Software: free
Ongoing: Β£0/month (no hosting fees, no subscription)

Just testing? Use MAMP instead

If you want to try CrystalSolutions on your Mac before committing to a full installation, MAMP is much simpler β€” no Terminal, no Homebrew, no configuration files.

  1. Download MAMP (free version) from mamp.info β†’ install and open
  2. Click Start β€” Apache and MySQL indicators turn green
  3. Copy all CrystalSolutions files to /Applications/MAMP/htdocs/cspractice/
  4. Open phpMyAdmin at http://localhost:8888/phpmyadmin β†’ create database crystalsolutions with collation utf8mb4_unicode_ci
  5. Visit http://localhost:8888/cspractice/cs_install.php β€” use localhost as host, root as username, root as password (MAMP default)
  6. Delete cs_install.php after installation
MAMP tip: Default port is 8888. To use port 80 (cleaner URLs): MAMP β†’ Preferences β†’ Ports β†’ set Apache to 80. Then use http://localhost/cspractice/ instead.

MAMP is ideal for testing and development. For a permanent practice server, use the Homebrew/Caddy setup above β€” it runs as a proper background service and starts automatically on boot.

Not technical? The installation only needs to be done once. If the steps above look daunting, ask a tech-savvy friend, a local IT person, or a student β€” it's a straightforward 30–45 minute job for anyone comfortable with Windows. Once it's running, day-to-day use requires no technical knowledge at all. What to ask for: "I need XAMPP installed on this PC and a local folder set up as a website running PHP and MySQL."
🩺 Clinical Reference

Condition value list

The primary condition dropdown covers the most common presenting complaints seen in musculoskeletal and naturopathic practice:

Head Β· Neck Β· Shoulder Β· Thoracic Ribs Β· Low Back Β· Knee Β· Stress Β· Naturopathic Β· General Β· O-A Β· Hip Β· Bowels Β· IHD Β· DVT Β· >BP Β· CD Junction Β· Skin Β· Anxious Β· Diabetes Β· Tiredness Β· Migraine Β· Baby Can't Sleep - Colic Β· Lupus Β· Peripheral Vascular Disease Β· Dizziness Β· Ankle/Feet Β· ME Β· PID Β· Reduced Sight Β· Thyroid Β· Coccyx Β· TMJ Β· Sinus Β· Elbow Β· Wrist/Hand Β· Bell's Palsy Β· Gen Cranial

Custom conditions not in this list can be noted in the yellow notes field or session treatment notes.

Structural orthopaedic tests

TestWhat it indicates
FP (Foraminal Pressure)Cervical nerve root compression
SLR (Straight Leg Raise)Lumbar nerve root irritation β€” record degrees L and R
ADAMSScoliosis screen β€” forward bend test
KEMPSLumbar facet joint involvement
+VE PercussionBony tenderness suggesting fracture or infection
Compression / DistractionDisc vs facet differentiation in cervical spine
Tinnels TapCarpal tunnel / peripheral nerve entrapment
ValsalvaSpace-occupying lesion β€” pain on increased intrathecal pressure

Red flag conditions

The following should prompt consideration of urgent referral and use of the red flag field on the patient record:

  • +VE percussion suggesting fracture
  • Aortic pulse prominence (possible aneurysm)
  • Unexplained weight loss with back pain
  • Bilateral neurological symptoms
  • Saddle anaesthesia (cauda equina)
  • Copper wiring or signs of hypertensive retinopathy
  • Ca (cancer) smell
  • Jaundice / hepatomegaly
  • Pear drops breath (diabetic ketoacidosis)
Important: This system is an administrative and audit tool. Clinical decisions remain entirely the responsibility of the treating practitioner. The examination findings and red flag indicators are prompts, not diagnostic tools.

Treatment value list

Structural Β· Cranial Β· Nutritional Β· Herbal Β· Homeopathic Β· Visceral Β· Acupuncture Β· GOT Β· AK Β· Meridian Β· Mobilise

πŸš— Mileage Log

Recording journeys

Go to Mileage in the nav. Log each practice journey with date, from/to locations, purpose, vehicle type, miles and an optional link to a patient or practice location.

HMRC mileage rates

The system automatically applies the current HMRC rates: 45p/mile for the first 10,000 miles per tax year, 25p/mile thereafter. Motorcycle: 24p/mile. Bicycle: 20p/mile.

Tax year totals

Use the tax year selector to view any previous year. The total mileage claim feeds into the Self Assessment summary.

CSV export

Download a CSV of all journeys in the selected tax year for your accountant.

πŸ“Š Self Assessment Summary

Overview

Go to Tax in the nav (or Accounts β†’ Tax Summary). Shows income, expenditure, mileage claim and net profit for any tax year.

MTD quarterly breakdown

The πŸ“Š MTD Quarterly Summary table shows Q1–Q4 with income, expenditure, net profit and the MTD submission due date for each quarter (7 Aug, 7 Nov, 7 Feb, 7 May).

MTD thresholds

Making Tax Digital for Income Tax is mandatory from April 2026 for income over Β£50,000 (Β£30,000 from April 2027). The summary shows a warning if your income exceeds the threshold.

CSV export

Download a Self Assessment CSV for your accountant. Always verify figures with a qualified accountant before submitting your return.

πŸ’Ύ Backup

Database backup

Go to Backup in the nav. Click Download SQL backup to download a complete SQL dump of your database. Restore via phpMyAdmin β†’ Import.

Full backup

Click Download full backup for a zip containing the database, all application files and uploaded patient attachments. Use for migration or complete server restore.

Recommended schedule

Database backup weekly or after significant data entry. Full backup monthly or before any server changes or upgrades.

Storage

Store backups off this server β€” external drive or encrypted cloud storage. If field encryption is enabled, keep your ENCRYPTION_KEY from config.php alongside the backup. UK health records should be retained for 8 years.

πŸ”’ Security & Encryption

Field-level encryption

Go to Setup β†’ Security. CrystalSolutions can encrypt sensitive patient fields β€” email, phone, address, notes and case history β€” using AES-256. When enabled, a stolen database dump shows only unreadable ciphertext.

Enabling encryption

  1. Read the warnings in Setup β†’ Security carefully
  2. Click Enable encryption
  3. Back up config.php immediately β€” the key is stored there
  4. Click Encrypt existing records
⚠ Without the ENCRYPTION_KEY from config.php, encrypted data cannot be recovered by anyone. Back it up before encrypting.

Disabling encryption β€” two steps required

  1. Click Decrypt all records β€” converts encrypted DB values back to plain text
  2. Click Disable encryption β€” updates config.php to turn off encryption for new saves

Both steps are needed. Doing only one leaves data inconsistent β€” either records show as ENC:... gibberish, or new saves are re-encrypted while old ones are plain text.

Encryption and Audit search

When encryption is enabled, address fields (address, town, county, postcode) are stored as ciphertext and cannot be searched in the Audit text search. To search by address, decrypt all records first, then re-encrypt when done. Name, condition, notes and treatment fields are not encrypted and remain searchable at all times.

What is and isn't encrypted

Encrypted: email, phone, mobile, address, notes, case history. Not encrypted: patient name and date of birth (needed for search, display and age calculations). For most practices this is proportionate protection.

Shared hosting checklist

For full GDPR-compliant protection on shared hosting: enable HTTPS, set config.php permissions to 644, add Options -Indexes to your attachments/ folder, and create a restricted MySQL user (SELECT/INSERT/UPDATE/DELETE only). See Setup β†’ Security for full details.

Connecting to HMRC (MTD Add-on)

If you have a serial number for the MTD module, you can submit quarterly figures directly to HMRC from within CrystalSolutions.

Setup

  1. Go to Setup → MTD / HMRC
  2. Enter your National Insurance Number (NINO) and click Save NINO
  3. Click Connect to HMRC -- you will be redirected to HMRC to log in
  4. After logging in, HMRC will redirect you back and your connection status will show Connected
  5. Your HMRC Business ID will be retrieved automatically

Submitting quarterly figures

  1. Go to Setup → MTD / HMRC → Submit quarterly figures
  2. Select the Tax year and Quarter
  3. Click Load figures -- income and expenses are pulled automatically from your accounts
  4. Check the figures then click Submit figures to HMRC
  5. A confirmation with HMRC submission ID will appear and the submission is logged

Notes

The MTD "direct to HMRC" module is optional -- you can connect from Setup / MTD, otherwise you have the quarterlies as a reference to submit yourself via your HMRC account. All income and expenditure in CrystalSolutions feeds automatically into the quarterly figures -- nothing to manually enter.
Each self-employed person is responsible for their own MTD submission. If multiple practitioners share this installation, ensure only your own income is recorded here, or that you understand whose figures are being submitted.

Making Tax Digital for Income Tax is mandatory from April 2026 for practitioners with income over £50,000, and from April 2027 for income over £30,000.