eLearning Developer · Instructional Designer · Learning Experience Designer (LXD) · AI Systems Developer · Local AI Expert · AI Skills Developer · AI Apps Developer
Why this page is built the way it is
Everything here is something you can run, read, or take apart. Each card says what the work is for before it shows you anything, tells you what to look at in ninety seconds, and states what is broken or unfinished. Where a piece is not mine to demonstrate, it says so instead of hiding it.
You choose the order. Nothing is gated, nothing auto-advances, and progress on the course is saved in your browser — you can read it, export it, or delete it, and I never see it.
Start here, if you have five minutes
The De-Escalation Scenario is the fastest way to see instructional design judgement; Qwen Survivors is the fastest way to see how I work with AI models. Play one, read the other's card. That is a fair sample of how I think.
Some descriptions are drafted placeholders.
These cards carry wording written as a stand-in while the final copy is decided, and they are marked "draft wording" on the card. The behaviour described is real and works today; the sentences around it are not final.
4 of 4 shown
Work you can look at
Web projectPublishedv1.0updated 2026-09-28draft wording
Qwen Survivors
The clearest evidence on this page of supervising a model rather than merely using one. A complete, playable game loop came out of local Qwen models, which makes the human direction around it the interesting part: setting an objective small enough that a model can actually land it, reading what came back, and refusing the parts that would not run. That is the same judgement call a learning technologist faces every week with generated content, and it is easier to judge from a working artefact than from a claim.
Too narrow to play here. This demo needs about 400 px of card. Use Open in a new tab — it runs full size there.
What to look for
Ninety seconds: start a run and play for a minute. Watch whether the core loop actually holds — a readable goal, a clean end state, and whether the frame rate survives a crowd of enemies. Then open the repository and read one file, because the generated code is the artefact and how legible it is says more than any summary here.
What you take from this
Name what a local language model is and is not good at generating, using a real project as the reference point.
Identify the points in an AI-generated codebase where human review changes the outcome.
Judge a generated artefact by whether it runs and holds up under load, not by whether it looks impressive.
Who did what
[Draft placeholder — a recruiter will ask this, and only you can answer it precisely.] Suggested shape: what you specified, what you rejected and regenerated, what you fixed by hand, and how you decided the result was finished.
In the operator's words
A 'Vampire Survivors' style web game developed entirely by local Qwen models (v1.0 — currently playable via GitHub Pages).
1.4.4 Resize Text — the embedded page ships a viewport meta that disables zoom (axe-core 4.13.0 rule meta-viewport, moderate). Measured 2026-09-29.
1.1.1 / 4.1.2 — gameplay is drawn on 8 canvas elements with only 310 characters of DOM text, so the running game state carries no text alternative; the menu has real buttons but the level selects are focusable divs, not buttons. Measured 2026-09-29.
1.4.3 Contrast — 16 colour-contrast checks came back incomplete: unverifiable automatically, which is not the same as passing. Measured 2026-09-29.
Keyboard reaches the menu (12 of 12 Tab presses moved focus to a distinct control), but in-game operability and screen-reader behaviour were not verified. Measured 2026-09-29.
Instructional design judgement in a single artefact. A high-stakes soft skill that no checklist can teach was built as a roleplay in which choices carry visible consequences, so the learner meets escalation from the inside rather than reading about it. Choosing a scenario over a video or a quiz is the decision designers get wrong most often, and this shows the reasoning rather than just the output.
Too narrow for the inline player. The course needs about 400 px of card to read. Use Open without the player — it runs full size; progress is not saved in that tab.
What to look for
Ninety seconds: play the opening encounter twice — once taking the options that feel instinctive, once taking the deliberately calm ones. What to watch is the feedback: whether the consequence becomes legible enough that you behave differently on the second attempt. That behaviour change is the entire instructional argument.
What you take from this
Recognise early behavioural cues in an escalating confrontation before they become a safety issue.
Practise calming language under time pressure, with the consequence of each choice made visible.
Reflect on which de-escalation move you default to under stress, and how often it actually works.
Who did what
operator — authored the package; we host and remediate, so accessibility improvements here are ours to claim.
1.2.1 / 1.2.3 — narration audio has no captions yet (see conformance.knownGaps). Measured 2026-09-28.
In the workshop
Not finished, not demoable, and deliberately shown without a play button. It is here because the fact that these are being built is itself part of the record.
AI skill packageIn progressupdated 2026-09-28draft wording
Submarine Search
Deep-research tooling normally locks you to one vendor's model and one vendor's idea of rigour. This is built the other way round: one research process that runs against practically any local or cloud model, which means the method — sourcing, verification, citation discipline — is the design, and the model is interchangeable. Of the items here it is the closest to what teams are currently trying, and failing, to do with AI.
What to look for
Not playable yet, so read it as a case study rather than a demo. The interesting part is the interface the skill exposes to a model: how a research protocol is written so that a small local model and a large hosted one both follow it, and where the process still degrades.
What you take from this
Name what makes a research process model-agnostic — which parts are the protocol and which parts are the model — using an in-progress package as the reference point.
Identify where a deep-research pipeline degrades as the model gets smaller, and what a harness has to do about it.
Judge an agent skill by its verification rules rather than by its demo.
Who did what
[Draft placeholder — state plainly what you designed here: the protocol, the harness, the verification rules, and what you refused to let the model decide for yourself.]
In the operator's words
A transferable, system-agnostic AI agent skill package which provides robust, accurate, reliable deep research via practically any local or cloud AI (WIP).
Web projectIn progressupdated 2026-09-28
Syntax Siege
Coding lessons packaged as a tower defense game (WIP).
In the operator's words
Coding lessons packaged as a tower defense game (WIP).
Your records
Progress in the SCORM course, and any note you write about what you got out of an item, live only in this browser. Nothing is sent anywhere. You can export them as a single JSON file or erase them; both are instant and irreversible.
No records saved in this browser yet.
A note for yourself
Accessibility statement
Target: WCAG 2.2 Level AA.
The hub shell and everything we author targets WCAG 2.2 AA. Embedded third-party frames are outside our authorship surface and are labelled as such (D-006).
This card embeds someone else's GitHub Pages deployment, so it sits outside our authorship surface. Measured 2026-09-29 by loading it top-level and running axe-core 4.13.0: 1 violation (meta-viewport — zoom disabled) and 16 colour-contrast checks incomplete; gameplay is canvas-rendered (8 canvas elements, 310 characters of DOM text) and so has no text alternative. Probe: test/a11y-third-party-probe.mjs · evidence: test/evidence/a11y-third-party-2026-09-29.txt.
Plan: Not ours to fix from inside this page — the findings go to the operator, who owns that repository. Here the card labels the frame third-party, states these gaps on the card itself, and keeps the live out-link so a learner who cannot use the embedded frame can go to the source instead. (status: open (third-party; findings reported to the author))
Measured 2026-09-29: the package holds 27 audio files — 18 narration mp3 (7408 KB, 308.2 s) plus 6 sfx mp3 and 3 sfx wav — totalling 11,022 KB and 342.2 s, with 0 video. None carry captions or an audio description. Probe: test/package-audio-probe.mjs · evidence: test/evidence/package-audio-2026-09-29.txt.
Plan: Operator will author captions and repackage; we version the new package in via data/content.json (D-011). (status: open)
Raised by the checker and judged in writing
An exception is only honest if it names the criterion it bends and says who judged it. These came from the second automated engine:
2.4.4 Link Purpose in Context (A) — HTML_CodeSniffer via pa11y, 8 notices. Reviewed against the criterion at source, not assumed. The page has 10 links, 0 duplicate accessible names, every name states its destination, and every link that opens a new tab says so in its own text (G91). The notices are htmlcs asking a human to look at each link; we looked. Checked 2026-09-29.
1.3.5 Identify Input Purpose (AA) — HTML_CodeSniffer via pa11y, 2 notices. Judged not applicable, and the judgement is on the record rather than silently dropped: both notices point at the learner note, a free-text field the learner writes for themselves. SC 1.3.5 covers purposes drawn from the autocomplete type list, and a personal note is not in that list. The field does carry a real label. Checked 2026-09-29.
1.4.3 / 1.4.11 Contrast (AA / non-text contrast) — HTML_CodeSniffer via pa11y, 4 warnings. The engine declines to resolve the background behind absolutely-positioned elements, so it warns rather than measures. The same colour pairs are measured numerically by our contrast gate (46 checks, 0 failing) against the tokens the page actually uses, so this is a tool limitation we covered another way. Checked 2026-09-29.
1.3.1 Heading Structure (A) — HTML_CodeSniffer via pa11y, 1 warning. Flags the row of action buttons on each card as content that might want a heading. Left as it is deliberately: no AA criterion requires a heading above two buttons, and adding one would add noise to every card. Revisit if the card layout changes. Decided 2026-09-29.
Roughly 30 further criteria (2.2.2 Pause/Stop/Animate, 2.4.6 Headings and Labels, 3.1.2 Language of Parts, 1.4.13 Content on Hover or Focus, and others) — HTML_CodeSniffer via pa11y, notices. Open, not resolved. These are notices the engine emits precisely because it declines to test them automatically, so they form part of the manual-review backlog listed in test/evidence/pa11y-check-2026-09-29.txt. Nobody should read them as passing. Recorded 2026-09-29.
Not verified yet
Automated checks catch roughly a third of what is wrong with a page, so these gaps are ours to state, not to leave quiet:
Keyboard-only pass through every interactive path, without a mouse. Not done yet.
Screen-reader pass (NVDA on Windows) over the three highest-traffic flows: find an item, launch the SCORM demo, use the learner's own records. Not done yet.
Live re-verification against the deployed URL, including the response headers this page depends on. Not done yet, because the site is not deployed yet.
1.2.5 Audio Description (Prerecorded) (AA) — audio description is provided for all prerecorded video content in synchronized media. The animated, synchronised-narration package reads as synchronized media (0 video files is about containers, not WCAG's definition of video), so 1.2.5 applies; not done yet. Route (a): author an audio description or a G203 static text alternative from data/dialogue.json. Not done yet.
What is not ours to claim
Cards marked as a third-party frame embed someone else's page inside ours. We measure whether they allow framing and we label them, but their accessibility is theirs; their status is recorded per card rather than absorbed into our claim.
A conformance claim that nothing was ever checked against is not a claim, so the automated and manual results behind this page are kept in the repository under test/evidence/ with the date they were taken.