尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Red social white-label multi-tenant para comunidades latinas en EE. UU. Cada tenant es un dominio propio con su marca (logo, color, módulos), sobre una única base de código y una única base de datos con aislamiento por RLS. Tenant piloto: dominicanos (Queens, NY).
El corazón del producto es el wedge de vivienda verificada anti-estafa: avisos de alquiler con Trust Score, Escudo Anti-Estafa (verificador + reportes comunitarios), mensajería con contacto protegido y guías SEO para recién llegados.
| Capa | Tecnología |
|---|---|
| Framework | Next.js 16 (App Router, src/, TypeScript estricto) |
| Estilos | Tailwind CSS v4 (tokens en globals.css vía @theme) |
| DB / Auth / Storage / Realtime | Supabase (Postgres 17, RLS FORCE en 23+ tablas) |
| Pagos | Stripe (Checkout + Identity + webhooks) |
| Resend | |
| IA | OpenAI (moderación omni-moderation + RAG con embeddings) |
| Observabilidad | Sentry |
| PWA | Serwist (service worker, offline) |
| Tests | Vitest + Testing Library |
Documentos rectores: docs/ARQUITECTURA.md (contrato técnico), docs/PLAN_MAESTRO.md (estrategia), docs/PROGRESS.md (estado), docs/investigacion/13-diseno-ux-premium.md (design system — rige tal cual).
npm install
cp .env.example .env.local # completar BLOQUE A como mínimo (ver docs/SETUP-ENV.md)
npm run dev # http://localhost:3000 (?t=<slug> para cambiar de tenant)
| Script | Qué hace |
|---|---|
npm run dev | Servidor de desarrollo (Turbopack; service worker deshabilitado en dev) |
npm run build | Build de producción — next build --webpack (Serwist necesita webpack para emitir public/sw.js) |
npm run start | Sirve el build de producción |
npm run test | Tests con Vitest |
npm run lint / npm run typecheck | ESLint / tsc --noEmit |
npm run check:rls | Enumerador RLS: verifica que ninguna tabla quede sin políticas (correr tras cada migración) |
npm run db:migrate | Aplica migraciones de supabase/migrations/ |
npm run db:seed | Siembra tenants demo + contenido de ejemplo |
npm run rag:embed | Genera embeddings del contenido para el asistente RAG (requiere OPENAI_API_KEY; lo agrega el módulo de IA) |
src/
├─ middleware.ts # Resolución de tenant por dominio + refresh de sesión Supabase
├─ app/
│ ├─ (marketing)/ # Landing pública + guías SEO
│ ├─ (auth)/ # Entrar, registro, onboarding
│ ├─ (app)/ # App autenticada: feed, propiedades, escudo, mensajes, perfil…
│ ├─ admin/ # Paneles global / dominio / moderación
│ └─ api/ # Webhooks (Stripe) + crons (protegidos con CRON_SECRET)
├─ components/ # ui/ (design system), trust/, listings/, feed/, shell/…
├─ lib/ # supabase/, tenant/, config/services.ts (degradación), rate-limit/, i18n/…
supabase/migrations/ # SQL versionado (RLS FORCE, triggers, RPCs)
scripts/ # rls-enumerator, seed, apply-migrations, generate-icons
Todo está documentado en .env.example (por bloques: A = imprescindible, B = antes del primer usuario real, C = puede esperar) y en docs/SETUP-ENV.md con el paso a paso de cada servicio.
Reglas de oro:
NEXT_PUBLIC_* se expone al navegador → jamás un secreto ahí.SUPABASE_SERVICE_ROLE_KEY, STRIPE_SECRET_KEY, OPENAI_API_KEY viven solo en el servidor.src/lib/config/services.ts): la feature muestra un estado premium "muy pronto", nunca un error crudo.tenant_id del JWT es la frontera real de aislamiento. npm run check:rls lo verifica.src/lib/rate-limit/, in-memory; migrar a Upstash con multi-instancia).next.config.ts: HSTS, X-Frame-Options: DENY, CSP (hoy en Report-Only; pasa a enforcing tras validar en staging).Según Plan Maestro §5.2 / §14.4 — el repo llega "listo para este gate", pero el gate lo cruza un humano:
package.json → next build --webpack, no lo pises)..env.example (Production + Preview).dominicanos.com) al proyecto — el middleware resuelve el tenant por Host.https://<dominio>/api/webhooks/stripe y cargar STRIPE_WEBHOOK_SECRET.api/cron/* exigen Authorization: Bearer ${CRON_SECRET}.| Slug | Dominio prod | Uso |
|---|---|---|
dominicanos | dominicanos.com | Tenant piloto (default en dev) |
comunidadlatina | comunidadlatina.com | Segundo tenant para probar white-label |
En dev: http://localhost:3000?t=comunidadlatina (queda en cookie cl-tenant).