This system may be tested with dummy records on any internet-accessible server β as demonstrated at soul-trade.com/cspractice. However, once you begin entering real patient data, the system must be moved to a secure, private environment.
| Component | Minimum | Recommended |
|---|---|---|
| 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 |
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.
Patient health data is special category data under UK GDPR (Article 9). As a data controller you are required to:
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.
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.
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.
Open the patient record, click the Attachments tab, and use the upload form. You can:
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 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.
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.
cs_attachments folder β it is outside the web root and may not be
included in standard web backups automatically.
All logged-in users can view attachments. Only Medium Level and above can upload or delete files.
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.
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:
Click + Add criterion to add more rows. All criteria are combined with AND β every condition must be met. Click Search to run.
| Group | Fields |
|---|---|
| Demographics | Sex, Age range, Postcode, Employment type |
| Condition | Primary condition, Secondary conditions, Therapy type, State (acute/chronic), New condition, Maintenance, Nerve radiation |
| History | PMH/Cranial, Accident/RTA, Condition duration |
| Examination | Exam findings, Better, Worse, Smoker, Improvement %, SLR left, SLR right |
| Clinical (P3) | Diagnosis, Prognosis, Treatment history, Medicine history, Movement/Emotion, Five Element |
| Sessions | Session treatment, Session condition |
| Practice | Practice location, Referral source, Practitioner |
| Dates | Last seen range, First contact range, Date of birth range |
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.
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.
SoftTissue not
Soft Tissue. This is already enforced in the treatment value list.
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.
The Statistics page is accessed from the main navigation. It has three tabs β Practice Dashboard, Clinical, and Cohort β filtered by year and practitioner.
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:
Deeper clinical analysis for the selected year:
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:
This is the research view β tag a cohort on the Audit page, then come here to see the statistical breakdown of that specific group.
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.
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.
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.
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.
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).
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.
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.
The page is divided into four quadrants:
Five separate dropdown lists each feed the same central medicine history text box:
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.
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.
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.
Excellent / Good / Fair / Guarded / Poor / Refer β append and annotate as the clinical picture evolves.
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.
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.
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.
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.
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.
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.
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.
| Group | Example findings |
|---|---|
| General | Verrucae, Diabetes, Flat foot, Orthotics, Gait |
| Forefoot | Bunions, Morton's neuroma, Metatarsalgia, Hallux Rigidus |
| Toe | Hammer toe, Ingrown toenails, Dorsal corns |
| Ankle | Achilles tendonitis, Ankle sprain, Peroneal tendon injury |
| Midfoot | Plantar fasciitis, Lisfranc's injury, Cuboid compression |
| Hindfoot | Haglund's deformity, Tarsal tunnel syndrome, Heel spur |
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.
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.
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.
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.
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.
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.
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.
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.
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.
Before adding patients, configure the system in Setup:
Go to Setup β Password. You'll need to enter your current password before setting a new one. Minimum 8 characters.
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.
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.
The coloured strip at the top of every patient record shows the key clinical facts at a glance:
| Type | Appearance | Purpose |
|---|---|---|
| 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 dots in the patient top strip are a temporary grouping tool for audit work, not a permanent clinical indicator. For example:
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.
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.
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.
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.
Examination findings work on a two-tier system:
| Tab | What it covers |
|---|---|
| π§ Neurological | Cranial nerves IβXII individually, Valsalva, reflexes |
| 𦴠Structural / Orthopaedic | FP, SLR, ADAMS, KEMPS, percussion, compression, distraction, ROM restrictions, Tinnels, sacroiliac |
| π« Abdominal | Tenderness, guarding, quadrant locations, hernia, aortic pulse, organ enlargement |
| π Bowels / Tongue | Bowel habit, IBS, colitis, blood/fatty stools, tongue appearance |
| π Eyes / Skin | BP signs, pupils, skin conditions, jaundice, cyanosis |
| π« CV / Respiratory | SOB, pulse quality, oedema, breath sounds, cough type |
| π Smell / Hearing | Characteristic smells, halitosis, hearing changes, tinnitus |
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.
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.
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.
Click any empty time slot or the + New Appointment button. The booking form lets you set:
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.
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.
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.
Click β Diary Settings to configure your personal diary preferences:
Each practitioner has their own diary settings. Administrators can set settings for any user.
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.
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.
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.
Cash, Cheque, Debit Card, Credit Card, BACS, Insurance, Trade, Unpaid, Gratis.
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.
Templates use {{double curly braces}} for merge fields. Available variables:
| Variable | Fills 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 |
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.
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.
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.
Each practitioner sees only their own CPD log. Administrators can switch between practitioners using the dropdown at the top of the CPD page.
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.
GP, Specialist, Physiotherapist, Osteopath, Chiropractor, Acupuncturist, Herbalist, Homeopath, Naturopath, Counsellor, Podiatrist, Reflexologist, Aromatherapist, Insurer, Solicitor, Associate, Staff, Reception, Other.
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.
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.
Sets the practice name, address, default practitioner, therapy type, currency symbol, tax rate, date format, review period and the practice-wide noticeboard (global notes). Also controls hover tips and the welcome screen.
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:
The review message (optional) appears in the patient record banner β useful for a standard reminder such as "Consider booking a maintenance appointment."
Change your own login password. Requires your current password. Minimum 8 characters.
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.
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.
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.
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.
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.
Administrator only. Create and manage user accounts, access levels and enabled status. You cannot delete your own account or reduce your own access level.
Import/Export is in the main navigation. High Level access or above required.
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.
Import patients from any CSV file β FileMaker export, another practice management system, or a spreadsheet. Two steps:
Rows without a surname are skipped. All other validation errors are reported after the import with a count of imported vs skipped records.
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.
| Level | Typical user | Key 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. |
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.
A Raspberry Pi 4 or Pi 5 is the ideal practice server for CrystalSolutions:
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:
cspractice)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.
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
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;
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.
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
Install Adminer for database management:
sudo wget -O /var/www/html/adminer.php https://www.adminer.org/latest.php
Visit http://cspractice.local/adminer.php from any device on your
network, log in and run the SQL files from the sql/ folder in order.
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
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
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.
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.
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.
brew install php mysql caddy
This installs PHP 8.3, MySQL 8, and Caddy (a modern web server that handles SSL automatically).
brew services start mysql mysql_secure_installation
Follow the prompts to set a root password. Choose Yes to all security questions.
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;
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
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
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
Install Adminer (a single-file database admin tool) for running the SQL files:
curl -o /Users/Shared/www/adminer.php https://www.adminer.org/latest.php
Visit http://192.168.1.50/adminer.php, log in with your database credentials, select the crystalsolutions database, and run each SQL file from the sql/ folder in order (01 through 09).
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.
To access the system from outside the practice (home visits, second site, working from home):
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.
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.
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\. Edit config.php with your database credentials.
5. Run the SQL migrations
In phpMyAdmin, select the crystalsolutions database, click the SQL tab, and run each file from the sql/ folder in order (01 through 09).
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
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\.
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.
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.
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.
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.
Open Package Center β search for Web Station β Install. Web Station provides Apache/Nginx and PHP support on your NAS.
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.)
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.
Package Center β search phpMyAdmin β Install. Use this to create the database and user before running the setup wizard.
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.
In File Station, navigate to the web shared folder β create a new folder called cspractice. The full path will be /volume1/web/cspractice.
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).
Use File Station or an FTP client (Fetch, Cyberduck, FileZilla) to copy all CrystalSolutions files into /volume1/web/cspractice.
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.
Delete setup_wizard.php from File Station. Then open http://[nas-ip]/cspractice and log in with the admin account you created.
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.
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.
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.
config.php as-is β the wizard will overwrite it with your settingsOpen a browser and go to http://[your-server]/cspractice/setup_wizard.php. The wizard walks through five steps:
config.php. A full installation log is shown.When the wizard completes you'll see a Go to CrystalSolutions β button. Click it and log in with the admin account you just created.
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.
On some servers (particularly NAS devices with strict folder permissions), the wizard may not be able to write config.php automatically. In that case, the wizard shows the values you need to paste in manually and completes all other installation steps normally. Edit config.php in a text editor and replace the placeholder values with those shown.
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.
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.
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.
An unactivated installation works fully but is limited to 50 patient records. All existing records remain fully accessible and editable β the limit only prevents adding new patients beyond 50. A yellow banner appears at the top of every page prompting activation. This is intentional β patient data is never locked or hidden, as that would be unacceptable in a clinical setting.
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.
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.
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.
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.
The logged-in dashboard shows up to six collapsible panes β each only appears if there is data to show:
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.
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.
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.
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.
| Test | What it indicates |
|---|---|
| FP (Foraminal Pressure) | Cervical nerve root compression |
| SLR (Straight Leg Raise) | Lumbar nerve root irritation β record degrees L and R |
| ADAMS | Scoliosis screen β forward bend test |
| KEMPS | Lumbar facet joint involvement |
| +VE Percussion | Bony tenderness suggesting fracture or infection |
| Compression / Distraction | Disc vs facet differentiation in cervical spine |
| Tinnels Tap | Carpal tunnel / peripheral nerve entrapment |
| Valsalva | Space-occupying lesion β pain on increased intrathecal pressure |
The following should prompt consideration of urgent referral and use of the red flag field on the patient record:
Structural Β· Cranial Β· Nutritional Β· Herbal Β· Homeopathic Β· Visceral Β· Acupuncture Β· GOT Β· AK Β· Meridian Β· Mobilise
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.
Each imaging record captures:
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.
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.