Spaces:
Paused
Paused
Upload 3 files
Browse files- README.md +88 -8
- app.py +96 -0
- requirements.txt +1 -0
README.md
CHANGED
|
@@ -1,14 +1,94 @@
|
|
|
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version: 5.49.1
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
license:
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
---
|
| 13 |
|
| 14 |
-
|
|
|
|
|
|
| 1 |
+
|
| 2 |
---
|
| 3 |
+
title: "Muhammad Saad — Portfolio"
|
| 4 |
+
emoji: "🚀"
|
| 5 |
+
colorFrom: "blue"
|
| 6 |
+
colorTo: "purple"
|
| 7 |
sdk: gradio
|
|
|
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
# Muhammad Saad — Portfolio
|
| 14 |
+
|
| 15 |
+
**CS student @ North South University** • Tech enthusiast • I break things (on purpose) and fix them better.
|
| 16 |
+
|
| 17 |
+
This is my live portfolio hosted on **Hugging Face Spaces** using **Gradio**.
|
| 18 |
+
It shows my projects, skills, and a simple contact section.
|
| 19 |
+
|
| 20 |
+
> Live URL (after you make the Space public):
|
| 21 |
+
> `https://saad003-portf01.hf.space`
|
| 22 |
+
|
| 23 |
+
---
|
| 24 |
+
|
| 25 |
+
## ✨ Features
|
| 26 |
+
- Tabs for **About**, **Projects**, **Skills**, **Contact**
|
| 27 |
+
- “Funny-but-true” skills section (because debugging at 2 AM is a skill)
|
| 28 |
+
- Contact tab formats a message and provides a **mailto** button
|
| 29 |
+
- Easy to extend with more projects or embedded demos
|
| 30 |
+
|
| 31 |
+
---
|
| 32 |
+
|
| 33 |
+
## 🚀 Quick Start (on Hugging Face Spaces)
|
| 34 |
+
1. Put these files at repo root:
|
| 35 |
+
- `app.py`
|
| 36 |
+
- `requirements.txt` (contains `gradio`)
|
| 37 |
+
- `README.md` (this file)
|
| 38 |
+
2. Commit & push:
|
| 39 |
+
```bash
|
| 40 |
+
git add app.py requirements.txt README.md
|
| 41 |
+
git commit -m "Initial portfolio"
|
| 42 |
+
git push
|
| 43 |
+
```
|
| 44 |
+
3. In the Space **Settings**, set **Visibility → Public**.
|
| 45 |
+
4. Share the link: `https://saad003-portf01.hf.space`
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## 🧪 Run Locally
|
| 50 |
+
```bash
|
| 51 |
+
pip install -r requirements.txt
|
| 52 |
+
python app.py
|
| 53 |
+
```
|
| 54 |
+
Then open the local URL printed in your terminal.
|
| 55 |
+
|
| 56 |
+
---
|
| 57 |
+
|
| 58 |
+
## 🧱 Repo Structure
|
| 59 |
+
```
|
| 60 |
+
portf01/
|
| 61 |
+
├─ app.py
|
| 62 |
+
├─ requirements.txt
|
| 63 |
+
└─ README.md <-- you are here
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
## 🛠️ Customize
|
| 69 |
+
- In `app.py`, update:
|
| 70 |
+
- `NAME`, `TAGLINE`, and the **About** text
|
| 71 |
+
- Social links in `SOCIALS_MD`
|
| 72 |
+
- Your email in `mailto_link()` (replace `you@example.com`)
|
| 73 |
+
- Project list in `PROJECTS_MD`
|
| 74 |
+
- Add screenshots or thumbnails if you want (e.g., put images in `/assets` and reference them in Markdown).
|
| 75 |
+
|
| 76 |
+
---
|
| 77 |
+
|
| 78 |
+
## 🔗 Useful Links
|
| 79 |
+
- My Hugging Face profile: (add link)
|
| 80 |
+
- GitHub: (add link)
|
| 81 |
+
- LinkedIn: (add link)
|
| 82 |
+
|
| 83 |
+
---
|
| 84 |
+
|
| 85 |
+
## 📸 Screenshot (optional)
|
| 86 |
+
Add a preview image to your repo (e.g., `assets/screenshot.png`) and embed:
|
| 87 |
+
```markdown
|
| 88 |
+

|
| 89 |
+
```
|
| 90 |
+
|
| 91 |
---
|
| 92 |
|
| 93 |
+
## 📄 License
|
| 94 |
+
MIT — feel free to reuse and remix. Credit appreciated. 😊
|
app.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from datetime import datetime
|
| 4 |
+
|
| 5 |
+
NAME = "Muhammad Saad"
|
| 6 |
+
TAGLINE = "CS @ North South University • Tech enthusiast • Builder of fun things"
|
| 7 |
+
|
| 8 |
+
ABOUT_MD = f"""
|
| 9 |
+
# 👋 Hey, I'm {NAME}
|
| 10 |
+
I'm a **Computer Science student at North South University** who loves shipping scrappy ideas,
|
| 11 |
+
breaking stuff (on purpose), and then fixing it better.
|
| 12 |
+
|
| 13 |
+
**What I'm into:** computer vision, MLOps, model deployment, and turning notebooks into real apps.
|
| 14 |
+
"""
|
| 15 |
+
|
| 16 |
+
# ← add your real links here
|
| 17 |
+
SOCIALS_MD = """
|
| 18 |
+
**Find me:**
|
| 19 |
+
- 🌐 Website: <https://example.com>
|
| 20 |
+
- 🐙 GitHub: <https://github.com/yourhandle>
|
| 21 |
+
- 🧠 Hugging Face: <https://huggingface.co/yourhandle>
|
| 22 |
+
- 💼 LinkedIn: <https://linkedin.com/in/yourhandle>
|
| 23 |
+
"""
|
| 24 |
+
|
| 25 |
+
PROJECTS_MD = """
|
| 26 |
+
### Selected Projects
|
| 27 |
+
- **Image Similarity App** — FAISS + ResNet embeddings to retrieve near-duplicate medical images.
|
| 28 |
+
- **Radiology Captioning Playground** — demo of ViT+GPT2 captioner with retrieval-augmented context.
|
| 29 |
+
- **Tiny MLOps** — Dockerized inference + Space deploy in under 5 minutes.
|
| 30 |
+
"""
|
| 31 |
+
|
| 32 |
+
# funny-but-true skills
|
| 33 |
+
SKILLS_MD = """
|
| 34 |
+
### Skills (serious-ish)
|
| 35 |
+
- **Python**, **PyTorch**, **Gradio**, **Hugging Face**, **FAISS**, **Docker**
|
| 36 |
+
- **Data wrangling**, **Training pipelines**, **Model serving**, **Prompt tinkering**
|
| 37 |
+
|
| 38 |
+
### Skills (funny but accurate)
|
| 39 |
+
- **Googling like a Pro**: 10/10 🔍
|
| 40 |
+
- **Debugging at 2 AM**: 11/10 🧯
|
| 41 |
+
- **“It worked yesterday” Whisperer**: 9/10 🧙
|
| 42 |
+
- **Version Control Therapist (merge conflicts)**: 8/10 🪄
|
| 43 |
+
- **Coffee-driven latency reduction**: -20ms ☕
|
| 44 |
+
"""
|
| 45 |
+
|
| 46 |
+
CONTACT_HELP = """
|
| 47 |
+
I can't send email for you, but this will format a message you can copy-paste.
|
| 48 |
+
Or use the **mailto** button to open your email client.
|
| 49 |
+
"""
|
| 50 |
+
|
| 51 |
+
def format_contact(name, email, message):
|
| 52 |
+
ts = datetime.now().strftime("%Y-%m-%d %H:%M")
|
| 53 |
+
return f"""### Thanks, {name or "friend"}!
|
| 54 |
+
**Time:** {ts}
|
| 55 |
+
**From:** {name} ({email})
|
| 56 |
+
**Message:**
|
| 57 |
+
> {message}
|
| 58 |
+
"""
|
| 59 |
+
|
| 60 |
+
def mailto_link(name, email, message):
|
| 61 |
+
import urllib.parse as up
|
| 62 |
+
to = "you@example.com" # ← replace with your address
|
| 63 |
+
subject = up.quote(f"Portfolio message from {name or 'Visitor'}")
|
| 64 |
+
body = up.quote(f"From: {name} <{email}>\n\n{message}")
|
| 65 |
+
return f"mailto:{to}?subject={subject}&body={body}"
|
| 66 |
+
|
| 67 |
+
with gr.Blocks(title=f"{NAME} — Portfolio") as demo:
|
| 68 |
+
gr.Markdown(f"# {NAME}\n**{TAGLINE}**")
|
| 69 |
+
|
| 70 |
+
with gr.Tab("About"):
|
| 71 |
+
gr.Markdown(ABOUT_MD)
|
| 72 |
+
gr.Markdown(SOCIALS_MD)
|
| 73 |
+
|
| 74 |
+
with gr.Tab("Projects"):
|
| 75 |
+
gr.Markdown(PROJECTS_MD)
|
| 76 |
+
gr.Markdown("*(Want live demos here? Link your Spaces or add iframes.)*")
|
| 77 |
+
|
| 78 |
+
with gr.Tab("Skills"):
|
| 79 |
+
gr.Markdown(SKILLS_MD)
|
| 80 |
+
|
| 81 |
+
with gr.Tab("Contact"):
|
| 82 |
+
gr.Markdown(CONTACT_HELP)
|
| 83 |
+
with gr.Row():
|
| 84 |
+
name = gr.Textbox(label="Your name", placeholder="Ada Lovelace")
|
| 85 |
+
email = gr.Textbox(label="Your email", placeholder="ada@example.com")
|
| 86 |
+
message = gr.Textbox(label="Message", lines=6, placeholder="Write me something nice…")
|
| 87 |
+
with gr.Row():
|
| 88 |
+
out = gr.Markdown()
|
| 89 |
+
with gr.Row():
|
| 90 |
+
btn_send = gr.Button("Preview message")
|
| 91 |
+
btn_mail = gr.Button("Open email client (mailto)")
|
| 92 |
+
btn_send.click(format_contact, [name, email, message], out)
|
| 93 |
+
btn_mail.click(mailto_link, [name, email, message], out)
|
| 94 |
+
|
| 95 |
+
if __name__ == "__main__":
|
| 96 |
+
demo.launch()
|
requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
gradio
|