The public-facing marketing site for Vertical Playground. A single-page application showcasing our mission, approach, and flagship projects.
| Layer | Technology |
|---|---|
| Framework | SvelteKit 2 |
| Components | Svelte 5 |
| Styling | Tailwind CSS 4 |
| Build | Vite |
| Deployment | Vercel |
External assets loaded via CDN: particles.js (animated background), Font Awesome (icons), Google Fonts (Poppins, Roboto).
src/
├── routes/
│ ├── +layout.svelte # Root layout: wraps all pages with Header/Footer
│ └── +page.svelte # Home page — renders the Main component
├── components/
│ ├── Header.svelte # Sticky nav, changes style on scroll
│ ├── Main.svelte # Landing page content (hero, approach, projects)
│ ├── Footer.svelte # Social links (email, GitHub, LinkedIn)
│ └── Step.svelte # Reusable project card
├── app.html # HTML entry template
└── app.css # Global styles (Tailwind imports + scroll behaviour)
The site is a single scrollable page with three anchor sections: #introPage, #approach, and #projects.
Prerequisites: Node.js 20+
# Install dependencies
make install
# Start dev server (http://localhost:5173)
make dev
# Type check
make check
# Build for production
make build
# Preview the production build locally
make preview
# Remove build artifacts and node_modules
make cleanAll commands have npm run equivalents if you prefer not to use Make.
GitHub Actions runs on every push and pull request to main:
- Install dependencies (
npm ci) - Type check (
npm run check) - Build (
npm run build)
PRs that fail either step should not be merged.
The site deploys automatically to Vercel on merge to main. No manual steps required. The @sveltejs/adapter-vercel adapter handles the build output.
- Hero text and CTAs —
src/components/Main.svelte, intro section - Approach columns —
src/components/Main.svelte, approach section - Project cards —
src/components/Main.svelte, projects section (each uses theStepcomponent) - Navigation links —
src/components/Header.svelte(nav tabs are currently commented out) - Social links —
src/components/Footer.svelte