Aplicacion de chat en tiempo real con salas privadas de 2 participantes y asistente de IA para mejorar y traducir mensajes.
- Chat en tiempo real con Supabase Realtime.
- Salas con
share_codepara unirse facilmente. - Autenticacion con Google (Supabase Auth).
- Asistente de IA por usuario:
- Mejorar redaccion.
- Traducir mensajes.
- Configuracion persistente en
user_settings.
- Seguridad de capa app implementada:
- Validacion de payloads con Zod.
- Rate limiting distribuido (Upstash) en endpoints sensibles.
- Control de acceso en
/api/users/metapor alcance de sala. - Security headers globales (CSP, XFO, nosniff, etc.).
- Next.js 16.1.6 (App Router)
- React 19.2.3
- TypeScript
- Tailwind CSS v4
- Supabase (
@supabase/ssr,@supabase/supabase-js) - Google Gemini (
@google/generative-ai) - Zod
- Upstash Redis + Upstash Ratelimit
- Node.js 18+
- pnpm
- Proyecto en Supabase
- Cuenta/credenciales de Google OAuth configuradas en Supabase
- (Produccion recomendada) Upstash Redis
- Clona el repositorio:
git clone https://github.com/tu-usuario/textly-chat.git
cd textly-chat- Instala dependencias:
pnpm install- Crea
.env.localen la raiz y agrega variables:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
GEMINI_API_KEY=
# opcional
GEMINI_MODEL=gemini-2.5-flash
RATE_LIMIT_IMPROVE_MAX=20
RATE_LIMIT_META_MAX=60
# recomendado para rate limit distribuido
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=| Comando | Descripcion |
|---|---|
pnpm dev |
Inicia entorno local |
pnpm build |
Build de produccion |
pnpm start |
Ejecuta build de produccion |
pnpm lint |
Ejecuta ESLint |
Inicia desarrollo:
pnpm devApp disponible en http://localhost:3000.
Flujo principal:
- Login con Google.
- Crear sala o unirse con codigo.
- Enviar mensajes en tiempo real.
- Usar IA para mejorar/traducir segun
user_settings.
app/
api/
improve/route.ts
users/meta/route.ts
auth/callback/route.ts
components/
chat/
sidebar/
skeletons/
ui/
hooks/
useAuth.ts
useChat.ts
useMensajes.ts
useRooms.ts
lib/
avatar.ts
supabaseClient.ts
utils.ts
security/
logger.ts
rate-limit.ts
request.ts
schemas.ts
types/database.ts
layout.tsx
login/page.tsx
page.tsx
middleware.ts
next.config.ts
Input:
{ "action": "improve" | "translate", "text": "..." }Reglas:
text: 1..1500 caracteres.- Requiere sesion.
- Aplica rate limit.
Respuestas comunes:
200,400,401,403,429,500.
Input:
{ "ids": ["uuid", "uuid"] }Reglas:
- Maximo 50 IDs.
- UUID valido.
- Solo devuelve usuarios autorizados por alcance de sala compartida.
- Aplica rate limit.
Respuestas comunes:
200,400,401,429,500.
profiles:id,username,email,created_atrooms:id,room_name,share_code,participant_1,participant_2,created_atmessages:id,room_id,sender_id,content,created_atuser_settings:user_id,assistant_enabled,writing_mode,translation_language,created_at,updated_at
rooms_deleterooms_insertrooms_selectrooms_select_open_for_joinrooms_update_unirsemessages_insertmessages_selectUsers can insert own settingsUsers can update own settingsUsers can view own settings
handle_new_user()handle_new_user_settings()set_updated_at_user_settings()- Trigger:
on_update_user_settings(BEFORE UPDATEenuser_settings)
Hardening de capa app ya aplicado:
- Zod en validacion de inputs sensibles.
- Rate limiting distribuido con Upstash.
- Hash de IP + request ID para trazabilidad.
- Logging estructurado para eventos de seguridad.
- Security headers globales.
- Middleware de rutas privadas/publicas.
Este proyecto se distribuye como proyecto personal de practica.