Turn the camera
around.
The hardest subject to focus on is the one holding the camera. Six exposures of the person behind this site: developer on most days, photographer on the good ones.

Read the metadata.
One roll, so far.
First exposures
Abitur at the Dietrich-Bonhoeffer-Gymnasium. English, math, physics, and a camera that started tagging along everywhere.
Change of scene
B.Sc. Computer Science at Universität Trier, with a Japanese minor on the side. New city, same lens.
Into the frame
First seat in the Fachschaftsrat. StuPa and Fachbereichsrat followed. Turns out talking to people is half the job, everywhere.
Passing it on
Web dev tutor: PHP, CodeIgniter, one-on-one feedback, and one exercise session run entirely solo.
The thesis frame
B.Sc. done. The thesis left as open source: ai-form-fill, AI-powered form filling in strict TypeScript, delivered as a framework-agnostic DOM library.
Side quest
The Paradox Modding Toolkit lands on the VS Code marketplace. A language server for grand strategy modding, 783 tests across 69 files.
In the tank
Shipped a Quest 3 app that finds the cables inside a real wall and paints the drill plan back onto it. The master's project, speaking scenes into VR, is the next one out of the tank.
Two frames, one subject.

1// joel.ts3const joel = {4base: "Trier, DE",5stack: ["TypeScript", "Unity", "GSAP"],6thesis: "ai-form-fill",7now: "speech → VR scenes, Quest 3",8ships: true,9} satisfies Developer;
Everything in the bag.
One body, one fixed 23mm. When the frame is wrong, you move.
Rules that survived the move.
Develop in the dark. Judge in the light.
Build in quiet, then show the print itself. No pitch survives a bad one.
One lens is enough.
A fixed 23mm taught that one. It holds for dependencies too.
Grain is honest.
A real thing shipped beats a perfect thing imagined.
Wait for the light.
The patient frame wins. So does the patient refactor.
Proof of passage.
That was the subject, in six exposures. The rest of the site is what he does with them.