Inspiration

Web game portals like CrazyGames and Poki reject games for things that have nothing to do with fun: a build that is too big, a link to another site, gameplay events fired twice, a freeze the developer never reached. My jam game Trash Talk (8th of 126 at Mini Jame Gam #60) is a 7.8 MB Unity WebGL build made for itch.io. Getting a game like that onto a portal means a checklist nobody shows you until the rejection email.

What it does

Portal Gate puts that checklist into GitLab and gives the follow-up work to Duo agents. The game it looks after, Gate Hop, is a small lane-dodging game built for this entry.

Every push runs type checks, unit tests, a build, and a headless bot that plays the game as a desktop and a phone player and fails on console errors, outside requests, a slow first frame, low FPS or a broken retry. A portal check covers the mechanical rules, next to GitLab SAST, secret detection and dependency scanning, and a carbon budget per play. The build is zipped for portals into the Package Registry, and tags become Releases.

Three custom Duo flows do the rest:

  • Compliance Review posts PASS or FAIL against a portal-rules skill on every merge request. On day one it caught a freeze at score 50 that the 25-second bot never reached, by reading the code, and gave the one-line fix.
  • Bug Triage turns a player report into labels, repro steps and the suspect code, then its fixer opens a draft merge request.
  • Release Captain reacts to pipelines: a read-only investigator finds the cause, a reporter files the issue, an incident, or a readiness report with patch notes and a GO/HOLD call, and a fixer proposes small fixes. Agents never merge or deploy.

How I built it

TypeScript, Vite and canvas for the game; Playwright for the bot; GitLab CI/CD; three custom flows on GitLab Duo Agent Platform with triggers on pipeline, merge request and work item events; project skills for the portal rules. Built with Claude Code.

Challenges

The triage trigger only passes the issue number, so the first run guessed the wrong project; flows began triaging each other's issues; the pipeline never counted as "passed" while waiting for the human deploy gate. Each one is fixed and visible in the history. The hackathon group protects every deploy environment, so the Pages deploy job could not be started from my role.

What I learned

A bot that plays and an agent that reads catch different bugs, and a game needs both.

Built With

Share this project:

Updates

Submission history