Paintball Invite: A Quick, Stylised Event Tool Built in a Rainy Afternoon
The Problem
My birthday's coming up. We're doing paintball. I had two potential dates—April 4th or 5th—and I needed people to commit and vote.
Could I have used Facebook events? Sure. Eventbrite? Obviously. But where's the fun in that?
Instead, I wanted something that felt like the event itself. Something with a bit of personality. Something that made people actually want to click and vote. Not a form. An experience.
So I built one in an afternoon.
The Stack (Deliberately Simple)
I kept this lean:
- Frontend: Single HTML file with vanilla JavaScript. No build tools, no framework overhead.
- Backend: Vercel Functions (one API route) + Vercel KV for vote persistence.
- Deployment: Deployed to Vercel (hit save, it goes live).
- Vibe: Dark purple glitch aesthetic, paintball splat animations, a Spotify track playing in the background.
That's it. No Next.js, no React, no database migrations. Just enough tech to do the job.
What It Does
- Splash screen — Full-screen intro with "IT'S MY BIRTHDAY YOU ARE INVITED" and an ENTER button that triggers the mood music.
- Event details — Location, date options, pricing breakdown.
- Live voting — Choose between two dates. Votes increment in real-time (stored in Vercel KV). One vote per session (localStorage check).
- Visual feedback — The splat animations trigger on every vote. Glitch effects on text. Cyberpunk energy.
- Shareability — Single static URL. No signups. No friction. Just send the link.
People click it. They vote. Done. And they see how many others voted for the same date.
Why This Approach Works
Speed: Built in ~2 hours. No overthinking. No design debt. No scope creep.
Personality: A standard event link is boring. This feels like the event. Chaotic, fun, paintball-coded in the UI itself.
Zero friction: No login. No email verification. No account creation. Click the link, vote, leave. That's all the UX you need.
Cheap to host: Vercel KV is pay-as-you-go. For a small event, it costs basically nothing. Function calls are free tier if you're under 100K/month.
Measurable: I can see vote counts in real-time. I know by day X if we're tilted toward April 4 or 5.
How to Steal This
If you want to build something similar:
-
Create a Vercel project with a single
api/votes.jshandler:import { kv } from '@vercel/kv'; export default async function handler(req, res) { if (req.method === 'GET') { const apr4 = (await kv.get('paintball-apr4')) || '0'; const apr5 = (await kv.get('paintball-apr5')) || '0'; return res.status(200).json({ apr4: parseInt(apr4), apr5: parseInt(apr5) }); } if (req.method === 'POST') { const { date } = req.body; if (!date || (date !== 'apr4' && date !== 'apr5')) { return res.status(400).json({ error: 'Invalid date' }); } const key = `paintball-${date}`; const current = (await kv.get(key)) || '0'; const newCount = parseInt(current) + 1; await kv.set(key, newCount.toString()); return res.status(200).json({ success: true, [date]: newCount }); } res.status(405).json({ error: 'Method not allowed' }); } -
Frontend is one HTML file — fetch the API, update the DOM, add event listeners. No build step.
-
Make it yours — Change colors, fonts, animations. Add your own song. Swap the event details.
-
Deploy — Push to Vercel. It's live in seconds.
The Design Details
Color scheme: Dark purple (#0f0621), bright accents (cyan, pink, lavender). Inspired by arcade cabinets and glitch aesthetics.
Typography: Monospace font (Courier New). Uppercase everything. Big letter spacing. Feels intentional, coded.
Animations:
- Glitch text effect on the title (clip-path shenanigans, pseudo-elements)
- Paintball splats burst on-screen with random trajectories when votes come in
- Hover effects with text shadows and scale transforms
- Glassmorphism cards with backdrop blur (because it's 2026 and we can)
Audio: A 30-second loop on repeat. Creates atmosphere without being annoying.
Why I'm Sharing This
This was a weekend tinker that solved a real problem. It's not groundbreaking. It's not a SaaS. But it's:
- Fast to build — If you're thinking about a project, sometimes you just need to build it.
- Easy to customize — No ejecting from a framework. It's plain JavaScript. Fork it. Remix it. Make it yours.
- Proven — Works. Ships. Does the job. No complexity you don't need.
A lot of engineers overthink event tools. We reach for the complex stack when a quick, scrappy solution would work better.
This is the scrappy solution.
The Irony
The coolest part? People don't care about the tech stack. They care about the experience. They click the link, they see the purple, they hear the music, they vote, and they think "oh, this person put thought into this."
That's the entire win. And you don't need a React monolith to do it.
Next
Once the event is done, I'll have data on which date won. I might build a quick results page. Or maybe a more generic "event vote" tool that anyone can use.
For now, this does exactly what it needs to.
Build fast. Ship weird. Let the personality shine through.
That's the whole thing.
Paintball Invite is live at paintball-invite.vercel.app. If you want to fork it and build your own event tool, the code is in my indigoNx workspace. No license, no gatekeeping. Just build.