A practical reference for the portfolio app: stack, features, setup, deployment, and supporting tools.
A Node.js and Express portfolio for cloud infrastructure, automation, technical writing, project work, small-business website services, and an AWS Cloud Practitioner quiz with an exam-only leaderboard.
correct/total (e.g., 12/15) and highlights your latest
attemptCloud/DevOps hero, portfolio CTA, and contact info
Professional summary, stats, social links, and podcast feature
Tech stack with badges/tooltips
Timeline of professional roles
Cards with tags
Embedded “The Root Access Podcast” appearance
Form with validation + direct contact details
Quiz (Practice/Exam) with exam-only leaderboard
git clone <repository-url>
cd sheigfredbello.com
npm install
cp .env.example .env
# Optional: set RESUME_PASSWORD and OpenAI keys if using chat featuresPlace your file at:
private/SheigfredBelloCV.pdfThe app serves it through the protected résumé download flow.
node server.jsNavigate to http://localhost:5000
Note: leaderboard.json is created on first write. Ensure the
app can write to the data 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.
sheigfredbello.com/
├── server.js # Express app, routes, markdown loading, leaderboard handling
├── views/ # EJS pages and shared layout
├── public/ # CSS, JavaScript, images, and static assets
├── content/resources/ # Markdown website guides and resources
├── data/leaderboard.json # AWS quiz exam leaderboard storage
└── private/SheigfredBelloCV.pdf # Protected résumé file
public/js/aws-quiz.js)AWSQuiz.EXAM_QUESTIONS = 15)
player-name, score, correct, total, time, quiz-mode
/aws-practice?highlight=<name>#leaderboardserver.js)
app.get('/aws-practice', ...)
app.post('/api/leaderboard', ...)
score plus correct and totalscore = round((correct/total) * 100) if counts providedmode == 'exam'correct/totalThe résumé lives outside the public folder and is served through a controlled route:
private/SheigfredBelloCV.pdf
RESUME_PASSWORD=replace_me
npm run dev
npm run start
npm run logs
Ensure write permissions for data/leaderboard.json.
This project is open source and available under the MIT License.