<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Safi Ullah</title>
    <description>The latest articles on DEV Community by Safi Ullah (@safiullah012).</description>
    <link>https://dev.to/safiullah012</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4161016%2Fc6bf7ea0-ae44-48ec-bc7d-f4120bfa4488.jpeg</url>
      <title>DEV Community: Safi Ullah</title>
      <link>https://dev.to/safiullah012</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/safiullah012"/>
    <language>en</language>
    <item>
      <title>How I Built My AI &amp; Machine Learning Portfolio Website from Scratch</title>
      <dc:creator>Safi Ullah</dc:creator>
      <pubDate>Sun, 04 Oct 2026 06:39:46 +0000</pubDate>
      <link>https://dev.to/safiullah012/how-i-built-my-ai-machine-learning-portfolio-website-from-scratch-2k5a</link>
      <guid>https://dev.to/safiullah012/how-i-built-my-ai-machine-learning-portfolio-website-from-scratch-2k5a</guid>
      <description>&lt;p&gt;How I Built My AI &amp;amp; Machine Learning Portfolio Website from Scratch (Flask + Python + SEO)&lt;/p&gt;

&lt;p&gt;By Safi Ullah — AI &amp;amp; ML Engineer | University of Layyah, Pakistan&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Every developer reaches a point where they ask themselves:&lt;/p&gt;

&lt;p&gt;"How do I stand out from thousands of other applicants?"&lt;/p&gt;

&lt;p&gt;For me, the answer was simple — build a professional portfolio website that not only showcases my Machine Learning and Computer Vision projects, but is also technically strong, fast, secure, and SEO-optimized.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk you through exactly how I built my portfolio from scratch using Python, Flask, PostgreSQL, and modern SEO techniques — and deployed it live on PythonAnywhere.&lt;/p&gt;

&lt;p&gt;👉 Live Portfolio: safiulllah.pythonanywhere.com&lt;br&gt;
 🔗 GitHub: SAFIULLAH012&lt;/p&gt;

&lt;p&gt;Why Flask? Why Not WordPress or Wix?&lt;/p&gt;

&lt;p&gt;Many developers go for WordPress or no-code tools. I chose Flask for a few strong reasons:&lt;/p&gt;

&lt;p&gt;Feature Flask   WordPress&lt;br&gt;
Full control over code  ✅ ❌&lt;br&gt;
Server-Side Rendering (SSR) ✅ ✅&lt;br&gt;
Custom SEO control  ✅ Limited&lt;br&gt;
Python backend  ✅ ❌&lt;br&gt;
Security control    ✅ ❌&lt;br&gt;
Lightweight &amp;amp; fast  ✅ ❌&lt;/p&gt;

&lt;p&gt;As an ML Engineer who works in Python daily, Flask was the natural choice.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;br&gt;
Layer   Technology&lt;br&gt;
Backend Python 3.x + Flask&lt;br&gt;
Database    SQLite (dev) / PostgreSQL (prod)&lt;br&gt;
ORM SQLAlchemy&lt;br&gt;
Frontend    HTML5, CSS3, Vanilla JavaScript&lt;br&gt;
Email   Resend API&lt;br&gt;
Security    Flask-WTF CSRF, Rate Limiting&lt;br&gt;
Deployment  PythonAnywhere&lt;br&gt;
Version Control GitHub (Private Repo)&lt;br&gt;
Project Architecture&lt;br&gt;
portfolio/&lt;br&gt;
│&lt;br&gt;
├── app.py                  # Application factory + SEO routes&lt;br&gt;
├── blueprints/&lt;br&gt;
│   ├── public/             # Homepage, Project Detail, Contact&lt;br&gt;
│   └── admin/              # Admin dashboard (protected)&lt;br&gt;
├── models.py               # SQLAlchemy models (Project, Settings, etc.)&lt;br&gt;
├── templates/&lt;br&gt;
│   ├── base.html           # Master layout (SEO, GA4, Schemas)&lt;br&gt;
│   ├── index.html          # Homepage&lt;br&gt;
│   ├── project_detail.html # Individual project pages&lt;br&gt;
│   ├── privacy_policy.html # Legal page&lt;br&gt;
│   ├── terms.html          # Legal page&lt;br&gt;
│   └── thank_you.html      # Conversion tracking page&lt;br&gt;
├── static/&lt;br&gt;
│   ├── css/style.css&lt;br&gt;
│   ├── js/script.js&lt;br&gt;
│   └── img/               # WebP optimized images&lt;br&gt;
└── tests/&lt;br&gt;
    └── test_app.py         # 27 automated tests&lt;br&gt;
Key Features I Built&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dynamic Admin Dashboard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I built a full admin panel where I can add/edit/delete projects, skills, certifications, and education — all without touching the code. Everything is stored in the database and rendered dynamically.&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
class Project(db.Model):&lt;br&gt;
    id = db.Column(db.Integer, primary_key=True)&lt;br&gt;
    title = db.Column(db.String(200), nullable=False)&lt;br&gt;
    slug = db.Column(db.String(200), unique=True, nullable=False)&lt;br&gt;
    short_description = db.Column(db.String(500))&lt;br&gt;
    published = db.Column(db.Boolean, default=False)&lt;br&gt;
    github_url = db.Column(db.String(300))&lt;br&gt;
    demo_url = db.Column(db.String(300))&lt;br&gt;
    category = db.Column(db.String(100))&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secure Contact Form (CSRF + Rate Limiting)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The contact form sends real emails via the Resend API and is protected against spam and CSRF attacks.&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
@limiter.limit("5 per hour")&lt;br&gt;
def contact():&lt;br&gt;
    # CSRF validation&lt;br&gt;
    # Email sending via Resend API&lt;br&gt;
    # JSON response for AJAX&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Server-Side Rendered (SSR) — Perfect for SEO &amp;amp; AI Bots&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Unlike React or Next.js SPAs, Flask renders full HTML on the server. This means:&lt;/p&gt;

&lt;p&gt;Google can read the full content immediately&lt;br&gt;
AI bots (ChatGPT, Perplexity, Google AI Overviews) can cite my content&lt;br&gt;
Page loads are fast and lightweight&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Advanced SEO Setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was the part I spent the most time on:&lt;/p&gt;

&lt;p&gt;html&lt;/p&gt;





&lt;p&gt;{&lt;br&gt;
  "@type": "Person",&lt;br&gt;
  "name": "Safi Ullah",&lt;br&gt;
  "jobTitle": "Machine Learning Engineer",&lt;br&gt;
  "address": {&lt;br&gt;
    "addressLocality": "Layyah",&lt;br&gt;
    "addressCountry": "PK"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "@type": "FAQPage",&lt;br&gt;
  "mainEntity": [...]&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google Analytics (GDPR Compliant)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GA4 only loads after the user clicks "Accept" on the cookie banner — fully GDPR compliant.&lt;/p&gt;

&lt;p&gt;javascript&lt;br&gt;
acceptBtn.addEventListener('click', function() {&lt;br&gt;
    localStorage.setItem('safi_cookie_consent', 'accepted');&lt;br&gt;
    loadGA(); // Only now GA4 script loads&lt;br&gt;
});&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Performance Optimizations
WebP images instead of JPEG (50% smaller file size)
Canvas particles disabled on mobile (&amp;lt;768px) for faster load
IntersectionObserver — animations only trigger when in viewport
CSS version busting — style.css?v=5.8 prevents stale cache
Automated Testing (27 Tests)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before every deployment, I run 27 automated pytest tests to make sure nothing is broken:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
def test_sitemap_xml(client, seed_db):&lt;br&gt;
    res = client.get('/sitemap.xml')&lt;br&gt;
    assert res.status_code == 200&lt;br&gt;
    assert b'brain-tumor-mri-classifier' in res.data&lt;br&gt;
def test_robots_txt(client):&lt;br&gt;
    res = client.get('/robots.txt')&lt;br&gt;
    assert b'Disallow: /admin/' in res.data&lt;br&gt;
def test_contact_form_csrf_required(client):&lt;br&gt;
    res = client.post('/contact', data={...})&lt;br&gt;
    assert res.status_code == 400&lt;/p&gt;

&lt;p&gt;All 27 tests pass before every push to GitHub.&lt;/p&gt;

&lt;p&gt;Deployment on PythonAnywhere&lt;/p&gt;

&lt;p&gt;PythonAnywhere hosts Flask apps for free. The WSGI config:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
import sys&lt;br&gt;
sys.path.insert(0, '/home/safiulllah/mysite')&lt;br&gt;
from app import create_app&lt;br&gt;
application = create_app()&lt;br&gt;
SEO Results After Launch&lt;/p&gt;

&lt;p&gt;After implementing all technical SEO fixes:&lt;/p&gt;

&lt;p&gt;✅ robots.txt — Clean, admin panel blocked&lt;br&gt;
✅ sitemap.xml — Dynamic, all pages included&lt;br&gt;
✅ Schema Markup — Person, FAQPage, SoftwareSourceCode, BreadcrumbList&lt;br&gt;
✅ Google Search Console — Sitemap submitted, indexing requested&lt;br&gt;
✅ Google Analytics GA4 — Real-time tracking active&lt;br&gt;
✅ Core Web Vitals — Optimized for mobile performance&lt;br&gt;
Lessons Learned&lt;br&gt;
SSR beats SPA for portfolios — Flask renders faster and better for SEO than React&lt;br&gt;
Security first — CSRF, rate limiting, and input validation are non-negotiable&lt;br&gt;
Test everything — 27 automated tests saved me from deploying broken code multiple times&lt;br&gt;
SEO is technical — It's not just keywords, it's schemas, canonical tags, and structured data&lt;br&gt;
Database-driven &amp;gt; static — Being able to update projects without editing HTML is a game-changer&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;Building this portfolio from scratch taught me more than any tutorial ever could. If you are a Computer Science student or ML Engineer, I strongly recommend building your own custom portfolio rather than using a template.&lt;/p&gt;

&lt;p&gt;It showcases your:&lt;/p&gt;

&lt;p&gt;Backend skills (Flask, Python, SQLAlchemy)&lt;br&gt;
Frontend skills (HTML, CSS, JS)&lt;br&gt;
DevOps knowledge (Deployment, Git, Testing)&lt;br&gt;
SEO &amp;amp; Marketing awareness&lt;/p&gt;

&lt;p&gt;Check out the live result:&lt;/p&gt;

&lt;p&gt;👉 safiulllah.pythonanywhere.com&lt;br&gt;
 🔗 GitHub: SAFIULLAH012&lt;/p&gt;

&lt;p&gt;About the Author&lt;/p&gt;

&lt;p&gt;Safi Ullah is a Computer Science student at the University of Layyah, Pakistan, specializing in Machine Learning, Computer Vision, Deep Learning, and Python development.&lt;/p&gt;

&lt;p&gt;📧 &lt;a href="mailto:safiullah477845@gmail.com"&gt;safiullah477845@gmail.com&lt;/a&gt; 🌐 &lt;a href="https://safiulllah.pythonanywhere.com" rel="noopener noreferrer"&gt;https://safiulllah.pythonanywhere.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tags: #Python #Flask #WebDevelopment #SEO #MachineLearning #Portfolio #PythonAnywhere #ComputerScience #DeepLearning #OpenSource&lt;/p&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>webdev</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
