尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Repo Sitio Web gabriel
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Guía de puesta en marcha, sin tecnicismos. Sigue estos pasos en orden. Un sitio con: Inicio, Quién soy, Qué hago, Blog (editable desde un panel visual) y Contacto (formulario de leads + agenda de Calendly). Construido con Next.js, pensado para alojarse gratis en Vercel. 2. Cuentas gratuitas que hay que crear Ninguna la creó Claude por ustedes — son cuentas personales de Gabriel/Carolina.檢視完整 README ↗
Guía de puesta en marcha, sin tecnicismos. Sigue estos pasos en orden.
Un sitio con: Inicio, Quién soy, Qué hago, Blog (editable desde un panel visual) y Contacto (formulario de leads + agenda de Calendly). Construido con Next.js, pensado para alojarse gratis en Vercel.
Ninguna la creó Claude por ustedes — son cuentas personales de Gabriel/Carolina.
| Servicio | Para qué | Link |
|---|---|---|
| Vercel | Alojar el sitio (gratis) | vercel.com |
| Sanity | El panel donde Gabriel escribe el blog, y donde quedan guardados los contactos del formulario (gratis hasta un buen volumen) | sanity.io |
| Resend | Enviar el correo de aviso cuando alguien llena el formulario (gratis hasta 3,000 correos/mes) | resend.com |
| Cloudflare Turnstile | Protección anti-spam del formulario (gratis). Obligatorio en producción: ambas claves (NEXT_PUBLIC_TURNSTILE_SITE_KEY y TURNSTILE_SECRET_KEY) deben configurarse en Vercel antes de publicar | dash.cloudflare.com → Turnstile |
| Calendly | Ya lo eligieron — la agenda de citas (gratis en plan básico) | calendly.com |
Copia .env.local.example a un archivo nuevo llamado .env.local y completa
los valores a medida que crees cada cuenta de arriba (cada plataforma te da
sus propias claves en su panel, sección "API keys" o similar). Nunca subas
.env.local a ningún repositorio ni lo compartas por correo/chat — son las
llaves de acceso del sitio.
Cuando despliegues en Vercel, esas mismas variables se cargan en Vercel → Settings → Environment Variables.
⚠️ Importante sobre el token de Sanity (SANITY_WRITE_TOKEN): al crearlo en
sanity.io/manage, dale permiso solo de "Create", nunca "Admin" o
"Editor" completo. El formulario de contacto solo necesita poder crear un
tipo de documento ("lead"), no el resto de tu panel.
Una vez configurado Sanity, entra a tu-dominio.com/studio, inicia sesión
con su cuenta de Sanity, y ahí puede escribir y publicar artículos como en un
procesador de texto — no requiere tocar código.
public/fotos/gabriel-lattanzi.png.src/lib/content.ts (línea
calendlyUrl) — hoy tiene un valor de ejemplo.contactEmail en src/lib/content.ts ya apunta a
[email protected], pero falta confirmar que ese buzón
existe y se revisa (dominio + correo, o reenvío configurado) antes
de publicar — si no, los avisos de leads no van a llegar a nadie..env.local.Se hizo una revisión completa contra el checklist OWASP Top 10. Se encontraron y corrigieron 3 problemas reales durante la revisión:
Controles ya implementados: HTTPS forzado, cabeceras de seguridad (CSP, HSTS, X-Frame-Options, etc.), validación de todos los campos del formulario en el servidor, sin datos financieros sensibles en el formulario, tokens con permisos mínimos, sin secretos en el código.
⚠️ Limitación conocida del rate limit: el contador de solicitudes por IP se almacena en memoria del proceso de Node.js. En Vercel (serverless), cada instancia fría arranca con sus propios contadores, por lo que el límite solo frena abuso dentro de la misma instancia. Si el tráfico crece significativamente, migrar a Vercel KV, Upstash Redis u otro contador distribuido.
Pendiente conocido (bajo riesgo): algunas dependencias del panel de Sanity
(no del sitio público) tienen alertas menores de npm audit, heredadas de
su propia herramienta de línea de comandos — no son alcanzables por un
visitante del sitio. Revisar con npm audit cuando Sanity publique una
actualización.
npm run dev
Abre http://localhost:3000.
node -v para verificar)# 1. Clonar el repositorio
git clone https://github.com/mcarolarac-byte/sitiowebgabriellattanzi.git
cd sitiowebgabriellattanzi
# 2. Instalar dependencias
npm install
# 3. Configurar variables de entorno
cp .env.local.example .env.local
# Completar los valores en .env.local (ver tabla en sección 3)
# 4. Levantar en local
npm run dev
# → http://localhost:3000 (sitio)
# → http://localhost:3000/studio (panel Sanity)
| Rama | Propósito | Deploy automático |
|---|---|---|
master | Producción — www.gabriellattanzi.com | Sí (Vercel, dominio custom) |
develop | Staging — validar cambios antes de producción | Sí (Vercel Preview URL) |
feature/* | Una rama por tarea/cambio | No (PR hacia develop) |
Ciclo de trabajo:
feature/mi-cambio → develop (PR + review) → master (PR + review)
Nunca hacer push directo a master.
npm run lint # ESLint
npx tsc --noEmit # TypeScript sin compilar
npm run build # Build completo (detecta errores de producción)
El mismo CI corre automáticamente en GitHub Actions al abrir un PR.
src/
├── app/
│ ├── (site)/ # Páginas públicas (layout.tsx, page.tsx, etc.)
│ └── api/ # API Routes (ej: formulario de contacto)
├── components/ # Componentes reutilizables
├── lib/ # Utilidades y contenido (content.ts = textos del sitio)
└── sanity/ # Schemas y configuración de Sanity CMS
public/ # Assets estáticos (logo, foto, etc.)
Vercel despliega automáticamente al hacer push:
master → producción (gabriellattanzi.com)develop → preview URL (visible en el PR de GitHub)Variables de entorno en producción: Vercel → proyecto → Settings → Environment Variables.