I went from being Movie Master’s first Facebook Marketplace customer to building the storefront, browser
game, analytics, and leaderboards for his movie recommendation business.
Role
Sole developer Design + implementation
Core stack
HTML, CSS, JavaScript Cloudflare Workers + D1
Delivery
GitHub Pages GitHub Actions
Current scope
Dozens of paid orders 2 game modes
Movie Master visual identity
01 / Origin
I started as a customer.
I found Robert Cravens selling personalized movie recommendations on Facebook Marketplace, bought a
package, and kept talking with him. I was his first customer. Before long, I was helping with the brand,
the rules, the purchase flow, and the website.
I started developing the site in July 2026 and am its sole developer. Robert contributes many ideas.
Part of my job is working through those requests with him: explaining when a feature would make the
site harder to use, suggesting alternatives, and agreeing on what to build.
The service was memorable but scattered across listings and messages. Customers needed one place to see
the $5, $10, and $20 packages, understand how the recommendations worked, and contact Robert. He needed a
site he could point to without becoming the person who maintained it.
Our conversations became the product backlog. A failed QR-code handoff made the need for a site clearer.
Unusual customer requests turned into genre and refund rules. Mobile tests changed the navigation and
purchase links. Robert’s reaction when his contact information looked less prominent led me to make that
path much clearer.
What I was working with
Hosting had to cost almost nothing.
Robert is nontechnical, and requirements arrived through ordinary conversation.
Customers needed a straightforward experience on phones and computers.
The site had to sound and look like Movie Master, not a generic online service.
New backend features could not make the basic storefront less reliable.
02 / Product decisions
I kept the first version static.
The first version had no reason to use a framework or database. Plain HTML, CSS, and JavaScript gave me
a fast site with free hosting and very little to maintain.
01
Make it feel like Movie Master
Robert wanted the site colorful, inviting, theatrical, and impossible to miss. I organized the
content around that style. I also designed the
Movie Master T-shirt, so the type and colors had to work beyond a single web page.
02
Stay static where possible
GitHub Pages serves the storefront and game. There is no application server to pay for, monitor, or
restart, and the main site remains available if an API request fails.
03
Use a small backend
Visitor counts and public scores needed shared data. I added a Cloudflare Worker and D1 database for
those features instead of rebuilding the rest of the site.
04
Keep tracking out of the way
Analytics helps me understand how people use the site, but it is not part of the game. Failed
tracking requests are ignored so they cannot interrupt a run.
Browser loads HTML, CSS, JavaScript, and images from GitHub Pages.
Browser sends scores and analytics directly to the Worker API, which reads and writes Cloudflare D1.
Seeing what people actually use
The analytics dashboard brings site traffic and game activity into one place. I can compare visitor
trends, games played, and the split between Standard and Hardcore instead of relying on a hit counter
alone. It gives me a way to follow what happens after a feature goes live.
The public analytics overview, captured September 15, 2026. The live dashboard also includes traffic charts and game statistics.
03 / Game + leaderboards
The hidden game became a project of its own.
I added a small popcorn-catching game as an Easter egg. It was fun to work on, so I kept going. The game
now has two modes, saved records, controller support, analytics, and public leaderboards.
A continuous update and render loop handles movement, collisions, projectiles, power-ups, difficulty,
pausing, and local statistics. Standard and Hardcore modes use the same core systems but apply different
rules when the player misses popcorn or takes a hit.
Input took more work than I expected. Keyboard, pointer, and gamepad controls each behave differently.
The controller code filters out stick drift with a dead zone. If the active controller disconnects, the
game pauses instead of leaving the player stuck in a live run.
Leaderboards without a login screen
Requiring accounts would have been too much friction for a small browser game. The browser keeps an
anonymous player ID and the name the player entered. The Worker validates names and scores before they
appear on the daily or all-time boards. After a run, the game can also show the scores directly above and
below the player.
The public boards introduced backend problems the original game did not have. Scores need server-side
checks, names need moderation, old runs need migrations, and ties need consistent ranks. I added rate
limits, replay protection, score receipts, profile-based renaming, and daily and all-time views while
keeping the player flow short.
Measure before optimizing
The benchmark suite (opens in a new tab)
covers 26 deterministic scenarios, from an empty scene to extreme entity counts. It exercises collision
checks, controller polling, rendering, and full updates, so changes can be compared against repeatable workloads.
The game’s start screen. Players can choose a mode, check the controls, or open the leaderboards before a run.
04 / Iteration
Most of the roadmap came from using the site.
I did not plan the finished system at the beginning. Each stage answered a current problem. The offer
needed to be clearer. Robert wanted his contact information easier to find. The mobile layout needed
work. I wanted real visitor numbers. Players wanted more reasons to return. Public scores then introduced
validation and moderation work.
Static business sitePut the packages, rules, testimonials, and contact options in one place.
Responsive rebuildReworked navigation, testimonials, contact details, purchase links, and phone layouts after real use.
Browser gameAdded the game loop, three control methods, two modes, progression, and saved records.
Visitor and game analyticsAdded the Worker and D1 once visitor counts and game data needed shared storage.
Public leaderboardsAdded daily and all-time scores, player names, validation, migrations, and backend tests.
05 / Outcome
Where the project stands.
The Movie Master site has handled dozens of paid orders. Robert has one clear link for the business, and players
have a complete browser game with saved records and public competition. The storefront remains static,
while the Worker handles visitor data, game analytics, player records, and public scores.
Once the site launched, the work changed. I had to translate conversational requests into product
decisions, diagnose problems I did not anticipate, and decide when a new service was useful enough to
justify the extra code.