── The Boomer Dev Docs ← Volver a la app

MEMORIA FUNCIONAL — HashtagLab

Producto: HashtagLab — Motor de sugerencia de hashtags con IA URL live: https://hashtaglab.theboomer.dev Frontend real (v1): code/src/frontend/ — React+Vite+Clerk (App.tsx, components/GeneratorForm.tsx, components/HashtagResults.tsx, components/PlatformSelector.tsx, types/api.ts) Frontend v2 (desplegado): code/hashtaglab-v2/ — landing genérica de plantilla (ver §7) Backend: FastAPI (code/src/backend/app/main.py, api/routes.py, models/schemas.py, services/hashtag_generator.py, core/rate_limiter.py); MongoDB (Motor); auth Clerk; billing vía tentpole-stripe-api Fuente: Documento generado a partir del código real del frontend v1 y del backend.


1. Introducción

HashtagLab genera conjuntos de hashtags optimizados para redes sociales a partir de un tema (y opcionalmente un nicho) y una plataforma objetivo. El motor devuelve una distribución estratégica en tres grupos: Relevantes (competencia media), Relacionados/Nicho (competencia baja) y Trending (competencia alta), en proporción 40/40/20. Cada hashtag incluye volumen estimado, nivel de competencia y categoría. La UI permite copiar hashtags individuales o todos a la vez, y avisa si el conjunto supera el límite de la plataforma.

Incluye: autenticación Clerk, cuota diaria por plan (anónimos 1/día, registrados free 3/día), límites por plataforma, caché de trends, 8 categorías, endpoints de billing Stripe y documentación de API (Scalar).

⚠️ Estado de despliegue: según el contexto del proyecto, el sitio live sirve actualmente hashtaglab-v2 (plantilla de landing genérica con hero/features/FAQ/CTA placeholder — ver §7). La aplicación funcional completa es el frontend v1 de code/src/frontend (con build en dist/) + el backend de code/src/backend. Esta memoria documenta el producto real (v1 + backend) y describe la v2 como estado desplegado.


2. Tipos de usuario

Tipo Acceso
Usuario anónimo Puede generar 1 set de hashtags/día (localStorage anon_hashtags + límite IP en backend). Tras la 1ª generación se abre el UpgradeDialog.
Usuario registrado (Free) 3 generaciones/día (FREE_REGISTERED_DAILY_LIMIT). QuotaBadge usados/límite en el header.
Usuario Pro / Enterprise Límites según plan (stripe-api); extra_rate para exceso con cargo; fallback a créditos bonus antes de rechazar.

3. Funcionalidades

F-101 Autenticación con Clerk

F-102 Formulario de generación (GeneratorForm)

F-103 Generación de hashtags

F-104 Visualización de resultados (HashtagResults)

F-105 Copiar todos los hashtags

F-106 Quota badge

F-107 Upgrade dialog para anónimos

F-108 Tendencias y catálogos (API)

F-109 Facturación (Billing)

F-110 Navegación y vistas


4. Pantallas (wireframes textuales)

P1 — Header

┌──────────────────────────────────────────────────────────────────────────┐
│ [# HashtagLab        ]  Generator | Historial | Facturación | Perfil    │
│  Generador de hashtags│                                        [2/3 ⬢free]│
│  con IA               │  [👤] [🌙☀️🖥] [EN ▾]  ó  [Iniciar sesión]       │
└──────────────────────────────────────────────────────────────────────────┘

P2 — Generator (grid 3 columnas)

┌───────────────────┬──────────────────────────────────────────────────────┐
│ Generator         │  ┌────────────────────────────────────────────────┐  │
│ ┌───────────────┐ │  │ (sin resultado)                               │  │
│ │ Topic or      │ │  │   #                                             │  │
│ │ Keyword       │ │  │   Generate Hashtags                            │  │
│ │ [input ______]│ │  │ "Enter a topic and select a platform to        │  │
│ └───────────────┘ │  │  generate optimized hashtags"                  │  │
│ ┌───────────────┐ │  └────────────────────────────────────────────────┘  │
│ │ Niche (Opt.)  │ │                                                    │
│ │ [input ______]│ │  ── o con resultado ──                             │
│ └───────────────┘ │  {topic} • {platform}            [📋 Copy All]     │
│ Target Platform   │  Generated Hashtags                           [×]  │
│ ┌────┐ ┌────┐     │  [# 21 hashtags]  [⚠ Over instagram limit (30)]   │
│ │📸  │ │💬  │     │  ── Relevant ───────────── (N)                     │
│ │IG  │ │X   │     │  [#fitnessmotivation] [medium] [📋]                │
│ └────┘ └────┘     │  ── Related (Niche) ──── (N)                      │
│ ┌────┐ ┌────┐     │  [#gymlife] [low] [📋]                             │
│ │💼  │ │🎵  │     │  ── Trending ───────────── (N)                     │
│ │LI  │ │TT  │     │  [#trending] [high] [📋]                           │
│ └────┘ └────┘     │                                                    │
│ (FB en 2ª fila)   │                                                    │
│ [✨ Generate       │                                                    │
│  Hashtags]        │                                                    │
│ [banner error rojo]│                                                   │
└───────────────────┴──────────────────────────────────────────────────────┘

P3 — Billing (Facturación)

P4 — UpgradeDialog (modal)

┌───────────────────────────────┐
│                          [×]  │
│             ✨                │
│   Desbloquea mas hashtags     │
│ "Crea una cuenta gratis y     │
│  obten 3 hashtags al dia!"    │
│   [G Iniciar sesion con Google]│
└───────────────────────────────┘

5. Flujos de trabajo

Flujo 1 — Anónimo genera hashtags

  1. Escribe el tema ("fitness") y pulsa "Generate Hashtags" (platform default Instagram).
  2. Spinner "Generating..." → panel de resultados: 3 secciones con badges de competencia.
  3. "Copy All" → pega los tags en su publicación.
  4. Tras la 1ª generación se abre el UpgradeDialog → registrarse (Free, 3/día) o cerrar (1/día por IP).

Flujo 2 — Usuario registrado con nicho

  1. Login → QuotaBadge 0/3.
  2. Tema "digital marketing" + Niche "tech" + plataforma LinkedIn.
  3. Genera → resultado (LinkedIn limit 10 en frontend; backend limita a 5 según MAX_HASHTAGS_LINKEDIN) → copia individual de los relevantes.
  4. El backend guarda la generación (counts) en MongoDB para el historial futuro.

Flujo 3 — Cuota agotada


6. Reglas de negocio

Distribución de hashtags (motor)

Límites por plataforma

Plataforma Backend (config.py) Frontend v1 (HashtagResults)
Instagram 30 30
Twitter 3 (MAX_HASHTAGS_TWITTER) 10
LinkedIn 5 (MAX_HASHTAGS_LINKEDIN) 10
TikTok 10 (MAX_HASHTAGS_TIKTOK) 25
Facebook no soportada por el backend (422) 30 (permitida en el formulario)

⚠️ Discrepancia detectada: el formulario v1 permite Facebook, pero el backend solo acepta instagram/twitter/linkedin/tiktok (Literal de Pydantic → 422). Además, los límites mostrados en el frontend (twitter 10, linkedin 10, tiktok 25) no coinciden con los del backend (3/5/10). El aviso "Over limit" del frontend usa los valores del frontend.

Cuotas diarias (stripe-api)

Validaciones

API (endpoints implementados)

Método Endpoint Descripción
POST /api/v1/hashtags/generate Generar hashtags (40/40/20)
GET /api/v1/trends/{platform} Trending por plataforma (caché Mongo)
GET /api/v1/platforms Plataformas soportadas + máximos
GET /api/v1/categories 8 categorías
GET /api/v1/auth/me Perfil (upsert usuario)
POST /api/v1/auth/sync Sync Clerk → Mongo
GET /api/v1/billing/pricing-plans Planes (cache Stripe)
POST /api/v1/billing/create-checkout-session Checkout
POST /api/v1/billing/create-portal-session Portal
GET /api/v1/billing/summary Resumen (guest → free)
POST /api/v1/billing/create-user-profile Crear customer Stripe
POST /api/v1/billing/webhook Webhook Stripe
GET /health Health check (Mongo ping)
GET /docs Documentación Scalar

Notas técnicas


7. Frontend v2 (hashtaglab-v2) — estado desplegado