AF · SEEKING
Web & AI Developer

Joël
Deffner.

CS master’s student in Trier. The last frame off the roll: a Quest 3 that finds the cables inside a real wall.

HoverTap · on this page
Scroll · start with the studies
01 — Education

The studies.

From an Abitur in Schweich to a master’s at Trier. Frame four is still unexposed.
FRAME 01 · ABITURCompleted 2021
Abitur.
Gymnasium
School
Dietrich-Bonhoeffer-Gymnasium
Place
Schweich
Advanced courses
English · Math · Physics
DEV 000%01/04
FRAME 02 · B.SCCompleted 2026
B.Sc.
Computer Science
Institution
Universität Trier
Graduated
2026
Minor
Japanese
DEV 000%02/04
FRAME 03 · M.SCIn progress
M.Sc.
Computer Science
Institution
Universität Trier
Expected
2028
Programme
120 LP under FPO 2020
DEV 000%03/04
FRAME 04 · UNEXPOSEDOpen
You?
The next frame
Your company name here

Reserved for a working-student role, or the first job after the M.Sc. The reel has room.

Get in touch →
DEV 000%04/04
02 — Skills & About

Behind the lens.

Less hype, more “does this actually work?”

I pick up new AI tooling the week it ships and keep whatever survives contact with a real project. This site is the test bench: agents do a lot of the typing, I do the judging. Which is why the contact sheet grades nothing about me. Every frame says what you can check: source you can open, a result you can look at, or my word and nothing behind it. I’m an entry-level engineer, and that third tier is on the sheet because leaving it off would have been the dishonest part.

DEUTSCHNATIVE
ENGLISHFLUENT
日本語 · JAPANESEUNICERT® BASIS
The contact sheetExposure = what you can check
Code you can readResult you can seeTake my word
Sheet 01 · 23 frames
TypeScriptCODE YOU CAN READ

Four codebases: the CK3 toolkit's language server (721 tests across 59 files), ai-form-fill on npm, a rules engine shared unchanged by a socket server and a React client, and this page. The toolkit is GPL-3.0 and public, so don't take my word for the test count. Go and run it.

Hover a frame to read its caption
03 — Selected work

Selected work.

Seven frames, newest first, each with its development notes on the back.
Frame 01 · 2026 · Master's research projectPaused since July

Speak a scene into VR

You describe a scene out loud and an agent edits a persistent VR world turn by turn instead of regenerating it. Nine scene operations and two session operations, one Anthropic tool each behind a strict JSON schema, carried over a WebSocket between a Python FastAPI service and Unity. The P0 scaffold runs end to end against a deterministic fake LLM, so routine tests never make a paid API call. Two-person thesis, 14 weeks, Trier.

UnityQuest 3FastAPIAnthropic tool use
Development notesAI Some · on the wiring
AI
The wiring and the Meta XR audit after the scaffold landed.
Me
I wrote the P0 scaffold myself in one session, 49 files, and the twelve architecture decisions under it: Unity validates every layout the agent proposes and can reject it, and MCP never ships in the runtime.
Voice → scene · Quest 3
MIC“a pine forest at dusk, with a campfire”
PERSISTENT · EDITABLEAGENT LISTENING…
UNITY · FASTAPI · WEBSOCKETFRAME 01
AR reveal · real wall
Press and hold
REVEAL r = 25 CM · HAPTIC 0.12 SIN RANGE 0 / 5
UNITY 6 · META XR · MRUKFRAME 02
Frame 02 · 2026 · Quest 3 · Shipped July 2026

Seeing Through Walls

You want to drill into a wall and you need to know what is behind it. In AR the app reveals the cables, studs and pipes inside the real wall within 25 cm of your hand; in VR you grab a copy of that same wall, scale it up and place the holes precisely; then the plan goes back onto the real surface. Manipulating the copy moves its root transform and never the data, so a pin placed on a wall blown up to twice its size still lands on the right millimetre of the real one. The structures are generated, not detected: only the sensor reading is simulated, and everything around it is real.

Unity 6Meta XR SDKMRUKPassthroughC#
Development notesAI High · on the typing
AI
All 10 runtime C# scripts, both editor tools, and the procedural cable and stud generation.
Me
Keying every plan to the wall's anchor UUID was my call, and so was killing the ArUco path once each iteration cost a 20-minute build. The ordering bug was mine to find on the headset: SetWall cleared the model, the clear fired a save, the empty plan cached, generation skipped.
Frame 03 · 2026 · VS Code extension · GPL-3.0

CK3 Modding Toolkit

A VS Code extension and standalone language server for Paradox script. It derives every piece of its language knowledge from the game install and the game's own logs instead of hard-coding it, so a new DLC or patch never needs a data release from me. Deep validation goes to ck3-tiger rather than being reimplemented: annotate, never hide. 721 tests across 59 files. Public on the Marketplace since July 2026, currently v0.1.x.

TypeScriptLanguage serverGUI previewck3-tiger
Test strip · measured before and after
Top-5 completion accuracy23.5%33.8%

Replaying real typing through VS Code’s own fuzzy-match scorer is what moved these. Corpus: about 6,000 real mod files; unknown scope over 807,000 trigger and effect sites.

Development notesAI High · on the typing
AI
Most of the TypeScript, and every measurement harness behind the strip above.
Me
I install each build and use it on my own mod. A gap I report becomes a permanent script in scripts/, never a one-off fix, and rank quality gets measured before and after every ranking change.
VS Code editing a Crusader Kings III mod file with the toolkit running: a completion popup is open on add_stress with fuzzy-match highlighting, next to a hover documentation panel.
TS · LSP · VS CODEFRAME 03
FlightMeet's live landing page: the headline “Take off together.” over a photograph of a paraglider flying at sunset.
REACT 19 · CI4 · MYSQLFRAME 04
Frame 04 · 2026 · Team project · MIT

FlightMeet

A community platform for paraglider pilots: find and join local flying meets, coordinate in groups, chat, and check the weather at the launch site. React 19 in front of a CodeIgniter 4 JSON API, about 30 endpoints behind one error contract. Wind is first class throughout, speed and gusts and direction and daily maxima, because wind is what decides whether a pilot flies. Chat polls every 3 s for anything newer than the last message id, since the university host cannot serve websockets.

React 19TypeScriptCodeIgniter 4MySQLOpen-Meteo
Development notesAI High · on the typing
AI
Backend and frontend were written concurrently by separate agent workstreams.
Me
That only worked because I froze the API contract in writing first. The rules are mine: CodeIgniter never renders HTML, every network call goes through one lib/api.ts, counts are derived at read time.
Frame 05 · 2026 · Bachelor thesis · MIT

ai-form-fill

A zero-dependency TypeScript library that fills any HTML form from unstructured text or speech. It derives a JSON schema from the DOM, the exact option values included as enums, then hands that schema to the model, so the contract comes from the form and never from a config. Framework-agnostic through ids and data attributes, MIT, ESM and UMD, and 132 unit tests that map one to one onto the thesis' functional requirements. Local Ollama or any OpenAI-compatible endpoint.

TypeScriptDOMLLMSchema-first
Development notesAI Some · on the rework
AI
The July rework commits. The thesis and its requirements-to-tests mapping are my own academic work.
Me
I found three of my own claims false. Framework-agnostic was silently broken for React: element.value does not update a controlled component. The fix, a native prototype setter plus synthetic events, carries the whole library.
The ai-form-fill demo page: a block of source text on the left, an empty contact form on the right, and a FILL FORM button between them.
TS · ESM + UMD · LLMFRAME 05
Board · Drag & drop
TODO
DOING
DONE
ROLES: ADMIN · USER · GUESTMOVING…
CI4 · MYSQL · JSFRAME 06
Frame 06 · 2024 · Team project · Full-stack

Kanban board

A full-stack web app from the Web Development course: CRUD through modals, drag and drop between columns, and role-based access for admins, users and guests. CodeIgniter, MySQL and plain JavaScript, built by the team in the year I was tutoring the same course.

PHPCodeIgniterMySQLJavaScript
Development notesAI None
AI
None. 2024, and it predates all of this.
Me
Typed by hand, as coursework, alongside tutoring the course it came from.
Frame 07 · 2023 · Team of 4 · VR

GazeFactory

A Unity/C# gaze-guiding system that leads a user through a safety-critical simulation. A state model detects operating errors and steers the gaze, through a full 360°, to the next correct step. My first Unity project, and the start of the line that frames 01 and 02 sit on.

UnityC#VRGaze guiding
Development notesAI None
AI
None. 2023, before any of this existed.
Me
One of four on the team. It is on the page for the trajectory, not for the code.
Gaze guiding · 360°
ERROR-STATE MODELSTATE: SEEKING
UNITY · C# · 360°FRAME 07
Off the syllabus

Teaching & involvement.

Prints from the hours that never show up on a transcript.
Universität Trier2024

Web dev tutor

Ran exercise groups for the Web Development course: debugging student PHP, giving feedback on submissions, and explaining CodeIgniter’s router until it stuck.

PHPCodeIgniterJavaScriptLed 1 session solo
PRINT A · TEACHINGFIX · WASH · DRY
Universität Trier2023 – NOW

Student government

Three elected mandates since 2023. Less politics than it sounds: mostly agendas, minutes, and defending the student angle in faculty meetings.

Fachschaftsrat2023 – now
Fachbereichsrat2025/26 term
StuPa2025 – now
Test strip · pick a year3/4 exposed
In 2026 · 3 of 4
Fachschaftsrat · Fachbereichsrat · StuPa
PRINT B · COMMITTEE3 BODIES · 3 YEARS
Old-school photography roots
I learned to see before I learned to code.
Fujifilm X100V · 23 mm · deliberate frames
Turn the ring until the patch coincides
0.711.535
MF · 23 MM · f/2
FOCUS 000%
Night bus at Trafalgar Square, London, shot on a Fujifilm X100V
▢ Frame 04
04 — Photography · @joel.intheskies

The other portfolio.

Travel, light, and the quiet in between, all through one fixed lens.

Trafalgar Square, LondonX100V · 23mm f/2 fixedFlick the lever for the electronic finder
Last frame

Get in touch.

No contact form, no scheduling link. Mail gets read, usually between a Quest 3 build and an exam.

Portrait of Joël Deffner
Paper · unexposed0.0 s
The print

One sheet, one frame. Hold the button to keep the enlarger on, let go when it looks right. The paper does not give any of it back.

Metered · 2.2 to 3.4 s5.5 s max
JD.
© 2026 JOËL DEFFNER
SHOT ON X100V · ANIMATED WITH GSAP