BSc (Hons) in Computing Science
Dublin, Ireland · Full-time
- Relevant modules: Networks and Data Communication; Linux System Administration; Databases; Web Technologies
Computing Science Graduate 2027 Dublin, Ireland
Final-year BSc (Hons) at Griffith College Dublin - I build, deploy and run what I write
Available for work
Final-year BSc (Hons) Computing Science student at Griffith College Dublin, graduating June 2027. Most of what I can do I learned by building and running things outside coursework: a self-hosted Proxmox cluster behind a WireGuard mesh, with Pi-hole, ZFS and Grafana monitoring; a client site in production that syncs its own availability through a GitHub Actions pipeline; a Rails API I audited and hardened after finding raw user input reaching SQL; and a GPU benchmark that measures training throughput, energy and thermals under a fixed LoRA fine-tune, with a C++ sampler reading board power at 500 Hz. Earlier, part-time work in industry: building and hardening client workstations, then debugging over 200 SQL-based regulatory reports and reworking around 400 queries against changing compliance rules in a core banking system. I am looking for a graduate engineering role where I can work on real systems and learn from experienced engineers.
Dublin, Ireland · Full-time
Online · Part-time
Moscow, Russia · Part-time
Moscow, Russia · Part-time
A home server cluster that replaced my paid cloud subscriptions.
Built to cut monthly subscription costs and keep my own data off corporate cloud services. Repurposed hardware runs Proxmox VE hosting containerised services, with a WireGuard mesh for remote access, Pi-hole for DNS filtering, ZFS for storage and Grafana with Uptime Kuma for monitoring. I built it between finishing the Networks and Data Communication module and starting Linux System Administration, and used it to put both subjects into practice.
Booking site for a Lake Como holiday villa, run at near-zero cost.
A holiday-rental site for a villa on Lake Como, built for a client who needed running costs as close to zero as possible. That ruled out a database, so availability is pulled from the property's Booking.com iCal feed by a GitHub Actions job every six hours and committed back to the repository as JSON, and the Italian, French and German pages are generated from the English ones by a Python script. It runs on GitHub Pages with a custom domain, a Formspree contact form and a strict Content Security Policy, and it is where I learned GitHub Actions properly.
The villa's site turned into a template for any holiday rental.
A site for a similar rental is set up by editing data files instead of HTML. Every page is generated from a property config, a reviews file and one text file per language by a build written against Python's standard library alone, and the build refuses to ship mistakes: overlapping price seasons, a translation missing a key, a review scored above its platform's scale or a link to a script that does not exist all stop it with a message saying which. Reviews are rendered into the HTML at build time rather than injected by JavaScript, so search engines see them. Availability is merged from every platform's iCal feed, and if any feed fails nothing is written, because a calendar missing one platform's bookings would offer those dates again. CI tests, builds and deploys the site, and every six hours rebuilds it with fresh availability without committing anything. Building it also turned up a bug on the live villa site: Chrome rendered the AVIF photos macOS had encoded at odd dimensions as blank images, which I fixed in both.
A marketplace for finding a driving instructor in Ireland.
I am building it on my own. The official RSA register already says who is approved to teach; Pro.me helps learners choose between them. Its reference data - all 26 counties and 62 driving test centres, with Eircodes, coordinates and the licence categories each one tests - is imported from the RSA's own register, and search ranks verified instructors first, then profile completeness and reviews, never self-reported lesson counts. Instructors set up their profile in a step-by-step wizard that saves as it goes, learners shortlist instructors and request lessons, and admins check ADI numbers against the register from a verification queue. Photos go to Cloudinary: the server checks each file's type from its bytes rather than its name, Cloudinary re-encodes it, which strips the GPS location a phone writes into it, and a gallery's 12-photo limit holds even when two uploads land at once. A learner can only review an instructor after a lesson the instructor confirmed has taken place. Because it hosts public profiles and reviews, it follows the EU Digital Services Act: anyone can report content, a report cannot be closed without a statement of reasons, the author of a hidden review is shown why, and the admin area counts the figures for the yearly transparency report. The Express 5 backend uses session auth stored in MongoDB, Helmet, bcrypt and a login rate limit that only counts failed attempts, and the whole site runs as a single Render service in Frankfurt so the session cookie stays first-party, which Safari would otherwise block.
A smartphone catalogue for Ireland with filters across 20 specs.
A smartphone catalogue for the Irish market, built with a coursemate: a React 19 and TypeScript front end over a Rails 8 JSON API on PostgreSQL. Filtering runs server-side across around twenty dimensions - brand, screen size, RAM, storage, cameras, refresh rate, release year, 5G, NFC, charging, SIM type and biometrics - and a second endpoint reports how many devices a pending filter set would leave and which brands are still selectable, so the counts update before anything is applied. Filter state is mirrored into the URL, results are paged in chunks of 50, and up to five phones can be put side by side. My work was on the backend: the storage and release-year filters interpolated user input straight into SQL, so I rewrote them onto bound parameters, then added per-endpoint rate limiting, a production-only secure flag on the session cookie, and JSON error handling so an unknown device id returns a 404 rather than a 500.
Benchmarks NVIDIA GPUs on a real AI training workload.
I deshrouded my RTX 4070 Ti and fitted custom fans, then had no repeatable way to tell whether it actually ran cooler, so I built one: the card runs a fixed LoRA fine-tune while the tool records what the driver reports. It has since grown into a benchmark for comparing cards and settings, released as 0.1.0. Throughput is measured in tokens per second and as model FLOPs utilisation against a peak worked out from the card's architecture, SM count and clock; energy comes from NVML's counter and is attributed to each training step; and a thermal model fitted to the temperature curve says whether the run reached steady state and when throttling began. Python cannot sample power fast enough to catch transients, so an optional C++17 extension samples it at 500 Hz on its own thread outside the GIL, through a lock-free ring buffer, tested under AddressSanitizer, UndefinedBehaviorSanitizer and ThreadSanitizer. Runs can be repeated with outlier rejection or swept over a grid of settings and ranked by their Pareto front of speed against efficiency, and the tool runs headless in a CUDA container with a Prometheus endpoint, a Grafana dashboard and a SQLite history of every run. Strict mypy, property-based tests and CI on Linux, Windows and macOS all run without a GPU.
Open to graduate engineering roles and internships, and to open-source collaboration. Typically responds within 24 hours.