A fullstack portfolio and interactive ML/GenAI showcase built with Flask. Features eight self-contained project demos spanning retrieval-augmented generation, computer vision, NLP, unsupervised learning, classification, regression, data visualization, and music data exploration — plus a blog, resume, and contact pages.
Each project lives in its own GitHub repo, wired in here as a git submodule.
| Project | Description | Runs On |
|---|---|---|
| D&D RAG | Ask natural language questions about D&D 5e — semantic search retrieves relevant passages from the DMG, PHB & MM, then Claude synthesizes a cited answer | Server (sentence-transformers, sqlite-vec, Anthropic Claude) |
| Text Summarization | Summarize text with 4 algorithms — TextRank, LSA, Luhn, and BART (abstractive) | Server (PyTorch, Transformers) |
| Project | Description | Runs On |
|---|---|---|
| Digit Recognition | Draw a digit and a neural network identifies it in real-time with confidence scores | Client (TensorFlow.js) |
| Customer Segmentation | Animated K-means++ clustering with RFM analysis, elbow method, and silhouette scoring | Client (Chart.js) |
| Mushroom Classification | Compare Random Forest, Gradient Boosting, Logistic Regression, and Decision Tree on the UCI Mushroom dataset | Server (scikit-learn) |
| Longevity Prediction | Predict age at death from lifestyle habits using four regression models with GridSearchCV tuning and EDA plots | Server (scikit-learn, seaborn) |
| Project | Description | Runs On |
|---|---|---|
| Duolingo Visualizer | Dashboard with calendar heatmap and charts for language learning progress | Client (Canvas, Chart.js) |
| Related Artists | Explore artist collaborator networks via the Discogs API with streaming results | Server (Discogs API, SSE) |
Projects are self-contained Flask blueprints discovered and registered automatically at startup. Each project lives in its own GitHub repo, mounted as a git submodule under projects/. Each package exposes a PROJECT_META dict and a bp Blueprint — adding a new project requires no manual wiring in the main app.
ml_hub/
├── app.py # Flask app factory, portfolio routes, blog registry
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── nginx/
│ └── nginx.conf # Reverse proxy with SSL
├── static/
│ ├── css/main.css # Global styles, dark/light theme
│ └── js/ # Shared JS utilities
├── templates/
│ ├── base.html # Master layout (topbar, sidebar, theme toggle)
│ ├── landing.html # Portfolio homepage
│ ├── projects.html # Project listing grid
│ ├── about.html
│ ├── resume.html
│ ├── contact.html
│ ├── blog.html
│ └── blog/ # Individual blog posts
└── projects/
├── __init__.py # Auto-discovery and blueprint registration
├── customer_segmentation/ # submodule → ZacStryker/customer-segmentation
├── digit_recognition/ # submodule → ZacStryker/digit-recognition
├── duolingo_visualizer/ # submodule → ZacStryker/duolingo-visualizer
├── mushroom_classification/ # submodule → ZacStryker/mushroom-classification
├── rag_chatbot/ # submodule → ZacStryker/dnd-rag
├── related_artists/ # submodule → ZacStryker/related-artists
├── text_summary/ # submodule → ZacStryker/text-summary
└── work_life_regression/ # submodule → ZacStryker/work-life-regression
- Backend: Flask, Gunicorn (gevent), Python 3.12
- Frontend: Vanilla JavaScript, Chart.js, TensorFlow.js, Canvas API
- GenAI: Anthropic Claude API (streaming), sentence-transformers, sqlite-vec, RAG pipeline
- ML/NLP: PyTorch, Hugging Face Transformers (BART), NLTK, Sumy, scikit-learn, seaborn
- APIs: Anthropic, Discogs (python3-discogs-client)
- Deployment: Docker, Nginx, Let's Encrypt SSL
- Styling: Custom CSS with dark/light theme via CSS variables and
localStorage
git clone --recurse-submodules https://github.com/ZacStryker/portfolio.git
cd portfolio
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.pyThe app starts at http://localhost:5000.
If you cloned without
--recurse-submodules, rungit submodule update --init --recursiveto pull the project code.
cp .env.example .env
# Edit .env with your Discogs token
docker compose up --buildNginx serves on ports 80/443. Flask runs internally on port 8000 behind Gunicorn with a gevent worker and a 300-second timeout for long-running ML inference.
| Variable | Description | Default |
|---|---|---|
ANTHROPIC_API_KEY |
Anthropic API key (required for D&D RAG) | — |
DISCOGS_USER_AGENT |
User-Agent string for Discogs API requests | MLHub/1.0 |
DISCOGS_USER_TOKEN |
Discogs personal access token (required for Related Artists) | — |
| Path | Description |
|---|---|
/ |
Landing page |
/projects/ |
Project listing grid |
/blog/ |
Blog index |
/blog/<slug>/ |
Individual blog post |
/resume/ |
Resume |
/about/ |
About |
/contact/ |
Contact |
/rag-chatbot/ |
D&D RAG project |
/digit-recognition/ |
Digit Recognition project |
/text-summary/ |
Text Summarization project |
/customer-segmentation/ |
Customer Segmentation project |
/mushroom-classification/ |
Mushroom Classification project |
/work-life-regression/ |
Longevity Prediction project |
/duolingo-visualizer/ |
Duolingo Visualizer project |
/related-artists/ |
Related Artists project |