← Back to Projects Full-Stack Marketplace

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 sellers with buyers. Sellers list parts with vehicle compatibility info, images, and pricing. Buyers search by vehicle model, compare parts, and place orders. The mobile app is built with React Native (Expo) for buyers, and there's an Astro web dashboard for sellers and admins.

Architecture

The project started with a Rust backend, then got ported to Supabase. The final architecture:

  • Mobile app — React Native (Expo) for iOS/Android buyers. Features search, vehicle selection, ordering, reviews, favorites
  • Web dashboard — Astro site for sellers and admins. Inventory management, order processing, bulk upload, analytics
  • Backend — Supabase. PostgreSQL with Row Level Security, Supabase Auth, Storage for images, Edge Functions for order processing

The Supabase RLS policies are where the real work lives. Every query goes through database-level security: sellers can only edit their own listings, buyers can only see their own orders, admins can see everything. This replaced the Rust AuthorityGuard system.

The hard parts

The Rust → Supabase migration. The original backend was in Rust with custom auth, custom API endpoints, and a handmade ORM. Porting everything to Supabase meant rethinking auth flows, rewriting all queries as Postgres RLS policies, and migrating data. The todo.md for this was 100 items long.

Real-time stock tracking. When a buyer adds a part to their cart, the stock needs to lock immediately to prevent overselling. This meant database-level triggers and careful edge function design. Get it wrong and two buyers order the same last item.

Vehicle compatibility. Parts don't just have a category — they fit specific vehicle makes, models, and years. The filtering logic (year → make → model → compatible parts) is a cascade of queries that needs to be fast even with thousands of parts.

What I learned

This was my first real full-stack project with a mobile app, and the scope was ambitious. I learned that Supabase is genuinely impressive for getting a production-ready backend running fast, but RLS policies have a learning curve — they're powerful but debugging "why does this query return nothing" when a policy is silently blocking you takes time.

The biggest lesson was about architecture decisions. The original Rust backend was elegant but slow to iterate on. Switching to Supabase meant sacrificing some control for speed, and for a solo project that was absolutely the right call.

Also: Expo's development builds are great. Expo's OTA updates are a lifesaver. But configuring native modules for both platforms still hurts.