Personal portfolio and blog, live at www.johncwaters.com.
- Astro 7 with
output: "server"on the Vercel adapter; blog routes, RSS, and sitemap are prerendered - Tailwind CSS 4 with daisyUI 5
- TypeScript
/landing page: animated wave hero, Professional Work (terminal-style cards driven bysrc/data/projects.ts), My Works (browser-window cards insrc/components/smallparts/Portfolio.astro), About Me, contact form/blogMarkdown content collection insrc/content/blog/, schema insrc/content.config.ts, feed at/rss.xml/api/nodemailerserverless contact form endpoint (nodemailer with Gmail OAuth via googleapis)/resume.pdfone-page resume, linked from the header nav
npm install
npm run dev # local dev server
npm run check # astro check (types + diagnostics)
npm run build # production buildThe contact form needs credentials: copy .example.env to .env and fill in the Gmail OAuth values.