← The Build Log

5 min read

A directory of 600 dentists on a free database and a dollar domain

What the stack actually is, what it really costs to run, and why most of the hard part was not the code.

The site is a directory of nearly 600 dentists across Los Angeles, sorted by neighborhood and specialty, with a profile page for each practice and a way for those practices to claim and pay for a better spot. It runs on almost nothing. A free Postgres database, a domain that cost about a dollar, and a small server that already had room on it. One person keeps the whole thing current in about two hours a week.

The stack is plain on purpose. Next.js for the app, server-rendered so every page is real HTML a search engine can read. Postgres for the roughly 599 records. Stripe for the paid tiers. Resend for the email. Nothing exotic, nothing that needs a team to operate. The interesting cost is not money, it is attention, and the build is shaped to keep that low.

Deploys are a two-step on purpose too. A push to the main branch builds and ships to a staging copy automatically, in about a minute. Production is a separate, manual promote: I look at staging, and if it is good I retag the exact image that was tested and move it to prod. A cron on the box checks every fifteen minutes that prod has not fallen behind staging and pings me if it has. It is more ceremony than a hobby project needs, and it has saved me more than once.

Security is the part that is easy to skip and expensive to skip. The database has thirty row-level policies: the public can read the dentist listings, anonymous visitors can insert a lead or a click or a review but nothing else, and only the server, using a key that bypasses the rules, can do the rest. That last part is the one to be careful with. The admin path holds a key that can do anything, so it lives on the server and never goes near the browser.

But the honest headline is that the code was the easy 20 percent. The other 80 percent was data: getting close to 600 real practices with real addresses, real specialties, and contact details that are actually right, then keeping them right. Eight scrapers, a validation pass, and a contact-coverage audit, all to fight the one thing a directory cannot survive, which is being wrong about the businesses it lists.

Early numbers are not a victory lap. The first launch week was 33 visitors over 12 days, no conversions, and one neighborhood page indexed out of 41. That is normal for a brand new site with no links and no history, and it is exactly the kind of flat week this log exists to write down. The machine works. Now it has to be fed, and that is the slow part nobody screenshots.

Get the next one by email

One short build log a week. Real numbers, including the flat weeks.