🚀 Flagship Projects
A curated selection of innovation programs, research prototypes, and production-ready platforms I have architected or led.




Quick facts
- Role
- Software Engineer & Researcher
- Link
- View live
Tech Stack
Overview
Project Overview
The Analytic Hierarchy Process (AHP) app is a Vite + React single-page application that helps teams create, edit, and review decision analyses directly in the browser. It ships with sample scenarios, includes an admin-only dashboard, and operates entirely on client-side storage so it can run on static hosting without server dependencies.
Key capabilities
- Admin authentication gate protecting the dashboard and editing workflows.
- Creation and editing of AHP analyses with persisted data in the browser.
- Dashboard overview cards, recent analysis lists, and quick links into edit flows.
- Responsive UI composed from Tailwind CSS utilities, Radix UI primitives, and Shadcn-inspired components.
- Client-only data layer that seeds from JSON and syncs via
localStorage(with an in-memory fallback for non-browser contexts).
High-level architecture
- React SPA with hash-based routing: Uses
react-router-domv7 hash router so routes work on static hosts without custom rewrite rules. - Feature organization: Routed pages live in
src/pages, shared UI lives insrc/components(withcomponents/uifor primitives), and shared logic resides insrc/hooksandsrc/utils. - State and persistence: Authentication context tracks login status in
localStorage, while the AHP data service provides CRUD operations backed by local storage and emits change events to keep views synchronized. - Styling and visuals: Tailwind CSS powers layout and spacing, Radix UI primitives supply accessibility, and Recharts renders analytics visualizations.
Included libraries (high level)
- React ecosystem:
react,react-dom,react-router-dom - Styling & UI: Tailwind CSS, Radix UI packages,
tailwind-merge,clsx,lucide-react,framer-motion,tailwindcss-animate,react-resizable-panels,embla-carousel-react,react-day-picker,cmdk,sonner - Forms & validation:
react-hook-form,zod,@hookform/resolvers - Data visualization:
recharts - Utilities and helpers:
date-fns,class-variance-authority,input-otp,vaul,next-themes,prop-types
Technical Details
Technical Details
Application structure
- Entry point:
src/main.jsxmounts the React tree and global providers (e.g., toaster) before rendering the router defined insrc/pages/index.jsx. - Routing: Uses
createHashRouterfromreact-router-domv7.AuthProviderwraps the router, andRequireAuthprotects all routes except/login. - Layout shell:
src/pages/Layout.jsxprovides the global navigation, header, and content container shared by routed pages. - Pages:
Dashboard.jsxrenders overview cards (StatsOverview), recent analyses (RecentAnalyses), and actions to view/edit/delete analyses.CreateAnalysis.jsxsupplies the form-driven experience for building or editing AHP models, using validation helpers and shared UI primitives.Login.jsxpresents the admin authentication form.
Authentication flow
- Implemented in
src/hooks/useAuth.jsxvia a React context anduseAuthhook. - Credentials come from
VITE_ADMIN_USERNAMEandVITE_ADMIN_PASSWORDwith safe defaults for local development. - Auth state persists in
localStorageunderahp:auth:v1; a constant-time password comparison reduces timing-leak risk. - Protected routes redirect unauthenticated users to
/login, and the context exposeslogin/logouthelpers for UI components.
Data layer and APIs
- Seed data lives in
src/data/analyses.jsonand is loaded on first run. src/api/entities.jsexportsDecisionAnalysis, a service exposing CRUD operations against the stored analyses:list(orderBy)sorts results (e.g.,-created_date).get(id)retrieves a specific analysis or throws if missing.create(payload)inserts a new analysis, generating IDs and timestamps as needed.update(id, updates)merges changes and refreshes theupdated_datestamp.delete(id)removes an analysis by ID.
- Storage writes to
localStoragewhen available, with an in-memory fallback for environments without persistent browser storage. - After mutations, the service dispatches a custom
analyses_changedDOM event so dashboard and list views can refresh automatically.
Styling and UI system
- Tailwind CSS provides utility-first styling;
clsxandtailwind-mergehelp compose class names safely. - Radix UI primitives and Shadcn-inspired components live under
src/components/ui, covering dialogs, popovers, dropdowns, and other interactive elements. - Icons use
lucide-react; motion and animation rely onframer-motionandtailwindcss-animate. - Charts and summaries on the dashboard use
rechartsfor data visualization.
Utilities and helpers
src/lib/utils.jsoffers thecnhelper for class name merging.src/utilscontains routing helpers (createPageUrl,PAGE_ROUTES) and other shared logic reused across pages and components.
Testing and quality
-
ESLint configuration lives in
eslint.config.jsand runs vianpm run lintto enforce consistency across React and hook usage. -
The project currently relies on manual and exploratory testing alongside linting; no automated test suite is configured in the repository.
-
ChatOps interface lets teams approve or override automated fixes.
-
Pluggable policy hooks support vendor-specific add-ons.
