All projects

Case study · An educational coaching marketplace, re-engineered solo

EduCoach

A full-stack marketplace connecting learners with tutors and coaches — search, messaging, session booking, verified reviews and an admin panel. Originally a CS4116 group project; later re-engineered solo into a modern, secure, containerised application and redeployed end-to-end on a fully free cloud stack.

PHP 8.2 MySQL / TiDB Cloud Bootstrap 5.3 Docker Apache Render
EduCoach

01

The problem

A two-sided educational marketplace that began as a CS4116 group build at UL. By the time I came back to it, the original InfinityFree host had been decommissioned, credentials were hardcoded across ~70 PHP pages, the admin login had a plaintext backdoor, and the UI hadn't aged well. The job: bring it back online — secure, modern, and fully free to run.

02

The approach

Re-architected the ~20,000-line PHP codebase around a single environment-driven config + PDO layer. Hardened security top-to-bottom (bcrypt, prepared statements, CSRF, secure session cookies, response headers, backdoor removed). Refreshed the UI with a Bootstrap 5.3 design system. Containerised the app (PHP 8.2 + Apache) and stood up a one-command `docker compose` dev stack. Deployed continuously from GitHub to Render with a TiDB Cloud Serverless MySQL-compatible database over TLS — zero-dollar production stack.

03

My contribution

Backend and system-architecture contributor on the original CS4116 team. Sole engineer for the modernisation and re-deployment — configuration, security, UI overhaul, Dockerisation, database migration, and production hosting.

04

What I learned

The first iteration was about getting it to work; the rebuild was about getting it to last. Splitting environment from code, removing every hardcoded credential, and treating security headers as default — not optional — is what turned a coursework artefact into a system I'd actually deploy. Also: free production infra exists, you just have to know where to look.


A full-stack web marketplace connecting learners with expert tutors and coaches across maths, languages, sciences, music and coding — with search, direct messaging, session booking, verified reviews and admin moderation.

EduCoach is a two-sided educational marketplace. Learners discover coaches by subject, price and rating, message them directly, and book sessions. Coaches publish profiles with tiered service packages, manage availability, and build a reputation through verified reviews. A dedicated admin role handles users, moderation and platform oversight.

The project began as a CS4116 team build at the University of Limerick. I later returned to it solo and fully re-engineered it — modernising the codebase, hardening security, containerising it, and bringing it back online end-to-end on a zero-cost cloud stack after its original host had been decommissioned.

Live demo note: the first load may take ~30s while the free-tier Render service wakes up.

Key features

  • Role-based accounts — learners, coaches and admins, with secure auth and per-role profiles.
  • Tiered service listings — coaches publish Basic / Standard / Premium packages with custom pricing.
  • Inquiry → session flow — learners send inquiries that convert into scheduled, tracked sessions.
  • Verified reviews — only learners who completed a session can leave a review; coaches can respond.
  • Search & filtering — by keyword, category, skill, price range and rating, with relevance scoring.
  • Messaging — direct learner ↔ coach messaging, plus a privacy-respecting “customer insights” system that lets prospects hear from verified past clients.
  • Notifications — in-app notifications with a live unread badge.
  • Admin panel — user management, content + review moderation, and banned-word filtering.

Engineering highlights

  • Re-engineered a ~20,000-line, ~70-page PHP application around a clean, environment-driven configuration layer — eliminating hardcoded credentials and duplicated database logic in favour of a single PDO connection that runs unchanged across local, Docker and cloud environments.
  • Security hardening — bcrypt password hashing, prepared statements throughout, CSRF-protected authentication, secure session cookies (HttpOnly / SameSite / Secure), security response headers, and removal of a legacy plaintext admin backdoor.
  • 22-table relational schema covering users, coaches, skills, availability, service tiers, inquiries, sessions, reviews, messaging and moderation — full foreign-key integrity.
  • Custom Bootstrap 5.3 design system — design tokens, typography, reusable components — refreshed the entire site from a single shared layout.
  • Containerised with Docker (PHP 8.2 + Apache) and a one-command docker compose dev stack: app + MySQL + Adminer, with the schema auto-imported on first run.
  • Deployed for free, end-to-end — continuous deploys from GitHub to Render (Docker web service), backed by a TiDB Cloud Serverless MySQL-compatible database over TLS. Pushes to main auto-deploy.

Outcome

A dated, offline coursework project transformed into a secure, modern, fully functional web application — live, continuously deployed, and running on a completely free production stack.


ESC
  • Home

    The hero & featured

    Page
  • About

    Bio + bento + education journey

    Page
  • Experience

    Timeline of every role

    Page
  • Projects

    Filterable project grid

    Page
  • Certifications

    17 certs in 5 categories

    Page
  • Wine — Sommelier

    33-dish pairing tool

    Page
  • Water — Lifeguard

    Emergency-scenario tool

    Page
  • Language — Interpreter

    Bulgarian phrasebook

    Page
  • Gallery

    Lightbox

    Page
  • Now

    What I'm doing this month

    Page
  • Uses

    Tools & gear

    Page
  • Contact

    Send a message

    Page
  • Junior Sommelier

    Adare Manor

    Role
  • Senior Food and Beverage Assistant

    Adare Manor

    Role
  • Software Development Student

    AMCS Group

    Role
  • Temporary Associate Software Developer

    AMCS Group

    Role
  • Temporary Associate Software Engineer

    AMCS Group

    Role
  • Duty Manager

    Askeaton Pool & Leisure

    Role
  • Lifeguard and Swim Teacher

    Askeaton Pool & Leisure

    Role
  • Food and Beverage Assistant

    The Devon Inn Hotel

    Role
  • Food and Beverage Assistant

    The Mustard Seed

    Role
  • Student Professional

    National Building Control Office (NBCO) & National Market Surveillance Office (NMSO)

    Role
  • Interpreter

    translation.ie

    Role
  • Interpreter

    TRANSLIT

    Role
  • Delivery Driver

    Uber Eats

    Role
  • Hub Staff

    First 7 Weeks, University of Limerick

    Role
  • ICT Learning Centre Tutor

    ICTLC, University of Limerick

    Role
  • ICT Learning Centre Tutor

    ICTLC, University of Limerick

    Role
  • Temporary Computing Assistant

    Information Technology Division, University of Limerick

    Role
  • Orientation Guide

    Academic Registry, University of Limerick

    Role
  • Peer Advisor

    Glucksman Library, University of Limerick

    Role
  • Peer Advisor

    Glucksman Library, University of Limerick

    Role
  • Peer Advisor

    Glucksman Library, University of Limerick

    Role
  • PSLG Tutor

    University of Limerick

    Role
  • Creative Crew

    UL Student Life

    Role
  • Lifeguard

    West Lake Aqua Park

    Role
  • Lifeguard Supervisor

    West Lake Aqua Park

    Role
  • Waiter

    WrkWrk

    Role
  • Automated External Defibrillation (AED)

    Royal Life Saving Society UK (RLSS UK)

    Certification
  • Basic Concepts of AMCS Platform

    AMCS Group

    Certification
  • Assistant Swimming Teacher

    Water Safety Ireland

    Certification
  • National Vocational Beach Lifeguard Qualification

    Royal Life Saving Society UK (RLSS UK)

    Certification
  • Cardiac First Response - Advanced

    PHECC

    Certification
  • Introductory Sommelier

    Court of Master Sommeliers Europe

    Certification
  • CPR and First Aid Update 2026

    Royal Life Saving Society UK (RLSS UK)

    Certification
  • Customer Service: Managing Payments & Invoicing

    AMCS Group

    Certification
  • EFSET English Certificate 76/100 (C2 Proficient)

    EF SET

    Certification
  • Emergency First Response

    PHECC

    Certification
  • First Aid Responder

    PHECC

    Certification
  • Certificate of Language Ability - C2

    Language Certification

    Certification
  • Building Regulation Requirements for Works to Existing Dwellings

    National Building Control Office (NBCO) & National Market Surveillance Office (NMSO)

    Certification
  • Pool Lifeguarding

    Royal Life Saving Society UK (RLSS UK)

    Certification
  • Practical First Aid

    Irish Red Cross

    Certification
  • Safeguarding 1

    Swim Ireland

    Certification
  • Level 2 Swimming Teacher (Virtual — Askeaton)

    Swim Ireland

    Certification
  • WSET Level 2 Award in Wines — Merit (82%)

    Wine & Spirit Education Trust

    Certification
  • EduCoach

    An educational coaching marketplace, re-engineered solo

    Project
  • EV Route Optimizer

    A* routing for electric vehicles, with live charging stops

    Project
  • Monkey Rescue

    A conservation nonprofit site, rebuilt accessibility-first

    Project
  • Personal Portfolio

    This site — Astro, Tailwind, editorial design

    Project
  • Ballingarry National School

    6th class (final year of primary)

    Education
  • Colàiste na Tròcaire

    Leaving Certificate (Established, incl. Transition Year)

    Education
  • SOU "Panayot Volov"

    Primary education (1st – 6th class)

    Education
  • University of Limerick

    Bachelor of Science — Computer Systems

    Education
  • University of Limerick

    Master of Science — AI & Machine Learning

    Education
  • Aged cheddar

    → Vintage Port

    Pairing
  • Beef bourguignon

    → Red Burgundy, village level

    Pairing
  • Blue cheese (Stilton, Roquefort)

    → Sauternes

    Pairing
  • Bolognese / ragù

    → Chianti Classico

    Pairing
  • Brie or Camembert

    → Champagne

    Pairing
  • Caesar salad

    → Sancerre

    Pairing
  • Spaghetti carbonara

    → Frascati

    Pairing
  • Charcuterie board

    → Beaujolais-Villages or dry Lambrusco

    Pairing
  • Dark chocolate dessert

    → Banyuls or vintage Port

    Pairing
  • Baked or pan-fried cod

    → Pinot Grigio

    Pairing
  • Coq au vin

    → Red Burgundy

    Pairing
  • Crème brûlée

    → Sauternes

    Pairing
  • Dover sole or other flat fish

    → Chablis

    Pairing
  • Duck (confit or roasted)

    → Pinot Noir or Alsace Pinot Gris

    Pairing
  • Indian curry (medium spice)

    → Gewürztraminer or rosé

    Pairing
  • Lobster with butter

    → White Burgundy or vintage Champagne

    Pairing
  • Margherita pizza

    → Chianti or Barbera d'Alba

    Pairing
  • Fresh oysters

    → Muscadet sur lie

    Pairing
  • Pad Thai

    → Off-dry Riesling

    Pairing
  • Seafood paella

    → Dry rosado (Spanish rosé)

    Pairing
  • Pesto pasta

    → Vermentino

    Pairing
  • Pork belly

    → Off-dry Mosel Riesling

    Pairing
  • Rack of lamb

    → Northern Rhône Syrah

    Pairing
  • Mushroom risotto

    → Barbera or aged Nebbiolo

    Pairing
  • Roast chicken

    → White Burgundy

    Pairing
  • Roast pork

    → White Burgundy

    Pairing
  • Grilled salmon

    → Light Pinot Noir or dry rosé

    Pairing
  • Pan-seared scallops

    → Chablis Premier Cru

    Pairing
  • Pan-seared sea bass

    → Albariño

    Pairing
  • Ribeye or sirloin steak

    → Bold Cabernet Sauvignon

    Pairing
  • Sushi & sashimi

    → Off-dry German Riesling or junmai sake

    Pairing
  • Seared tuna steak

    → Cru Beaujolais

    Pairing
  • Venison

    → Barolo or Northern Rhône Syrah

    Pairing
  • Anaphylaxis (severe allergic reaction)

    critical

    Scenario
  • Choking adult (conscious)

    urgent

    Scenario
  • Drowning casualty (recently removed from water)

    critical

    Scenario
  • Heat exhaustion progressing to heat stroke

    urgent

    Scenario
  • Hypothermia (cold-water immersion)

    urgent

    Scenario
  • Tonic-clonic seizure

    urgent

    Scenario
  • Severe external bleeding

    critical

    Scenario
  • Suspected spinal injury (pool diving)

    critical

    Scenario
  • Suspected stroke (FAST positive)

    critical

    Scenario
  • Sudden cardiac arrest (adult)

    critical

    Scenario
  • The airport

    Летището · leh-TEESH-teh-toh

    Phrase
  • I am allergic to...

    Алергичен съм към... · ah-ler-GEE-chen suhm kuhm

    Phrase
  • I need an ambulance

    Имам нужда от линейка · EE-mam NOOZH-dah ot lee-NEY-kah

    Phrase
  • Call the police

    Извикайте полицията · eez-vee-KAI-teh poh-LEE-tsee-yah-tah

    Phrase
  • Could I get a coffee, please?

    Едно кафе, моля · ED-noh kah-FEH, MOH-lyah

    Phrase
  • Cheers!

    Наздраве! · nahz-DRAH-veh

    Phrase
  • This is delicious

    Това е много вкусно · toh-VAH eh MNOH-goh VKOOS-noh

    Phrase
  • I don't understand

    Не разбирам · neh rahz-BEE-ram

    Phrase
  • There's a fire

    Има пожар · EE-mah poh-ZHAR

    Phrase
  • A glass / A bottle

    Чаша / Бутилка · CHAH-shah / boo-TEEL-kah

    Phrase
  • Good evening

    Добър вечер · DOH-bar VEH-cher

    Phrase
  • Good morning

    Добро утро · DOH-broh OO-troh

    Phrase
  • Goodbye

    Довиждане · do-VEEZH-dah-neh

    Phrase
  • Hello

    Здравейте · zdrah-VEY-teh

    Phrase
  • Help!

    Помощ! · poh-MOSHT

    Phrase
  • The hospital

    Болницата · BOHL-nee-tsah-tah

    Phrase
  • How are you?

    Как сте? · kahk steh

    Phrase
  • How much does it cost?

    Колко струва? · KOHL-koh STROO-vah

    Phrase
  • I'm from Ireland

    От Ирландия съм · ot eer-LAHN-dee-yah suhm

    Phrase
  • Could I see the menu?

    Може ли менюто? · MOH-zheh lee men-YOO-toh

    Phrase
  • This pairs well with...

    Това върви добре с... · toh-VAH vuhr-VEE doh-BREH suh

    Phrase
  • Please

    Моля · MOH-lyah

    Phrase
  • Red wine / White wine

    Червено вино / Бяло вино · cher-VEH-noh VEE-noh / BYAH-loh VEE-noh

    Phrase
  • Sorry / Excuse me

    Извинете · eez-vee-NEH-teh

    Phrase
  • A table for two, please

    Маса за двама, моля · MAH-sah zah DVAH-mah, MOH-lyah

    Phrase
  • Thank you

    Благодаря · bla-go-dar-YAH

    Phrase
  • The bill, please

    Сметката, моля · SMET-kah-tah, MOH-lyah

    Phrase
  • The train station

    Жп гарата · zhuh-puh GAH-rah-tah

    Phrase
  • A glass of water, please

    Чаша вода, моля · CHA-shah voh-DAH, MOH-lyah

    Phrase
  • What do you recommend?

    Какво препоръчвате? · kahk-VOH preh-poh-RUHCH-vah-teh

    Phrase
  • What's your name?

    Как се казвате? · kahk seh kahz-VAH-teh

    Phrase
  • Where is the bathroom?

    Къде е тоалетната? · KUH-deh eh toh-ah-LET-nah-tah

    Phrase
  • Yes / No

    Да / Не · dah / neh

    Phrase
  • LinkedIn

    todoraleksandrov

    External
  • GitHub

    todor147

    External
  • Email

    todor_147@abv.bg

    External
↑↓ to navigate to open