This isn’t just another story about a dev who built something cool. This is about what happens when the rubber meets the road for real people trying to find a good deal on a $1 phở or a $0.50 coffee in Vietnam, and the often-invisible plumbing that makes it possible — or breaks spectacularly.
We’re talking about cheapmap.app, a project that shipped six months ago and is now seeing its user base climb. The core idea? To cut through the noise of Google Maps’ rating-obsessed algorithms and SEO-spam deal sites to deliver a community-driven guide to the best-value spots across Vietnam. It’s a map-first experience, augmented by live affiliate offers from major players like Shopee and Traveloka. Bilingual, cheap to run, and, critically, useful.
Why does this matter to you? Because the decisions made here—the architectural choices, the tech stack, the careful calibration of free-tier services—are the bedrock of every successful indie product. And when things go wrong, as they inevitably do, it’s the users who feel the friction.
The Unsung Hero: The Infrastructure Choices
At its heart, cheapmap.app is a proof to pragmatic engineering. The developer opted for a lean stack, consciously prioritizing cost-effectiveness and ease of maintenance for an estimated $30/month operation at 1,000 users daily. This meant sidestepping the allure of bleeding-edge frameworks for more established, predictable tools. Next.js 14 with its App Router handles the frontend, leveraging Incremental Static Regeneration (ISR) for SEO-heavy pages, a smart move for a content-driven application. Tailwind CSS and shadcn/ui provide a rapid styling solution, bypassing the need for a full-blown design system. For mapping, Mapbox GL JS was chosen over the ubiquitous Google Maps for its flexibility and a more generous free tier. State management is split between Zustand for UI and TanStack Query for server-side data fetching.
On the backend, a monolith approach reigns supreme with Spring Boot 3.2 on Java 21, utilizing virtual threads for concurrent operations. This choice, alongside a Supabase Postgres instance with PostGIS capabilities, keeps the operational overhead low. Redis from Upstash handles caching, and Cloudflare R2 manages image storage, crucially avoiding egress fees. Deployment? Vercel’s Hobby tier for the frontend and Railway for the backend, with Cloudflare for DNS and CDN. The total cost at 22 days in was a mere $15. This isn’t just cheap; it’s aggressively lean.
The big architectural call: monolith, not microservices. One Spring app, feature-based packages (
auth/,location/,deal/,ranking/), one database. I’ll extract a service the day traffic justifies it, not before.
This philosophy extends to the API layer, favoring REST over GraphQL for its simpler caching and client implementations. For an indie developer, these aren’t just technical choices; they’re survival decisions.
When Free Tiers Start to Sting
The first major shockwave came from Vercel’s ISR Writes. Within two weeks, the app was already hitting 50% of the monthly free-tier cap. With over 43,000 location pages, each potentially regenerating multiple times a day, the numbers quickly escalated. The culprit? Bot traffic, hitting the pages faster than anticipated. The solution was a strategic adjustment of the revalidate parameter across different route types. Critical pages like the daily deals hub kept a shorter revalidation period (6 hours), while less frequently updated location pages were extended to a full week. This wasn’t a bug fix; it was a nuanced tuning exercise, illustrating how platform-specific limits can dictate content update strategies. The estimated reduction in writes was staggering—around 85%.
The second breakthrough was more insidious, affecting the affiliate deals aggregator. Samsung’s product feed, funneled through AccessTrade Vietnam, was unexpectedly wrapped in Commission Junction (CJ) tracking URLs. This meant the deeplinkers, expecting a direct product URL, were instead receiving a redirect to a CJ hostname, triggering HTTP 500 errors. The issue wasn’t with the app’s logic but with the nested, opaque tracking mechanisms of affiliate networks. Unraveling this required deep-diving into the raw data feeds and understanding how different affiliate platforms interoperate—or, in this case, clash.
The Human Cost of Technical Glitches
And then there was the subtle UX erosion caused by an overly aggressive rate limiter. Implemented for security and cost control, it flagged legitimate users as bots based on shared IP addresses—a common issue in regions with widespread mobile carrier NAT. Imagine trying to find a cheap meal, only to be repeatedly blocked because you’re sharing an IP with a dozen other users. This isn’t just a technical bug; it’s a direct barrier to the very people the app is designed to serve. The fix involved a more granular approach, potentially whitelisting certain known entities or implementing user-specific rate limiting where possible, a complex balancing act between security and accessibility.
This project offers a potent reminder that shipping an app isn’t just about writing code; it’s about understanding the ecosystem. It’s about anticipating how external services will behave, how platform limits will impact growth, and how even well-intentioned security measures can inadvertently alienate your user base. For developers, this is the ongoing, often unglamorous, work of building resilient, user-friendly products in a world of interconnected, sometimes unpredictable, digital services.
What’s Next for Cheap Eats in Vietnam?
The trajectory is promising. With a solid, cost-effective foundation and a keen understanding of its operational challenges, cheapmap.app is poised to grow. The lessons learned here—about the criticality of infrastructure monitoring, the intricacies of affiliate marketing, and the delicate art of rate limiting—are invaluable for any developer venturing into the solo product space. The real story isn’t just the tech stack; it’s the relentless iteration required to keep the digital doors open for people seeking value.
🧬 Related Insights
- Read more: Ditching WordPress for EmDash: One Dev’s AI-Powered Rebuild and Why It Works
- Read more: [React/Next.js DoS Bug] Deno Deploy Users Safe, Others Patch Now
Frequently Asked Questions
What does cheapmap.app actually do?
Cheapmap.app is a crowdsourced mobile application that helps users find cheap restaurants, shops, and gas stations across Vietnam. It also aggregates affiliate deals from various online merchants.
How is this app different from Google Maps?
Unlike Google Maps, which prioritizes ratings, cheapmap.app focuses on price and value. It also integrates location-specific deals, which are often missing or poorly implemented on larger platforms.
Will this approach work for other regions?
The core concept of a community-driven, price-focused map and deals app could be adapted to other regions with similar needs. However, the success would depend on local market dynamics, user adoption for crowdsourcing, and the availability of relevant affiliate programs.