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!