Project archive

Full-stack and browser-native case studies

Detailed write-ups sourced from audited repositories — frontend architecture, API design, local runtimes, and deployment choices.

Full-stack PWALive

Mobile-first PWA for logging newborn care events with multi-caregiver sync, offline outbox, and a FastAPI + MongoDB backend.

  • React
  • TypeScript
  • TanStack Router
  • FastAPI
  • +3 more
Problem

Caregivers need a fast phone-first way to log feeds, diapers, sleep, and health events—and share that timeline with partners without losing data when connectivity drops.

Frontend work
  • React 19 SPA with TanStack Router and 20+ file-based routes
  • IndexedDB offline outbox with sync-on-reconnect and client ID remapping
  • HttpOnly cookie auth client with CSRF headers and silent refresh
  • PWA install manifest, shortcuts, and service worker reminders
  • English/Hebrew i18n with RTL and voice log via Web Speech API
Backend & system work
  • FastAPI REST API with 25+ v1 route modules and OpenAPI docs
  • MongoDB repository layer with JWT cookie auth and owner/caregiver/viewer RBAC
  • Web Push reminders (VAPID) with secured external cron job endpoint
  • Production on AWS Lightsail: Docker Compose stack with Caddy reverse proxy/TLS, backend API, and Redis
  • Observability on the VPS: Prometheus, Loki/Promtail, Grafana, Node Exporter, and cAdvisor
  • GitHub Actions CI: pytest (70% coverage gate), Vitest, and Playwright E2E
Key decisions
  • HttpOnly cookie sessions instead of localStorage JWT storage
  • IndexedDB offline outbox for mutation queueing and ID remap after sync
  • Cloudflare Pages frontend with API on AWS Lightsail behind Caddy (ports 80/443 only)
  • External HTTP cron for reminder push dispatch in production
Challenges
  • Offline-first mutation queue with ordered flush and temporary ID remapping
  • Cross-origin cookie auth between Cloudflare Pages frontend and Lightsail-hosted API
  • Multi-caregiver invite flows with viewer read-only enforcement
Tech stack
Frontend
  • React 19
  • TypeScript
  • Vite
  • TanStack Router
  • TanStack Query
  • Tailwind CSS
  • Radix UI
  • i18next
  • vite-plugin-pwa
Backend
  • FastAPI
  • Motor
  • PyMongo
  • Celery
  • Redis
  • pywebpush
  • Resend
Data
  • MongoDB
  • IndexedDB
Infrastructure
  • Docker Compose
  • Cloudflare Pages
  • AWS Lightsail
  • Caddy
  • MongoDB Atlas
  • Prometheus
  • Grafana
  • Loki
  • GitHub Actions
Testing
  • Vitest
  • pytest
  • Playwright
Tooling
  • Bun
  • ESLint
  • Prettier
  • Ruff
Browser APIs
  • Web Speech API
  • Web Push
  • Service Worker
Local-first AI stackIn progress

Local-first AI chat monorepo: TanStack Start frontend, FastAPI backend, PostgreSQL/pgvector, MinIO, and Ollama inference via Docker Compose.

  • TanStack Start
  • React
  • FastAPI
  • PostgreSQL
  • +3 more
Problem

Most AI chat tools depend on hosted APIs. This project runs chat, persistence, and inference entirely on localhost with a one-command dev stack.

Frontend work
  • TanStack Start chat UI with session sidebar, SSE streaming, and optimistic messages
  • Three-column layout with mobile drawers and react-virtual for long transcripts
  • OpenAPI codegen into shared TypeScript contracts
  • Roleplay template management route with CRUD forms
Backend & system work
  • FastAPI layered routes, services, repositories, and Alembic migrations
  • PostgreSQL + pgvector for chat and embedding metadata; MinIO for image binaries
  • Ollama client with model allowlist and optional CrewAI orchestration backends
  • Docker Compose stack: Ollama, PostgreSQL, MinIO, API, and model pull jobs
Key decisions
  • Docker Compose brings up the full backend stack with one `bun run local:start` command
  • Shared `@local/shared` package keeps frontend and backend request shapes aligned
  • SSE streaming with optimistic UI instead of waiting for full completion responses
Challenges
  • SSE client parsing with optimistic pending/streaming/failed message states
  • Orchestration trace storage separate from user-visible chat messages
  • Local-only security tradeoffs documented (no auth in default configuration)
Tech stack
Frontend
  • TanStack Start
  • React 19
  • TanStack Router
  • TanStack Query
  • Vite
  • Tailwind CSS
Backend
  • FastAPI
  • SQLAlchemy
  • Alembic
  • Uvicorn
Data
  • PostgreSQL
  • pgvector
  • MinIO
Infrastructure
  • Docker Compose
  • Bun workspaces
Testing
  • Vitest
  • Playwright
  • pytest
AI / ML
  • Ollama
  • CrewAI (optional)
Local ML workspaceIn progress

Local Stable Diffusion workspace with a React dashboard, FastAPI orchestration, and a dedicated GPU subprocess for text-to-image and image-to-image generation.

  • React
  • TypeScript
  • FastAPI
  • Stable Diffusion
  • +3 more
Problem

Running image models locally means juggling checkpoints, Python environments, GPU diagnostics, and a usable UI. This project wraps that into one coordinated app.

Frontend work
  • React dashboard for generation, gallery, runtime diagnostics, and image-to-image editor
  • Canvas-based crop/color preprocessing plus server-side Pillow tool endpoints
  • Typed API client for JSON and multipart flows with Vitest component coverage
Backend & system work
  • FastAPI routes with subprocess `diffusers` runner in a dedicated model venv
  • Generation lock and CUDA OOM retry with smaller preset sizes
  • Optional API key, CORS origin checks, and upload validation for local-but-exposed use
  • Filesystem output storage under `outputs/generated`
Key decisions
  • Isolate GPU inference in a subprocess/venv so the API stays fast and testable
  • Allowlisted model IDs instead of arbitrary filesystem paths from the client
  • Split instant browser edits from heavier Pillow tools before image-to-image runs
Challenges
  • Orchestrating reliable local GPU pipelines across two Python environments and a web UI
  • Canvas mask retouch workflow with backend blur/median fill
  • Keeping frontend types aligned with Pydantic schemas across JSON and multipart routes
Tech stack
Frontend
  • React 19
  • TypeScript
  • Vite
  • Vitest
  • Testing Library
Backend
  • FastAPI
  • Uvicorn
  • Pydantic Settings
  • Pillow
Data
  • Local filesystem
Infrastructure
  • PowerShell dev scripts
Testing
  • Vitest
  • pytest
AI / ML
  • Stable Diffusion 1.5
  • diffusers
  • Realistic Vision checkpoint
Browser APIs
  • Canvas
  • Fetch
  • FormData
Links
Browser utilityLive

Single-file browser app that pairs with generic BLE LED strips over Web Bluetooth—color, brightness, power, and multi-protocol debugging with no native app or backend.

  • Web Bluetooth
  • Petite-Vue
  • Tailwind CSS
  • iro.js
  • +2 more
Problem

Generic BLE LED strips often ship with closed or mobile-only vendor apps. This utility talks to compatible strips from Chromium on HTTPS with runtime protocol tuning.

Frontend work
  • Petite-Vue reactive UI with iro.js color wheel and responsive glassmorphism layout
  • Web Bluetooth pairing, GATT discovery, throttled writes, and serialized command chain
  • Pluggable protocol profiles, channel order, and debug panel with storage CRUD
  • Accessibility hooks: aria-live, aria-label, labeled inputs
Backend & system work
  • No backend — GitHub Actions CI with zero npm install static tests
  • GitHub Pages deploy publishes `src/` directly with no build step
Key decisions
  • Single HTML file with no build step for trivial static hosting and direct device control
  • Throttled and serialized BLE writes to avoid overlapping GATT operations
Challenges
  • Web Bluetooth requires HTTPS, user gesture, and Chromium — with clear unsupported-context warnings
  • Protocol fragmentation across command families, channel orders, and write modes
  • Characteristic discovery across many known service/characteristic pairs
Tech stack
Frontend
  • HTML5
  • Petite-Vue
  • Tailwind CSS (CDN)
  • iro.js
  • Font Awesome
Infrastructure
  • GitHub Pages
  • GitHub Actions
Testing
  • Node.js built-in test runner
Browser APIs
  • Web Bluetooth
  • localStorage
  • Clipboard API
Previous portfolioLive

A React/TypeScript portfolio SPA for data analysis case studies, using Zod-validated JSON content, searchable project pages, visualization galleries, and a minimal Vercel serverless geo-block route.

  • React
  • TypeScript
  • Vite
  • Bun
  • +10 more

An earlier personal portfolio built to present data analysis case studies as structured, searchable content — static frontend, validated data pipeline, and one serverless route for geo IP checks.

Problem

I needed a portfolio for presenting data analysis work and project visualizations without running a CMS or database. Content stays in validated JSON, deploys as a static SPA, and only uses backend code where a server-side secret is required.

Frontend work
  • React 19 + TypeScript + Vite SPA with lazy-loaded routes
  • Theme UI design system with light/dark mode
  • Searchable and filterable project grid
  • Project detail pages with case-study structure and plot carousel
  • Static content pipeline using JSON, Zod schemas, and Vite asset resolution
  • Contact page with React Hook Form, Getform submission, clipboard copy, and resume download
  • SEO metadata with react-helmet-async, sitemap, robots, and Vercel Speed Insights
  • Accessibility details including skip link, reduced-motion styles, and ARIA feedback states
Backend & system work
  • Minimal Vercel serverless handler for GET /api/geo-block
  • Abstract API IP geolocation used server-side so the API key stays private
  • Vercel routing that sends /api/* to the serverless handler and the rest to the static frontend
  • Client-side Getform submission for contact messages
Key decisions
  • Used JSON + Zod instead of a CMS/database to keep content git-reviewable and statically deployable
  • Kept backend scope intentionally minimal — only serverless code where secrets must remain server-side
  • Used Zustand as a lightweight access layer over validated static content
  • Lazy-loaded routes and heavier UI pieces to keep the SPA structure cleaner
  • Used Vercel to deploy a static frontend and one serverless route from the same repo
Challenges
  • Keeping content integrity without a CMS
  • Resolving local asset references into Vite build output
  • Coordinating static frontend routing with a minimal serverless backend
  • Keeping Theme UI and React Bootstrap components visually consistent
  • Making geo-blocking fail open so the site still renders when the external API is unavailable
Tech stack
Frontend
  • React 19
  • TypeScript
  • Vite
  • React Router
  • Theme UI
  • React Bootstrap
  • Framer Motion
  • Zustand
  • Zod
  • React Hook Form
  • react-helmet-async
Backend
  • Vercel serverless Node handler
Data
  • Local JSON content files
Infrastructure
  • Vercel
  • Vercel Speed Insights
Tooling
  • Bun
  • TypeScript
  • Vite
Browser APIs
  • Clipboard API
  • fetch