graph LR
A[Edit .qmd files] --> B[Git commit & push]
B --> C[GitHub Actions builds site]
C --> D[Live on GitHub Pages]
style A fill:#4A90D9,color:#fff
style D fill:#2ECC71,color:#fff
A Hands-On Workshop with Quarto & GitHub Pages
2026-03-01
A portfolio isn’t a gallery of finished projects — it’s evidence of how you think through problems.
💡 Why Quarto for a portfolio? You write .qmd files (text + code) and Quarto turns them into a polished website. No frontend framework, no React, no JavaScript needed.
Let’s look at a live Quarto portfolio site
🔗 sepd.dev
.qmd file — code + narrativeTake a look at these for ideas:
📌 Tip: Don’t try to build the perfect site. Start simple, iterate. Your portfolio is a living document.
By the end of this section, you’ll have:
🔗 github.com/phdjsep/gh-pages-quarto-portfolio-template
<your-username>.github.io⏱️ This takes about 30 seconds
⏱️ This takes ~2-3 minutes. While we wait…
💡 What is a Codespace? It’s a full VS Code editor running in your browser. The template comes pre-configured with Python, Quarto, and — importantly — GitHub Copilot already available.
Once your Codespace is ready, open the terminal and run:
You should see a live preview of the template site. Now make it yours — try editing:
index.qmd — your homepageabout.qmd — your about pagestyles.css — custom styling🎉 Congratulations! You have a working portfolio site. Changes appear instantly in the preview.
Instead of manually managing a gh-pages branch, we’ll use GitHub Actions. Create .github/workflows/publish.yml:
After pushing the Actions workflow:
gh-pages branch⏱️ First deploy takes ~2 minutes. After that, updates are faster.
Your site will be live at: https://<your-username>.github.io
📌 Pro tip: Want a custom domain like yourname.dev? It’s ~$20/year and very worth it. Check out Hover or any domain registrar.
In your terminal:
Then add this YAML header to index.qmd:
📌 Structure your post: Problem → Approach → Results → Reflection
AI tools can help you:
⚠️ The key rule: AI assists, you author. Use AI to get unstuck, not to replace your voice.
Copilot is built into GitHub Codespaces:
.qmd filesOpen about.qmd and start typing:
Watch Copilot suggest the rest. Accept what’s useful, edit what’s not.
For bigger tasks, use a chat-based AI:
I’m a business analytics master’s student interested in healthcare data and predictive modeling. Help me draft a 150-word “About Me” for my portfolio. Professional but personable.
I’m getting this error when I run
quarto preview: [paste error]. My_quarto.ymllooks like this: [paste config]. What’s wrong?
📌 Tip: The more context you give the AI, the better the output.
I completed a project where I [description]. The data was [source]. I used [methods]. The key finding was [result]. Write a portfolio summary: Problem → Approach → Results → Reflection.
Let’s build a real piece of portfolio content together, live
🎯 Goal: Use AI to draft an “About Me” section, then refine it
Every project post should answer four questions:
📌 The #1 mistake: Jumping straight to code and methods without explaining why anyone should care.
## The Problem
Customer churn costs telecom companies billions annually.
I explored a dataset of 7,000 customers to identify the
key drivers of churn and build a predictive model.
## My Approach
- Exploratory data analysis to understand feature distributions
- Feature engineering: tenure buckets, monthly charge ratios
- Logistic regression (chosen for interpretability)
- Evaluation: confusion matrix, ROC-AUC
## Key Findings
[Include a visualization here]
The strongest predictors of churn were...
## Reflections & Next Steps
If I were to extend this analysis, I would...
The main limitation was...Quarto renders code blocks natively. Include your actual analysis:
```{python}
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("data/churn.csv")
churn_by_tenure = df.groupby("tenure_bucket")["churn"].mean()
fig, ax = plt.subplots(figsize=(8, 4))
churn_by_tenure.plot(kind="bar", ax=ax, color="#4A90D9")
ax.set_title("Churn Rate by Customer Tenure")
ax.set_ylabel("Churn Rate")
plt.tight_layout()
plt.show()
```💡 Tip: Use AI to help clean up your analysis code for presentation. Your notebook code might be messy — your portfolio code should be readable.
Try this prompt pattern with Claude or ChatGPT:
Prompt Template
I’m writing up a portfolio project for my business analytics portfolio site. Here’s what I did:
Write a 300-word project summary following this structure: Problem (why it matters) → Approach (what I did) → Results (what I found) → Reflection (what I learned). Write for a hiring manager who may not be deeply technical.
Then paste the output into your .qmd file and make it your own.
With GitHub Actions set up, your workflow is now:
graph LR
A[Edit .qmd files] --> B[Git commit & push]
B --> C[GitHub Actions builds site]
C --> D[Live on GitHub Pages]
style A fill:#4A90D9,color:#fff
style D fill:#2ECC71,color:#fff
That’s it. Edit, commit, push. Your site updates automatically.
| Resource | Link |
|---|---|
| Quarto Docs | quarto.org |
| GitHub Pages | pages.github.com |
| Markdown Guide | markdownguide.org |
| Quarto Gallery | qmdclub.com |
| Awesome Quarto | github.com/mcanouil/awesome-quarto |
| Custom Domains | docs.github.com |
| Workshop Template | github.com/phdjsep/gh-pages-quarto-portfolio-template |
| This Site | sepd.dev |
Go build something.
🔗 Workshop Reference: sepd.dev/posts/2026-portfolio-workshop/
🔗 Connect: linkedin.com/in/sepdadsetan
🔗 Questions? Reach out anytime.
sepd.dev | Building Your Portfolio in the AI Age