Inspiration

As someone who loves exploring new places, I've always struggled to find a single platform that connects all the amazing experiences happening around me. You have to check Instagram, scroll through multiple vendor pages, ask friends for recommendations, it's fragmented and frustrating. I also noticed that no platform in Nigeria uses AI to help people discover outings tailored to their preferences. That's why we built Resisen; to bridge the gap between fun seekers and experience providers, and make discovering your next adventure effortless.


What it does

Resisen is a centralized marketplace where users can discover, save, and book unique experiences across the world from cultural tours and food adventures to nightlife and wildlife encounters.

For fun seekers:

  • Browse curated experiences by destination, category, or price
  • Get AI-powered recommendations based on your vibe ("art, coffee, romantic evening")
  • Save favorites to your wishlist
  • Build AI-sequenced itineraries with unlockable checkpoints

For experience providers:

  • Apply with Company documentation and business details
  • Get approved by admin, then list and manage experiences
  • Track bookings and update statuses in real-time

For admins:

  • Review and approve provider applications
  • Manage destinations and platform content
  • Access dashboard analytics

How we built it

Backend: Express 5 with TypeScript, running on Node.js. AWS DynamoDB for the database (single-table design) with JWT authentication and Zod for request validation. AI features (experience recommendations and itinerary sequencing) are powered by Amazon Bedrock (Claude). API documentation is fully OpenAPI 3.0 compliant with Swagger UI.

Frontend: Next.js 15 with React, Tailwind CSS for styling, and Framer Motion for animations. Used React Context for state management and react-international-phone for phone input. The design system uses a custom glass-morphism aesthetic with responsive layouts and smooth transitions.

Infrastructure: The app is containerized with Docker for easy deployment. Backend runs on port 5000, frontend on 3000. Environment variables manage AWS credentials, JWT secrets, and Bedrock configurations.


Challenges we ran into

  • DynamoDB single-table design — Designing the key structure (PK/SK) and four GSI indexes to support all access patterns was complex. We had to carefully plan entity key patterns and query strategies.
  • Amazon Bedrock integration — Getting Claude to work reliably required using cross-region inference profiles (not the plain model IDs). We implemented graceful degradation so AI features fail silently if Bedrock is unavailable.
  • Provider application workflow — Building the admin approval flow with status transitions (pending → approved/rejected) needed careful validation to prevent invalid state changes.
  • Responsive auth forms — Making the signup form conditionally show provider fields based on role selection, while keeping it fully responsive, required thoughtful mobile-first design.
  • DynamoDB Local setup — Testing locally required configuring endpoints and credentials correctly for offline development.

Accomplishments that we're proud of

  • AI-powered discovery — Successfully integrated Amazon Bedrock to recommend experiences and build sequenced itineraries based on natural language prompts.
  • Complete provider onboarding flow — From application with CAC verification to admin approval and experience management.
  • Clean architecture — Separation of concerns with repositories, middleware, and validators made the codebase maintainable and scalable.
  • Beautiful, responsive UI — Consistent design language with glass-morphism, animations, and seamless mobile experience.
  • Production-ready API — Fully documented with OpenAPI 3.0, Swagger UI, and comprehensive error handling.
  • Complex DynamoDB queries — Implemented cursor-based pagination, filtering by category/price/destination, and efficient GSI lookups.

What we learned

  • DynamoDB single-table design requires thoughtful planning — you need to design for your access patterns upfront
  • Amazon Bedrock integration needs inference profiles for newer models; plain model IDs won't work
  • Building an admin review workflow adds significant complexity but is essential for trust and quality
  • AI features can be a "nice-to-have" — gracefully degrading when unavailable keeps the core product working
  • TypeScript + Zod provides excellent type safety and validation, catching errors early
  • The provider application process (with CAC, company details) mimics real-world business verification — making it practical for production use

What's next for Resisen

Payment integration — Add Paystack/Flutterwave for secure, in-app payments with booking confirmation.

Multi-currency & localization — Support USD, EUR, and other currencies with multi-language support (English, French, Geman e.t.c).

Multi-payment channels — Enable bank transfers, cards, USSD, and wallets for maximum accessibility.

Reviews & ratings — Let users rate experiences and providers to build trust.

Provider mobile app — Dedicated mobile app for providers to manage bookings and listings on the go.

Advanced AI — Personalized recommendations based on user history, preferences, and real-time availability.

Social features — Share itineraries, create group bookings, and follow favorite providers.

Analytics dashboard — Help providers understand their performance, booking trends, and customer demographics.


Quick Demo Links


Share this project:

Updates