From aa7b09cb8895997a2f07f0137a74def2df7ceb7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Manzo=20Olivares=20C=C3=A9sar=20Alberto?=
Date: Sun, 13 Sep 2026 20:22:02 -0600
Subject: [PATCH 1/2] feat(legal): agrega aviso de privacidad y corrige copy de
registro
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Publica /privacidad describiendo fielmente los datos que ya trata el
producto (cuenta, progreso, intentos, analítica, social, reportes,
operación), sus finalidades, retención/eliminación y cómo ejercer
acceso/rectificación/cancelación/oposición, con marcas explícitas donde
falta un dato legal real (domicilio, correo dedicado).
Corrige en /registro la afirmación de que los datos se usan
"únicamente para tu progreso académico", enlaza el aviso de
privacidad y hace visible el aviso de no afiliación oficial con el
CETI también en mobile, donde el panel lateral que ya lo mostraba
está oculto.
Co-Authored-By: Claude Sonnet 5
Claude-Session: https://claude.ai/code/session_019aEdw8ju2HVfvknp2PNCRb
---
src/app/(auth)/registro/page.tsx | 13 +-
src/app/privacidad/page.tsx | 267 ++++++++++++++++++++++++++++++
src/components/landing/footer.tsx | 1 +
3 files changed, 279 insertions(+), 2 deletions(-)
create mode 100644 src/app/privacidad/page.tsx
diff --git a/src/app/(auth)/registro/page.tsx b/src/app/(auth)/registro/page.tsx
index 1022823..ec4ec7b 100644
--- a/src/app/(auth)/registro/page.tsx
+++ b/src/app/(auth)/registro/page.tsx
@@ -1,5 +1,7 @@
import Link from "next/link";
+import { UNOFFICIAL_NOTICE } from "@/lib/branding";
+
import { RegisterForm } from "./register-form";
export const metadata = {
@@ -32,8 +34,15 @@ export default function RegisterPage() {
- Al registrarte aceptas que tus datos se usen únicamente para tu
- progreso académico.
+ Al crear tu cuenta, usamos tus datos para tu cuenta, tu progreso
+ académico y mejorar la plataforma, como se explica en el{" "}
+
+ aviso de privacidad
+
+ . {UNOFFICIAL_NOTICE}
diff --git a/src/app/privacidad/page.tsx b/src/app/privacidad/page.tsx
new file mode 100644
index 0000000..043dd6c
--- /dev/null
+++ b/src/app/privacidad/page.tsx
@@ -0,0 +1,267 @@
+import Link from "next/link";
+
+import { LandingFooter } from "@/components/landing/footer";
+import { LandingNavbar } from "@/components/landing/navbar";
+import { PRODUCT_NAME, UNOFFICIAL_NOTICE } from "@/lib/branding";
+
+export const metadata = {
+ title: "Aviso de privacidad",
+ description:
+ "Qué datos trata la plataforma, para qué los usa y cómo pedir acceso, corrección o eliminación. Proyecto independiente, no oficial del CETI.",
+};
+
+/**
+ * Describe fielmente lo que el producto YA hace, leído del schema y de los
+ * flujos reales (auth, progreso, analítica, social, feedback) — no una
+ * plantilla legal genérica. Donde falta un dato real (domicilio, correo
+ * dedicado) se deja una marca explícita en vez de inventarlo.
+ */
+export default function PrivacyPage() {
+ return (
+ <>
+
+
+
Legal
+
+ Aviso de privacidad
+
+
+ Última actualización: 13 de septiembre de 2026.
+
+
+
+
+
+ {PRODUCT_NAME} es un proyecto independiente hecho por un solo
+ desarrollador para apoyar a estudiantes del CETI Guadalajara.{" "}
+ {UNOFFICIAL_NOTICE} Este aviso describe, sin
+ relleno legal, qué información recopila el producto realmente,
+ para qué la usa y cómo puedes pedir que la corrijamos o la
+ borremos.
+
+
+
+
+
+ El responsable de esta plataforma y del tratamiento de tus
+ datos es César Manzo Olivares (usuario de GitHub{" "}
+
+ CesarManzoCode
+
+ ), quien la desarrolla y opera de forma independiente. No es
+ una empresa constituida ni una entidad del CETI ni de ninguna
+ institución educativa o gubernamental.
+
+
+ Pendiente: este
+ proyecto no tiene un domicilio fiscal ni de operación
+ publicado. Complétalo aquí manualmente si el CETI u otra
+ autoridad lo requiere para fines de cumplimiento.
+
+
+
+
+
Sólo la que el producto usa de verdad, agrupada por para qué sirve:
+
+
+ Cuenta y autenticación. Nombre, correo,
+ nombre de usuario, contraseña (guardada con hash, nunca en
+ claro) o el enlace con tu cuenta de Google si entras con
+ “Continuar con Google”, foto de perfil y
+ biografía opcionales. El sistema de sesiones guarda además un
+ token de sesión y, por sesión, la dirección IP y el user
+ agent del dispositivo — se usan para mantenerte conectado y
+ detectar accesos anómalos, nunca para analítica de producto.
+
+
+ Identidad académica (opcional). Campus,
+ programa, semestre y grupo, sólo si decides declararlos.
+ Nunca es obligatorio para aprender.
+
+
+ Progreso académico. Qué unidades, lecciones
+ y pasos completaste, tu racha de días, tu XP y tu nivel.
+
+
+ Intentos y actividad de aprendizaje. El
+ código que envías a calificar en un reto o práctica (se
+ guarda el envío calificado, no cada tecla que presionas), si
+ pasó las pruebas, y qué pistas pediste.
+
+
+ Sesiones de estudio. Tiempo activo
+ aproximado por visita a una lección o práctica —pestaña
+ visible y actividad reciente—, no tiempo de pantalla total ni
+ grabaciones de lo que haces.
+
+
+ Analítica de producto. Eventos internos como
+ qué lección viste o en qué paso estás, para entender dónde se
+ atoran los alumnos. No incluye tu IP, tu user agent,
+ grabaciones de pantalla ni las teclas que presionas.
+
+
+ Funciones sociales (opcionales). Amigos,
+ rachas compartidas, invitaciones, kudos y ligas — sólo
+ existen si tú decides usarlas.
+
+
+ Reportes y feedback. Si reportas un error de
+ contenido o mandas retroalimentación desde el botón dedicado,
+ guardamos tu mensaje, tu cuenta y la lección, ejercicio o
+ ruta (sin parámetros de la URL) donde lo enviaste, para darle
+ seguimiento.
+
+
+ Operación y seguridad. Conteos de uso por
+ endpoint (para evitar abuso del compilador) y los registros
+ de servidor necesarios para operar el servicio.
+
+
+
+
+
+
+
Darte acceso a tu cuenta y conservar tu progreso entre sesiones y dispositivos.
+
Compilar y ejecutar el código que envías a un reto o práctica, y calificarlo contra los casos de prueba.
+
Entender qué tan bien funciona el contenido —qué lección confunde, dónde se abandona un curso— para mejorarlo.
+
Darte seguimiento cuando reportas un error o mandas feedback.
+
Prevenir abuso del compilador con límites de envíos.
+
Si activas las funciones sociales, mostrar tu progreso a los amigos que agregaste.
+
+
+
+
+
+
+ El código que envías a un reto o práctica se manda al
+ proveedor de ejecución configurado (hoy, Wandbox) sólo para
+ compilarlo y correrlo contra los casos de prueba; recibe el
+ código y las entradas, no tu identidad.
+
+
+ Si entras con “Continuar con Google”, Google
+ procesa esa autenticación conforme a su propia política.
+
+
+ Si usas “olvidé mi contraseña”, ese correo se
+ envía a través de Resend, el proveedor de correo
+ transaccional del proyecto.
+
+
+ Todo lo demás —progreso, intentos, analítica, datos sociales,
+ reportes— vive únicamente en la base de datos del proyecto y
+ en su infraestructura de hosting. No se vende ni se comparte
+ con terceros para fines comerciales o publicitarios.
+
+
+
+
+
+
+ Mientras tu cuenta exista, conservamos los datos anteriores
+ para que tu progreso no se pierda entre sesiones. Puedes
+ eliminar tu cuenta tú mismo, en cualquier momento, desde{" "}
+
+ tu perfil
+
+ , sin tener que escribirle a nadie. Al hacerlo se borra tu
+ cuenta y, en cascada, tu progreso, intentos, sesiones de
+ estudio, pistas vistas, reportes, feedback y datos sociales —
+ de forma permanente e inmediata. No existe una copia que se
+ restaure después.
+
+
+
+
+
+
+ Acceder a lo que sabemos de ti: tu progreso,
+ tu perfil y tu actividad son visibles directamente en tu
+ cuenta.
+
+
+ Rectificar tu nombre, biografía, foto e
+ identidad académica desde tu perfil, en cualquier momento.
+
+
+ Cancelar (eliminar) tu cuenta y tus datos
+ desde tu perfil, con efecto inmediato, como se describe
+ arriba.
+
+
+ Oponerte al tratamiento, o pedir algo que la
+ interfaz no resuelva directamente (por ejemplo, corregir tu
+ correo), escribiendo por el medio de contacto de abajo.
+
+
+
+
+
+
+
+ Para reportar un problema de contenido o dejar
+ retroalimentación, usa el botón de reporte dentro de la
+ plataforma (lo ve cualquier cuenta con sesión iniciada).
+
+
+ Para dudas o solicitudes sobre este aviso que la interfaz no
+ resuelva, por ahora el canal disponible es{" "}
+
+ los issues de GitHub del proyecto
+
+ . Ten en cuenta que son públicos: describe tu solicitud en
+ términos generales, sin datos sensibles.
+
+
+
+ Pendiente: falta
+ una dirección de correo dedicada para solicitudes de
+ privacidad (hoy no existe ninguna configurada en el proyecto).
+ Agrégala aquí en cuanto exista.
+
+
+
+
+
+ Si el producto empieza a tratar datos de una forma distinta a
+ la descrita aquí, esta página se actualiza para reflejarlo —
+ no hay una versión “real” distinta a la publicada.
+
+ {children}
+
+ );
+}
diff --git a/src/components/landing/footer.tsx b/src/components/landing/footer.tsx
index d5ea4b9..2867218 100644
--- a/src/components/landing/footer.tsx
+++ b/src/components/landing/footer.tsx
@@ -7,6 +7,7 @@ const links: { href: string; label: string; external?: boolean }[] = [
{ href: "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/login", label: "Iniciar sesión" },
{ href: "/registro", label: "Crear cuenta" },
{ href: "#temario", label: "Temario" },
+ { href: "/privacidad", label: "Privacidad" },
{
href: "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/CesarManzoCode/cpp-ceti",
label: "GitHub",
From f3038fe4c0cc6b4fb288296f535ba325b46081b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Manzo=20Olivares=20C=C3=A9sar=20Alberto?=
Date: Sun, 13 Sep 2026 20:23:08 -0600
Subject: [PATCH 2/2] =?UTF-8?q?feat(branding):=20renombra=20el=20producto?=
=?UTF-8?q?=20a=20=C3=8Dndice=20Cero=20y=20fija=20el=20correo=20real=20de?=
=?UTF-8?q?=20privacidad?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Sustituye "Plataforma de Programación CETI" / "CPP-CETI" por el nombre
definitivo Índice Cero en la identidad pública y metadata: fuente única
en src/lib/branding.ts (de la que heredan title/OG, toasts, appName de
auth, asunto de correo de Better Auth, aria-labels), wordmark del logo
y de la pantalla de error global (nueva marca compacta índice[0]),
README, AGENTS.md, DEPLOYMENT.md y las dos menciones al nombre del
producto en contenido de lecciones (unidad de archivos y las guías de
laboratorio local de bases de datos). CETI se mantiene solo como
contexto del proyecto, nunca como el nombre del producto.
En /privacidad, reemplaza los issues públicos de GitHub como canal para
solicitudes de privacidad y derechos sobre datos por el correo real
dedicado (indice0.ceti@gmail.com) y quita el marcador de "pendiente"
que ya no aplica.
Co-Authored-By: Claude Sonnet 5
Claude-Session: https://claude.ai/code/session_019aEdw8ju2HVfvknp2PNCRb
---
AGENTS.md | 2 +-
DEPLOYMENT.md | 2 +-
README.md | 2 +-
.../bases-de-datos/shared/local-lab-guides.ts | 4 +--
prisma/content/unidad-09-archivos.ts | 2 +-
src/app/global-error.tsx | 4 ++-
src/app/privacidad/page.tsx | 32 ++++++++-----------
src/components/shared/logo.tsx | 4 +--
src/lib/branding.ts | 17 +++++++---
9 files changed, 36 insertions(+), 33 deletions(-)
diff --git a/AGENTS.md b/AGENTS.md
index 86893c3..38c64d7 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -4,7 +4,7 @@
This version (16.2.6) has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
-# Contexto para asistentes de IA — Plataforma de Programación CETI
+# Contexto para asistentes de IA — Índice Cero
## Qué es esto
Plataforma web para que estudiantes del **CETI Guadalajara** aprendan a programar
diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md
index 16ad460..22111d5 100644
--- a/DEPLOYMENT.md
+++ b/DEPLOYMENT.md
@@ -1,4 +1,4 @@
-# Guía de despliegue — Plataforma de Programación CETI
+# Guía de despliegue — Índice Cero
Esta guía te lleva de cero a tener la plataforma corriendo en producción.
diff --git a/README.md b/README.md
index dba0c2f..59070e2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Plataforma de Programación CETI
+# Índice Cero
Plataforma para **aprender a programar escribiendo código**, pensada para estudiantes
del **CETI Guadalajara**. Lecciones cortas, un editor con compilador de verdad y retos
diff --git a/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts b/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts
index 1962fe9..69dc5b5 100644
--- a/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts
+++ b/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts
@@ -13,7 +13,7 @@
export const MYSQL_LOCAL_LAB_GUIDE = `## Laboratorio local: MySQL
-Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de CPP-CETI sólo ejecuta SQLite, así que esto NO corre ahí.
+Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de Índice Cero sólo ejecuta SQLite, así que esto NO corre ahí.
1. **Levanta el motor.** Instala \`mysql-server\` con el paquete de tu sistema, o usa un contenedor: \`docker run --name ceti-mysql -e MYSQL_ROOT_PASSWORD=ceti -p 3306:3306 -d mysql:8\`.
2. **Conéctate** con el cliente \`mysql\` (o MySQL Workbench): \`mysql -h 127.0.0.1 -u root -p\`.
@@ -23,7 +23,7 @@ Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de
export const MONGODB_LOCAL_LAB_GUIDE = `## Laboratorio local: MongoDB
-Este bloque requiere **MongoDB local** — el editor web de CPP-CETI sólo ejecuta SQLite, así que esto NO corre ahí.
+Este bloque requiere **MongoDB local** — el editor web de Índice Cero sólo ejecuta SQLite, así que esto NO corre ahí.
1. **Levanta el motor.** Instala MongoDB Community Server, o usa un contenedor: \`docker run --name ceti-mongo -p 27017:27017 -d mongo:7\`.
2. **Conéctate** con \`mongosh\` (MongoDB Shell): \`mongosh "mongodb://localhost:27017"\`.
diff --git a/prisma/content/unidad-09-archivos.ts b/prisma/content/unidad-09-archivos.ts
index 7de6935..1e0415e 100644
--- a/prisma/content/unidad-09-archivos.ts
+++ b/prisma/content/unidad-09-archivos.ts
@@ -64,7 +64,7 @@ streams, separada de la consola). Para imprimir EN la TERMINAL ya usas
> **Qué puedes probar aquí, y qué no.** Todos los ejemplos y retos de
> esta unidad crean el archivo, escriben, cierran y vuelven a leer **en
> el mismo programa, en una sola ejecución** — eso es exactamente lo que
-> el editor en línea de CPP-CETI puede demostrar. Lo que el editor en
+> el editor en línea de Índice Cero puede demostrar. Lo que el editor en
> línea **no** garantiza es que ese archivo siga ahí para una ejecución
> *distinta* (correr el programa hoy y que otro programa lo lea mañana,
> o volver a correr el mismo reto esperando encontrar lo que dejó la vez
diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx
index b2aab7a..9131398 100644
--- a/src/app/global-error.tsx
+++ b/src/app/global-error.tsx
@@ -1,5 +1,7 @@
"use client";
+import { PRODUCT_MARK } from "@/lib/branding";
+
/**
* Last-resort error boundary. Renders its own / because
* it can fire before the root layout renders.
@@ -54,7 +56,7 @@ export default function GlobalError({
>
C++
- CETI
+ {PRODUCT_MARK}
Algo salió mal
diff --git a/src/app/privacidad/page.tsx b/src/app/privacidad/page.tsx
index 043dd6c..ed2c8fd 100644
--- a/src/app/privacidad/page.tsx
+++ b/src/app/privacidad/page.tsx
@@ -208,31 +208,25 @@ export default function PrivacyPage() {
- Para reportar un problema de contenido o dejar
- retroalimentación, usa el botón de reporte dentro de la
- plataforma (lo ve cualquier cuenta con sesión iniciada).
-
-
- Para dudas o solicitudes sobre este aviso que la interfaz no
- resuelva, por ahora el canal disponible es{" "}
+ Para privacidad y solicitudes sobre tus datos —acceso,
+ rectificación, cancelación u oposición— que la interfaz no
+ resuelva directamente, escribe a{" "}
- los issues de GitHub del proyecto
+ indice0.ceti@gmail.com
- . Ten en cuenta que son públicos: describe tu solicitud en
- términos generales, sin datos sensibles.
+ , la dirección dedicada del proyecto para este tipo de
+ solicitudes.
+
+
+ Para reportar un problema de contenido o dejar
+ retroalimentación general sobre una lección o ejercicio, usa
+ el botón de reporte dentro de la plataforma (lo ve cualquier
+ cuenta con sesión iniciada).
-
- Pendiente: falta
- una dirección de correo dedicada para solicitudes de
- privacidad (hoy no existe ninguna configurada en el proyecto).
- Agrégala aquí en cuanto exista.
-
diff --git a/src/components/shared/logo.tsx b/src/components/shared/logo.tsx
index df6b174..26a304a 100644
--- a/src/components/shared/logo.tsx
+++ b/src/components/shared/logo.tsx
@@ -1,4 +1,4 @@
-import { PRODUCT_NAME } from "@/lib/branding";
+import { PRODUCT_MARK, PRODUCT_NAME } from "@/lib/branding";
import { cn } from "@/lib/utils";
interface LogoProps {
@@ -58,7 +58,7 @@ export function Logo({ className, size = "default", glyphOnly = false }: LogoPro
layout.word,
)}
>
- CETI
+ {PRODUCT_MARK}
);
diff --git a/src/lib/branding.ts b/src/lib/branding.ts
index 43482d8..735f13e 100644
--- a/src/lib/branding.ts
+++ b/src/lib/branding.ts
@@ -5,13 +5,20 @@
// de un solo lenguaje: el nombre no puede prometer C++ a alguien que
// viene a POO I. Cada curso pone su propio título dentro de su ruta.
//
-// Esto es wording PROVISIONAL, no una marca definitiva. Los identificadores
-// internos (paquete, base de datos, prefijo de cookie, slug del curso de
-// C++) NO son marca visible y no se tocan.
+// Nombre definitivo: Índice Cero. Los identificadores internos (paquete,
+// base de datos, prefijo de cookie, slugs de curso) NO son marca visible
+// y no se tocan.
// =====================================================================
-/** Título neutral del producto. */
-export const PRODUCT_NAME = "Plataforma de Programación CETI";
+/** Nombre canónico del producto — el que va en texto y metadata. */
+export const PRODUCT_NAME = "Índice Cero";
+
+/**
+ * Representación visual compacta, para donde el contexto lo permita
+ * (isotipo + wordmark, marcas pequeñas). El nombre textual/canónico
+ * sigue siendo `PRODUCT_NAME`.
+ */
+export const PRODUCT_MARK = "índice[0]";
/** Descripción corta, sin comprometerse con un lenguaje. */
export const PRODUCT_TAGLINE =