This repository contains the source code for my personal portfolio and interactive resume, which you can view live at ajx.codes.
This project is a full-stack application built with a modern tech stack, showcasing my skills in both frontend and backend development. The frontend is a Next.js application, and the backend is a .NET API. The entire application is containerized with Docker for easy setup and deployment.
You can run the entire application on your local machine using Docker and Docker Compose.
Prerequisites:
- Docker
- Docker Compose
Instructions:
- Clone the repository to your local machine.
cp .env.template .envReview and adjust the AI provider (Ollama or Gemini), Database, and Supabase keys as needed.
- Run the following command from the root of the project to build and start the containers:
docker-compose up -d
- Once the containers are running, you can access the portfolio website at http://localhost:3000 and the API at http://localhost:5000.
This project is built with the following technologies:
Frontend (apps/web):
- Framework: Next.js 16 (App Router with React 19)
- Language: TypeScript
- Styling & Icons: Tailwind CSS v4, Lucide React
- Animations: Framer Motion
- Authentication: Supabase Auth & SSR client
- Testing: Jest, React Testing Library, and Playwright (E2E)
Backend (apps/api):
- Framework: .NET 10 Web API
- Language: C#
- Database: PostgreSQL with EF Core
- AI Integration: Drop-in
IAiChatServicearchitecture supporting both local Ollama and cloud Google Gemini. - Real-time Streaming: Server-Sent Events (SSE) implemented via raw
HttpClientchunk parsing. - Analytics & GDPR: Custom data migrations that scrub PII (hashing IPs) into secure
VisitorSessionIdtokens for Page Views, Link Clicks, and AI Queries. - Security:
Microsoft.AspNetCore.RateLimitingsliding window policies to prevent API abuse. - PDF Compilation: QuestPDF (ATS-compliant layouts)
- Cloud Storage: S3-compatible object storage via AWS SDK
- API Documentation: OpenAPI / Swagger
DevOps & Automation:
- Containerization: Docker, Docker Compose
- CI/CD: GitHub Actions running lint, backend tests, and frontend Unit/E2E suites.
- Code Review: Automated AI PR Reviewer via Google Gemini API in GitHub Actions.
- Hosting: Configured for automated continuous deployment to Render.
This project serves as a practical demonstration of my skills and experience as a software developer. It is a fully dynamic, full-stack application that handles content management via a live database instead of local static files.
Key features include:
- Interactive Bash Terminal CLI: A retro-themed interactive CLI shell on the homepage supporting commands like
ls,cat [dir],open blog/[slug], andclear. - Dynamic PDF Resumes: An integrated PDF compiler using QuestPDF that generates a professional, ATS-friendly PDF download in real-time.
- Resume AI Chatbot (RAG): A highly defensive AI Assistant that dynamically pulls the active Resume Profile from the database and injects it into a strict system prompt.
- Supports hot-swapping between Ollama (e.g.
gemma4:e2bfor local testing) and Google Gemini in production. - Uses Server-Sent Events (SSE) to stream responses chunk-by-chunk to the frontend UI.
- Locked down with IP-based rate limiting (5 requests per minute).
- Supports hot-swapping between Ollama (e.g.
- GDPR-Compliant Analytics Tracker: A robust analytics engine that tracks page views, link clicks, and AI queries. To protect user privacy, it uses custom SQL migrations to securely hash the user's IP Address and User Agent into an anonymous
VisitorSessionId. - Supabase-Authenticated Admin Panel: A secure management portal (
/admin) to update experience logs, link profiles, view traffic analytics, upload media files directly to cloud storage, and view application audit trails.
All resume data, images, and posts are managed dynamically through our REST API rather than checked-in JSON or markdown files.
This project was built iteratively across several milestone phases:
- Phase 1 (Setup & Architecture): Established the containerized monorepo, .NET API with Entity Framework, Next.js frontend, and Supabase auth integration.
- Phase 2 (Interactive Resumes & CLI): Built the homepage bash terminal and integrated QuestPDF for on-the-fly, ATS-compliant PDF resume generation.
- Phase 3 (GDPR Analytics & Webhooks): Implemented strict privacy-first analytics using hashed IP/UA sessions (
VisitorSessionId) for tracking traffic and clicks. - Phase 4 (AI Chatbot & Admin Panel): Integrated the interactive RAG AI assistant (supporting Ollama and Gemini with SSE streaming) and built the authenticated Admin portal for data management.
To ensure zero-downtime deployments and that only fully tested builds reach production, configure your Render service settings as follows:
- In your Render Dashboard, select your web service and go to Settings.
- Set Auto Deploy to No.
- Use the deployment webhook URL provided by Render in your GitHub Actions secrets as
RENDER_DEPLOY_HOOK_APIandRENDER_DEPLOY_HOOK_WEB. - In your GitHub Repository, set up a branch protection rule on
mainthat requires all status checks (Backend Test Suite (C# / .NET 10),Frontend Build & Lint (Next.js),Frontend Unit Tests (Jest / RTL), andFrontend E2E Tests (Playwright)) to pass before merging. - The
deploy-renderjob in our CI/CD pipeline will automatically trigger the Render deployment webhook viacurlonce all tests pass on commits pushed tomain.