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.

Role
Design & Development
Type
Personal Project
Timeline
Started 2022, rebuilt 2026
Tech Stack
Node.js Express PostgreSQL Sequelize EJS Render

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);
AutoDex, comparing the Porsche 911, BMW M3 and Chevrolet Corvette

Garage, Dex & Gallery

Built for Car People

AutoDex, the Porsche 911 page with its photo credit and garage actions

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.

71
Makes in the Catalog
Models come from NHTSA, with curated lists for the makes it barely covers.
1981
Model Years Scanned
Every year since 1981, stored as exact lists so production gaps stay visible.
27×
Lighter Photos
Unsplash images load at the size the page needs instead of full resolution.

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.