A personal portfolio site with an IDE-like (VS Code) dark theme, powered by Astro and packed with interactive Stitch Easter eggs.
🛠️ Template by HoPHNi — fork it, customize it, make it yours.
# Install dependencies
npm install
# Run dev server
npm run dev
# Build for production
npm run build
# Preview production build
npm run previewThe site will be available at http://localhost:4321/.
src/
├── content/ ← All editable content (Markdown)
│ ├── hero/about.md ← Role, skills, bio for terminal
│ ├── experience/*.md ← Work experience entries
│ ├── projects/*.md ← Pet project cards
│ ├── contacts/links.md ← GitHub, Telegram, etc.
│ ├── terminal/commands.md ← Hidden terminal commands
│ └── stitch/reviews.md ← Stitch tech review comments
├── components/ ← Astro components
│ ├── Header.astro ← IDE tab navigation
│ ├── Hero.astro ← Terminal-style hero section
│ ├── ExperienceTimeline.astro ← JSON-formatted experience
│ ├── ProjectCards.astro ← Project card grid
│ ├── Footer.astro ← Contact + VS Code status bar
│ ├── StitchDebugger.astro ← 🐛 Corner Stitch Easter egg
│ ├── StitchReviewer.astro ← 🔍 Tech badge tooltip
│ ├── StitchCopyGuard.astro ← 🔒 Copy guard toast
│ ├── StitchCrash.astro ← 💥 Idle crash effect
│ └── HiddenTerminal.astro ← 🖥️ Secret terminal
├── layouts/BaseLayout.astro ← HTML head, fonts, meta tags
├── pages/
│ ├── index.astro ← Main page
│ └── 404.astro ← Custom 404 with Stitch
├── styles/global.css ← Tailwind v4 theme tokens
public/
├── stitch-debugger.png ← Stitch with a bug
├── stitch-reviewer.png ← Stitch with magnifying glass
├── stitch-crash.png ← Stitch sitting innocently
├── stitch-guard.png ← Stitch guarding data
├── stitch-404.png ← Stitch chewing cables
├── favicon.svg ← Terminal prompt icon
└── CNAME ← Custom domain
All content lives in Markdown files inside src/content/. No component code changes needed.
---
role: "Your Role Title"
username: "yourname" # Terminal prompt: yourname@portfolio
hostname: "portfolio" # Terminal prompt + path
templateUrl: "https://github.com/..." # "Use Template" header button
bio: "Short bio paragraph."
skills:
backend: ["FastAPI", "Django"]
database: ["PostgreSQL", "Redis"]
devops: ["Docker", "CI/CD"]
tools: ["Celery", "RabbitMQ"]
---Create one .md file per job (e.g., 1-company.md):
---
company: "Company Name"
role: "Your Role"
period: "Jan 2024 — Present"
stack: ["Python", "FastAPI", "PostgreSQL"]
order: 1 # Lower = shown first
current: true # Optional, marks green dot
description: "Project context"
---
- Built something amazing
- Led a team of 5---
name: "Project Name"
description: "What the project does."
stack: ["Python", "Selenium"]
icon: "smart_toy" # Material Symbol name
link: "https://example.com" # Optional (GitHub, website, etc.)
order: 1
---Icons: browse Material Symbols
---
heading: "Want to collaborate or hire me?"
links:
# Material Symbol icon (default)
- label: "hophnidev@gmail.com"
url: "mailto:hophnidev@gmail.com"
icon: "mail"
# Custom SVG icon (e.g. brand logos)
- label: "github.com/yourname"
url: "https://github.com/yourname"
icon: "code"
iconType: "svg" # "material" (default) or "svg"
svgPath: "M12 0c-6.626..." # SVG path data (d attribute)
---
iconType: "svg"renders an inline<svg>with the providedsvgPath. Omit it for default Material Symbols.
Edit the @theme block to change IDE colors:
@theme {
--color-bg-dark: #0D1117; /* Main background */
--color-ide-gray: #161B22; /* Panel backgrounds */
--color-primary: #58A6FF; /* Accent color */
--color-accent-green: #3FB950; /* Terminal green */
}- Domain: edit
public/CNAME - Site URL: edit
siteinastro.config.mjs - Title & Description: edit
src/layouts/BaseLayout.astro
Every tab in the header has a close button (×) that appears on hover — just like VS Code:
- Click × to close the tab and hide its section from the page
- All tabs can be closed
- A "Restore" button appears when tabs are closed — click to reopen all
- Press
Ctrl+Z(orCmd+Z) to restore the last closed tab one by one
The active tab automatically highlights based on scroll position.
Stitch peeks from the bottom-right holding a glowing bug.
- Hover → Stitch peeks up fully
- Click → Console log: "Burp! Delicious bugs..."
- Idle → Stitch periodically peeks up on his own
2. 🖥️ Hidden Terminal
Press ` (backtick), ~ (tilde), or Cmd+K / Ctrl+K to open an Ubuntu-styled terminal overlay.
Tab autocomplete — type a partial command and press Tab to complete it.
| Command | Output |
|---|---|
help |
List of available commands |
cat skills.json |
Tech skills (from hero section) |
python3 info.py |
Bio in triple quotes |
cat contact.sh |
Contact links |
neofetch |
Ubuntu-style ASCII + system info |
fetch_stack |
ASCII tech stack table |
ls |
Virtual file listing |
git status |
Fake git status |
sudo rm -rf / |
Glitch effect + ASCII art 💀 |
Customize commands and neofetch info in
src/content/terminal/commands.md
Hover over any tech badge (in Experience or Projects) — Stitch appears with a speech bubble commenting on the technology.
Customize comments in
src/content/stitch/reviews.md
Select text inside the Experience section — a toast appears:
"🔒 Data locked. Just kidding, copy whatever you want 😜"
30-second cooldown between triggers.
Leave the tab inactive for 5 minutes, then return:
- Page scrolls to top
- ALL sections "fall" into a pile with physics
- Stitch sits on the wreckage: "SYSTEM CRASH — docker-compose down // oops"
- Move the mouse to reboot — elements spring back to their positions
Change idle duration: edit
IDLE_MSinsrc/components/StitchCrash.astro
Navigate to any invalid URL — Stitch is caught chewing server cables with electric sparks.
git init
git remote add origin https://github.com/YOUR_USERNAME/YOUR_REPO.git
git add .
git commit -m "initial commit"
git push -u origin main- Go to Settings → Pages in your GitHub repo
- Under Source, select GitHub Actions
- The workflow (
.github/workflows/deploy.yml) will auto-deploy on every push tomain
Push to main → wait ~1 min → visit https://YOUR_USERNAME.github.io/YOUR_REPO/
git add .
git commit -m "update portfolio"
git push origin mainpublic/CNAME — set your domain (no https://):
yourdomain.com
astro.config.mjs — set site to your domain:
export default defineConfig({
site: 'https://yourdomain.com',
// ...
});Go to your domain registrar's DNS settings and add these records:
For root domain (yourdomain.com) — add 4 A records:
| Type | Name | Value |
|---|---|---|
| A | @ |
185.199.108.153 |
| A | @ |
185.199.109.153 |
| A | @ |
185.199.110.153 |
| A | @ |
185.199.111.153 |
For www subdomain — add CNAME:
| Type | Name | Value |
|---|---|---|
| CNAME | www |
YOUR_USERNAME.github.io |
⏳ DNS changes can take 10 min–48 hours to propagate.
- Go to Settings → Pages
- Under Custom domain, enter
yourdomain.com - Click Save
- Wait for DNS check to pass (green checkmark)
- ✅ Check Enforce HTTPS (appears after DNS verifies)
# Check DNS propagation
dig yourdomain.com +short
# Should show: 185.199.108.153, ...109, ...110, ...111
# Check HTTPS
curl -I https://yourdomain.com
# Should show: HTTP/2 200Visit https://yourdomain.com — your portfolio should load with HTTPS 🔒
| Layer | Tech |
|---|---|
| SSG | Astro 5 |
| Styling | Tailwind CSS v4 |
| Content | Astro Content Collections (Markdown) |
| Hosting | GitHub Pages |
| CI/CD | GitHub Actions |
| Design | Google Stitch (initial prototype) |
MIT — use it, fork it, make it yours.
Template developed by HoPHNi · Star ⭐ the repo if you like it!