Source for jorgesandoval.dev, Jorge Sandoval’s professional portfolio. The site presents selected fullstack and applied-AI work, professional experience, services, a public résumé, and direct contact options.
- Evidence-led project case studies with contributions, decisions, outcomes, and limitations.
- Responsive, keyboard-accessible interface with reduced-motion support.
- Server-rendered content with a small client boundary for mobile navigation.
- Progressive-enhancement contact form backed by Formspree.
- Metadata, sitemap, robots configuration, and a focused privacy page.
- Next.js App Router
- React and TypeScript
- Tailwind CSS
- IBM Plex Sans and IBM Plex Mono through
next/font - Node.js native test runner
Requirements: Bun 1.3.14+ and Node.js 22.18+.
bun install --frozen-lockfile
cp .env.example .env.local
bun run devOpen http://localhost:3000.
The contact form is disabled by default. To enable it locally, set the following values in .env.local:
CONTACT_FORM_ENABLED=true
FORMSPREE_ENDPOINT=https://formspree.io/f/your-form-idFORMSPREE_ENDPOINT is a public form action, not a secret. The application accepts only HTTPS endpoints under formspree.io/f/. When the configuration is absent or invalid, the page shows a direct email action instead of a broken form.
bun run format:check
bun run lint
bun run typecheck
bun run test
bun run buildapp/
components/ Page sections and interactive navigation
lib/ Project data and contact configuration validation
privacy/ Contact-form privacy information
public/ Portrait and downloadable résumé
tests/ Contact configuration tests
Professional links and contact details are available at jorgesandoval.dev.
Copyright © Jorge Sandoval. All rights reserved.
The mobile scorer lives at /pingpong. It includes local camera tracking, assisted points, limited experimental automatic double-bounce scoring, manual correction and local history. See setup, architecture and limitations and validation. The camera mode is a beta; real-game accuracy has not been measured.