All projects
Own product

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
View live
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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

APB Resto