Personal site of Alejandro Guerra. Fullstack developer and solution architect based in Madrid.
- Next.js 16 (App Router, Turbopack)
- React 19
- Tailwind CSS 4
- Contentlayer2 (MDX)
- next-intl (ES/EN)
- Vercel
pnpm install
pnpm devpnpm buildpnpm testTests live alongside source as *.test.ts. Run via Vitest.
The /contact form is protected by Cloudflare Turnstile (Managed mode) plus
a hidden honeypot field. Both must validate before the email is sent via Resend.
NEXT_PUBLIC_TURNSTILE_SITE_KEY=... # public, exposed to client
TURNSTILE_SECRET_KEY=... # server-only, used for siteverify
The site key is configured in the Cloudflare Turnstile dashboard
under the widget for gueden.com.
Cloudflare publishes test keys
that always pass or always fail. Use them in local .env.local:
# always passes
NEXT_PUBLIC_TURNSTILE_SITE_KEY=1x00000000000000000000AA
TURNSTILE_SECRET_KEY=1x0000000000000000000000000000000AA
# always fails
NEXT_PUBLIC_TURNSTILE_SITE_KEY=2x00000000000000000000AB
TURNSTILE_SECRET_KEY=2x0000000000000000000000000000000AA
- Happy path — fill form, solve captcha, submit → email arrives
- Honeypot triggered — set the hidden
websiteinput via devtools, submit → backend silently returns 200, no email sent - No token — disable JS or remove the widget, submit →
403 Verificación fallida - Invalid token — use the always-fails test keys →
403 Verificación fallida - siteverify network error — block
challenges.cloudflare.comin devtools, submit →503 Servicio no disponible
MIT