Case Study, Full-Stack Web App
AutoDex
A car database and garage app built on public data, with every make and model, the exact years each was sold, specs, recalls and a community photo gallery.
Node.js Express PostgreSQL REST APIs Design & Build
Project Overview
AutoDex began in 2022 as a project during my General Assembly software engineering course: a simple vehicle search that saved favorite cars to an account. In 2026 I rebuilt it into a production app with a catalog of 71 makes drawn from public vehicle data, a personal garage, and a community that helps fill in the photos.
The goal was a car site that stays accurate without anyone typing in data. Makes, models, model years, specs, recalls and background all come from public sources, while the parts that need people, like photos and garages, are built for users to contribute to.
Implementation
A Catalog Built From Public Data
The catalog is assembled from public sources rather than typed in. Makes and models come from the NHTSA vehicle API, specs from FuelEconomy.gov, and background from Wikipedia and Wikidata, all cached in Postgres so a slow or failing source serves the last good answer instead of an error.
Model years are scanned for every year since 1981 and stored as exact lists rather than ranges, because production gaps are real: AutoDex lists the BMW M3 for 1988 to 1991, 1995 to 2018 and 2021 onward. Public data is messy too. NHTSA matches a make as a substring, so asking for MG also returns trailer companies, and the catalog keeps only exact matches:
// NHTSA matches the make as a substring, so asking for "MG" also returns
// models from CHEMGUARD, MGM Trailers, TMG Trailer and friends. Keep only
// exact make matches, and store our own spelling so casing stays stable
// ("SAAB"/"smart" come back inconsistently).
const wanted = normalizeMake(makeDisplay);
const names = (res.data.Results || [])
.filter(m => normalizeMake(m.Make_Name) === wanted)
.map(m => m.Model_Name);
Garage, Dex & Gallery
Built for Car People
Signed-in users get a garage for the cars they own, with a VIN decoder that fills in the details, open recalls from NHTSA and a maintenance log for each car. Garages can be shared publicly, and a Spotted It check-in turns car spotting into a collection, the Dex, with completion tracked per make and badges earned along the way.
Photos are a shared effort. Cars without one are filled automatically from Unsplash with photographer credit, users can propose a better shot, and every car has a gallery where votes decide which photo leads the page:
// Highest score wins; ties go to the oldest image so the hero doesn't flicker.
async function refreshHero(carId, { transaction } = {}) {
const top = await db.car_image.findOne({
where: { carId },
order: [['score', 'DESC'], ['id', 'ASC']],
transaction
});
if (!top) return null;
await db.car.update({ image: top.url, updated_img: true }, { where: { id: carId }, transaction });
return top;
} Results
AutoDex is live at autodx.io and deploys on every push to main, with Render running the database migrations before it cuts over. It is hardened for real traffic with CSRF protection, rate limiting, hashed verification tokens and sessions stored in Postgres, and its test suite runs against a separate database built from the real migrations.
See It Live
Experience the Full Site
Search any make, compare up to three cars side by side, and browse the catalog by decade or country.