Personal portfolio site for John Paul Wile — developer, writer, and AI enthusiast.
Built with Nuxt 3, Tailwind CSS, and shadcn/vue. Live at botsone.net.
- Home — Hero section, latest newsletter posts, featured projects
- About — Bio, skills, and connect links
- Projects — GitHub repos with language filtering and star counts
- Newsletter — Full archive of Substack posts
- Contact — Contact form with FormSubmit.co integration
- 404 — Custom error page
- Nuxt 3 — Vue framework
- Tailwind CSS — Utility-first CSS
- shadcn/vue — UI components
- Lucide — Icons
- VueUse — Composables
- FormSubmit.co — Contact form backend
- Vercel — Deployment
# Install dependencies
pnpm install
# Start dev server on http://localhost:3000
pnpm dev
# Build for production
pnpm build
# Preview production build
pnpm preview├── app.vue # Root layout (Navbar + main + Footer)
├── pages/ # File-based routing
│ ├── index.vue # Home page
│ ├── about.vue # About me
│ ├── projects.vue # GitHub projects
│ ├── contact.vue # Contact form
│ ├── newsletter/
│ │ └── index.vue # Newsletter archive
│ └── 404.vue # Custom 404
├── components/ # Vue components
│ ├── Navbar.vue # Fixed header with mobile menu
│ ├── Footer.vue # Sticky footer with social links
│ └── ui/ # shadcn/vue components
├── server/api/ # Server routes
│ ├── github.get.ts # GitHub repos API
│ ├── substack.get.ts # Substack feed API
│ └── contact.post.ts # Contact form handler
├── lib/utils.ts # cn() utility
├── nuxt.config.ts # Nuxt configuration
└── vercel.json # Vercel deployment config
Deployed to Vercel automatically on push to main.
MIT