Vibe
Experience and event marketplace with swipe-based discovery, QR ticketing and real payments.
- Role
- Full-stack developer · Software architect
- Year
- 2026
- Status
- In production
- Client
- Own product
- 5
- applications
- ~38,000
- lines of code
- 88
- REST endpoints
- 22
- domain entities
Overview
Vibe is an experience discovery platform built around a card-deck interaction: users discover events by swiping, save the ones they like and buy tickets inside the same app. On the other side, businesses get a self-service portal to publish experiences, sell tickets, subscribe to plans and analyse their audience through a business intelligence dashboard. I designed and built the entire system: domain model, API, web app, native mobile apps, payment integration and the AWS deployment.
Context
The problem
Discovering local events was fragmented across Instagram, WhatsApp groups and word of mouth. Businesses had no way to measure real audience interest, and users had no single place to find what to do.
The solution
One product solving both sides: a fast, visual discovery experience for users, and a layer of actionable data plus monetisation for businesses. Five applications on a single API: web app, landing page, user mobile app, door-validation app and back office.
What it does
Discovery engine
A card deck generated dynamically from the database, with a feed personalised by the interests declared during onboarding. Swipe right to save and open contact channels, left to dismiss, and rewind to undo. Every interaction is recorded as an analytics event.
QR ticketing
Purchase through Mercado Pago Checkout, issuing a signed QR pass tied to the user, ticket transfers between users via an initiate → claim flow with a single-use token, and door validation from the Vibe Partner app with double-scan protection and per-partner staff roles.
Payments and subscriptions
Two distinct flows on Mercado Pago: partner subscriptions through the Preapproval API with automatic monthly billing and quota-limited plans, and ticket sales with centralised collection and later settlement. Webhooks are signature-validated and processed asynchronously and idempotently.
Business intelligence dashboard
Every partner gets real audience metrics: demographics by gender and age range of the people who saved their experiences, psychographics with their audience's most frequent interests, and a heatmap of peak interaction days and hours.
Growth system
Boosts for featured visibility on a specific experience, referral codes tracking sales per sales agent, and curated billboard slots inside the feed.
Admin panel
A complete moderation and operations back office: partner approval, user management and suspensions, bulk experience creation via CSV import, interest management, content report review and manual subscription assignment.
Technical decisions
- 01
Layered clean architecture on the backend
Dependencies point inwards: controller → usecase → service ↔ repository → entity. Interfaces are inverted through string-token injection, which lets infrastructure implementations be swapped without touching business logic. One controller per endpoint keeps files small and each change's diff contained.
- 02
Swappable infrastructure drivers
Storage sits behind a StorageDriver interface with two implementations — local filesystem for development, S3 for production — selected by environment variable. The same pattern applies to mailer and payments. This let me build the whole product without depending on cloud services and migrate to AWS without refactoring any of the domain.
- 03
ECS Fargate over Lambda or fixed EC2
Traffic is irregular: silence most of the time and spikes of thousands of concurrent users during an event's ticket sale. Lambda was ruled out because of cold starts with NestJS; fixed EC2, because of paying for idle capacity. Fargate scales in seconds and drops back to minimum automatically.
- 04
Aurora Serverless v2 + RDS Proxy
The database scales by ACUs following the same variable-cost logic, and the proxy prevents a spike of concurrent requests from exhausting the connection pool.
- 05
Mercado Pago over Stripe
Stripe does not operate in Argentina without a foreign entity. Mercado Pago has near-universal penetration locally and offers exactly the two APIs the product needs: Preapproval for subscriptions and Checkout for tickets.
- 06
Concurrency and idempotency
Capacity control preventing overselling under simultaneous purchases, and idempotent webhook processing: Mercado Pago can resend the same event and the payment is credited only once.
Stack
Backend
- NestJS 10
- TypeScript 5.7
- TypeORM
- PostgreSQL 16
- JWT + Passport
- Google Sign-In
- Zod / class-validator
- sharp
- Nodemailer
- Swagger
- Jest
Web
- Next.js 15
- React 19
- Tailwind CSS
- TanStack Query v5
- React Hook Form + Zod
- Framer Motion
- Axios
- Vitest
Mobile
- Flutter 3.5
- Dart
- Riverpod 2
- go_router
- Dio
- flutter_secure_storage
- mobile_scanner
Infrastructure
- AWS ECS Fargate
- Aurora Serverless v2
- RDS Proxy
- S3
- ALB
- CloudFront
- ECR
- VPC
- Netlify
- Docker
Next project