Technical documentation for the cyberpunk portfolio website
A modern, cyberpunk-themed portfolio built with Flask: neon aesthetics, animated particles, smooth scrolling navigation, a downloadable résumé, and an AWS Cloud Practitioner quiz with an exam-only leaderboard.
correct/total (e.g., 12/15) and highlights your latest
attemptleaderboard.json)Hero with animated title, résumé download, contact info
Summary with stats and neon glow
Tech stack with badges/tooltips
Timeline of professional roles
Cards with tags
Embedded “The Root Access Podcast”
Form with validation + direct contact details
Quiz (Practice/Exam) with exam-only leaderboard
git clone <repository-url>
cd portfolio
python -m venv venv
# macOS/Linux
source venv/bin/activate
# Windows
# venv\Scripts\activate
pip install -r requirements.txtPlace your file at:
static/assets/resume.pdfThe homepage “Resume” button links to this path.
python app.pyNavigate to http://localhost:5000
Note: leaderboard.json is created on first write. Ensure the
app can write to the project directory.
Image: shig24/shig-webapp:latest
docker pull shig24/shig-webapp:latest
docker run --rm -p 5000:5000 shig24/shig-webapp:latest
# Open http://localhost:5000
docker run --rm -p 5000:5000 \
-e SECRET_KEY='replace_me' \
-e RESUME_PASSWORD='replace_me' \
-v "$PWD/private:/app/private:ro" \
-v "$PWD/leaderboard.json:/app/leaderboard.json" \
--name shig-webapp \
shig24/shig-webapp:latest
docker pull shig24/shig-webapp:latest
docker stop shig-webapp || true
docker rm shig-webapp || true
docker save -o shig-webapp.tar shig24/shig-webapp:latest
docker load -i shig-webapp.tar
Note: If private, run docker login
before pulling.
portfolio/
├── app.py # Flask app (with /aws-practice + alias /awspractice)
├── requirements.txt
├── README.md
├── leaderboard.json # Created at runtime (exam leaderboard storage)
├── templates/
│ ├── index.html # Home
│ ├── documentation.html # Docs page
│ └── aws_practice.html # AWS quiz page (exam-only leaderboard)
└── static/
├── assets/
│ └── resume.pdf # Résumé served by the CTA
├── css/
│ ├── styles.css # Main site styles (home/docs/shared)
│ └── aws-practice.css # Quiz styles (scoped to .aws-practice-main)
└── js/
├── app.js # Nav, theme, particles, typing, etc.
└── aws-quiz.js # Quiz logic (Practice/Exam, timer, POST to backend)
static/js/aws-quiz.js)AWSQuiz.EXAM_QUESTIONS = 15)
player-name, score, correct, total, time, quiz-mode
/aws-practice?highlight=<name>#leaderboardapp.py)
@app.route('/aws-practice', methods=['GET', 'POST'])
@app.route('/awspractice', methods=['GET', 'POST']) # alias
score plus correct and totalscore = round((correct/total) * 100) if counts providedmode == 'exam'correct/totalAdd a download button in the hero:
<a class="cta-button resume"
href="{{ url_for('static', filename='assets/resume.pdf') }}"
download>
Download Résumé
</a>
python app.pydebug=False in app.py
pip install gunicorn
gunicorn app:app
Ensure write permissions for leaderboard.json.
This project is open source and available under the MIT License.