Portfolio Project: A production-grade SaaS job board platform demonstrating full-stack development capabilities, modern authentication & payment systems, and professional development practices.
Live Demo: shopmatch-pro.vercel.app | Portfolio: View Showcase β
Portfolio Demonstration Project - Built to showcase professional-level full-stack development skills
Status: β Production-Ready MVP (Test Mode) - Fully functional and deployed
- β Full-Stack Development: Complete MERN-equivalent stack (Next.js + Firebase + Stripe)
- β Production-Grade Architecture: Secure, scalable, and maintainable code
- β Modern Best Practices: TypeScript strict mode, security rules, comprehensive testing
- β Complex Integrations: Authentication (Firebase), Payments (Stripe), Real-time data
- β Professional Workflow: Git, CI/CD, documentation, code review process
- β AI-Assisted Development: Effective orchestration of modern AI development tools
- β
Always-On Monitoring: Automated production smoke tests verify critical flows on every push to
main
- β‘ Performance: 176.9 KB first-load JS (41% under budget), ~3s builds with Turbopack
- π Security: Zero npm vulnerabilities (verified 2025-11-16), Firebase security rules, Stripe webhook verification, RBAC, type-safe APIs
- π‘οΈ CI/CD: 6-job automated pipeline (build, lint, test, a11y, smoke tests, security scan), branch protection, conventional commits
- π¨ Modern Stack: Next.js 15, TypeScript 5.7, Tailwind v4, shadcn/ui
- π§ͺ Quality: Zero ESLint errors, TypeScript strict mode, Playwright E2E tests, accessibility verified
- π Documentation: Architecture diagrams, API docs, runbooks, AI development guide (CLAUDE.md)
- π Deployed: Vercel with auto-deployment, production smoke tests on every main push
- π Full Portfolio Showcase β - Detailed project overview
- ποΈ Architecture Documentation β - System design & data flows
- π Security Documentation β - Security model & threat analysis
- π Complete Documentation β - All technical docs
Get started in 5 minutes:
-
Install Dependencies
npm install
-
Configure Environment Variables
cp .env.local.template .env.local # Edit .env.local with your Firebase and Stripe credentials # See docs/ENVIRONMENT_VARIABLES.md for detailed instructions
-
Validate Configuration
npm run validate-env
-
Start Development Server
npm run dev # Open http://localhost:3000
π New to the project? See Quick Start Guide | Full Documentation β
- π Browse and search job listings
- π Apply to jobs with cover letters
- π Track application status
- π― Personalized dashboard
- βοΈ Post unlimited job listings
- π Manage applications
- π View application analytics
- ποΈ Edit and close job postings
- π Secure authentication (Email/Password + Google OAuth)
- π³ Stripe subscription integration
- π Real-time updates with Firebase
- π± Fully responsive design
- β‘ Built with Next.js 15 + Turbopack
Show clients how you reason about hiring performance with the new Analytics & Insights dashboard:
- Portfolio-ready KPIs: Jobs posted, matches generated, time-to-match, and interview rate (seeded data for demos)
- Conversion funnel: Visualizes drop-off from job views through hires, making it easy to discuss optimization ideas
- Narrative insights: Highlight top-performing roles, competitive markets, and overall pipeline healthβperfect for executive summaries
- Navigation:
Dashboard β Analytics(or visit/dashboard/analyticsdirectly)
| View | Screenshot |
|---|---|
| Desktop overview | ![]() |
| Mobile summary | ![]() |
π‘ Client hand-off tip: Swap the seeded data with live metrics by wiring the cards and charts to your analytics warehouse (BigQuery, Firestore, Supabase, etc.) or marketing tracking tools. The layout is fully responsive and uses the same design tokens as the rest of the dashboard, so itβs production-ready once you connect real data sources.
Config-driven datasets: The analytics view reads from src/app/dashboard/analytics/demo-metrics.ts. Flip ACTIVE_METRIC_DATASET (e.g., jobBoard, courseMarketplace) or add your own vertical to instantly change every KPI/funnel/insight card.
- Framework: Next.js 15.5.4 (App Router, Server Components, Turbopack)
- Language: TypeScript 5.7 (strict mode)
- Styling: Tailwind CSS v4 + shadcn/ui component library
- Forms: React Hook Form + Zod validation
- State: React Context API for auth and global state
- Authentication: Firebase Auth (Email/Password + Google OAuth)
- Database: Cloud Firestore with custom security rules
- Payments: Stripe API (Checkout, Subscriptions, Webhooks)
- Hosting: Vercel (Edge Functions, Auto-scaling)
- Monitoring: Sentry error tracking
- Version Control: Git + GitHub with branch protection
- CI/CD: GitHub Actions (6-job pipeline: branch/commit validation, build & quality checks, accessibility tests, local smoke tests, Snyk security scan, production smoke tests)
- Package Manager: npm
- Linting: ESLint + Prettier
- Testing: Playwright E2E (smoke tests, accessibility), Jest unit tests, Firebase Emulator
- Security: Snyk scanning, npm audit (0 vulnerabilities), FOSSA license compliance
- Guardrails: Branch naming enforced as
type/ID-slug(feat|fix|perf|sec|docs|test|refactor|ci|build); usecifor infrastructure changes
src/β Next.js 15 App Router source (routes, components, providers, utilities)e2e/β Playwright suites (login,demo-diagnostics,verify-demo-loginsmoke tests run in CI)docs/β Comprehensive documentation (architecture, security, runbooks, checklists, ADRs).github/workflows/ci.ymlβ All CI jobs (branch naming + commit checks, build, accessibility, production smoke tests)scripts/β Automation scripts (e.g.,create-demo-users.js, CI helpers)public/β Static assets and integrations, including Google Search Console verifiergooglee573592846ba27d6.htmlplaywright-report/β Latest local Playwright artifacts (ignored in CI unless tests fail)vercel.json&lighthouse-budgets.jsonβ Deployment routing and performance budgets
# Start development server (default port 3000)
npm run dev
# Build for production
npm run build
# Start production server
npm start
# Lint code
npm run lint
# Validate environment variables
npm run validate-env
# Create test users (after env setup)
npm run create-user
# Webhook Testing & Monitoring (requires Stripe CLI)
npm run webhook:test # Trigger test webhook event
npm run webhook:monitor # Monitor live events in real-time
npm run webhook:events # Show recent webhook events
npm run webhook:events:watch # Watch webhook events (auto-refresh)π‘ Tip: For complete webhook testing guide, see docs/runbooks/STRIPE_WEBHOOK_RUNBOOK.md
This repository includes a safe, local demo of a data extraction and enrichment pipeline. Perfect for showcasing web scraping, data processing, and AI integration patterns.
- Sample Data: 5 dummy products with HTML files in
examples/html/ - CSV Input:
examples/products.csvwith product metadata - CLI Script:
scripts/scrape-and-enrich-products.jsthat:- Reads CSV product data
- Loads corresponding HTML files
- Extracts title, price, and description using pattern matching
- Calls
generateEnrichedDescription()stub (ready for LLM integration) - Writes enriched output to
output/enriched_products.csv
# Run the demo pipeline
npm run demo:scrape
# Or with custom paths
node scripts/scrape-and-enrich-products.js <input_csv> <output_csv>title,price,enriched_description
Premium Wireless Headphones,$79.99,"Experience crystal-clear audio with advanced noise cancellation..."
Durable USB-C Cable 2m,$12.99,"High-quality USB-C cable with reinforced connectors..."The script includes a stub function generateEnrichedDescription() ready for AI integration:
// TODO: Replace with actual LLM API call:
// - OpenAI API (gpt-4, gpt-3.5-turbo)
// - Anthropic Claude API
// - Google Vertex AI / PaLM
// - Local LLM (Ollama, LM Studio)
// - Hugging Face Inference API
async function generateEnrichedDescription(rawDescription) {
const response = await openai.chat.completions.create({
model: "gpt-4",
messages: [{
role: "user",
content: `Enhance this product description with compelling marketing copy: "${rawDescription}"`
}]
});
return response.choices[0].message.content;
}- Check robots.txt - Respect crawling rules:
https://example.com/robots.txt - Review Terms of Service - Verify scraping is permitted
- Implement Rate Limiting - Don't hammer servers; use delays between requests
- Set User-Agent - Identify your bot in HTTP headers
- Cache Results - Don't re-scrape the same content repeatedly
- Handle Errors Gracefully - Catch 429 (rate limit), 403 (forbidden), 500 (server errors)
- Use Official APIs - Prefer APIs over scraping when available
Related Resources:
- robots.txt Standard
- Web Scraping Best Practices
- Cheerio Documentation - HTML parsing library for Node.js
- Playwright Guide - Browser automation for dynamic content
| Document | Description |
|---|---|
| PRODUCTION_LAUNCH_COMPLETE.md | Complete production verification & launch report |
| PRODUCTION_DEPLOYMENT_GUIDE.md | Production deployment quick start |
| MONITORING_CHECKLIST.md | Daily/weekly monitoring procedures |
| FUTURE_ROADMAP.md | 12-month feature roadmap |
| Document | Description |
|---|---|
| ARCHITECTURE.md | System diagrams, data flows, component architecture |
| API_REFERENCE.yml | Complete OpenAPI 3.0 specification |
| SECURITY.md | Threat model, auth, security controls |
| TESTING.md | Test pyramid, commands, coverage budgets |
| Document | Description |
|---|---|
| CLAUDE.md | AI-powered development guide with persona prompts (PM, Tech Lead, QA, Security, Pair Programmer, Researcher) |
| CONTRIBUTING.md | How to contribute using AI personas and SHOOTβSKIN workflow |
| docs/ | Complete technical documentation (Architecture, Security, Testing, APIs, Runbooks, ADRs) |
AI Workflow Quick Links:
- Persona Prompts - Copy-paste ready prompts for 6 AI personas
- Workflow Order - AIM β Plan β Build β Wrench β Gate β SKIN
- Playbook - Standard Operating Procedures for each task
- Architecture Decisions - ADRs explaining why we chose each technology
- Runbooks - Operational procedures for common issues
Use Persona Prompts to Simulate a Full Team:
- π― Product Manager - "Why this way?" business rationale and acceptance criteria
- ποΈ Tech Lead - "Build on existing" minimal architectural changes
- π§ͺ QA Engineer - Complete test plans across the test pyramid
- π Security Engineer - Threat modeling and vulnerability analysis
- π₯ Pair Programmer - Step-by-step implementation with code snippets
- π¬ Researcher - Technology landscape monitoring for Decision Matrix updates
See CLAUDE.md for complete workflow documentation and copy-paste ready prompts.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT (Next.js App) β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββ β
β β Auth β β Job Board β β Subscriptions β β
β β Pages β β Features β β & Payments β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββ β
ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Firebase β β Next.js API β β Stripe β
β Auth β β Routes β β Checkout β
ββββββββββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ
β β
βΌ β
ββββββββββββββββ β
β Firestore β β
β Database β β
ββββββββββββββββ β
β² β
β β
ββββββββββββββββββ
Webhook Events
For Job Seekers:
- Browse and search job listings
- Apply to jobs with cover letters
- Track application status
- Personalized dashboard
For Employers: (Requires Pro Subscription)
- Post unlimited job listings
- Manage applications
- View application analytics
- Edit and close job postings
Platform Features:
- Secure authentication (Email/Password + Google OAuth)
- Stripe subscription integration
- Real-time updates with Firebase
- Fully responsive design
- Role-based access control (RBAC)
This project showcases a comprehensive skill set:
- β Full-Stack Development: Frontend (React/Next.js) + Backend (API Routes) + Database (Firestore)
- β TypeScript Mastery: Strict mode, advanced types, type-safe APIs
- β Authentication & Authorization: JWT, OAuth 2.0, RBAC, custom claims
- β Payment Integration: Stripe API, webhooks, subscription management
- β Database Design: NoSQL data modeling, security rules, composite indexes
- β API Development: RESTful endpoints, error handling, input validation
- β Security: OWASP best practices, input sanitization, secure authentication
- β DevOps: CI/CD pipelines, environment management, production deployment
- β Version Control: Git workflow, meaningful commits, PR process
- β Code Quality: Linting, formatting, type checking, zero errors
- β Documentation: Technical writing, architecture diagrams, API docs
- β Testing: Manual E2E testing, security rule testing, webhook simulation
- β Problem Solving: Debugging, researching solutions, implementing fixes
- β AI Collaboration: Using AI tools strategically while maintaining code quality
shopmatch-pro/
βββ src/
β βββ app/ # Next.js App Router pages and API routes
β β βββ (auth)/ # Authentication pages
β β βββ dashboard/ # Owner and seeker dashboards
β β βββ jobs/ # Job listing, detail, create, edit
β β βββ subscribe/ # Stripe subscription page
β β βββ api/ # Backend API routes
β βββ components/ # React components
β β βββ ui/ # shadcn/ui components
β β βββ job-card.tsx # Job display card
β β βββ job-form.tsx # Job creation/edit form
β β βββ application-card.tsx
β βββ lib/ # Shared utilities
β β βββ firebase/ # Firebase client and admin
β β βββ stripe/ # Stripe configuration
β β βββ contexts/ # React contexts
β βββ types/ # TypeScript type definitions
βββ public/ # Static assets
βββ scripts/ # Utility scripts
β βββ validate-env.js # Environment validation
β βββ create-user.js # Test user creation
βββ firestore.rules # Firestore security rules
βββ .env.local # Environment variables (YOU NEED TO FILL THIS)
βββ package.json # Dependencies and scripts
Required Environment Variables:
See .env.local.template for complete list.
Quick Setup:
- Copy
.env.local.templateto.env.local(already done) - Fill in Firebase credentials from Firebase Console
- Fill in Stripe credentials from Stripe Dashboard
- Run
npm run validate-envto verify - Restart dev server if needed
Detailed instructions: QUICK_START.md
- Configure environment variables
- Sign up as Owner account
- Subscribe to Pro plan (Stripe test mode)
- Create a job posting
- Sign up as Seeker account (incognito window)
- Browse jobs and view details
- Submit application
- Review application as Owner
- Update application status
Detailed test flows: TESTING.md
To test the complete subscription flow with real Stripe webhook events:
Prerequisites:
- Stripe CLI installed
.env.localconfigured with Stripe keys- Dev server running on
localhost:3000
Steps:
-
Start Stripe webhook forwarding (in a new terminal):
stripe listen --forward-to localhost:3000/api/stripe/webhook
Copy the webhook signing secret (
whsec_...) and updateSTRIPE_WEBHOOK_SECRETin.env.local -
Trigger a test checkout session completed event:
stripe trigger checkout.session.completed
-
Watch the logs to see:
- Stripe CLI forwarding the webhook
- Your app at
/api/stripe/webhookprocessing the event - Firebase custom claims being updated
- Console logs showing subscription activation
What happens:
- Stripe sends a webhook event to your local endpoint
- The webhook handler verifies the signature
- User subscription status is updated in Firebase (custom claims + Firestore)
- User gains access to Pro features instantly
For production: Configure webhook endpoints in Stripe Dashboard pointing to your deployed URL.
Verify all systems are operational:
# 1. Check health endpoint (all services should return true)
curl http://localhost:3000/api/health
# Expected: {"status":"ok","checks":{"firebase":true,"stripe":true,"environment":true}}
# 2. Verify Stripe webhook endpoint
curl http://localhost:3000/api/stripe/webhook
# Expected: {"message":"Stripe webhook endpoint ready","timestamp":"...","note":"Use POST method for webhook events"}
# 3. Verify Stripe checkout endpoint
curl http://localhost:3000/api/stripe/checkout
# Expected: {"message":"Stripe checkout endpoint ready","note":"Use POST method to create checkout sessions","config":{"mode":"subscription","tier":"ShopMatch Pro"}}All endpoints returning JSON? β Your Stripe integration is working!
β οΈ Webhook Security: The webhook endpoint uses raw body signature verification per Stripe's security best practices. This prevents spoofed events and ensures only genuine Stripe webhooks are processed.
- β Firebase security rules for Firestore
- β Role-based access control (owner/seeker)
- β Stripe webhook signature verification
- β Server-side authentication with Firebase Admin
- β Custom claims for subscription access
- β Input validation with Zod schemas
- β Protected API routes with token verification
β Compiled successfully
β All TypeScript checks passing
β Zero ESLint errors
β 19 routes (8 pages, 11 API endpoints)
β Bundle size: 245 kB shared chunks
β Build time: ~3 seconds with Turbopack
Production Site: shopmatch-pro.vercel.app
Test Accounts:
Employer Account (can subscribe):
Email: owner@test.com
Password: testtest123
Job Seeker Account:
Email: seeker@test.com
Password: testtest123
Stripe Test Card:
4242 4242 4242 4242 | Any future date | Any CVC
Deployment Details:
- Hosted on Vercel with auto-deployment from
mainbranch - Firebase Firestore for database with security rules
- Stripe integration in test mode (full functionality)
- CI/CD via GitHub Actions (lint, build, security scans)
- Environment variables securely configured
For deployment documentation, see DEPLOYMENT.md
Dev server won't start:
# Kill process on port 3001
lsof -ti:3001 | xargs kill -9
npm run devFirebase errors:
- Verify all
NEXT_PUBLIC_FIREBASE_*variables are set - Check
FIREBASE_PRIVATE_KEYformat (should include\n) - Restart dev server after .env.local changes
Stripe errors:
- Verify
STRIPE_SECRET_KEYstarts withsk_test_ - Check
STRIPE_PRICE_ID_PROis correct - Use test card
4242 4242 4242 4242for testing
More troubleshooting: PRODUCTION_DEPLOYMENT_GUIDE.md
Development: Complete
Deployment: Live on Vercel
Testing: All user flows verified
Documentation: Comprehensive
Purpose: Portfolio demonstration
- β User authentication (Email + Google OAuth)
- β Role-based access (Employer vs Job Seeker)
- β Job posting and management
- β Application submission and tracking
- β Stripe subscription integration
- β Webhook processing
- β Real-time database updates
- β Responsive design
- β Security rules enforced
- Automated test suite (Jest + Playwright)
- Email notifications
- Advanced search/filtering
- Analytics dashboard
- API rate limiting
- Resume parsing
See FUTURE_ROADMAP.md for complete feature roadmap.
This is a portfolio demonstration project built to showcase professional full-stack development capabilities.
Interested in working together?
- Review the Portfolio Showcase for detailed technical achievements
- Explore the Architecture Documentation to see system design
- Check out the live demo to see it in action
For Employers: This project demonstrates my ability to build production-grade applications from concept to deployment.
For Clients: I can build similar custom solutions for your business needs.
ShopMatch Pro is licensed under the MIT License. See LICENSE for the full license text.
This project uses various open-source packages. All dependencies have been reviewed for license compatibility with commercial use. See THIRD_PARTY_LICENSES.md for complete licensing information.
Key Points:
- β All dependencies are permissively licensed (MIT, Apache-2.0, BSD, ISC)
- β Compatible with commercial and proprietary software
- β Dual-licensed packages use BSD option (node-forge)
- β No strong copyleft licenses (GPL, AGPL) in distribution
FOSSA Configuration: License scanning policy is configured in .fossa.yml.
- Lines of Code: ~15,000+ (TypeScript, React, API routes)
- Build Size: 245 KB shared chunks (optimized)
- Build Time: ~3 seconds (Turbopack)
- API Endpoints: 11 RESTful routes
- Pages: 8 user-facing pages
- Components: 30+ reusable React components
- Security Rules: Comprehensive Firestore rules
- Documentation: 20+ technical documents
Built with β€οΈ using Next.js 15, Firebase, and Stripe
Project Type: Portfolio Demonstration
Status: Production-Ready (Test Mode)
Last Updated: October 2025

