Skip to content

TalentBricksAI genera certificados digitales verificables cuando un estudiante completa un curso. Los certificados se generan en el navegador usando Canvas HTML5 e incluyen un codigo QR para verificacion publica.

  • Generacion client-side: Renderizado con Canvas HTML5 (sin servidor)
  • Diseño premium: Tema oscuro con acentos dorados
  • Verificacion publica: URL unica sin necesidad de login
  • Codigo QR: Enlace directo a la pagina de verificacion
  • Descarga PNG: Un click para descargar el certificado
  • Datos snapshot: Informacion capturada al momento de completar
Completar todas las lecciones
Curso marcado como completado
Certificado generado automaticamente
Ver en /certificado/:courseId
Descargar PNG o compartir enlace
Verificacion publica en /verificar/:code
RutaAccesoDescripcion
/certificado/:courseIdAutenticadoVer y descargar certificado propio
/verificar/:verificationCodePublicoVerificar autenticidad del certificado

El certificado guarda datos “snapshot” al momento de generacion:

model Certificate {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
user User @relation(...)
userId String
course Course @relation(...)
courseId Int
verificationCode String @unique @default(uuid())
// Snapshot data
studentName String
courseTitle String
instructorName String
totalDurationMinutes Int
@@unique([userId, courseId])
}

Los datos se guardan como copia (snapshot) porque:

  1. Si el curso cambia de nombre, el certificado mantiene el nombre original
  2. Si el instructor cambia, el certificado refleja quien enseno al estudiante
  3. Si la duracion del curso cambia, el certificado muestra las horas completadas

El certificado Canvas incluye:

ElementoDescripcion
Logo”TalentBricksAI” con tagline
Titulo”CERTIFICADO DE COMPLETACION”
Nombre estudianteResaltado en dorado
Nombre cursoCon word-wrap automatico
Duracion totalHoras y minutos del curso
Fecha emisionFormato largo en español
InstructorNombre con linea de firma
Codigo QREnlace a pagina de verificacion
CodigoUUID para verificacion manual

La pagina /verificar/:code es publica y muestra:

  • Badge verde “Verificado”
  • Nombre del estudiante
  • Nombre del curso
  • Instructor
  • Duracion
  • Fecha de emision
  • CTA para explorar cursos
  • Mensaje de error
  • Codigo verificado (para debugging)
  • CTA para ir al inicio

Cuando un usuario completa todas las lecciones:

// 1. Verificar que todas las lecciones estan completadas
// 2. Calcular duracion total en minutos
// 3. Capturar nombre del estudiante (username o email)
// 4. Crear registro de Certificate con snapshot data
// 5. Marcar Enrollment como completedAt
// 6. Retornar verificationCode
// Requiere autenticacion
// Retorna certificado del usuario para un curso especifico
// Incluye datos del curso (slug, category, difficulty)
// NO requiere autenticacion (publico)
// Busca por verificationCode
// Retorna datos publicos del certificado
import { CertificateCanvas } from "./components/CertificateCanvas";
<CertificateCanvas
data={{
studentName: "Juan Perez",
courseTitle: "Python para Data Engineering",
instructorName: "Maria Garcia",
totalDurationMinutes: 180,
issuedAt: new Date(),
verificationCode: "abc-123-def",
}}
/>
import { downloadCertificateFromCanvas } from "./components/CertificateCanvas";
<Button onClick={downloadCertificateFromCanvas}>
Descargar PNG
</Button>
const verificationUrl = `${window.location.origin}/verificar/${code}`;
await navigator.clipboard.writeText(verificationUrl);
await navigator.share({
title: "Mi certificado de TalentBricksAI",
text: `He completado el curso ${courseTitle}!`,
url: verificationUrl,
});

En CertificateCanvas.tsx, modificar el gradiente de fondo:

const gradient = ctx.createLinearGradient(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
gradient.addColorStop(0, "#1a1a2e"); // Color inicio
gradient.addColorStop(0.5, "#16213e"); // Color medio
gradient.addColorStop(1, "#0f0f23"); // Color final

Buscar las lineas de ctx.fillText() en el componente:

ctx.fillText("TalentBricksAI", CANVAS_WIDTH / 2, 100);
ctx.fillText("Plataforma de Aprendizaje...", CANVAS_WIDTH / 2, 130);
const logo = new Image();
logo.src = "/logo.png";
logo.onload = () => {
ctx.drawImage(logo, x, y, width, height);
};
Terminal window
wasp db seed seedAllDummyData

El seed crea un usuario de prueba con certificado. El codigo de verificacion se muestra en la consola.

  1. Crear usuario y inscribirse en un curso
  2. Completar todas las lecciones
  3. Visitar /certificado/:courseId
  4. Verificar que el certificado se renderiza
  5. Probar descarga PNG
  6. Probar enlace de verificacion publica

Verificar que qrcode este instalado:

Terminal window
cd app
npm install qrcode @types/qrcode
  • Verificar que los datos del certificado estan completos
  • Revisar la consola del navegador por errores

Verificar que:

  1. Todas las lecciones tienen isCompleted: true
  2. El usuario tiene Enrollment para el curso
  3. El Enrollment no tiene completedAt ya seteado