From PS3 Trade-in to Vibe Coding a LEGO Dimensions NFC Server
Recently, I decided it was time to clear out some shelf space and took my old PS3 console along with my entire collection of games down to CeX. The trade-in went smoothly for the most part—except for one item they couldn't accept: the LEGO Dimensions starter kit, specifically because of the USB-connected NFC Toy Pad.
Instead of letting it gather dust in a drawer, I saw it as the perfect opportunity to run an experiment. Google had just released the new Antigravity 2.0 agent, so I decided to see how far I could push it. The goal was to build a companion tool, dimensions-nfc-server, entirely through natural language and architectural guidance—a process commonly known as vibe coding.
Here is the story of how I built it, what worked, and where the boundaries of modern AI coding agents lie.
The Architectural Plan & Tech Stack
I wanted the project to be a robust, modern web application rather than a basic script. I instructed the agent to set up the following stack:
- Backend: A Node.js server to interact with the USB hardware.
- Frontend: A React application styled with Tailwind CSS for a premium, responsive dashboard.
- Tooling: Comprehensive linting, unit tests, a devcontainer configuration for easy setup, and Playwright for E2E validation.
To communicate with the physical Toy Pad, I needed to interface with its USB protocol. Rather than writing that library from scratch, I pointed the agent to an existing open-source library, node-ld. The agent successfully analyzed, ported, and integrated the library logic directly into our new server architecture.
I thought it would be fun to use the physical Toy Pad to control some home automation. So, I asked the agent to implement a feature to configure NFC triggers—specifically, calling custom webhooks with a payload whenever tags are placed on or removed from the Toy Pad. With this in place, I was able to trigger webhooks on my Home Assistant instance to control the living room lights and play music simply by setting physical Lego figures on the pad.
Pushing the Boundaries of Vibe Coding
My personal rule for this experiment was simple: I wanted to write as little code as possible. In the end, the project was entirely vibe-coded. I did not write a single line of backend, frontend, or markdown documentation myself—with one single exception.
During development, I hit a subtle bug related to port communication and state management. The agent kept writing corrections that missed the root cause, and struggled to parse my explanations of the terminal trace. I eventually had to step in and write exactly one line of code to fix the issue. Beyond that single line, the entire codebase was generated by Antigravity 2.0.
I also encountered some interesting challenges along the way:
- CI/CD Integration: I asked for a GitHub Actions pipeline. While basic test and lint steps worked fine, the agent struggled to get a complex
super-linterconfiguration passing. After several attempts, I decided to simplify the pipeline and skip the super-linter. - Structural Refactoring: As the codebase grew, I directed the agent to refactor the initial flat structure into clean controller, service, and view layers, which it executed seamlessly.
- UK English Refactor: In a fit of spelling consistency, I requested the project be refactored to use British/UK English. The agent performed the refactoring perfectly but also added a humorous note directly in the README warning contributors that the codebase strictly enforces British spelling.
Reflections on Antigravity 2.0
Vibe coding this project left me with two main takeaways:
1. Speed and Design are Outstanding
The velocity at which the agent spins up boilerplates, configures environments, and iterates on component files is incredible. Furthermore, the visual design of the React frontend was exceptional. The agent chose vibrant color schemes, harmonized layouts, and glassmorphic hover effects that looked significantly better than any interface I would have designed myself.
2. High-Level Direction remains Essential
While the agent is highly capable, it is not a mind reader. To build a premium tool rather than a minimum viable product, you need to act as an architect. Providing clear instructions on structuring folders, selecting libraries, defining E2E test scenarios, and calling out refactoring patterns is what separates a messy prototype from a clean, maintainable project.
What started as a rejected toy pad from CeX turned into a fantastic validation of agentic coding. If you have any old physical game hardware lying around, I highly recommend booting up an agent and seeing what you can vibe code to life.