Skip to main content
FEB 10, 2025·5min read·952 words ·

2025 07

In which a gentleman programmer, beset by half-finished endeavors and haunted by the spectral presence of incomplete repositories, finds momentary satisfaction in the precise measurement of his typing velocity,

QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5
QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5

Experimenting a bit with visualizing Open Street Maps and Digital Elevation Model data in QGIS.

QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.
QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.

Ran some OSM queries for highway and peak data and did the most basic of styling to get them to appear on the map. Got the DEM data showing (not elegantly though) in the background as gray.

QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.
QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.

Playing with the color scale on the digital elevation model data, I am and always will be a fan of the turbo color scheme, and when applied you can instantly see the mountains that run down the southeast of Orange County next to the Hudson River.

GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.
GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.

Once I could see the mountains my next question was "what the fuck am I looking at" – so I needed to try and pull in place names from OSM. I tried to size them by population but it didn't seem like the OSM data was consistent enough to get the look I wanted.

Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.
Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.

Is this number for the size calculation correct? No, no it is not.

USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.
USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.

If you make the town labels arranged vertically, it suddenly gives the map a bit of a japanese vibe, which I like, but probably a bit too experimental for this project.

QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.
QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.

Now let's start converting the DEM to contour lines that we can style into 10 different layers.

Mind map organizing EJ Fox's 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.
Mind map organizing EJ Fox's 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.

I suffer from having a ton of half-completed ongoing coding projects, so many that I needed to draw myself a little map so I can remember all the things that I have laying around waiting for me to give them the 10% of energy to push them into temporary completion.

macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.
macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.

One of my projects is a little Electron AI chat app I made for myself called Vulpecula Loom. I've been trying to fix the icon on it, and it's finally working! It almost looks like a real app!

Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.
Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.

The last blocker on this project is the log-in / onboarding process, which is annoying to test and made even more complicated by the fact I have combined all of my prototypes into a single Supabase project, trying to share authorization schemes, which is borderline ruining my life right now.

Vulpecula AI coding assistant interface showing Dolphin 3.0 R1 Mistral 24b model initialization logs with Content Security Policy errors and API key validation status.
Vulpecula AI coding assistant interface showing Dolphin 3.0 R1 Mistral 24b model initialization logs with Content Security Policy errors and API key validation status.

There's still a bunch of weird issues with the vulpecula onboarding I need to work through…

IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.
IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.

IssueBuilder is another project I want to get over the finish line soon! Strangely, when you log into Vulpecula, the auth redirect sends you to IssueBuilder. I need to fix this.

Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.
Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.

In order to fix it, I guess I will make separate supabase projects for each of the apps, like supabase wants. They tell me this will cost $10/month per project, probably. That is too much money for projects that make no money. But of course projects that no one can see or use make no money. So I think to myself, I will give them the opportunity to find users, who may theoretically make up for the cost at some point. Or I could self-host each supabase project on my own VPS. But I just wanted to punt so I could get something publishable.

Meme about tire repair with text 'When the tires are out, mend the nets' overlaid on archival footage of people working.
Meme about tire repair with text 'When the tires are out, mend the nets' overlaid on archival footage of people working.

LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.
LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.

So many of my projects are open-ended and creative without hard definitions of completeness. My organized brain rebels against this, and so I feel compelled to do these little leetcode puzzles where I can just make the little cases turn green. This is only my second question, and it's among the easiest, but I liked the way it made my brain work in a slightly different way. I want to start redoing these in Python soon.

MonkeyType typing test profile showing ejfox's statistics: 126 WPM at 100% accuracy on 30 seconds, 132 WPM at 98% on 60 seconds, with activity heatmap spanning last 12 months.
MonkeyType typing test profile showing ejfox's statistics: 126 WPM at 100% accuracy on 30 seconds, 132 WPM at 98% on 60 seconds, with activity heatmap spanning last 12 months.

Another short, repetitive, easy skill to measure and improve is typing speed. This brings me joy. This is one of the things I'm good at, so it's nice to be able to have a nice little tool to come back to. The stats are then imported to <ejfox.com/stats>

The world is editable. I ship fast, bend computers toward good problems, and help teams who have a hunch something could be better — napkin sketch to working prototype, usually before the week is out. Let's build something →

If you found value in this, consider supporting my work

github ·