reading comfort is on: larger text, more spacing, higher contrast, no motion. Inspired by Clarity Layer, an adaptive reading app I helped build.
x-ray mode: engineering notes are visible on each section · full write-up in the colophon at the bottom
Hi, and thanks for visiting with a screen reader. Everything on this site should work for you: the games, the live features and Ask Leah. If anything doesn't, please tell me at weldonl@tcd.ie and I'll fix it.
Leah Weldon, software engineer
hover to disturb · click to scatterbog an luch thairis · cliceáil chun é a scaipeadh… particles
~ $
currently building: this siteá thógáil faoi láthair: an suíomh seo
x-ray · the name is ~2,600 points sampled from text rendered on an offscreen canvas, each on a spring back to its home position, pushed by your cursor or your phone's tilt. It pauses off-screen and stays still for reduced motion. The "last push" pill is a Vercel function reading GitHub's public events API, cached for 15 minutes.
software developer · ibm · dublinforbróir bogearraí · ibm · baile átha cliath
I build software that holds up under scrutiny, and systems where interesting behaviour emerges on its own.Tógaim bogearraí a sheasann suas faoi ghrinnscrúdú, agus córais ina dtagann iompar suimiúil chun cinn as a stuaim féin.
the 30-second version
now
Software developer at IBM, Dublin (since Sep 2026)
before
Eight-month SWE internship, IBM Process Mining: agentic RAG with Granite, LangChain and Milvus
education
MSc Computer Science and first-class BSc, Trinity College Dublin
research
Fairness and adversarial robustness of toxicity classifiers
won
1st place + Industry Award, SwEng 2024 (CodeCraft) · joint 1st, OpenAI × Ormeau Labs hackathon
languages
Python · TypeScript · JavaScript · Java · C · Haskell · R
~/about
I'm a software developer at IBM in Dublin. Before that I spent eight months as an intern on IBM Process Mining, building agentic RAG features with Granite models. I studied Computer Science at Trinity College Dublin: a first-class BSc, then an MSc whose dissertation measured how toxicity classifiers fail, and for whom.Is forbróir bogearraí mé ag IBM i mBaile Átha Cliath. Roimhe sin chaith mé ocht mí i m’intéirneach ar IBM Process Mining, ag tógáil gnéithe RAG gníomhaireachta le samhlacha Granite. Rinne mé staidéar ar an Ríomheolaíocht i gColáiste na Tríonóide: BSc den chéad ghrád, agus ansin MSc ar thomhais a thráchtas conas a theipeann ar aicmitheoirí tocsaineachta, agus cé air a dteipeann siad.
I like building with other people under pressure: my SwEng team won first place and the Industry Award with CodeCraft, and I have taken joint first at the OpenAI × Ormeau Labs hackathon and the Privacy by Design track at OpenAI’s AI Privacy Hackathon. On my own I build things to see what happens, like an evolution sandbox where predators appear without being programmed, and a music game whose every note is synthesised in the browser.Is maith liom tógáil le daoine eile faoi bhrú: bhuaigh m’fhoireann SwEng an chéad áit agus Gradam an Tionscail le CodeCraft, agus bhí mé comhionann sa chéad áit ag hackathon OpenAI × Ormeau Labs agus bhuamar rian Privacy by Design ag Hackathon Príobháideachta AI OpenAI. Asam féin, tógaim rudaí chun a fheiceáil cad a tharlóidh: bosca gainimh éabhlóide ina dtagann creachadóirí chun cinn gan iad a ríomhchlárú, agus cluiche ceoil ina gcruthaítear gach nóta sa bhrabhsálaí.
91.7%
semantic-attack bypass rate against Muslims for HAP-38M and Toxic-BERTof disguised attacks on Muslims got past two of the AI moderators I tested
66
automated tests behind Primordial, plus a real-browser checkautomatic checks that make sure Primordial keeps working
98×
peak speedup for a CNN-style convolution with OpenMP + SSE (2024 coursework)times faster: how much quicker our team made a core AI calculation run
12
original music cues synthesised live in the browserpieces of music written by code instead of recorded
x-ray · each figure comes from a project README or a results file. They count up once, when an IntersectionObserver sees the strip, with a cubic ease-out.
x-ray · names decode from random glyphs when this section scrolls in. Hover previews sit in the gutter and develop like a photo: a 1-bit ordered (Bayer) dither of the screenshot dissolves pixel by pixel into the real image, drawn on a 144×134 canvas. Rows link to case-study pages generated from Markdown at build time, and the page change uses cross-document View Transitions where supported.
→
~/explore-the-research
real results from my MSc dissertation
→
x-ray · bars come from per-group CSVs exported from my dissertation pipeline, bundled at build time. The takeaway sentence is computed from the data, and groups that were never flagged before an attack are excluded rather than shown as 0%.
~/swap-test
Same sentence. Different group.
One of my dissertation tests, live. Write an ordinary, kind sentence with a {group} slot. IBM's HAP-38M scores it once for each group. A fair moderator would give every version the same score. Watch what actually happens.
the dashed line is the 0.5 threshold the guestbook uses · nothing you type here is stored
x-ray · a Vercel function fills the slot with twelve groups and scores each one with HAP-38M, which runs inside the function itself (about 20 ms a sentence once warm). In my dissertation this is the counterfactual "swap" test, run across four models and six datasets with bootstrap confidence intervals; inconsistency ranged from 7.8% to 26.3% between models. Identity terms alone can push a harmless sentence over the line.
~/sentence-map
Where the model puts your sentence.
Every dot is a sentence, placed by how HAP-38M itself sees it. Left to right is the model's own verdict: past the dashed line, it gets flagged. Up and down is how much it reads the sentence as being about identity. Type something and see where it lands, or run the swap test above and its twelve versions appear here.
friendly, everyday, criticalsentences that mention a groupabusive (text hidden)yours
x-ray · the model now returns two things: its verdict and the 576 numbers its last layer reads. x is the classifier's own decision axis (the logit gap, so the dashed line is exactly the 0.5 threshold). y is an "about identity" direction: the average difference between sentences that mention a group and the same kind of sentence that doesn't, with the decision axis removed (scripts/build_map.mjs, 82 reference sentences). Harmless sentences that name a group sit higher, and the higher they sit the further right the model pushes them: the bias, as geometry.
~/fit-check
for recruiters · runs entirely in your browser
Hiring? Paste the job description.
I'll pick out the skills the role asks for, show which ones appear in my work (with the project that proves each one), and list anything I haven't shown here yet. It's a keyword match, not a verdict.
x-ray · about 30 hand-written regular expressions map skills to evidence, plus a list of common skills I haven't shown here. Nothing you paste leaves the page. The rules are unit-tested.
~/arcade
bug-bashbest 0
fixed 020s
Bug bash
Bugs are crawling into production. Squash as many as you can in 20 seconds.
build finished
0 bugs fixed
review:
name-that-genrestreak 0 · best 0
Name that genre
Every clip is composed live by code in your browser, the same way Melody Masters works. Listen, then guess.
x-ray · bug bash is a requestAnimationFrame loop with delta-time movement, wall bouncing and difficulty that rises with your score. Name that genre schedules oscillators, filtered noise and pitch-dropping kicks with the Web Audio API: there are no audio files on this site.
~/now · updated Nov 2026
working
Software developer at IBM
building
This site, and Receipts: a win diary, for SheBuilds
writing
My first Substack essay
~/git log --graph
a3f9c1eHEAD → ibm
Software developer, IBM · Sep 2026
7d02b4amsc
MSc Computer Science, Trinity College Dublin · 2025–26 · dissertation on fairness and robustness in risk detection models
A research essay on algorithmic bias and inequality, a theme my dissertation picked up.
writingcode soon
x-ray · one data file (src/data/modules.ts) drives this grid. Filtering only dims cards, so the shape of each year stays visible. Repo links switch on with a single flag (currently off) once the College repo is public.
~/guestbook
moderated by a classifier from my dissertation
Leave a note.
Every message is scored by IBM's Granite Guardian HAP-38M, one of the four models I evaluated, before it appears. You'll see its score. It isn't perfect, which is rather the point of my research.
x-ray · a Vercel function validates the note, scores it with IBM's HAP-38M running inside that same function (ONNX Runtime in WebAssembly, no third-party API), and only inserts it into Supabase Postgres if the hate/abuse/profanity score is below 0.5. Row-level security means the browser can only read approved notes. A honeypot field and per-IP rate limit keep bots out.
Software developer at IBM with a first-class BSc and an MSc in Computer Science from Trinity College Dublin. Experience building agentic RAG systems with IBM Granite models, Python data pipelines and APIs; research on the fairness and adversarial robustness of toxicity classifiers.
Experience
Software Developer, IBM, DublinSep 2026 – present
Software Engineering Intern, IBM Process Mining, DublinJan 2025 – Sep 2025
Built agentic RAG features for the Automation Planner in IBM Process Mining and Blueworks Live, using Granite models with dynamic prompting and tool calling (LangChain, LangGraph).
Built data ingestion pipelines (PostgreSQL, MonetDB, Milvus) and FastAPI endpoints; researched hybrid vector embeddings to improve retrieval precision for enterprise search.
Unit and integration tests, CI/CD and CVE fixes in a global Agile team (Python, Java Spring Boot, Jira).
MSc Computer Science, Trinity College Dublin2025 – 2026
Dissertation: Fairness and Robustness in Risk Detection Models (supervisor: Eoin Delaney)
BSc Computer Science, Trinity College Dublin · First Class Honours · Book Prize2021 – 2025
Selected projects
Fairness & Robustness in Risk Detection Models · Python, PyTorch, Hugging Face. Four toxicity classifiers, six datasets; attack bypass reached 91.7% depending on the targeted group; threshold mitigation cut one model's FPR gap by 63.8% for 0.006 F1.
CodeCraft · React, Flask, LangChain, Docker. Frontend lead on an 11-person IBM-sponsored AI coding platform; 1st place and Industry Award, SwEng Showcase 2024.
Primordial · Python, NumPy, FastAPI, WebGL2. Evolution sandbox with neural-network creatures and emergent speciation; vectorised simulation, binary WebSocket protocol, from-scratch renderer; 66 tests and CI.
Parallel Multi-Kernel Convolution · C, OpenMP, SSE. Team of three; up to 98× faster than the scalar reference.
Sync · Joint 1st, OpenAI × Ormeau Labs hackathon, Belfast: an AI planner adapting to cycle phase and energy, built in 3.5 hours.
Honours
1st place and Industry Award, SwEng Projects Showcase, Trinity (CodeCraft) · First Class Honours, BSc Computer Science, Trinity · Book Prize, awarded for first-class results in the annual examinations · Joint 1st, OpenAI × Ormeau Labs hackathon, Belfast (Sync) · Privacy by Design track winner, OpenAI AI Privacy Hackathon, Dublin · 2nd place and RSA Special Award, BT Young Scientist & Technology Exhibition · 1st place, SciFest@College · Specsavers Making a Difference Award
Skills
Python · TypeScript · JavaScript · Java · C · Haskell · R · LangChain/LangGraph · PyTorch · Hugging Face · FastAPI · Flask · Spring Boot · React · PostgreSQL · Milvus · Docker · GitHub Actions · OpenMP · IBM Internship Program Certificate · IBM Agile Explorer · Enterprise Design Thinking Practitioner
Leadership
Executive Committee, Central Societies Committee (2024–25) · Treasurer, DU Netsoc (2024–25) · PRO, DUCSS (2024) · Computer Science Ball organiser (2023–24) · Class rep, Students' Union (2024–25)