Tu vida real, convertida en RPG. Un agente de IA ("El Sistema") te asigna quests diarias de entrenamiento, hábitos y finanzas. Completa misiones, gana XP y sube de nivel — en tiempo real con tu party gracias a Portal.
SystemIRL.mp4
Proyecto para The Realtime Hackathon by Portal (7–9 agosto 2026). Desarrollo individual por nightstar73.
- Quests diarias con IA (6/día): El Sistema genera cada día 6 quests personalizadas (Gemini, con fallback a Kilo/Zen y a un pool offline). En el onboarding eliges intereses (gimnasio, lectura, finanzas…) y las quests se alinean a ellos; puedes regenerar hasta 2 veces por día (preserva las ya completadas) o bajar el rango de dificultad.
- RPG con combate táctico ATB-lite: Completar quests dispara un combate por turnos con orden por agilidad. Atacas, lanzas hechizos (elementos con debilidades ocultas → ONE MORE), defiendes, gastas MP y acumulas el gauge EX (hasta nivel 99 con +3% de efectividad por nivel). La victoria da oro, dropea armas, y daña al jefe de tu piso en La Torre del Sistema.
- Clases y evolución: elige clase (Guerrero/Guardia/Sabio/Cazador), cambiala en el shop, y evoluciona. Cada clase tiene agilidad propia, Raid Skill exclusiva (pasiva global + activa) y elemento de magia predeterminado.
- Shop: gastá tu oro en títulos (con pasivas de XP/oro/ataque), colores, armas, armaduras, reliquias, pociones porcentuales (cura 30% HP) y auras de raid. Lo que equipás se ve en el perfil y el leaderboard.
- Party en vivo (Portal): únete a un canal de party y ve en tiempo real quién está online, el leaderboard de niveles, la actividad de tus amigos y la raid semanal: un jefe con HP compartido entre toda la party.
- Raid semanal ISO (lunes–domingo): jefes por tier (T1: 1200 HP → T5: 5000 HP) con HP compartido. Se reinicia cada semana ISO; el tier máximo disponible lo desbloquea tu Raid Skill. El botón de pelea se deshabilita tras derrotarlo hasta el próximo lunes. Completar la meta diaria hace 3.5% de daño porcentual al jefe (1×/jugador/día; cap de daño pasivo acumulado por tier).
- La Torre del Sistema (100+ pisos): generación procedural infinita con escalado de dificultad, recompensas acumulativas y jefes únicos.
- Arena de Entrenamiento: combates 1v1 (2/día) y Torneo de 16 participantes (1/día) contra bots de la party.
Portal es el corazón del modo multiplayer. Todo lo que se ve en vivo —presencia, feed, toasts, raid grupal— corre sobre un canal de Portal por party:
-
Canales en tiempo real — Cada party es un canal
party-<código>(definido enportal.config.ts). Todos los miembros comparten un stream secuenciado de mensajes a través de un único WebSocket, manejado por@portalsdk/react:// App.tsx — un solo hook conecta toda la sala const party = useChannel<PartyMessage>({ channelId: partyCode ? `party-${partyCode}` : undefined, history: 40, }); // Publicar actividad de la party (sin backend) void party.send({ content: { kind: "done", name, quest: q.title } });
-
Presencia → leaderboard sin servidor — Cada sesión publica su identidad como presence metadata con
setMetadata({ name, level, xp, streak, title, color }). El leaderboard se arma solo: agrupa a los participantes presentes y los ordena por nivel/XP. Al cerrar la pestaña, el jugador desaparece en vivo.party.setMetadata({ name: player.name, level, xp: player.xp, streak: player.streak });
-
Notificaciones en tiempo real — Completar una quest publica
done/levelupal canal; la party lo recibe y lo muestra como toast desde cualquier pestaña, además del feed de actividad (nivel, raid, joins, bots de la demo). -
Raid con progreso grupal — los mensajes
raidHitdel canal son el estado del jefe: cada golpe suma daño compartido en vivo (con regeneración si nadie golpea en 24h) y el feed muestra quién pegó. Completar la meta diaria aplica 3.5% de daño porcentual al jefe (1×/jugador/día; limitado por cap de daño pasivo según el tier). La recompensa (aura) es exclusiva de quienes contribuyeron. -
Escalable sin infraestructura — No hay servidor propio: el realtime, la presencia, el historial y el orden de mensajes los maneja la plataforma de Portal. Nuestro "backend" son dos serverless functions de Vercel (una para mintear la identidad si quisiéramos, otra para generar quests con IA).
flujo realtime (sin backend propio):
jugador ──setMetadata──▶ canal party-<código> ──▶ leaderboard (presencia)
jugador ──send(done/levelup/raid)──▶ canal ──▶ feed + toasts en la party
God mode (demo): con
#demoal final de la URL se activa un panel de demo con bots de party (clientes de Portal propios, con presencia real), autopilot de quests, +XP, level-up forzado, oro, control de la Torre, forzar rango, revelar debilidades en combate y toggles de IA. Ideal para grabar el video sin depender de otra persona.
| Capa | Tecnología |
|---|---|
| Frontend | React 19 + Vite 8 + TypeScript (strict) |
| Tiempo real | Portal (@portalsdk/core + @portalsdk/react) |
| IA | Gemini / Kilo Gateway / OpenCode Zen (cualquiera con key; fallback offline) |
| RPG | Combate + loot + shop + La Torre (client-side, sin assets) |
| Persistencia | IndexedDB (idb-keyval) — perfil, XP, quests del día, items, torre |
| Deploy | Vercel (SPA + serverless functions api/*.ts) |
- Node.js ≥ 20
- Cuenta en Portal y una publishable key (
pk_...) - (Opcional) una API key de Gemini en aistudio.google.com para quests generadas por IA
git clone https://github.com/MatiAlevMe/SystemIRL.git
cd SystemIRL
npm install
cp .env.template .env # completa tus keys
npm run dev # http://localhost:5173La app funciona sin Gemini (usa el pool offline) y sin tokens identificados (modo anónimo de Portal, cero backend).
# Navegador (segura de exponer)
VITE_PORTAL_PUBLISHABLE_KEY=pk_...
# Server-side (solo en Vercel / CLI)
PORTAL_SECRET=sk_...
GEMINI_API_KEY=... # IA para quests (modelos free: gemini-3.6-flash)
QUEST_PROVIDER=auto # auto | gemini | kilo | zen (auto = el que tenga key)
KILO_API_KEY=... # (opcional) Kilo Gateway free ~200 req/hr
ZEN_API_KEY=... # (opcional) OpenCode Zen free (big-pickle, deepseek-v4-flash-free)La generación de quests intenta los proveedores en orden (
gemini→kilo→zen), y si ninguno responde cae a un pool offline. Con configurar una key la IA ya funciona.
Seguridad: las keys reales viven en las variables de entorno de Vercel, nunca en el repo.
.envestá en.gitignore.
- Importa el repo
MatiAlevMe/SystemIRLen vercel.com/new (Vercel detecta Vite solo). - En Settings → Environment Variables agrega:
VITE_PORTAL_PUBLISHABLE_KEY(valorpk_...)GEMINI_API_KEY(opcional)PORTAL_SECRET(opcional, solo si usas/api/portal-token)
- Deploy. Cada push a
maindespliega automáticamente. - (Opcional) Desplegar la config de canales:
export PORTAL_SECRET=sk_... npm run portal:deploy # npx @portalsdk/cli deploy
├── api/
│ ├── quests.ts # Gemini: genera quests personalizadas (+ fallback, tags, rango)
│ └── portal-token.ts # (opcional) mintéa identidad identificada con sk_
├── src/
│ ├── App.tsx # orquestación: jugador, quests, party, combate, modales
│ ├── portal.ts # cliente Portal (publishable key)
│ ├── lib/ # XP/niveles, IndexedDB, quests, prefs, combate, shop, torre, sonido, bots
│ └── components/ # Onboarding, QuestList, StatsPanel, CharacterPanel, PartyPanel,
│ # ShopPanel, TowerPanel, BattleModal, LevelUp, DemoPanel (god mode)
├── portal.config.ts # canales party-* (Portal)
└── docs/
├── ROADMAP.md # plan de ejecución + entregables
└── DEMO.md # guion del video de la demo
- Pitch (280): "Tu vida real convertida en RPG: un agente de IA te asigna quests diarias de entrenamiento y hábitos. Completá misiones, derrotá monstruos, subí de nivel y tu party lo celebra en vivo con Portal. IA + tiempo real, sin infraestructura."
- Demo (1:30): [enlace] — ver guion en
docs/DEMO.md
- 🚀 Deploy: https://system-irl.vercel.app
- 🎬 Demo: https://youtu.be/qHgmIaeDRqk
- 🌐 The Realtime Hackathon by Portal (2026): https://hack.useportal.co
Este proyecto es software libre y de código abierto, distribuido bajo la licencia GNU AGPL v3.0.
- Derechos: Puedes alojarlo en tus propios servidores, usarlo, modificarlo y redistribuirlo.
- Condición clave: Si ejecutas una versión modificada como un servicio en red, debes liberar el código fuente de dicha versión bajo la misma licencia AGPL-3.0. Nadie puede convertir este software en un producto cerrado o propietario.
Consulta el archivo LICENSE para ver los términos completos. Para consultas o soporte sobre el proyecto, por favor abre un Issue en este repositorio.