toponymia
Toponymia is a map-based wiki, with articles explaining the etymology of (potentially) every place name on the map. You can click any label on the map to view an article, or create it if one doesn’t exist. Places with an article show up with an orange label. The etymologies are modeled per name rather than per article, since a place can have multiple names (endonym plus exonyms) each with its own etymology and source language(s). It’s a full wiki with user creation/login, discussion sections, revision history, etc.
It is not entirely finished, but the site is live (and unadvertised). You can view the current state at www.toponymia.org. I’ll update this post along with the site.
History
In 2019, I took a three-month full-stack programming bootcamp. Eight hours a day of instruction and programming. The final month or so was largely devoted to a capstone project, which we would present in front of the school. This program was my capstone. It was fully functional at the end, but not too pretty and kind of clunky.
About four years later, I was back in school taking a course called “Code Review” - essentially software engineering with extra emphasis on style and convention to make clean, organized, and legible code. We had to pick some large, existing codebase and throughout the course incrementally refactor it into TypeScript. So I took my old bootcamp capstone and used that. I always thought it was a good idea for a website, and wanted to keep working on it. But all this work didn’t really change any of the functionality of the program, it just taught me Typescript (along with better programming).
I think I bought the domain name back in 2019, and I held on to it in the hopes that I’d eventually get around to finishing the site. I finally got around to it in 2026 thanks to Anthropic: they ran a special where they opened up Fable to Pro users for a few weeks. I wanted to test out Fable, and I thought refreshing Toponymia would be a great project for it. So I just used Claude Code to help make all necessary edits for a more polished and usable site.
The overall design really didn’t change much, but it looks and works much better than before. You can have a look at the README if you want, but here’s a quick technical overview:
Details
It’s built on a Django 6 + Django REST Framework backend with
PostgreSQL/PostGIS for geospatial storage, and a React + TypeScript +
Vite frontend rendering the map with MapLibre GL JS. There are no API
keys or paid services anywhere: map tiles come from OpenStreetMap via
OpenFreeMap, the Overpass API resolves clicked map features to
real-world OSM elements, Wikidata IDs anchor stable identities, and
Photon handles geocoding search. In production Django serves the built
React app directly out of web/dist/, adding server-rendered SEO
metadata, a sitemap, and robots.txt; in development the two run
separately, with Vite proxying API calls to Django.
My original program used pins on the map, but now it uses the labels themselves (a huge improvement IMO). Every rendered label on the basemap is clickable, and a server-side lookup resolves that click to a stable entity, then serves the matching article. Articles aren’t tied to coordinates; they’re anchored to a Wikidata ID when one exists, falling back to an OpenStreetMap element or a name-plus-location match.
On top of that sits a pretty conventional wiki stack: accounts via django-allauth, full revision history with diffs and revert, threaded talk pages, and moderation for admins (report queues, soft-delete, per-article protection levels, report review, account banning).
What turned out to be of the main lessons in developing this: creating a site where people can log in and publish their own content is a completely different category of project. I feel like half of the overall work revolved around this. Things like email notifications, account management, moderation dashboards, licensing/copyright considerations, etc., had to be thoroughly planned out and tested from every possible angle. I don’t feel so bad serving myself up a bug, but I really don’t want to disappoint or confuse a user who’s contributing to my site. And I need to prevent misbehaving users from doing any damage.
I also wrote a bot to crawl the map for article-less labels, search for etymologies on sources with a friendly license (e.g., Wikipedia and Wiktionary) and automatically write articles. For legal reasons I need to manually review every post, so it’s not fully automated but it does help a lot. That’s a project for another post.
The source code for Toponymia can be found here on GitHub.