Build Stack

A high-level breakdown of the tools, architecture, and decisions behind each project.

🌐 Portfolio Site
✅ Complete
Frontend HTML5 · CSS3 · Vanilla JavaScript
Hosting AWS S3 (static website hosting)
CDN / HTTPS AWS CloudFront + ACM (SSL certificate)
CI/CD GitHub Actions → S3 sync + CF cache invalidation
Version Control Git + GitHub
git push → GitHub Actions → aws s3 sync --delete → CloudFront invalidation (/*) → Live Site Developer CI/CD Pipeline AWS Infrastructure ───────── ────────────── ───────────────── git push →→→ GitHub Actions →→→ S3 Bucket (origin) ├─ Checkout code └─→ CloudFront CDN ├─ S3 sync └─→ ACM HTTPS cert └─ CF invalidate →→→ End User (browser)
  • Chose S3 + CloudFront over managed hosting (Netlify, Vercel) to practice real AWS infrastructure skills
  • CloudFront handles HTTPS for free via ACM — no need for a separate certificate manager
  • GitHub Actions chosen over Jenkins for simplicity — no server to maintain, native GitHub integration
  • Used --delete flag on S3 sync to keep bucket clean and remove stale files automatically
  • Vanilla JS with no framework — keeps bundle size at zero and demonstrates core DOM skills
  • IAM least-privilege matters — created a dedicated deploy user with only S3 + CloudFront permissions
  • CloudFront caches aggressively — always invalidate after deployment or users see stale content
  • Cache-Control headers on S3 objects affect how long CloudFront holds content at edge nodes
  • GitHub Secrets are the right way to store AWS credentials for CI/CD — never hardcode keys
  • IntersectionObserver is a powerful, performant alternative to scroll event listeners
📊 Web Analytics Implementation
✅ Complete
Tag Manager Google Tag Manager (GTM-5M2JVHL4)
Analytics Google Analytics 4 (GA4)
Deployment GTM container script injected into all 4 HTML pages
Trigger All Pages — fires GA4 tag on every page load
Browser loads page → GTM container script fires → GTM checks rules → GA4 tag fires → Sends hit to Google Analytics HTML Pages GTM Container GA4 Property ────────── ───────────── ──────────── index.html →→→ GTM-5M2JVHL4 →→→ G-XXXXXXXXXX projects.html ├─ GA4 Tag └─ Realtime Reports stack.html ├─ All Pages trigger └─ Audience Data blog.html └─ DataLayer └─ Page View Events
  • Used GTM instead of direct GA4 snippet — allows adding/changing tags without code deployments
  • GTM container script placed at top of <head> for earliest possible load time
  • Added <noscript> iframe fallback in <body> for browsers with JavaScript disabled
  • Single GTM container covers all 4 pages — one publish deploys tracking changes everywhere
  • GTM decouples analytics from source code — marketers or analysts can add tags without a developer
  • GA4 Realtime view is the fastest way to verify a tag is firing correctly after GTM publish
  • GTM Preview mode lets you debug tag firing before pushing to production
  • The DataLayer is a powerful pattern for passing custom event data to GTM without hardcoding
Agile Workflow with Jira
✅ Complete
Project Board Jira (Atlassian Cloud — Free tier)
API Jira REST API v3
Auth Basic Auth (email + API token)
Credentials Stored as env vars in ~/.zshrc
Client curl + Python (JSON parsing)
~/.zshrc (env vars) → curl → Jira REST API → Board / Sprint / Tickets Local Machine Jira REST API Jira Cloud ──────────── ───────────── ────────── $JIRA_API_TOKEN →→→ POST /issue →→→ Create Epic / Story $JIRA_EMAIL POST /transitions →→→ Set status → Done $JIRA_BASE_URL POST /sprint/{id} →→→ Add issues to sprint POST /sprint/start →→→ Activate sprint
  • Used Jira REST API over the UI to create tickets in bulk — faster and repeatable
  • Stored API token in ~/.zshrc as env var — never hardcoded in scripts or committed to git
  • Added .gitignore to block .env and .zshrc from being committed to the repo
  • Used Jira Free tier — supports unlimited projects and sprints for solo developers
  • Chose Scrum board over Kanban to practice sprint-based agile workflow
  • Jira's transition IDs are workflow-specific — always query /transitions before automating status changes
  • Epics must be created before stories — stories reference the epic key as a parent
  • API tokens expire or get revoked — source ~/.zshrc is needed after any token update
  • Storing credentials in chat is a security risk — always use env vars or a secrets manager
🔁 AWS Data Pipeline
🔄 In Progress
Language Python 3.x
Compute AWS Lambda (serverless)
Storage AWS S3
Monitoring AWS CloudWatch
Trigger → Lambda → Transform → S3 → CloudWatch Logs
  • Documentation in progress...
🔄 In Progress
🔐 Security Home Lab
🔮 Coming Soon
OS Linux (Ubuntu) · Kali Linux
Network Wireshark · Nmap · tcpdump
SIEM Splunk
Coming soon — lab topology documentation pending setup
  • Documentation coming soon...
🔮 Coming Soon
📊 Python Analytics Dashboard
🔮 Coming Soon
Language Python 3.x
Data Pandas · SQL
Visualization Matplotlib · Jupyter
Coming soon — project in planning phase
  • Documentation coming soon...
🔮 Coming Soon