A modern, multilingual full-stack developer portfolio and project showcase built with SvelteKit 5, Skeleton Labs, and Paraglide JS i18n. Deployed to Cloudflare Workers with comprehensive testing infrastructure.
lelab.dev is a public showcase and portfolio platform for sharing diverse open-source projects:
- Golang projects - Backend services and CLI tools
- Python projects - Data processing and automation scripts
- SvelteForge boilerplate - Custom Svelte starter template for rapid web development
- Experimental projects - Cutting-edge technical explorations
The core site features a professional, accessible interface with full internationalization (EN/FR/DE/ES/JA), dark mode support, and dynamic project loading from markdown + Svelte files.
- Multilingual Landing Page - 5 languages with automatic browser locale detection
- Dynamic Project System - Projects loaded from
.svxfiles (Markdown + Svelte) with locale fallback - Dark Mode - Theme switcher with persistent preference
- Responsive Design - Mobile-first layout using Tailwind CSS and Skeleton Labs
- SEO Optimized - Meta tags, Open Graph, structured data, sitemap, robots.txt
- Type-Safe - Full TypeScript with strict mode enabled
- Comprehensive Testing - Vitest for unit tests, Playwright for e2e tests
- Professional Styling - Skeleton Labs CSS variables with automatic light/dark mode pairing
- Accessible UI - WCAG compliance with semantic HTML and ARIA attributes
| Technology | Purpose |
|---|---|
| SvelteKit 5 | Full-stack web framework with file-based routing |
| Skeleton Labs | Component library and design system with CSS variables |
| Tailwind CSS 4 | Utility-first CSS with Skeleton themes |
| Paraglide JS | Runtime i18n with 5-language support |
| TypeScript | Type-safe development with strict mode |
| Vitest | Unit testing framework |
| Playwright | E2E testing framework |
| Cloudflare Workers | Serverless deployment platform |
- Node.js 18+ (or use
nvm) - npm, yarn, or pnpm
# Install dependencies
npm install
# Start development server with hot reload
npm run dev
# Open in browser automatically
npm run dev -- --openThe development server runs at http://localhost:5173 with instant HMR for Svelte components.
# Type check and validate
npm run check
# Run all tests
npm run test
# Build production bundle
npm run build
# Preview production build locally
npm run preview
# Format code
npm run format
# Lint and check formatting
npm run lintnpm run build # Creates optimized bundle in .svelte-kit/cloudflareThe project uses @sveltejs/adapter-cloudflare with nodejs_compat flag for Paraglide JS async_hooks support.
src/
βββ routes/ # File-based routing
β βββ +layout.svelte # Root layout with SEO meta tags
β βββ +page.svelte # Landing page composition
β βββ home/ # Landing page components (Hero, Projects, About)
β βββ Navigation.svelte # Sticky navbar with theme/language switchers
β βββ Footer.svelte # Footer with branding and links
β βββ demo/ # Demo pages and UI showcase
βββ lib/
β βββ components/ # Reusable Svelte components
β β βββ ui/ # UI elements (Link, buttons, etc.)
β β βββ Logo.svelte # Gradient logo component
β β βββ LightSwitch.svelte # Dark mode toggle
β β βββ LanguageSwitcher.svelte # Language selector (EN/FR/DE/ES/JA)
β βββ services/ # Business logic (project loading, etc.)
β βββ stores/ # Svelte stores (theme, language, i18n)
β βββ utils/ # Utilities (icons, messages, theme manager)
β βββ styles/ # Global CSS and shared patterns
β βββ types/ # TypeScript type definitions
βββ content/
β βββ links.ts # Centralized URL management
β βββ projects.ts # Project registry and loading
β βββ projects/ # Project .svx files organized by locale
β βββ en/ # English projects
β βββ fr/ # French projects
β βββ de/ # German projects
β βββ es/ # Spanish projects
β βββ ja/ # Japanese projects
βββ messages/ # i18n translation files (5 languages)
βββ static/ # Static assets (favicon, robots.txt, .well-known/)
βββ app.d.ts # SvelteKit app type definitions
The project uses Paraglide JS for zero-runtime i18n with 5 languages:
- English (en)
- FranΓ§ais (fr)
- Deutsch (de)
- EspaΓ±ol (es)
- ζ₯ζ¬θͺ (ja)
import * as m from '$lib/paraglide/messages';
import { setLocale, getLocale } from '$lib/paraglide/runtime';
// Type-safe message access
<h1>{m['hero.title']()}</h1>
// Change language
setLocale('fr'); // Switch to French
// Get current locale
const current = getLocale(); // Returns 'en', 'fr', 'de', 'es', or 'ja'-
Add translation keys to all 5 message files:
messages/en.jsonmessages/fr.jsonmessages/de.jsonmessages/es.jsonmessages/ja.json
-
Rebuild to regenerate Paraglide runtime:
npm run build
Projects are managed via .svx files (Markdown + Svelte) with YAML frontmatter:
---
title: "Project Name"
description: "Brief description"
github: "https://github.com/..."
icon: "IconName" # From Phosphor Icons
color: "primary|secondary|tertiary"
---
# Project Details
Markdown content with features, use cases, and integration details.
Current Projects:
svelteforge- Custom Svelte starter templaterune-scroller- Interactive scrolling componenthush-music- Music projectgositemap- Go sitemap generatorgoto-slug- URL slug managementtasky- Task management tool
- Create
.svxfiles insrc/content/projects/{locale}/projectname.svxfor each language - Add project slug to
projectModulesinsrc/content/projects.ts - Files automatically appear in the Projects grid with locale fallback
Uses Skeleton Labs CSS variables with automatic light/dark mode pairing:
<!-- Color pairing for automatic dark mode -->
<div class="bg-surface-50-800 text-surface-950-50">
Automatically light background with dark text in light mode,
dark background with light text in dark mode
</div>Available Colors:
- Surface - Backgrounds and text (50-950 scale)
- Primary - Main brand color (blue)
- Secondary - Accent color (green)
- Tertiary - Accent color (magenta)
# Unit tests (Vitest)
npm run test:unit
# Unit tests with UI
npm run test:unit -- --ui
# Unit tests in watch mode
npm run test:unit -- --watch
# E2E tests (Playwright)
npm run test:e2e
# Run all tests
npm run testTest Patterns:
- Client tests:
src/**/*.svelte.spec.ts(browser environment) - Server tests:
src/**/*.spec.ts(Node.js environment) - E2E tests:
e2e/**/*.spec.ts(Playwright)
All tests require requireAssertions: true - at least one assertion per test.
Use these convenient path aliases instead of relative imports:
import { Logo } from '$c/Logo'; // $c or $components
import { Link } from '$ui/Link'; // $ui
import { theme } from '$s/theme'; // $s or $stores
import { formatDate } from '$u/core'; // $u or $utils
import * as m from '$lib/paraglide/messages'; // i18n
import { projects } from '$content/projects'; // $content- Meta Tags - Title, description, keywords, author
- Open Graph - Social media preview optimization
- Twitter Card - Custom social media cards
- Canonical URLs - Prevent duplicate content issues
- hreflang Tags - Multi-language SEO support
- Robots.txt - Crawler instructions with sitemap reference
- Sitemap.xml - Dynamic sitemap generation
- Security.txt - Security contact information
Follow Conventional Commits:
feat: add new feature
fix: resolve bug
docs: update documentation
refactor: improve code structure
test: add or update tests
Always include footer with collaboration attribution.
Created by LudoLoops as a full-stack developer portfolio.
This is a personal portfolio project, but contributions and feedback are welcome!
- Create a feature branch
- Make changes following commit conventions
- Run
npm run checkandnpm run testto validate - Submit a pull request with detailed description
- Website: https://lelab.dev
- GitHub: https://github.com/ludoloops
- Security: See
static/.well-known/security.txt
For detailed architecture and development guidelines, see CLAUDE.md.