Inspiration
Every neighborhood has small problems that never get properly tracked — a broken street light, a pothole, overflowing trash. Residents notice these issues daily, but there's rarely a simple, transparent way to report them and let the community itself decide what's most urgent. Existing solutions are either too formal and slow (official government portals) or too informal to track (messages scattered across WhatsApp groups that get lost within days).
We wanted to build something in between: as easy to use as sending a message, but as trackable and transparent as an issue tracker. That's where the idea of treating civic problems like GitHub Issues for your neighborhood came from — report it, let the community vote on urgency, and track it to resolution.
How We Built It
We built FixIt with a Go backend (Fiber framework) and SQLite for fast, dependency-free data storage, paired with a React (Vite) frontend styled with Tailwind CSS.
The core of the product is three connected data models:
- Report — the issue itself: title, description, category, photo, and a location dropped directly on an interactive map
- Upvote — one vote per device (tracked via a randomly generated device token in
localStorage, so no login is required), which powers community-driven ranking in the feed - StatusLog — an append-only history of every status change, so nothing gets silently updated without a trace
On top of this core loop, we layered features that improve trust and usability without adding backend complexity: a map-based location picker (so coordinates are always precise), a "Near Me" filter using GPS, comments for social proof, an image lightbox, a one-click share button that just copies a link to the clipboard, and small "Trending"/"Just Reported" badges to help people scan the feed quickly.
For the visual identity, we deliberately chose a neo-brutalist design system — thick black borders, hard offset shadows, flat high-contrast colors, zero border-radius — instead of a generic soft-UI template. It matches the personality of the product: direct, honest, no decoration for decoration's sake.
Challenges We Ran Into
The biggest challenge was scope control under a hard time limit. It was tempting to start building "nice to have" features early, so we forced ourselves to lock down a strict priority order: the core loop (report → vote → track status) had to be fully working end-to-end before touching anything else.
Another challenge was designing a vote-limiting mechanism that's simple enough to build in hours but still prevents obvious abuse — without requiring full user accounts. We solved this with a lightweight device-token approach: no login friction for users, but still enough to enforce "one vote per device, per report."
Keeping the neo-brutalist design consistent across every component was also harder than expected — it's easy for a bold style like this to turn into visual noise if border widths, shadow offsets, and spacing aren't disciplined across the whole app.
What We Learned
We learned how much product value can come from a single well-designed mechanism — in this case, upvoting — rather than piling on more features. It's the one thing that turns FixIt from "just another form-and-list CRUD app" into something that actually reflects community consensus.
We also learned the value of ruthlessly cutting scope: deliberately skipping full authentication, cloud storage, and real-time sync (WebSocket) let us ship a fully working, polished core product instead of several half-finished features.
Built With
- fiber
- go
- javascript
- react
- rest-api
- sqlite
- tailwindcss
- vite
Log in or sign up for Devpost to join the conversation.