Holley Hudson

MSc Software Engineering (Distinction, 2025) · Sports Therapist

Experience

Holley Hudson Sports Therapist

Biomechanics Specialist / Owner
Duration: 16 years · UK
  • Delivery of client-facing educational content using visual learning tools and simplified models to enhance patient comprehension.
  • Design and maintains secure client databases with full GDPR compliance. Responsible for developing and implementing SOPs for data handling, digital workflows, and security aware client documentation.
  • Conduct biomechanical root cause analysis using structured logic trees to isolate pain patterns.
  • Document case findings in structured reports, enabling reproducibility and long-term data tracking. Used this process to iterate improvements in care strategy using low-tech digital systems.
  • Implement and support various digital tools for custom rehab templates and scheduling.
  • Translate complex musculoskeletal data into action-oriented outputs.

Ocean Marine Research Ltd.

Company Director / Secretary
Duration: 8 years
  • Oversaw documentation, filings, and information governance.
  • Coordinated stakeholders and streamlined office workflows.
  • Produced concise reports and maintained accurate records.

Education

MSc Software Engineering — Wrexham University

Award: Distinction · Year: 2025

BSc in Kinesiology

Year: —

Google Cybersecurity Professional Certificate — Coursera

Status: Completed

Foundations of Software Testing and Validation — University of Leeds (Coursera)

Status: In progress
================================= QUICK‑START CHECKLIST (cPanel) ================================= 1) cPanel → MySQL® Databases → create DB and user → grant ALL privileges. 2) cPanel → phpMyAdmin → run the SQL in `sql/schema.sql`. 3) cPanel → File Manager → create folder `/api/` under `public_html/`. 4) Upload `api/*.php` into `/public_html/api/` and `public/index.html` into `/public_html/`. 5) Edit `/public_html/api/config.php` with your DB name, user, pass. 6) Test API health: open `https://YOURDOMAIN/api/health.php`. - If it says OK, the backend is ready. 7) Visit your site home. Create a client. Use the generated **Client UID** when adding sessions. FAQ: - “Analyze + Save” won’t save without step 1–6. Analysis will still render on page. - **Client UID** = pseudonymous auto ID used to link sessions (not the real name). ============================== FILE: sql/schema.sql ============================== -- Create database first in cPanel, then run this in phpMyAdmin CREATE TABLE clients ( id INT AUTO_INCREMENT PRIMARY KEY, client_uid VARCHAR(20) NOT NULL UNIQUE, name_protected VARCHAR(255) NOT NULL, dob DATE NULL, age TINYINT NULL, address VARCHAR(255) NULL, phone VARCHAR(40) NULL, medications TEXT NULL, -- unified medical history JSON to hold timelines per topic history_json JSON NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE consents ( id INT AUTO_INCREMENT PRIMARY KEY, client_id INT NOT NULL, consent_text TEXT NOT NULL, consent_ack BOOLEAN DEFAULT 0, consent_method ENUM('link','paper','verbal') DEFAULT 'link', consent_at DATETIME NULL, retention_years TINYINT DEFAULT 7, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE sessions ( id INT AUTO_INCREMENT PRIMARY KEY, client_id INT NOT NULL, session_date DATE NOT NULL, issue_subject VARCHAR(160) NOT NULL, issue_description VARCHAR(200) NOT NULL, pain_locations JSON NOT NULL, acuity ENUM('acute','chronic') NOT NULL, duration_value INT NULL, duration_unit ENUM('days','weeks','months') NULL, rom_analysis VARCHAR(100) NULL, treatment_notes TEXT NULL, analysis_json JSON NULL, rehab_plan_json JSON NULL, emailed_to_client BOOLEAN DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE INDEX idx_clients_uid ON clients(client_uid); CREATE INDEX idx_sessions_client ON sessions(client_id, session_date); ============================== FILE: api/config.php ============================== MySQL® Databases -> Create DB/User $DB_HOST = 'localhost'; $DB_NAME = 'YOUR_DB_NAME'; $DB_USER = 'YOUR_DB_USER'; $DB_PASS = 'YOUR_DB_PASS'; $pdo = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME;charset=utf8mb4", $DB_USER, $DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); header('Content-Type: application/json'); ?> ============================== FILE: api/util.php ============================== true,'data'=>$data]); exit; } function bad($msg, $code=400){ http_response_code($code); echo json_encode(['ok'=>false,'error'=>$msg]); exit; } ?> ============================== FILE: api/health.php ============================== query('SELECT 1'); echo "OK"; } catch(Exception $e){ http_response_code(500); echo "DB ERROR: ".$e->getMessage(); } ?> ============================== FILE: api/create_client.php ============================== prepare('INSERT INTO clients (client_uid, name_protected, dob, age, address, phone, medications, history_json) VALUES (?,?,?,?,?,?,?,?)'); $stmt->execute([ $client_uid, $in['name_protected'], $in['dob'] ?? null, $in['age'] ?? null, $in['address'] ?? null, $in['phone'] ?? null, $in['medications'] ?? null, isset($in['history_json']) ? json_encode($in['history_json']) : null ]); $id = $pdo->lastInsertId(); // default consent row with GDPR wording placeholder, 7y adults, 12y children $consent = $pdo->prepare('INSERT INTO consents (client_id, consent_text, retention_years) VALUES (?,?,?)'); $consent->execute([$id, $in['consent_text'] ?? 'GDPR + medical disclaimer pending acknowledgement', ($in['is_child']??false)?12:7]); ok(['client_id'=>$id,'client_uid'=>$client_uid]); ?> ============================== FILE: api/get_client.php ============================== prepare('SELECT * FROM clients WHERE client_uid=?'); $stmt->execute([$uid]); $client = $stmt->fetch(); if(!$client) bad('not found',404); $cons = $pdo->prepare('SELECT * FROM consents WHERE client_id=? ORDER BY id DESC LIMIT 1'); $cons->execute([$client['id']]); $client['consent'] = $cons->fetch(); ok($client); ?> ============================== FILE: api/create_session.php ============================== prepare('SELECT id FROM clients WHERE client_uid=?'); $stmt->execute([$in['client_uid']]); $c = $stmt->fetch(); if(!$c) bad('client not found',404); $ins = $pdo->prepare('INSERT INTO sessions (client_id, session_date, issue_subject, issue_description, pain_locations, acuity, duration_value, duration_unit, rom_analysis, treatment_notes, analysis_json, rehab_plan_json) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)'); $ins->execute([ $c['id'], $in['session_date'], substr($in['issue_subject'],0,160), substr($in['issue_description'],0,200), json_encode($in['pain_locations']), $in['acuity'], $in['duration_value'] ?? null, $in['duration_unit'] ?? null, substr($in['rom_analysis'] ?? '',0,100), $in['treatment_notes'] ?? null, isset($in['analysis_json'])? json_encode($in['analysis_json']): null, isset($in['rehab_plan_json'])? json_encode($in['rehab_plan_json']): null ]); ok(['session_id'=>$pdo->lastInsertId()]); ?> ============================== FILE: api/list_sessions.php ============================== prepare('SELECT id FROM clients WHERE client_uid=?'); $stmt->execute([$uid]); $c = $stmt->fetch(); if(!$c) bad('client not found',404); $s = $pdo->prepare('SELECT * FROM sessions WHERE client_id=? ORDER BY session_date DESC, id DESC'); $s->execute([$c['id']]); ok($s->fetchAll()); ?> ============================== FILE: api/ack_consent.php ============================== prepare('SELECT id FROM clients WHERE client_uid=?'); $stmt->execute([$uid]); $c = $stmt->fetch(); if(!$c) bad('client not found',404); $upd = $pdo->prepare('UPDATE consents SET consent_ack=1, consent_method="link", consent_at=NOW() WHERE client_id=? ORDER BY id DESC LIMIT 1'); $upd->execute([$c['id']]); echo "

Thank you. Consent acknowledged.

You may close this page.

"; ?> ============================== FILE: public/index.html ============================== Sports Therapy App

🪞🧸🌀🔑 Sports Therapy Evidence‑Reflector

Create / Find Client

Medical history (timeline by topic)

Enter notes under each topic. Use sections: within 1y / 2–5y / 6–10+y

Consent link

Send this link to client by SMS. When they tap it, consent is recorded.

New Treatment Session

Analysis & Rehab

Biomechanical analysis


      

Rehab plan


      

Send to client

Quick method: opens email draft. For SMS, copy text.

      

Session history