{"id":27264203,"url":"https://github.com/stevehoober254/fullstack-portfolio","last_synced_at":"2026-04-11T13:03:34.897Z","repository":{"id":287213563,"uuid":"963971761","full_name":"stevehoober254/fullstack-portfolio","owner":"stevehoober254","description":"💻 Real-world fullstack apps with scalable APIs, CI/CD pipelines, and cloud-native hosting","archived":false,"fork":false,"pushed_at":"2025-04-10T14:38:26.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T15:52:24.083Z","etag":null,"topics":["api","backend","cloud-hosting","docker","frontend","fullstack","nextjs","nodejs","typescript","webapp"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stevehoober254.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-10T13:48:16.000Z","updated_at":"2025-04-10T14:38:30.000Z","dependencies_parsed_at":"2025-04-10T15:52:27.605Z","dependency_job_id":"632e4a63-896f-42d2-9893-16835554d1fe","html_url":"https://github.com/stevehoober254/fullstack-portfolio","commit_stats":null,"previous_names":["stevehoober254/fullstack-portfolio"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevehoober254%2Ffullstack-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevehoober254%2Ffullstack-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevehoober254%2Ffullstack-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevehoober254%2Ffullstack-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stevehoober254","download_url":"https://codeload.github.com/stevehoober254/fullstack-portfolio/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248358548,"owners_count":21090401,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","backend","cloud-hosting","docker","frontend","fullstack","nextjs","nodejs","typescript","webapp"],"created_at":"2025-04-11T06:51:27.635Z","updated_at":"2026-04-11T13:03:34.891Z","avatar_url":"https://github.com/stevehoober254.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌐 Fullstack Engineer Portfolio — Stephen Gashoka\n\n\u003e Production-grade web applications with scalable APIs, CI/CD pipelines, and cloud-native hosting. Specialising in Africa-market products — offline-first PWAs, M-Pesa payment integrations, and multilingual interfaces.\n\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white)\n![Next.js](https://img.shields.io/badge/Next.js-000000?style=flat-square\u0026logo=nextdotjs\u0026logoColor=white)\n![Node.js](https://img.shields.io/badge/Node.js-339933?style=flat-square\u0026logo=nodedotjs\u0026logoColor=white)\n![PostgreSQL](https://img.shields.io/badge/PostgreSQL-4169E1?style=flat-square\u0026logo=postgresql\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/Docker-2496ED?style=flat-square\u0026logo=docker\u0026logoColor=white)\n\n---\n\n## Projects\n\n### 1. Offline-First POS System for Informal Traders\n**Problem:** Small vendors in Kenya operate in areas with intermittent connectivity but need reliable sales records and inventory tracking.\n\n**Architecture:**\n- **Next.js** PWA frontend with **IndexedDB** (Dexie.js) for offline data persistence\n- **NestJS + PostgreSQL** backend with conflict-resolution sync engine\n- **Service Workers** for full offline capability (asset caching + API request queuing)\n- **M-Pesa STK Push** integration for mobile payment recording\n- **PDF/CSV** daily report export\n\n**Key engineering decisions:**\n- Implemented a CRDT-inspired sync strategy: offline mutations are timestamped and merged server-side, with last-write-wins on non-conflicting fields\n- IndexedDB chosen over localStorage for structured query support on product catalogue\n- Progressive enhancement: app is fully functional offline, enhanced when online\n\n**Stack:** TypeScript · Next.js · NestJS · PostgreSQL · Dexie.js · Service Workers · M-Pesa API\n\n---\n\n### 2. Digital Farmer's Market — E-Commerce for Smallholder Farmers\n**Problem:** Kenyan smallholder farmers lack direct-to-consumer online channels and rely on exploitative middlemen.\n\n**Architecture:**\n- **FastAPI + PostgreSQL** backend (async, production-ready)\n- **Next.js 14 App Router** frontend with server components\n- **M-Pesa STK Push** + **Stripe** payment integration\n- **Mapbox GL JS** for farm location discovery\n- **Africa's Talking SMS API** for order confirmation and delivery alerts\n- Deployed on **Railway** (backend) + **Vercel** (frontend)\n\n**Key engineering decisions:**\n- Used PostGIS extension for geospatial farm queries (\"farms within 50km\")\n- SMS notifications via Africa's Talking preferred over email (higher rural open rates)\n- Separate buyer and farmer dashboards with role-based access\n\n**Stack:** Python · FastAPI · Next.js · PostgreSQL · PostGIS · M-Pesa · Mapbox · Africa's Talking\n\n---\n\n### 3. AI-Powered Resume Matcher \u0026 Job Fit Scorer\n**Problem:** Hiring managers spend hours manually screening CVs; candidates don't know how well their CV matches a job description.\n\n**Architecture:**\n- **Python NLP backend**: sentence-transformers for semantic similarity, spaCy for skill extraction\n- **GPT embeddings** for job description → skill graph mapping\n- **React + Tailwind CSS** frontend: upload CV + paste JD → see fit score breakdown by skill category\n- **FastAPI** serving the ML inference endpoints\n- **PDF parsing** via PyMuPDF for structured CV extraction\n\n**Stack:** Python · FastAPI · spaCy · sentence-transformers · OpenAI API · React · TailwindCSS · PyMuPDF\n\n---\n\n## Architecture patterns used\n- Clean architecture (domain / application / infrastructure layers)\n- Repository pattern for data access\n- Event-driven with message queues (Redis Bull for background jobs)\n- Containerised with Docker Compose for local dev parity\n\n---\n\n## Skills demonstrated\n| Area | Technologies |\n|---|---|\n| Frontend | React, Next.js, TypeScript, TailwindCSS, PWA/Service Workers |\n| Backend | Node.js, NestJS, FastAPI, REST, GraphQL |\n| Database | PostgreSQL, PostGIS, Redis, Prisma ORM |\n| Payments | M-Pesa STK Push, Stripe, KCB API |\n| DevOps | Docker, GitHub Actions CI/CD, Vercel, Railway, AWS |\n| Testing | Jest, Playwright (E2E), pytest |\n\n---\n\n\u003e 📌 Also see: [KCB M-Pesa WooCommerce Plugin](https://github.com/stevehoober254/kcb-mpesa-express-wordpress-plugin) — a production WordPress payment plugin with real install base.\n\n📧 stephengachoka57@gmail.com | 🌐 [stephengachoka.co.ke](https://stephengachoka.co.ke) | 📍 Nairobi, Kenya\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevehoober254%2Ffullstack-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevehoober254%2Ffullstack-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevehoober254%2Ffullstack-portfolio/lists"}