Nifty plans. Happy circles. - Private, trust-based trip planning for friend groups.
Tripti helps friend groups plan trips together through a progressive scheduling model that respects everyone's availability without requiring unanimous participation. The primary trip experience is the Command Center V2 — a chat-centric interface where coordination happens through conversation, system messages, and slide-in overlays for actions like scheduling, itinerary planning, and accommodation.
- Progressive Scheduling: Propose trip → Share date windows → Build support → Lock dates
- Chat-First Coordination: Trip Chat is the primary interactive surface; all decisions and nudges happen in context
- Circle-Based Groups: Private circles for organizing friend groups
- Date Windows: Travelers propose date ranges and signal support; leaders propose and lock when ready
- Collaborative Planning: Itinerary ideas, accommodation options, and prep tracking after dates are locked
- Lightweight Nudges: System messages in chat celebrate progress and clarify next steps without pressuring
- Privacy-First: Trust-based design where privacy never blocks collaboration
- Framework: Next.js 14 (App Router)
- Database: MongoDB
- Authentication: JWT
- Styling: Tailwind CSS + shadcn/ui
- Testing: Vitest (unit) + Playwright (E2E)
See SETUP.md for detailed setup instructions.
- Node.js 18+
- MongoDB (local or remote)
- npm or yarn
# Install dependencies
npm install
# Set up environment variables (create .env.local)
MONGO_URL=mongodb://localhost:27017
DB_NAME=tripti
JWT_SECRET=your-secret-key-here
CORS_ORIGINS=http://localhost:3000
# Start development server
npm run devVisit http://localhost:3000 to see the app.
npm run seedThis creates sample users, circles, trips, and discover posts. See SETUP.md for seed account credentials.
tripti-web/
├── app/ # Next.js app directory
│ ├── api/ # API routes
│ ├── globals.css # Global styles
│ ├── layout.js # Root layout
│ └── page.js # Main SPA component
├── components/ # React components
│ └── ui/ # shadcn/ui components
├── docs/ # Documentation
│ ├── api/ # API documentation
│ ├── features/ # Feature documentation
│ └── tests/ # Testing documentation
├── e2e/ # End-to-end tests (Playwright)
├── lib/ # Shared utilities
│ └── server/ # Server-side utilities
├── public/ # Static assets
│ ├── brand/ # Brand assets (logos, icons)
│ └── uploads/ # User-uploaded images
├── scripts/ # Utility scripts
│ └── seed-discover.js # Seed script
└── tests/ # Unit tests (Vitest)
npm run dev # Start development server
npm run build # Build for production
npm start # Start production server
npm run seed # Seed sample data
npm run test # Run unit tests
npm run test:watch # Run tests in watch mode
npm run test:e2e # Run E2E tests
npm run test:all # Run all tests- SETUP.md - Setup and installation guide
- date_locking_funnel.md - Date scheduling flow (current default)
- scheduling_mvp.md - Earlier scheduling model (historical reference)
- docs/ - Additional documentation
docs/api/- API endpoint documentationdocs/features/- Feature specifications and guidesdocs/NUDGE_ENGINE_SURFACING.md- Nudge engine architecture notes
Trips progress through explicit stages:
- Proposed — Trip created within a circle, broad intent established
- Scheduling — Travelers share date windows and signal support
- Locked — Leader locks dates; planning begins
- Itinerary — Ideas collected, itinerary generated (LLM-assisted)
- Stay — Accommodation selected
- Prep — Transport, packing, documents organized
- Ongoing — Trip dates are active
- Completed — Trip has ended
- Sharing date windows is not a commitment
- Only locking dates represents commitment
- The system can progress without unanimous participation
Tripti uses lightweight system nudges in chat to celebrate milestones and clarify next steps. For example, when the first person shares their availability or when dates are locked, a short system message appears in the trip chat. Nudges are informational and non-blocking — they never pressure or shame.
- Private groups for organizing friend trips
- Circle-scoped content and discover posts
- Circle owners have management privileges
- No email or push notifications: All updates happen within the app via chat polling
- Discover feed: May be empty for new users until posts are created
- Dates are final: Once locked, dates cannot be unlocked (MVP constraint)
- Single leader: Each trip has one leader who can transfer leadership
- Frontend: Dashboard at
app/dashboard/page.js; trip detail via Command Center V2 (components/trip/command-center-v2/) - API: Centralized in
app/api/[[...path]]/route.jswith dedicated routes for specific features - Server Utilities: Shared helpers in
lib/server/
- Unit tests:
tests/directory (Vitest) - E2E tests:
e2e/directory (Playwright) - See
docs/tests/for testing documentation
- Follow the existing code patterns
- Maintain backward compatibility for API endpoints
- Add tests for new features
- Update documentation as needed
Private project