- Backend must be PHP. Any framework (or none) is still fine.
- Persistence must be a real database (e.g. MySQL, PostgreSQL, SQLite) — not cookies or local storage. This applies to how your backend stores games, votes, and daily-limit tracking. Cookies or local storage may still be used only to identify which user is acting, as described in Business Rules below.
- Your submission must be self-contained and runnable locally with a working
docker-compose.ymlthat reviewers can run withdocker-compose up. A deployed URL is welcome in addition, but is no longer an acceptable substitute for the docker-compose path. - Your entire AI chat transcript must be included in the submission — not just a link.
Overview
Our team wants a simple way to collect and vote on games we'd like to add to the office library. Employees should be able to suggest new titles and vote on the ones they want most. Your job is to build that app.
This challenge evaluates how you structure a small full-stack application, how you integrate with an external API, and how you make deliberate product decisions. It should take a reasonable amount of focused time — quality of thought matters more than feature count.
What You'll Build
A full-stack web application with two parts:
- Frontend — the user interface employees interact with in their browser.
- Backend — your own server that talks to our REST API for persistence and enforces any business rules you add.
Your backend consumes the Essense of Australia Code Challenge API. See the full endpoint reference at /docs. Generate your API key at /api-key.
Requirements
- Display every game in the library, sorted by vote count (highest first).
- Let a user add a new game by title. Duplicate titles (case-insensitive) must be rejected by your backend.
- Let a user vote for a game.
- Let a user remove a vote they've cast.
- Let a user remove a game from the list.
- Every screen must work well on both mobile and desktop.
- Errors (network failure, validation failure) should be surfaced to the user in a friendly way — no silent failures.
- Styling, routing, and testing choices are yours to make. If you add tests, we'll look for whether they cover the things that actually matter rather than 100% coverage for its own sake.
- Frontend stack (suggestion-only): TypeScript and React.
Business Rules
- A user may cast one vote OR add one new game per day (midnight to midnight, their local time is fine). How you identify a "user" is up to you — cookies, local storage, or a simple auth layer are all acceptable. Our API doesn't enforce this, so your backend must. Updated: identifying the user this way is still fine, but tracking and persisting that limit (and all game/vote data) must go through a real database, not cookies or local storage — see Submission Requirements.
AI Tools
Using AI assistants like Claude or ChatGPT is strongly encouraged. We want to see how you work with them — not whether you work without them.
If you use AI, keep your work in a single session. Treat AI output the way you'd treat a code review from a junior developer: read everything, question assumptions, and don't ship what you don't understand.
Submission
When you're done, send us:
- A link to a public GitHub repository with your code.
- A working
docker-compose.ymlin the repo so reviewers can run it locally withdocker-compose up. Updated: this is now required for every submission — a deployed URL alone is no longer sufficient. See Submission Requirements. A publicly accessible deployed URL is still welcome in addition. - Your entire AI chat transcript, included directly in the submission.
A short README.md explaining how to run the app and what decisions you made is required.
Evaluation
Reviewers will look at:
- Code quality, structure, and readability
- UX and UI polish — does it feel considered?
- Correct and idiomatic use of our REST API
- How thoughtfully you implemented the daily vote rule
- Error handling and edge-case awareness
- Your AI-tooling conversation