A modern, obviously vibe-coded, dark-mode portfolio/resume website template built with SvelteKit. Perfect for software engineers, full-stack developers, DevOps engineers and other technical professionals who want a clean, professional online presence.
- π¨ Modern Dark Theme - Beautiful zinc-based color scheme with glassmorphism effects
- π± Fully Responsive - Looks great on all devices
- β‘ Static Site Generation (SSG) - Fast loading, SEO-friendly, and hostable anywhere
- π Smooth Animations - Scroll-reveal transitions using Svelte's built-in transitions
- π§ Contact Form - Integrated with Formspree (free tier available)
- π― Easy to Customize - All content managed through simple TypeScript files
- π Free Hosting - Deploy to Cloudflare Pages (or Vercel/Netlify) for free
- βΏ Accessible - Built with shadcn-svelte components following WCAG guidelines
- Hero - Profile photo, name, title, and social links
- About - Professional summary, location, education, and certifications
- Skills - Tech stack organized by category (customizable)
- Experience - Work history timeline with highlights
- Key Highlights - Top 4 achievements or expertise areas
- Contact - Form + direct email CTA
- Framework: SvelteKit with static adapter
- Styling: Tailwind CSS v4
- Components: shadcn-svelte
- Icons: Lucide Icons
- Forms: Formspree
- Node.js 18+
- npm (comes with Node.js)
-
Clone this template
git clone git@github.com:Kxpi/yadr.git my-portfolio cd my-portfolio -
Install dependencies
npm install
-
Customize your data
- Edit
src/lib/config.ts- Site-wide settings - Edit
src/lib/data/profile.ts- Your experience, skills, etc. - Replace
static/profile.jpgwith your photo
- Edit
-
Run development server
npm run dev
Open http://localhost:5173 to see your site.
-
Build for production
npm run build
Static files will be generated in the
build/directory.
export const siteConfig = {
title: "Your Name | Software Engineer",
description: "Your professional summary",
url: "https://yourname.dev",
github: "https://github.com/your-username",
linkedin: "https://linkedin.com/in/yourusername",
email: "your.email@example.com",
formspreeId: "YOUR_FORM_ID" // Get from https://formspree.io
};Update these sections:
profile- Name, title, tagline, summaryskills- Your tech stack (organized by category)experience- Work historyhighlights- Top 4 achievementseducation- Degree infocertifications- Optional certifications list
Replace static/profile.jpg with your own photo.
Recommended specifications:
- Size: 400x400px to 800x800px square
- Format: WebP (best) or optimized JPEG
- File size: Under 50KB for best performance
Quick optimization guide:
- Go to Squoosh.app
- Upload your photo
- Select WebP format (right panel)
- Reduce quality until file size is ~30-50KB
- Resize to 600x600px (covers all display sizes)
- Download and replace
static/profile.jpg
Edit the categories in src/lib/components/sections/Skills.svelte:
const categories = [
{ key: "frontend", label: "Frontend" },
{ key: "backend", label: "Backend" },
{ key: "databases", label: "Databases" },
{ key: "tools", label: "Tools & DevOps" }
];The project uses ESLint and Prettier for code quality and formatting:
# Check for linting errors
npm run lint
# Auto-fix linting errors
npm run lint:fix
# Check code formatting
npm run format:check
# Auto-format all files
npm run format
# Type check with svelte-check
npm run checkThe project uses Husky and lint-staged to automatically run checks on staged files before each commit:
- β
Runs ESLint with auto-fix on
.js,.ts,.sveltefiles - β Formats code with Prettier
- β Only processes staged files (fast!)
Setup:
npm install # Installs Husky hooks automaticallyManual checks:
If you want to run all checks manually:
npm run lint && npm run format && npm run checkSkip pre-commit (not recommended):
git commit --no-verify -m "message"All checks run automatically in GitHub Actions:
- CI Workflow (
.github/workflows/ci.yml):- Code Quality job: Runs lint, format check, and type check in parallel
- Build job: Verifies the production build succeeds
- Deploy Workflow (
.github/workflows/deploy-gh-pages.yml):- Runs quality checks first, then builds and deploys to GitHub Pages
- Only deploys if all quality checks pass
The template uses Tailwind CSS v4 with shadcn-svelte's zinc theme. To change colors:
Edit src/app.css and modify the CSS variables:
.dark {
--background: oklch(...);
--primary: oklch(...);
/* etc */
}All sections are in src/lib/components/sections/. To remove a section:
- Delete the section file (e.g.,
Highlights.svelte) - Remove the import and component from
src/routes/+page.svelte - Update navigation in
Navigation.svelte
The template uses Lucide Icons throughout. To change icons:
- Browse available icons at https://lucide.dev/icons
- Find the icon you want (e.g., "rocket")
- Import it in your component:
import Rocket from "lucide-svelte/icons/rocket";
- Use it in your template:
<Rocket class="h-6 w-6" />
Example - Changing Highlights Icons:
Edit src/lib/components/sections/Highlights.svelte:
// Replace these imports with your preferred icons
import Code from "lucide-svelte/icons/code";
import Layers from "lucide-svelte/icons/layers";
import Zap from "lucide-svelte/icons/zap";
import Users from "lucide-svelte/icons/users";
const icons = [Code, Layers, Zap, Users];The icons array matches the order of highlights in profile.ts, so the first icon corresponds to the first highlight, and so on.
Replace static/favicon.svg with your own icon.
- Go to Formspree.io and create a free account
- Create a new form
- Copy your form ID (looks like:
xabcd123) - Update
formspreeIdinsrc/lib/config.ts
Free tier includes 50 submissions/month.
-
Customize and push to GitHub
-
Deploy to Cloudflare Pages
- Go to Cloudflare Dashboard
- Click Workers & Pages β Create application β Pages
- Connect to Git and select your repository
- Configure build:
- Framework preset: SvelteKit
- Build command:
npm run build - Build output directory:
build
- Click Save and Deploy
-
Add Custom Domain (Optional)
- In your project, go to Custom domains
- Click Set up a custom domain
- Enter your domain (e.g.,
yourname.dev) - Cloudflare will auto-configure DNS if your domain is on Cloudflare
This project is also configured to automatically deploy to GitHub Pages when you push to the main branch.
-
Customize and push to GitHub
-
Enable GitHub Pages
- Go to your repository on GitHub
- Click Settings β Pages
- Under Build and deployment, select:
- Source: Deploy from a branch
- Branch:
gh-pages/root
- Click Save
-
Access your site
- The workflow will automatically build and deploy to the
gh-pagesbranch - Your site will be available at:
https://user.github.io/yadr/ - Initial deployment takes 1-2 minutes
- Check the Actions tab to see deployment progress
- The workflow will automatically build and deploy to the
Both work great with SvelteKit. The build settings are the same:
- Build command:
npm run build - Output directory:
build
MIT License - feel free to use this template for your portfolio!
Found a bug or have a suggestion? Feel free to open an issue or submit a PR.
- Keep it concise - Recruiters spend ~6 seconds on first pass
- Focus on impact - Use numbers and results in your highlights
- Update regularly - Keep your experience current
- Test on mobile - Most traffic is mobile these days
- Optimize images - Use WebP format and compress before uploading
The template is pre-configured for excellent Lighthouse scores. Additional optimizations:
Critical: Optimize your profile photo for best performance:
- Use WebP format instead of JPEG/PNG
- Resize to 600x600px (covers all display sizes)
- Compress to under 50KB using Squoosh.app
- The image has
fetchpriority="high"for faster LCP
Already optimized:
- β
CSS precompression enabled (
precompress: true) - β
Inline small CSS chunks (
inlineStyleThreshold: 1024) - β Static site generation (no runtime JS for content)
- β Minimal JavaScript bundle (~60KB gzipped)
Cloudflare Pages (recommended):
- Automatic Brotli compression
- Global CDN
- HTTP/3 support
- Free SSL
GitHub Pages:
- Enable gzip compression (automatic)
- Consider using Cloudflare in front for better performance
- Make sure Framework preset is set to SvelteKit
- Check that
builddirectory is specified (notdist) - Try adding
NODE_VERSION=18environment variable
- Verify your Formspree form ID is correct in
src/lib/config.ts - Check that your form is active in Formspree dashboard
- Note: Form submissions won't work in development mode (localhost)
- Make sure images are in the
static/folder - Reference them with
/filename.jpg(leading slash) - Check file extensions match exactly (case-sensitive)