Replication Guide: Build This Website
Complete documentation to replicate the earthy design system, local-first AI stack, Cloudflare Pages deployment, and maximum SEO/AEO setup — so anyone can build their own version.
Overview & Philosophy
This website was built by a 14-year-old builder from Pune with zero budget, maximum output, and a local-first philosophy. Every decision optimizes for:
- Ownership: No platform lock-in. Static files on Cloudflare Pages. Data in local PostgreSQL.
- Speed: 100 Lighthouse across the board. No frameworks. No heavy JS.
- Discoverability: Maximum SEO + AEO (Answer Engine Optimization) — schema.org, sitemap.xml, robots.txt, Open Graph, Twitter Cards, JSON-LD.
- Personality: Earthy, vibrant, handcrafted. Not corporate. Not template.
- Extensibility: Design system via CSS variables. Easy to fork and customize.
🎯 What You'll Build
A personal website that loads instantly, ranks aggressively, looks distinctive, and costs $0/month to host. Plus the documentation so others can replicate it.
Design System
Color Palette (Earthy + Vibrant)
No standard tech blues/purples. This palette draws from soil, terracotta pots, sage leaves, forest canopy, sand, cream paper.
Primary
Cream#FAF8F5 — Background base
Forest #1B3B2B — Text, primary actions
Accents
Terracotta#D76F30 — CTAs, links, highlights
Sage #7B9E87 — Secondary, muted elements
Sand #EEDFBE — Code backgrounds, subtle fills
Dark Mode
Night#0E1712 — Base
Moss #ECF5EF — Text
Clay #E28D58 — Accent (warmer)
Typography
| Role | Font | Weights | Usage |
|---|---|---|---|
| Headings | Fraunces (Serif) | 300–900 variable | Personality, warmth, editorial feel |
| Body | Plus Jakarta Sans | 200–800 variable | Clean, modern, highly legible |
| Code | JetBrains Mono | 400, 500 | Technical, monospace |
Both fonts loaded via preconnect + variable font files for minimal requests.
Spacing & Radii
Fluid spacing using clamp() for responsive scaling. Border radii scale: 8px → 16px → 24px → 36px. Transitions: 0.2s → 0.4s → 0.8s with cubic-bezier(0.16, 1, 0.3, 1) for natural feel.
Semantic HTML5 Structure
Every element has semantic purpose. No Reusable utility classes: Persists to Adds Native Click button on ScrollSpy updates TOC active link based on section in viewport. All URLs + PWA config: name, icons, shortcuts, theme_color, display: standalone Vector logo, scales perfectly, This website is the frontend. The real power is the local automation stack running on a VPS: Daily 9AM trigger → Instagram automation → Composio MCP → Telegram bot review → post. Visual workflow editor. Self-hosted. Managed integrations: Instagram, GitHub, Discord, Gmail, Notion. v3 MCP protocol. Replaces custom API code. Port 30000. Routes all AI traffic. Auth, rate limits, logging, model switching. Single endpoint for all tools. Local database for content, automation logs, Instagram copy drafts, project metadata. No Supabase/Firebase. Pre-launch security scans on projects (RTO calculator, this site). Multi-agent: recon → exploit → validate → report. Connect GitHub repo → auto-deploy on push to main. Preview deployments on PRs. No frameworks. Critical CSS inlined. Fonts preconnected. Images optimized (WebP/AVIF). No render-blocking JS. HTTPS, CSP-ready, no console errors, modern image formats, efficient caching headers via Cloudflare. Meta tags, canonical, structured data, sitemap, robots.txt, mobile-friendly, fast, secure. This design system, code, and documentation are released under MIT License. Free to use, modify, distribute, commercialize. Attribution appreciated but not required: "Based on Ishaan Dalvi's personal website design system (ishaan-dalvi.pages.dev)" The goal: more distinctive personal websites on the internet. Less templates. More personality.
Skip to main content
Key Principles
per page with aria-labelledby pointing to headingalt text or , never CSS Architecture
CSS Custom Properties (Design Tokens)
:root {
/* Colors */
--color-cream: #FAF8F5;
--color-forest: #1B3B2B;
--color-terracotta: #D76F30;
--color-sage: #7B9E87;
--color-sand: #EEDFBE;
--color-white: #FFFFFF;
--color-shadow: rgba(27, 59, 43, 0.08);
/* Typography */
--font-heading: 'Fraunces', serif;
--font-body: 'Plus Jakarta Sans', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
/* Spacing */
--transition-fast: 0.2s cubic-bezier(0.25, 0.8, 0.25, 1);
--transition-smooth: 0.4s cubic-bezier(0.16, 1, 0.3, 1);
--transition-slow: 0.8s cubic-bezier(0.16, 1, 0.3, 1);
--radius-sm: 8px; --radius-md: 16px; --radius-lg: 24px; --radius-xl: 36px;
--container-width: 900px;
}
/* Dark mode via data attribute */
[data-theme="dark"] {
--color-cream: #0E1712;
--color-forest: #ECF5EF;
--color-terracotta: #E28D58;
/* ... */
}Component Patterns
.btn, .btn-primary, .btn-secondary, .card, .tag, .skip-link. All use variables — change tokens, whole site updates.Animations
@keyframes float-mesh (22-28s, alternate).visible class for fade-uptransform: translateY(-4px) + shadow on cards/buttonsprefers-reduced-motion — all animations disabledVanilla JS Interactions (~150 lines)
Theme Toggle
localStorage, applies data-theme on , syncs SVG icons.Scroll Reveal
IntersectionObserver with threshold: 0.1, rootMargin: '0px 0px -50px 0px'. Adds .visible for CSS fade-up.Header Scroll State
.scrolled class after 20px scroll — backdrop blur + shadow.Smooth Scroll
scrollIntoView({behavior: 'smooth'}) for anchor links.Code Copy
blocks → navigator.clipboard.writeText() → toast feedback.Active Nav Highlight
Maximum SEO/AEO Implementation
Meta Tags (All Pages)
JSON-LD Schema.org (Homepage)
Technical SEO Files
sitemap.xml
annotations + robots.txt
Allow: /, Sitemap: ..., disallows private pathsmanifest.json
favicon.svg
AEO (Answer Engine Optimization)
TechArticle / FAQPage where applicableLocal-First AI Stack (The "Backend")
🦙 Ollama (Local LLMs)
qwen2.5-coder:14b — code generation, review, documentation. qwen3:30b (MoE) — complex reasoning. Zero API costs. Private.🔄 n8n (Workflows)
🔌 Composio MCP
🛡️ SkillClaw Proxy
🐘 PostgreSQL
🛠️ Strix AI Pentesting
Cloudflare Pages Deployment
One-Command Deploy
# 1. Install Wrangler
npm install -g wrangler
# 2. Authenticate (one-time)
wrangler login
# Opens browser → authorize → done
# 3. Deploy
wrangler pages deploy ./ishaan-site --project-name=ishaan-dalvi
# Output: https://Custom Domain
ishaan-dalvi → Custom domainsishaan-dalvi.pages.dev (or your domain)Git Integration (Optional)
Performance & Lighthouse 100
Performance: 100
Accessibility: 100
prefers-reduced-motion supportBest Practices: 100
SEO: 100
Core Web Vitals (Target)
Metric Target Achieved Via LCP < 1.5s Inlined critical CSS, preconnected fonts, optimized hero image INP < 100ms Minimal JS, no main-thread blocking, passive event listeners CLS < 0.05 Explicit image dimensions, font-display: swap, reserved space Customization Checklist (Fork & Make It Yours)
Ishaan Dalvi → your name (HTML, JSON-LD, manifest, meta tags)https://ishaan-dalvi.pages.dev → your domain (everywhere)portrait.jpg → your photo (same aspect ratio, 1080x1080+):root — pick your earthy paletteknowsAbout, sameAs in JSON-LD Person schemamanifest.json name, shortcuts, theme_colorfavicon.svg with your initials/logowrangler pages deploy with your project name📁 File Structure
ishaan-site/
├── index.html # Main page (copy for other pages)
├── docs/
│ └── index.html # This documentation page
├── portrait.jpg # Your photo (1080x1080+)
├── favicon.svg # Vector logo
├── manifest.json # PWA config
├── sitemap.xml # All URLs
├── robots.txt # Crawler rules
├── schema.json # AID machine-readable profile
├── SHARING.md # Publicity/distribution plan
└── deploy.sh # wrangler deploy wrapperLicense & Attribution