BD Travel Spirit Guide System
A full-stack platform for managing tour guide operations in Bangladesh, providing a public landing page for travelers and a role-based dashboard for Guides and Assistants to manage tours, bookings, reviews, employees, payments, and real-time communication.

Aug 2025 - July 2026
Next.js 16 (Beta)React 19TypeScriptMongoDBMongooseNextAuth.js v5Upstash RedisCloudinaryZustandTailwind CSS 4.0Radix UIFramer MotionRechartsReact LeafletSocket.IOStripe
Read-Only Credentials
Demo Credentials
sadiqul.islam.shakib1@gmail.comjEd$rjQM8aFeatures
- Server-rendered landing page with live stats hydrated from MongoDB
- Role-based authentication (Credentials + Google OAuth via NextAuth v5) with rate-limited login (Upstash Redis)
- Dashboard with KPI grids
- Recharts visualizations
- date-range filters
- and CSV export
- Multi-step tour creation wizard with lifecycle moderation (DRAFT → SUBMITTED → APPROVED → ACTIVE → COMPLETED/ARCHIVED/TERMINATED)
- Review management with threaded replies and approval gating
- Report triage with priority levels and bulk-resolve actions
- Employee management with payroll
- shifts
- and soft-deletion
- Stripe-based payment account linkage and refund handling
- Real-time notifications and chat via Socket.IO
Challenges
- Coordinating Cloudinary uploads outside MongoDB transactions to avoid the 60-second transaction timeout while still ensuring asset dedup/cleanup
- Designing a modular tour-update API (separate PATCH endpoints per schema section: bangladesh-fields
- logistics
- pricing
- gallery) to support a multi-step wizard
- Implementing role-based route protection and rate limiting via a shared proxy middleware (`src/proxy.ts`)
- Building a consistent error/response contract (`withErrorHandler`
- `ApiError`) across a large number of API routes
What I Learned
- Structuring a large Next.js App Router codebase with modular route handlers and shared builder/handler layers
- Using Upstash Redis for distributed rate limiting and caching in a serverless-friendly way
- Managing complex state with Zustand stores using TTL caching and in-flight request de-duplication
- Integrating Stripe payments alongside a custom refund/termination workflow

View Full Screen

View Full Screen

View Full Screen

