Belfast, Northern Ireland

Computing Technologies student building software, web systems and a playable game.

I am entering second year at Ulster University in September 2026 and build substantial projects alongside work and study. The strongest work is below, with the decisions, checks and unfinished parts included rather than hidden.

Press / anywhere to open the quick menu.

Profile

I prefer complete, explainable projects over polished mock-ups.

I have worked alongside study since 2021 in manufacturing, warehouse, stockroom and service roles. At Saica Pack I operate large automated packaging machinery and troubleshoot routine faults and stoppages through safe, hands-on intervention. That experience carries into how I build software: follow the process, investigate problems methodically, document what changed and stay honest about what still needs work.

I am preparing for a third-year placement in 2027/28 where I can contribute to real work and keep learning from an experienced team.

Working toolkit

Used across the projects below

Build

HTML, CSS, JavaScript, TypeScript, React, Next.js, SQL, Godot 4 and GDScript.

Systems

Netlify Functions, Cloudflare Workers, Supabase, SQLite, local-first storage and data migrations.

Quality

Playwright, Vitest, deterministic checks, GitHub Actions, responsive design, accessibility and technical documentation.

Project workbench

Pick a project and inspect the work.

The index keeps all six projects in view. Each project opens one focused summary, with the deeper engineering notes and limitations available underneath.

01 / 06Game developmentActive development
The World Forgot Us project graphic showing a dark road network, cyan trace signal and warm carriage light.

Playable Godot campaign

The World Forgot Us

A top-down road story set around a failed British civil-warning network. A small learning project grew into a four-area campaign with combat, saving, upgrades, NPC assignments, environmental puzzles, optional records and three endings.

  • 4campaign areas
  • 3ending routes
  • 10recoverable traces
  • CIsmoke test + web export

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    Campaign state had to survive four maps, saves and a browser export.

  2. Decision

    Keep one persistent campaign record and share map-building rules.

  3. Build

    One authored opening area, then region-specific runtime construction.

  4. Evidence

    The complete campaign smoke test and Web export run in CI.

Engineering notes

The difficult part is keeping campaign state consistent while moving between one authored area and three maps assembled by a shared runtime builder. The Trace Receiver is deliberately used by several systems: it reveals recordings, creates enemy shield windows and carries the central story mechanic.

The project also includes region-aware lighting, a persistent day/night cycle, generated normal maps, adaptive procedural audio and an automated GitHub Actions path that imports the project, runs the campaign smoke test and exports the browser build.

Current limits and next work

The campaign is playable, but pacing and balance still need external playtesting. Combat action frames have less variation than the walk cycle, controller support is unfinished, and the browser build still depends on WebGL 2 and local browser storage.

  • Godot 4.7
  • GDScript
  • Campaign state
  • 2D lighting
  • Procedural audio
  • Web export
  • GitHub Actions
02 / 06Full-stack learning platformPublic demo
French for Life project graphic showing its teach-before-test approach and technology stack.

Adaptive French platform

French for Life

An accuracy-first French-learning app built around one rule: teach language before asking the learner to produce it. The public no-account route keeps progress in the browser and remains usable while account sync is held behind production-readiness checks.

  • A1source-backed mission
  • 13+consent-aware onboarding
  • E2EPlaywright checks
  • Safeaccount sync fails closed

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    A learner must be taught a phrase before the app scores it.

  2. Decision

    Model prerequisites explicitly and gate scored practice against them.

  3. Build

    A concept graph, source-backed vocabulary checks and guarded account sync.

  4. Evidence

    Deterministic tests, Playwright flows and a fail-closed release gate.

Engineering notes

A concept graph records prerequisites, every scored prompt is checked against a vendored FLELex vocabulary source, and deterministic tests keep completion separate from actual evidence of learning. The release checks cover linting, types, unit tests, production build, Playwright and dependency audit.

The wider product includes listening and speaking practice, mistake-driven spaced review, streak and garden rewards, private friend-code co-op challenges and deterministic roleplay with a guarded tutor fallback.

Current limits and next work

Production account sync stays unavailable until email delivery is verified and the privacy, consent, retention and youth-safeguard checks are complete. The public demo is intentionally the safer browser-only route.

  • Next.js
  • TypeScript
  • Supabase
  • Curriculum modelling
  • Playwright
  • Vitest
  • Privacy controls
03 / 06Local-first learning systemPrivate project
Groundwork project graphic showing a guided learning path, SQL result table and personal guidebook.

Guided computing study

Groundwork

A local React app built to rebuild my first-year computing knowledge and prepare for second year. It chooses the next useful activity from recorded evidence, explains the choice and will not unlock tests or portfolio work before the required teaching.

  • 206runtime assertions
  • 45browser smoke checks
  • 15Guided SQL stages
  • 30/49fully taught topics

This is a private local project because it contains my own learning data and working plans. The architecture and verification figures are included here without publishing that personal material.

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    A study app should choose the next useful task, not add another dashboard.

  2. Decision

    Use recorded evidence and fixed precedence rules rather than generated advice.

  3. Build

    Guided lessons, real SQLite stages, migrations and a derived Guidebook.

  4. Evidence

    206 runtime assertions and 45 browser checks cover the learning rules.

Engineering notes

The recommendation rules are deterministic and tested. They prioritise due review, remediation, Guided SQL, ready checkpoints, portfolio milestones and then the next genuinely taught topic. A real in-browser SQLite engine runs the fifteen-stage SQL route and the free SQL lab.

The app also has checkpoint gating, mistake recovery, a Guidebook derived from evidence, migration paths for older progress data and responsive checks across fixed viewports plus a continuous 320-1920 pixel sweep.

Current limits and next work

Nineteen mapped topics still need full lessons. Python and one API exercise remain clearly labelled simulations, and progress stays in one browser unless it is exported manually.

  • React
  • TypeScript
  • SQL.js
  • Playwright
  • Adaptive rules
  • Data migrations
  • Local-first design
04 / 06Production websiteLive users
Coast Internet Radio project graphic showing a live player, secure stream relay and owner-managed content.

Live radio website

Coast Internet Radio

A stakeholder-led redevelopment for a small Newry radio station with real listeners. I worked with the station owner to modernise the listener experience, solve mixed-content audio, provide a protected owner-admin area and collect useful first-party information without installing a large analytics platform.

  • 2Cloudflare Workers
  • Livelistener metadata
  • Adminowner-managed content
  • CSPhash drift checked in CI

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    Browsers block the station's HTTP stream inside an HTTPS website.

  2. Decision

    Re-serve the stream and metadata through controlled HTTPS workers.

  3. Build

    Two Cloudflare Workers plus a serverless owner-admin system.

  4. Evidence

    Real listeners use it, while auth and CSP drift are checked automatically.

Engineering notes

The radio stream and now-playing source are HTTP while the public site is HTTPS. Browsers block that combination, so two Cloudflare Workers re-serve the feeds. Netlify Functions and Blobs support session authentication, CSRF protection, owner editing, play history, listener feedback and first-party analytics.

Current limits and maintenance

The site depends on the station stream and metadata source staying available. A build check now recomputes every inline-script CSP hash so a design edit cannot silently break saved theme, contrast or text-size preferences again.

  • Cloudflare Workers
  • Netlify Functions
  • Netlify Blobs
  • Session auth
  • CSRF
  • First-party analytics
  • CSP
05 / 06Serverless applicationExperimental
Talk With Jamie project graphic showing a chat interface and the boundary between public and private context.

Privacy-conscious chat app

Talk With Jamie

An AI chat with guest and registered accounts, saved conversations and a private admin side. The useful engineering problem is not the chat interface. It is deciding which context can be retrieved for which user, then enforcing that boundary in code.

  • Guestand registered sessions
  • HttpOnlysigned session cookies
  • Splitpublic/private retrieval
  • Testsauth and context boundaries

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    A public visitor must never retrieve private personal context.

  2. Decision

    Enforce audience permissions before context reaches the model.

  3. Build

    Signed sessions, serverless routes, storage controls and split retrieval.

  4. Evidence

    Authentication and context-boundary tests cover the access rules.

Engineering notes

A static frontend talks to Netlify Functions, with users and conversations stored in Netlify Blobs. The retrieval layer splits context by audience before it reaches the model. Private source material is not committed or included in the static deployment, and there is no route that reads the protected pack back out.

Current limits and next work

This remains an experiment rather than a finished messaging product. The project is deliberately explicit about AI use, tells visitors not to submit sensitive information and keeps the privacy boundary in retrieval code rather than relying on a prompt.

  • Netlify Functions
  • Authentication
  • Netlify Blobs
  • Context retrieval
  • Privacy boundaries
  • Automated tests
06 / 06Service websiteLive
Local Web Fix project graphic showing a free website check, clear pricing and safe contact boundaries.

Small-business service site

Local Web Fix

A small service site for practical website and online-information fixes. A business can send a public link for a free check before deciding whether paid work is worthwhile.

  • Clearpublished pricing
  • Safeno password requests
  • Fastplain static delivery
  • Mobilesmall-screen first

Engineering decision trace

Constraint → decision → build → evidence

  1. Constraint

    A small business needs trust and clarity before technical detail.

  2. Decision

    Publish scope and prices, and never request passwords in the enquiry flow.

  3. Build

    A fast static service site with a direct mobile-first contact path.

  4. Evidence

    The live site keeps the offer, limits and next step visible without sales theatre.

Design decisions

The main work was setting boundaries clearly. Prices are visible, the site says what is and is not included, and the enquiry flow asks for a public link rather than credentials. The design is intentionally plain, direct and usable on a phone.

Current limits and next work

It is a focused service site rather than a large application. Its value is the clarity of the offer, the mobile contact path and the refusal to collect information the job does not need.

  • Static web
  • Mobile-first design
  • Contact flow
  • Clear pricing
  • Privacy wording
  • Small-business UX

The repositories also contain smaller experiments, source snapshots and project history.

View all public repositories

Background

Work, education and the evidence behind the student projects.

Work experience

Jun 2026 - 12 Sep 2026 (fixed term)

Temporary Production Operative, Saica Pack UK

Operating and monitoring large automated corrugated-packaging machinery, including DRO flexographic printing and rotary die-cutting equipment and the site's C4 production line. Diagnosing and resolving routine mechanical faults and stoppages through safe, hands-on intervention, restoring operation where possible and escalating maintenance-critical issues.

Oct 2021 - Jul 2026

Warehouse Operative, Pet Connection

Packing orders, sorting stock, supporting fulfilment and deliveries, and following procedures in a small team.

Aug 2024 - Jul 2026

Kitchen Porter, The Garden Room

Supporting kitchen and front-of-house staff during busy service, maintaining hygiene standards and helping with stock rotation.

Jun 2022 - Sep 2022

Floor Staff, No.7 Duke

Customer support, stock replenishment, event preparation and varied shift tasks.

Education and certification

2025 - 2029 expected

BSc (Hons) Computing Technologies

Ulster University, Belfast. Programming, computing systems, web technologies and problem-solving.

Passed May 2023

Information Technology Specialist in HTML & CSS

Certiport, a Pearson VUE business. View certificate.

2022 - 2024

Level 3 Extended Diploma in Technology

Southern Regional College, grade D*DD.

Currently looking for

A third-year placement in 2027/28.

I start second year in September 2026. A dedicated employability module will prepare me to apply for a third-year placement in 2027/28, and I am building the evidence early. I am interested in software, web development and practical IT roles where I can contribute to real work and learn from an experienced team.