No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Terminal de inteligencia de tendencias de moda — "Bloomberg para moda", en versión editorial y femenina. Cada tendencia cotiza con un score 0–100 derivado de señales de seis fuentes, su momentum y su ciclo de vida. Estado actual: catálogo de tendencias mock, feed editorial real. Las pantallas que se alimentan del seed llevan la etiqueta visible Datos de muestra; /editorial no la lleva porque sus titulares vienen por RSS de los medios.Read the full README ↗
Terminal de inteligencia de tendencias de moda — "Bloomberg para moda", en versión editorial y femenina. Cada tendencia cotiza con un score 0–100 derivado de señales de seis fuentes, su momentum y su ciclo de vida.
Estado actual: catálogo de tendencias mock, feed editorial real. Las pantallas
que se alimentan del seed llevan la etiqueta visible Datos de muestra; /editorial
no la lleva porque sus titulares vienen por RSS de los medios.
Mercado objetivo: LATAM con foco en México. Los links de compra cotizan en MXN (Shein, Zara México, Amazon México, Liverpool) y en USD (ASOS, Revolve, Nordstrom).
app/globals.css)npm install
npm run dev # http://localhost:3000 → redirige a /trending
npm run build # build de producción
npm run lint
npm run seed # regenera data/trends.seed.json (determinista)
npm run editorial # trae los feeds RSS y escribe data/editorial.cache.json
npm test # suite completa con node --test
npm run db:migrate # aplica el esquema a DATABASE_URL (o abre /api/admin/setup)
npm run db:seed # carga el catálogo en Postgres con origen mock
npm run golden # regenera el test de oro (solo si cambian pesos/umbrales)
Rutas:
| Ruta | Qué es | Datos |
|---|---|---|
/trending | Tabla de 25 tendencias con filtros | Mock |
/trends/<id> | Ficha: momentum, fuentes, dónde comprar | Mock |
/compare?a=&b= | Comparador A vs B | Mock |
/alerts | Emergentes: momentum 7d ≥ 3 y score < 60 | Mock |
/editorial | Titulares RSS cruzados con el catálogo | Real |
/edicion | Cinco prendas por domingo, con archivo | Mock + curado |
/fashion-week | Colecciones: looks, paleta y qué comprar | Curado |
/ocasiones | Boda, ski, playa, oficina y fiesta | Curado |
/paleta | Colores del catálogo por score | Mock + curado |
/ redirige a /trending.
Lo que se edita a mano vive en content/ y se lee con fs durante el build;
todas las páginas que lo consumen se prerenderizan, así que cambiar un archivo
de content/ requiere un nuevo deploy. El contenido pasa por git a propósito.
content/ediciones/YYYY-MM-DD.json Sobreescribe la edición de ese domingo
content/fashion-week/<slug>.json Una colección de pasarela
content/ocasiones/<slug>.json Una ocasión
content/paleta/<trend-id>.json Con qué combina ese color
Las combinaciones de /paleta se nombran por id de tendencia
(content/paleta/verde-matcha.json) y llevan una pareja de ejemplo cada una:
{ "pairs": [{ "trendId": "crochet-fino", "note": { "es": "…", "en": "…" } }] }
El orden del array es el orden en que se muestran. Un color sin archivo sale con "todavía sin combinaciones curadas" en vez de un hueco.
La edición semanal funciona sin archivo: se genera sola con las cinco
tendencias de mayor momentum entre SUBIENDO y EMERGIENDO de esa semana. El
archivo solo hace falta para cambiar la selección o escribir los textos; si
trae picks, reemplaza la selección automática, y lo que no venga cae en lo
generado.
Importante para componentes cliente: no importar valores desde un módulo que
lea fs. Los estilos por ocasión viven en lib/ocasiones-accent.ts separados
de lib/ocasiones.ts justo por eso — importarlos juntos arrastra node:fs al
bundle del navegador y Turbopack aborta el build.
Siete fuentes por RSS, cada una marcada con su idioma. Se parsean con
rss-parser, se cruzan contra los keywords de cada tendencia (nombre en ambos
idiomas, término de compra y sinónimos escritos a mano) y se guardan en un JSON
con TTL de una hora.
Siete fuentes, todas verificadas contra una corrida real:
| Fuente | Idioma | URL |
|---|---|---|
| Vogue México | es | https://www.vogue.mx/feed/rss |
| Glamour México | es | https://www.glamour.mx/feed/rss |
| Harper's Bazaar | en | https://www.harpersbazaar.com/rss/all.xml/ |
| Fashionista | en | https://fashionista.com/.rss/full/ |
| Vogue | en | https://www.vogue.com/feed/rss |
| WWD | en | https://wwd.com/feed/ |
| Who What Wear | en | https://www.whowhatwear.com/rss |
Una fuente que no responde no es gratis: cuesta su timeout en cada corrida y ensucia el contador de fuentes vivas. Estas dos se quitaron:
elle.mx/feed/, /rss). Si
aparece una URL que alguien haya visto funcionar, vuelve a FEEDS con idioma
es; el hueco de una tercera cabecera mexicana sigue abierto.npm run editorial imprime el estado de cada fuente: la que dé ERROR se quita
de FEEDS en lib/editorial.ts y se anota aquí.
El idioma de la fuente decide contra qué términos cruza el matcher:
lib/keyword-lang.ts clasifica cada keyword como es, en o both (los
préstamos puros —boho, matcha, crochet, oversize— van a los dos, porque la
prensa mexicana los usa igual). Así "wine red" deja de casar por casualidad
dentro de un titular en español. Si el filtro dejara a una tendencia sin ningún
término, se usan todos: vale más un match en el idioma equivocado que ninguno.
El caché no se versiona: data/editorial.cache.json está en .gitignore porque
es un artefacto de runtime. En Vercel el repo es de solo lectura, así que el
refresco escribe en el directorio temporal y la página usa además revalidate
de una hora.
This is the beginning of the README. Read the rest at the original. Read the full README ↗