Resumé

View my resumé!

Clean and efficient code. During my years of development and consulting, I enjoyed mentoring developers on clean code, test driven development, design patterns and code reuse.

UX

It's not "done" until the user is happy!

portfolio

Claude plays Doom & Minesweeper

An LLM plays games live in your browser. In Doom (the shareware episode) each turn the game freezes, a screenshot goes to Claude, and it picks a move and jots a short note to itself for the next turn; the page's one helper is tapping the use key after every forward move, so walking into a door opens it. In Minesweeper, which you can play too, Claude gets the board as text and returns several moves per turn. You choose the level (Beginner, Intermediate or Expert), the model and its thinking effort, and can switch on a second Claude that referees each move before it is played. Apart from that helper nothing is scripted: the page enforces the rules, and it shows Claude's reasoning and a running cost estimate as it plays. Minesweeper also keeps a small notebook of lessons Claude writes after each loss.

Tech stack: Claude through the Anthropic Messages API (Sonnet 5 or Haiku 4.5 with vision for Doom, chosen on the page; Haiku 4.5 or Sonnet 5 with adaptive thinking for Minesweeper, chosen on the page; tool use for structured moves) · js-dos v8 (DOSBox compiled to WebAssembly) · vanilla JavaScript with a DOM-free Minesweeper engine · Eleventy static site on AWS Amplify · a Node.js 20 AWS Lambda behind a Function URL, deployed with AWS SAM, with the API key in AWS Secrets Manager and the prompts, origin allowlist, rate limits and daily spend cap all enforced server-side.

Challenges:
• Latency vs. real time. A model call takes seconds and Doom does not wait, so the game is paused while Claude decides and only runs while a move is held.
• Reading pixels. At Doom’s 320×200, Claude often misreads the scene (it reported lava and demons in plain corridors), so it wanders more than it fights.
• Doors look like walls. In Doom’s first level the only way out of the start area is a plain grey door at the end of a corridor, and Claude would walk up to it and turn away. From saved-game starts next to that door, the original prompt got through 0 of 3 tries, and a prompt telling it to press use on flat walls got through 3 of 6. Having the page tap the use key after every forward move got through 12 of 12 with either prompt, so I kept that helper and say so on the page. I also tried making it fully self-reliant: with an Escape key and a concrete start procedure it works the title menus itself (before that, one run spent 53 steps stuck in the quit dialog), but giving it the game’s automap did not get it through the door (0 of 8), so the door tap stayed. Full 60-step runs still mostly stayed in the start area and its dead-end west wing. Giving Claude a notes field to remember what it had seen also let it talk itself into firing at a corpse for 22 turns until I added a warning after repeated firing.
• Minesweeper needs real reasoning. On the same 8×8 boards Haiku 4.5 lost all 5 games. Sonnet 5 won 4 of 5 at low effort and 2 of 3 at medium, in 2–5 minutes and about 20 cents a game. It only worked once I stopped forcing a tool call, which had been suppressing its thinking. A notebook of self-written lessons made no measurable difference.
• Does a second model help? The optional referee caught more than 50 moves that were really mines before they were played, but a Haiku player with a Sonnet referee still lost all 6 games, so it does not replace a stronger player. The Intermediate and Expert boards are there to try, but I have not measured how Claude does on them.
• Running it in public on my API key. That took server-side prompts, an origin allowlist (a missing www origin silently blocked the game), rate limits, a daily dollar cap, retries for intermittent 502s, and a cost meter fed by real token usage.

AWS Certified Solutions Architect

Visit the website

djmckay.tech Blog

Visit the website

djmckay.tech

My Portfolio site, djmckay.tech. Configured using Leaf and can be updated via RESTful API. Endpoints for adding/updating projects, experiences, social media education and skills. Endpoints for managing site and profile contents. With the idea of creating an iOS companion app.

This site was built on server side Swift using Vapor. Dockerized and deployed to AWS Fargate with database hosted on AWS RDS. Also uses AWS ECR, AWS Secrets Manager, AWS Network Load Balancer and github actions. Email service provided by Bespin and Mailgun. Also uses Amazon Web Services (AWS) for content delivery (CDN) by way of S3 (Simple Storage Service).

Visit the website

Countdown With Me

iOS App serving as a reference application combining iOS, iMessage, WatchOS and CloudKit frameworks. And I really like runDisney

Visit the website

Bespin Email Service

Email API built on Mailgun adding email templates using Mustache. Built using server side Swift and Vapor, deployed to Vapor Cloud. This website currently uses this service. This project is currently a work in progress to offload resources for the VZTUF suite.

Kamino

Event Management Web App. Reference implemenation for Vapor. The beta site is unavailable until migration from heroku to aws is done. It is limited funcationality, but you may login with username(dj1) and password(12345678).

VZTUF Website

Event hosting site. Manages a yearly event by invitation only. Registers attendees, creates invoices, receipts, fullfillment documents. Allows attendees and exhibitors to manager attendees and their booth deliverables. Frontend uses html, css, and javascript. Backend is PHP and MySQL.

Visit the website

VZTUF Show Management App

iOS App built for iPads. Allows administrators to manage the VZTUF show. Manage attending companies and exhibiting companies. Provides a dashboard to manage invitations, revenue, payments, vendor kit, and attendees. Uses JSON rest servies to communicate with backend database (PHP/MySQL). Also provides MacOS desktop version with less features. This is a B2B distribuited application. You may visit the gallery to see demo screenshots.

VZTUF Registration App

iOS App built for iPads. Part of the VZTUF Suite. This provides the registration desk features to find attendees and print their show badges. Can register new attendees and take payments. This is a B2B distribuited application. You may visit the gallery to see demo screenshots.

VZTUF QR Reader

iOS App built for iPod Touches. Part of the VZTUF Suite. This provides the registration desk the ability to scan an attendees badge to mark them as checked in. Indicating the badge which was printed, has been handed to the badge owner in an attempt to prevent fraud by reprinting badges. Uses the device camera to read a QR code and communicate with backend system. This is also used to scan for other tracking purposes. Visiting a particular booth, track training and picking up their show gifts. This is a B2B distribuited application. You may visit the gallery to see demo screenshots.

Accenture

Web based application. Worked on Java EE backend services (RESTful endpoints) for managing commitments and loans. This was a Spring enabled application using Gemfire Cache in front of an Oracle persistent layer. Also lead efforts to improve test automation and code coverage/quality tools such as Clover, Cobertura, SonarQube, Fisheye, Crucible, Selenium, Jenkins to name a few.

Visit the website

👨‍💻More Me!

°D°J McKay

Technologist