logoAyoub Omari

Portfolio

A modern portfolio and blog platform featuring a comprehensive dashboard, blog system, and project showcase.

8/9/2024 - 11/11/2024
GitHubWebsite
Posted on: 1/8/2025 | Edited on: 8/23/2026

Project Overview

This project is the site you're currently on โ€” a modern portfolio and blog platform built from scratch to showcase my work, write technical articles, and manage everything through a custom admin dashboard rather than a third-party CMS.

๐ŸŒ Live Demo ยท ๐Ÿ’ป Source on GitHub

Why Build a Custom Portfolio

Off-the-shelf portfolio templates are quick to set up but rarely fit exactly how I want to present projects, write long-form technical posts, or manage content day to day. Building it myself meant full control over the data model, the editing workflow, and the performance of the public-facing pages.

Features

  • ๐Ÿ“ Blog system โ€” write and publish posts with Markdown support
  • ๐ŸŽจ Project showcase โ€” detailed case studies for each project, with tags, technologies, and image galleries
  • ๐Ÿ“ฌ Contact form โ€” with email notifications on new submissions
  • ๐Ÿ“Š Admin dashboard โ€” full CRUD for blog posts, projects, tags, and technologies
  • ๐Ÿ“ฑ Responsive design โ€” usable across desktop, tablet, and mobile
  • ๐ŸŒ™ Dark mode โ€” light/dark theme toggle
  • ๐Ÿ“จ Newsletter system โ€” email subscription capture

Technical Implementation

Backend

  • Framework: Next.js 14 (App Router, API routes)
  • Language: TypeScript
  • Database: PostgreSQL with Drizzle ORM
  • Authentication: Lucia Auth, session-based
  • Email: Nodemailer for contact form and admin notifications

Frontend

  • Styling: Tailwind CSS
  • UI components: Shadcn UI
  • Charts: Recharts (dashboard analytics)
  • Markdown rendering: React Markdown

Architecture Highlights

  • Server-rendered project and blog pages for SEO, with structured data (JSON-LD) for rich search results
  • A relational schema (projects, blog posts, tags, technologies, images) with many-to-many join tables so content can be tagged and cross-referenced flexibly
  • A dashboard that lets me manage every table without touching the database directly

Conclusion

The portfolio is a living project โ€” it evolves alongside the rest of my work, and doubles as a testbed for patterns (auth, dashboards, content modeling) I reuse in client projects like Ruxaby and Lahagni.

Technologies used