TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Plataforma web para crear y compartir Video CV y Video Pitch.
Diseñada para talleres de capacitación laboral — el usuario graba su presentación en módulos guiados, el sistema une los fragmentos con FFmpeg y genera una URL pública para compartir.
| Capa | Tecnología |
|---|---|
| Framework | Next.js 14 (App Router) |
| Base de datos | PostgreSQL + Prisma ORM |
| Auth | JWT en cookie HttpOnly (jose) |
| Estilos | Tailwind CSS |
| Tipografías | Fraunces (display) + DM Sans (cuerpo) |
| Procesamiento video | FFmpeg (CLI) |
| Almacenamiento | Local /public/ (reemplazable por S3) |
git clone <repo>
cd oportunai
npm install
cp .env.example .env
Editá .env:
DATABASE_URL="postgresql://postgres:PASSWORD@localhost:5432/oportunai"
JWT_SECRET="clave-secreta-larga-y-aleatoria"
NEXT_PUBLIC_APP_URL="http://localhost:3000"
# Opcional — si ffmpeg no está en el PATH del sistema:
# FFMPEG_PATH="/usr/bin/ffmpeg"
# Crear la base
psql -U postgres -c "CREATE DATABASE oportunai;"
# Aplicar el schema
npm run db:push
# Cargar datos iniciales (módulos CV + Pitch + usuario admin)
npm run db:seed
# Ubuntu / Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Verificar
ffmpeg -version
npm run dev
# → http://localhost:3000
| Campo | Valor |
|---|---|
[email protected] | |
| Contraseña | Admin1234! |
| Acceso | /admin |
Opción A — Desde psql:
UPDATE "Usuario" SET role = 'admin' WHERE email = '[email protected]';
Opción B — Prisma Studio:
npm run db:studio
# Abre http://localhost:5555
# Tabla Usuario → cambiar role a "admin"
Opción C — Script rápido:
node -e "
const { PrismaClient } = require('@prisma/client');
const p = new PrismaClient();
p.usuario.update({ where: { email: '[email protected]' }, data: { role: 'admin' } })
.then(u => { console.log('Admin:', u.email); p.\$disconnect(); });
"
/register y crear una cuenta/dashboard → clic en "Grabar Video CV"http://localhost:3000/u/{slug}/cvMismo flujo desde "Grabar Video Pitch" → perfil en /u/{slug}/pitch
.mp4/adminnpm run dev # Desarrollo (hot reload)
npm run build # Build de producción
npm run start # Servir build de producción
npm run db:push # Aplicar schema a la DB (sin migraciones)
npm run db:studio # Abrir Prisma Studio (GUI de la DB)
npm run db:seed # Cargar datos iniciales
oportunai/
├── app/
│ ├── page.tsx # Landing
│ ├── layout.tsx # Root layout + metadata global
│ ├── not-found.tsx
│ ├── login/page.tsx
│ ├── register/page.tsx
│ ├── dashboard/
│ │ ├── page.tsx # Server component — carga datos del usuario
│ │ ├── DashboardClient.tsx # Client component — UI del dashboard
│ │ ├── grabar-cv/page.tsx # Carga config Video CV → VideoRecorder
│ │ └── grabar-pitch/page.tsx # Carga config Video Pitch → VideoRecorder
│ ├── admin/
│ │ ├── page.tsx # Server component (solo role=admin)
│ │ └── AdminClient.tsx # Editor de módulos + lista de usuarios
│ ├── u/[slug]/
│ │ ├── cv/page.tsx # Perfil público Video CV + OG tags
│ │ └── pitch/page.tsx # Perfil público Video Pitch + OG tags
│ └── api/
│ ├── auth/{login,register,logout}/
│ ├── users/{me,bio,[slug]/contact}/
│ ├── files/{upload,download}/
│ ├── videos/{upload,merge,download}/
│ └── admin/{config,users}/
├── components/
│ ├── layout/Navbar.tsx # Barra de navegación autenticada
│ └── ui/
│ ├── VideoRecorder.tsx # Componente de grabación (CV y Pitch)
│ └── PublicProfileClient.tsx # Perfil público (CV y Pitch)
├── lib/
│ ├── auth.ts # JWT, sesiones, generador de slug
│ ├── prisma.ts # Cliente Prisma singleton
│ └── validations.ts # Schemas Zod
├── prisma/
│ ├── schema.prisma # Modelos de DB
│ └── seed.js # Datos iniciales
├── styles/globals.css # Estilos globales + variables CSS
├── middleware.ts # Protección de rutas
└── .env.example