Inspiration

Tourists coming to Cambodia not being able to find landmarks or hidden places that they know never existed. That is why we came up with an application that shows all of them.

What it does

TesJor is the complete guide to exploring Cambodia. We cover everything - from world-famous landmarks like Angkor Wat to the Hidden Gems that most tourists miss. Whether it’s a popular temple or a secret village, our platform connects tourists to the best Places to visit. We also complete their journey by recommending local Events, Food, Drinks, and Souvenirs they should try along the way. We are the one-stop platform for truly knowing Cambodia.

How we built it

TesJor is a full-stack web app built with Next.js 16 (App Router) and React 19 in TypeScript, deployed on Vercel.

Backend & data

Drizzle ORM on Neon serverless Postgres stores our curated Hidden Places, Foods & Drinks, Events, and Souvenirs, along with verification status for each listing better-auth handles user authentication Zod validates data across API routes Upstash Redis + @upstash/ratelimit protect our endpoints from abuse Winston for structured logging

Discovery & content

Google Maps JavaScript API powers location-based discovery — the core of getting travelers from an inspiring photo to an actual pin on the map Cloudinary (via next-cloudinary) stores and optimizes photos of every place, dish, and souvenir we verify Infinite-scroll browsing (react-intersection-observer) keeps the "Experience-First" feed continuous instead of paginated, so discovery feels like scrolling a feed rather than searching a directory

Frontend & UX

Tailwind CSS 4 with shadcn/ui-style components built on Radix UI primitives (dialogs, tabs, dropdowns, etc.) for a consistent, accessible design system lucide-react for icons, next-themes for light/dark mode, and small delight touches (sonner toasts, canvas-confetti) for moments like a verified discovery

Process We designed the UI in Figma first — separate flows for the traveler-facing app and an internal admin dashboard for verifying and managing listings — then built it component by component, keeping the Postgres schema (migrated via drizzle-kit) in sync as features landed. The result is a live, working prototype at tesjor.bunsou.com.

Challenges we ran into

Collecting data on the location of the places in Cambodia was the most challenging part as we had to go around and ask the locals for information on the location, and history about those specific location

Accomplishments that we're proud of

We shipped a real, working prototype — not just mockups — with live auth, a database, image hosting, and maps, deployed and reachable at tesjor.bunsou.com. We built two coherent products in one: a traveler-facing discovery app and a separate internal admin dashboard for verifying and managing listings, which is what actually makes "every location is verified" a credible claim rather than a slogan. We designed a single, flexible content model that treats Places, Food, Events, and Souvenirs consistently, so adding a new category later won't mean rebuilding the app. We turned a slogan — "Experience-First" — into an actual UX pattern (image-led, infinite-scroll discovery) rather than just a search bar with filters.

What we learned

Design the data model for the idea, not the first feature. Needing a schema migration partway through taught us to think about all four content types up front next time, not just the one we started with. "Hidden gems" is a data problem before it's a product problem. The hardest part of TesJor isn't the app — it's sourcing and verifying places that have no digital footprint yet. Mobile isn't a checkbox, it's the primary surface. Multiple optimization passes told us this should have been the default target from day one, not an afterthought.

What's next for TesJor

A Trip Planner, bundling verified hidden gems, food, and events into ready-made multi-day itineraries — turning "here's a cool place" into "here's your actual 7-day route." Direct bookings and merchant partnerships (homestays, tour guides, local eateries) so TesJor earns revenue by connecting travelers to transactions, not just information — and so verified businesses get real economic benefit, not just visibility. Multi-language support, especially for Cambodia's largest inbound markets (Chinese, Korean) alongside English, since the discovery-gap problem hits non-English speakers even harder. Scaling verification through partnerships with local tourism boards, NGOs, or community reps, since manual verification is our biggest bottleneck to growing beyond a handful of provinces.

Built With

Share this project:

Updates

Submission history