Case Study: VapeFinder.com.au — Supplier Discovery Platform

  • Source Repository: github.com/joshjames/vapefinder
  • ⚠️ REGULATORY POST-MORTEM NOTE:
    Following its engineering lifecycle, the VapeFinder platform was formally decommissioned and closed down due to sweeping legislative updates and federal regulatory structural changes governing the sale and commercial distribution of alternative nicotine delivery systems within Australia. This archive serves strictly as a technical layout showcase of mobile-first discovery patterns, fuzzy location routing, and Next.js App Router service separation.
    System Overview: VapeFinder was engineered as a high-performance, mobile-first marketplace locator designed to securely and efficiently bridge the gap between consumers and local wholesale/retail suppliers throughout Australia using low-compute spatial clustering.

    Platform Layer & Service Dependency Architecture

    The system relies on a clean decoupling of Next.js Route Handlers (API Layer) and abstract, state-free logic controllers (Service Layer). Database interactions pass explicitly through strict TypeScript data schemas.

    graph TB subgraph Client["📱 Client Tier (Mobile-First Web)"] ui["Next.js App Router UI"] gmaps["Google Maps API Integration"] geo["HTML5 Geolocation API"] end subgraph API["⚡ API Gateway & Route Handlers"] routeAuth["/api/auth/* (Session Management)"] routeSup["/api/suppliers/* (CRUD / Geo-Query)"] routeProd["/api/products/* (Catalog Management)"] routeMsg["/api/messages/* (Real-time Routing)"] routeLead["/api/contacts/* (Lead Tracking Engine)"] end subgraph CoreServices["⚙️ Platform Service Layer"] authService["Auth Utility Engine
    JWT & Session Guard"] mapService["Maps Optimization Service
    Fuzzy Radius Generator"] msgService["Multi-Channel Broker
    WhatsApp / Telegram / App Switch"] leadService["Monetization & Lead Counter"] end subgraph Models["📦 Data Access Layer (Entities)"] userModel["User Model
    (ID, Email, PasswordHash, Role)"] supplierModel["Supplier Model
    (ID, Name, GeoPoint, FuzzyRadius, Active)"] productModel["Product Model
    (ID, SupplierID, Name, SKU, InStock)"] messageModel["Message Model
    (ID, SenderID, ReceiverID, Content, Timestamp)"] leadModel["Lead/Contact Model
    (ID, SupplierID, CustomerFingerprint, Meta)"] end subgraph Storage["💾 Persistence Layer"] db[("PostgreSQL Database
    (Structured Relations)")] end %% Client Interactions ui --> geo ui --> gmaps ui -->|"JSON HTTPS / App Router"| API %% Route to Service Mapping routeAuth --> authService routeSup --> mapService routeProd --> CoreServices routeMsg --> msgService routeLead --> leadService %% Service to Model Mapping authService --> userModel mapService --> supplierModel msgService --> messageModel leadService --> leadModel CoreServices --> productModel %% Database Persist userModel --> db supplierModel --> db productModel --> db messageModel --> db leadModel --> db %% Custom Styling Match classDef clientNet stroke:#38bdf8,fill:#0c4a6e,color:#cbd5e1; classDef apiNet stroke:#e879f9,fill:#581c87,color:#cbd5e1; classDef serviceNet stroke:#2dd4bf,fill:#115e59,color:#cbd5e1; classDef modelNet stroke:#a78bfa,fill:#2e1065,color:#cbd5e1; classDef storageNet stroke:#fb923c,fill:#431407,color:#cbd5e1; class Client clientNet; class API apiNet; class CoreServices serviceNet; class Models modelNet; class Storage storageNet;

    Technical Breakdown & Specifications

    1. Privacy-First Location Obfuscation

    2. Asynchronous Multi-Channel Brokerage

    3. Clean Directory Allocation

    vapefinder/
    ├── src/
    │   ├── app/                    # Next.js App Router pages
    │   │   ├── (marketing)/        # Public marketing funnels
    │   │   ├── (auth)/             # NextAuth / Crypto Token Guards
    │   │   ├── (customer)/         # Geolocation & Mapping Views
    │   │   └── (supplier)/         # Inventory & Product Matrix Management
    │   ├── components/             # Atomic UI Elements
    │   └── lib/                    # Core Infrastructure Engines (db, maps)