How FPVBuilder works

Three layers: catalog (scraping/API of 13 stores), compatibility engine (50+ rules written in code, not AI), cross-store comparator (fuzzy matcher with spec guards). All open, all documented.

See the 50+ rules About the project

Layer 1: catalog

Python (Scrapy) spiders extract products from Shopify stores (Pyrodrone, GetFPV, BetaFPV, RaceDayQuads, MepsKing, HGLRC, Diatone, etc.) via their public /products.json API. AliExpress integrates via the official affiliate API (no HTML scraping). Each product goes through a per-category normalizer that extracts structured specs (KV, stator, mount pattern, voltage, etc.) with regex + weekly LLM fallback.

Layer 2: compatibility engine

50+ rules written in PHP in CompatibilityEngine.php. Each rule returns one of three states: pass (compatible), warning (warns but allows), error (build invalid). Rules execute on every build change. Not AI — deterministic rules: if motor mount_pattern isn't in frame motor_mounts set, error. Period.

Layer 3: cross-store matcher

The same product (e.g. RDQ Mach 3 Frame) can sell in 4 stores with different titles. The matcher uses fuzzy string + spec guards (stator+KV for motors, cells+mAh for batteries, prop_size for frames) to dedupe and show all purchase options grouped in a single product card.

Layer 4: chatbot (Gemini Flash + function calling)

Optional. The chatbot has access to tools (search_products, recommend_full_build, validate_compatibility) and builds complete drones by calling the same APIs as the UI. It can't hallucinate IDs because tools validate product existence before returning.