Axto

A marketplace platform for auto parts. Mobile app for buyers, web dashboard for sellers, all backed by Supabase.

What it does

Axto connects auto parts buyers and sellers. Buyers browse listings through a React Native app; sellers manage inventory, process orders, and track analytics through an Astro web dashboard. Vehicle compatibility matching ensures you only see parts that fit your car.

Architecture

Two frontends, one backend:

  • Mobile app — React Native (Expo). Browse by vehicle, search by part, save favourites, direct messaging with sellers. Push notifications for price drops and saved searches.
  • Admin dashboard — Astro with React islands. Inventory management, order fulfilment, sales analytics. Responsive — works on desktop and tablet.
  • Backend — Supabase handles auth, Postgres with Row Level Security, storage for part images, and real-time subscriptions for messaging.

Key decisions

Vehicle compatibility as a graph problem. Instead of tagging every part with make/model/year (which is thousands of combinations), we modelled it as a compatibility matrix — each part has a set of "fits" rules, and the query engine walks the graph. More work upfront, but adding a new vehicle doesn't require retagging every part.

Supabase RLS for multi-tenant data. Every row in the database has a seller_id, and Row Level Security policies enforce that sellers only see their own orders and inventory. Buyers see only public listing data. This means the mobile app queries Postgres directly — no custom API layer needed for reads.

Scope management is a skill, not a constraint.

The hard parts

Search. Postgres full-text search is fine for text, but auto parts have VIN-specific queries, OEM numbers, and fuzzy brand matching. We ended up with a hybrid: Postgres tsvector for full-text + a custom matching layer for compatibility queries.

Image moderation. Users upload part photos. We built an automated moderation pipeline using a third-party API, but the false-positive rate on engine parts vs. prohibited items was… educational.

Screenshots

Axto home screen
Home — Browse listings by vehicle
Axto search screen
Search — Find parts by name or OEM number
Axto product details
Product details — Compatibility info, price, seller
Empty cart
Cart — Empty state
Cart with products
Cart — Items ready for checkout
Checkout address form
Checkout — Shipping address
Checkout payment
Checkout — Payment via Stripe
Notifications
Notifications — Price drops and messages
Profile screen
Profile — Account and saved searches

What I learned

This was my first full-stack marketplace and the project where I learned that scope management is a skill, not a constraint. The feature list kept growing — reviews, messaging, notifications, analytics — and each one taught me something about state management across platforms, real-time data sync, and why you don't skip writing integration tests for your Stripe webhook handler.

Also: React Native's FlatList performance with 10,000+ parts listings is genuinely impressive. Astro's partial hydration meant the dashboard felt instant despite having React components embedded in static pages.