Let the robot do the coding! (Now retired) https://badblocks.dev
Find a file
2025-08-14 19:00:08 -07:00
.github feat: add in copy of updated shared deployment workflows for now until they are 2025-08-14 18:42:59 -07:00
app feat: add profile headshot image 2025-08-13 18:29:17 -07:00
deploy ci: add SSH key support and fix release workflow issues 2025-08-11 12:44:55 -07:00
public feat: add profile headshot image 2025-08-13 18:29:17 -07:00
server refactor: remove temporary proxy testing code 2025-07-31 16:03:58 -07:00
.dockerignore ci: implement 3-stage deployment pipeline with semantic-release 2025-07-31 19:18:43 -07:00
.env.example feat: enhance contact form security and add animated hero 2025-07-19 22:59:05 -07:00
.gitignore feat: add profile headshot image 2025-08-13 18:29:17 -07:00
.nvmrc ci: modernize workflows for gitflow with SSH signing 2025-07-30 13:18:40 -07:00
.releaserc.json ci: clean up semantic-release config and remove unused deps 2025-08-13 21:39:14 -07:00
bun.lock feat: add Docker deployment with HAProxy and blue-green strategy 2025-07-21 23:25:19 -07:00
docker-compose.yml feat: add Docker deployment with HAProxy and blue-green strategy 2025-07-21 23:25:19 -07:00
Dockerfile feat: display app version in footer 2025-08-11 10:33:38 -07:00
eslint.config.mjs feat: enhance contact form security and add animated hero 2025-07-19 22:59:05 -07:00
LICENSE ci: implement 3-stage deployment pipeline with semantic-release 2025-07-31 19:18:43 -07:00
nuxt.config.ts feat: add profile headshot image 2025-08-13 18:29:17 -07:00
package-lock.json ci: clean up semantic-release config and remove unused deps 2025-08-13 21:39:14 -07:00
package.json ci: clean up semantic-release config and remove unused deps 2025-08-13 21:39:14 -07:00
README.md chore: update readme 2025-08-14 19:00:08 -07:00
tailwind.config.js feat: bootstrap Nuxt portfolio with Tailwind and daisyUI for now 2025-07-17 15:53:12 -07:00
tsconfig.json feat: bootstrap Nuxt portfolio with Tailwind and daisyUI for now 2025-07-17 15:53:12 -07:00

🚀 Portfolio Bonanza

A sweet little portfolio site with some absolutely ridiculous SMS shenanigans built on Nuxt 4! Looks like things are getting too spicy for the pepper! 🌶️

The Good Stuff

  • 🌙 Night mode everything - DaisyUI components that won't burn your eyeballs
  • 📱 SMS contact form - Because I get wayyy too many emails already
  • 🎭 Snazzy animations - ScrollReveal + Typed.js doing their thang
  • 🐳 Zero-downtime deploys - Blue-green magic with Docker & HAProxy
  • 🔧 Overengineered infrastructure - We like to do things the hard way over here

🏃‍♂️ Getting Started

# Grab the dependencies
bun install

# Copy example env file and edit
cp .env.example .env && nano .env

# Fire up the dev server
bun run dev

# Build the contraption
bun run build

# Bake it
bun run generate

Current vibe levels:
😴 sleepy
🙂 caffeinated
🤓 productive
🔥 on fire
💀 send halp

📞 Contact Form Wizardry

Two-step verification dance: drop your message → prove you're human with SMS → message gets yeeted to my phone via some questionable infrastructure choices.

Rate-limited because spam just sucksssss! 🛡️

🏗️ Infrastructure Tomfoolery

Here's where things get completely unhinged:

🌐 Your Browser → Some VPS → 🔐 WireGuard Tunnel 
→ 🏠 Home Network → 🧟‍♂️ My Frankenstein Phone/SMS-Gateway 
→ 📱 Someone's Legit Regular Phone

The SMS Gateway Setup

I'm running the android-sms-gateway app on a completely deranged setup:

  • Hardware: Pixel 1 with the battery surgically removed (no spicy pillows please)
  • Power: Permanently plugged into the wall like some kind of cursed landline
  • Network: Hardwired ethernet via USB-C adapter ("WhyFight" with WiFi?)
  • Purpose: Sits there 24/7 just waiting to send OTPs and forward your messages to my actual phone

The whole contraption lives on my home network and the VPS reaches it through a WireGuard tunnel because apparently I enjoy making simple things complicated just to save $2 a month!

🌳 Git Workflow Madness

This repo follows a three-branch strategy with some absolutely bonkers automated promotions because manually managing branches is for chumps:

  • dev - Where the magic happens! All new features and fixes go here
  • staging - Integration testing playground, auto-promoted from dev daily at 13:00 UTC via scheduler
  • main - Production branch, gets promoted from staging weekly on Sundays at 14:00 UTC via scheduler

The Repository Setup

We're running a bit of a funky setup here:

  • Primary repo: Git origin (configurable - can be self-hosted, GitHub, etc.)
  • GitHub Mirror: Optional push-only mirror for CI/CD and visibility
  • CI/CD: GitHub Actions (triggered by pushes or scheduled workflows)

So the workflow is: push to Git origin → (optional mirror to GitHub) → GitHub Actions does the heavy lifting.

Branch Promotion Dance 💃

Daily (dev → staging):

  • Robot overlord wakes up at 13:00 UTC every day
  • Checks if dev has new commits (because we're not animals)
  • Actually validates the build passed via GitHub API (fancy!)
  • Fast-forward merge to staging (keeps git history from becoming spaghetti)
  • Supports [skip ci] in commit messages for when you inevitably break something
  • Manual "YOLO deploy anyway" button available

Weekly (staging → main):

  • Sunday funday at 14:00 UTC for production releases
  • Runs semantic-release for proper versioning (we're not completely chaotic)
  • Some gnarly branch gymnastics to keep everything synchronized
  • SSH-signed commits because we pretend to care about security
  • Manual panic button also available

🤖 The 5-Workflow CI/CD Circus

Because apparently one workflow wasn't enough, we've got a whole circus of automation:

  1. build.yml - The overachiever that builds everything

    • Gets triggered by basically anything that moves
    • Smart enough to skip builds when we already did the work (lazy efficiency!)
    • Hoards artifacts for 2 days like a digital packrat
    • Has more caching layers than a wedding cake
  2. deploy.yml - The deployment minion (does what it's told)

    • Gets bossed around by the other workflows
    • Juggles blue-green deployments without dropping anything
    • Speaks fluent SSH and WireGuard
    • Downloads artifacts faster than you can say "containerization"
  3. stage.yml - The daily grind automation

    • Wakes up every day to promote dev → staging
    • Actually checks if builds passed (responsible adult behavior)
    • Signs commits with SSH keys because we're fancy like that
    • Has a "force" option for when things go sideways
  4. release.yml - The weekly release party host

    • Shows up every Sunday with semantic versioning
    • Does some serious git branch yoga to keep everything aligned
    • Maintains that linear history we all pretend to care about
  5. scheduler-*.yml - The workflow orchestrators

    • Exists because GitHub has weird scheduling quirks
    • Makes sure the right code runs from the right branch
    • Basically the puppet masters of this whole operation

🚢 Deployment Shenanigans

Pushes to staging or main branches trigger some absolutely wild blue-green deployment wizardry with more caching than your browser history!

Blue-Green Magic

  1. Build Phase: Smart enough to skip rebuilding stuff we already built (because efficiency is sexy)
  2. Deploy Phase: Download cached goodies and poke the new containers to make sure they're alive
  3. Switch Phase: HAProxy does the old switcheroo faster than a shell game
  4. Cleanup Phase: Yeet the old containers into the digital void
  5. Artifact Hoarding: Keeps build artifacts for 30 days like a digital packrat with commitment issues
  6. Moon Phases: 🌑 🌒 🌓 🌔 🌝 🌖 🌗 🌘 🌚 (for spiritual alignment)

GitHub Secrets Setup

Deployments generate the needed .env from GitHub secrets, so make sure to slap some secrets up first!

WireGuard Setup

The stack is rocking gluetun, so just set up your WIREGUARD_ environment variables in Github secrets:

🔒 Security Fortress

  • 🔐 WireGuard tunnel encryption
  • 🛡️ Container firewalls and non-root execution
  • 🔢 TOTP phone verification + rate limiting
  • 🔤 ASCII-only validation (No spammy weird characters please!)

🆘 When Things Go Wrong

# Check if containers are actually alive
docker compose ps && docker compose logs portfolio

# Poke the SMS gateway to see if it's responsive
docker compose exec portfolio curl -f http://your-sms-gateway-ip:9090/health

# Check WireGuard tunnel status
docker compose exec portfolio wg show

Debugging stages of grief: 😎 confident → 🤔 confused → 😅 nervous → 😰 panicking → 💀 accepting fate → 🍕 ordering pizza

📁 What's Where

├── app/          # Nuxt 4 frontend
├── server/       # API routes
├── deploy/       # Deployment scripts
└── .github/      # CI/CD workflows

🤝 Contributing

Feel free to explore the code! This is a personal portfolio, so no contributions are needed, but you can use the architecture and deployment setup for inspiration!

📜 License

This project is licensed under AGPL 3.0 only - see the LICENSE file for details. Any derivative works must also be licensed under AGPL 3.0.


Built with ❤️ and lots of ! (Sheesh, if you've read this far, just hire me, please!)