Modern web development can make you feel like every small idea needs a full production stack before it deserves to exist.
A framework. A router. A bundler. A component system. A styling strategy. A content layer. A deployment adapter. Maybe a database, because apparently we all enjoy having responsibilities.
For Vexle, a small daily flag-drawing game, I went in the opposite direction.
The site is built with plain JavaScript, a tiny Node.js static generator, JSON content files, one HTML game fragment, and a browser canvas. The final output is just a dist folder that can be dropped onto Vercel or any static host.
And honestly? For this kind of project, it felt great.
The Product Shape
Vexle is a daily geography game. The player sees a country name, draws the flag from memory, then reveals the real flag and gets a rough match score.
That meant the site needed a few things:
- A playable first screen
- Fast loading
- Mobile-friendly drawing controls
- Local daily progress
- SEO pages like About, Privacy, and Terms
- Metadata, Open Graph tags, structured data, sitemap, and robots.txt
- A simple deployment story
What it did not need was a client-side app framework.
There is no complex state shared across routes. There is no authenticated dashboard. There are no deeply nested UI flows. The game is the app, and most of the surrounding site is content.
So the architecture became very boring in the best possible way.
The Architecture
The project is split into a few plain folders:
text
content/
home.json
game.html
pages/
about.json
privacy.json
terms.json
public/
app.js
styles.css
data/
game-data.json
scripts/
build-static.mjs
server.mjs
site.config.json
Top comments (0)