Most people keep their first phone number forever. You get it in high school, college, or maybe when you first move to a new country, and then it follows you around no matter where you end up. That means the area codes in your contacts are sort of a history of your life. You’ve got people you grew up with, people from work, friends you met through hobbies, and random people from parties, conferences, weddings, etc.

I’ve had this idea to show all of these connections on map in my project list for about 10 years, never wanting to commit a full weekend to building it out. Now these kind of micro-apps can be built in hours, so I finally got to cross it off my list!

Lifecycle of Personal Projects

The first commit in the github repo is from June 2021, just adding in the geometry from a public dataset. There are three more commits from that October where I got a tiny React app running and made the area codes searchable. Then I abandoned it for four years.

It wasn’t an important project, and I didn’t really know what tools I wanted to use to build it. It’s also mostly a novelty that you look at for five minutes and send to a few friends. I’m sure everybody has a few projects like that. Fun ideas, but not quite fun enough to spend a bunch of your small amount of free time working on them.

I definitely have complicated feelings about how LLMs are changing programming. I actually like a lot of the boring parts. Sitting with a problem for way too long is usually how I finally wrap my head around it, and fighting with the code until it works and is beautiful is one of the most satisfying things. When my role turns into mostly reviewing generated code, I notice myself feeling detached from the work. I can’t really hold the whole project in my head anymore, what code is in what files, and when something breaks I don’t immediately know where to look.

I also think we’re going to be buried in software that works well enough to ship, but that nobody understands well enough to trust. Eventually somebody has to answer a hard question about how it works, and “the models will get better” doesn’t really solve that. BUT, these types of small encapsulated side projects can be a great use case for this technology. The working prototype was completed in minutes, and polishing it up only took a few more hours for me to feel pretty confident in my work.

The choice wasn’t between building it carefully and building it quickly. It was between building it quickly and not building it at all.

What Ended Up Being Built

Hometowns is an interactive map of area codes in the US, Canada, and the Caribbean. You can search by phone number, city, state, or province and poke around the map without importing anything. I find that pretty fun on its own.

The more interesting part is when you import your contacts. You can pick contacts directly on your phone, upload a vCard or CSV export, or paste in a list of numbers. It counts the contacts in each area code and colors them in on the map. You can also click a region to see which people are behind the number.

You can generate a share link with the counts for your map. If a friend opens it and imports their own contacts, you can compare the two and see where they overlap. I think the comparison is probably my favorite part. It’s fun seeing all the places you have in common, along with the ones that make no sense at all.

My Hometowns contact map, showing 356 phone numbers across 114 area codes

My Part in All of This

I already had a project plan, so I started by handing that to the LLM. We went back and forth a while adding sharing, comparisons, sample maps, and all the little details I hadn’t thought through ahead of time. Then I rewrote all of the copy myself and went through the code to make sure the privacy claims were true.

Your contacts are probably the most personal list you own, so I didn’t want to build something that asks for them without handling it with care. The entire app is static. There is no server, database, or accounts. Your contacts are parsed fully in your browser, and by default the names and phone numbers aren’t stored at all and thus are fully deleted close the tab. If you want your map to stick around, you can save it to local storage. It never syncs anywhere, and the “Forget everything” button does delete it. Share links only contain the total number of contacts for each area code, plus your own area code if you choose to include it. They never contain names or phone numbers.

I’d say this is the important part of being a technologist in the age of LLMs. An LLM will happily agree that nothing should leave the browser and then undermine that later when a feature would be easier violating it without letting yuo know. Privacy is mostly about making sure something doesn’t happen, so you have to go check. I read through the code, added end-to-end tests for it, and deploy the site directly from the public repo with GitHub Actions.

Conclusion

I still feel mixed about using AI every day, but I’ll probably keep using it for these little side projects. Most of them are never going to justify days or weeks of work, and without the help they probably just won’t exist. Overall I’m just happy this project finally came to life.

The code is at benaduggan/hometowns and you can try Hometowns here. Here’s my own map if you want to see how many area codes we have in common!