{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"blog_post","url":"https://ejfox.com/blog/week-notes/2025-07","json_url":"https://ejfox.com/blog/week-notes/2025-07.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<figure role=\"figure\" aria-label=\"QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739244166/Screenshot_2025-02-10_at_10.22.32_PM.png\" alt=\"QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739244166/Screenshot_2025-02-10_at_10.22.32_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739244166/Screenshot_2025-02-10_at_10.22.32_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739244166/Screenshot_2025-02-10_at_10.22.32_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739244166/Screenshot_2025-02-10_at_10.22.32_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5\" width=\"2204\" height=\"1978\" style=\"--splay-rot:2.99deg;\" data-dimensions=\"2204×1978\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">QuickOSM query builder searching for natural=peak map features within geographic coordinates -74.1,41.3,-73.9,41.5</figcaption>\n</figure>\n<p class=\"\">Experimenting a bit with visualizing Open Street Maps and Digital Elevation Model data in QGIS.</p>\n<figure role=\"figure\" aria-label=\"QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739382002/Screenshot_2025-02-12_at_12.39.46_PM.png\" alt=\"QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739382002/Screenshot_2025-02-12_at_12.39.46_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739382002/Screenshot_2025-02-12_at_12.39.46_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739382002/Screenshot_2025-02-12_at_12.39.46_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739382002/Screenshot_2025-02-12_at_12.39.46_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:1.78deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">QGIS mapping interface displaying Hudson Valley DEM topographic base map with natural peaks, highways, waterways, and tourism viewpoints overlaid.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739388454/Screenshot_2025-02-12_at_2.27.13_PM.png\" alt=\"QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739388454/Screenshot_2025-02-12_at_2.27.13_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739388454/Screenshot_2025-02-12_at_2.27.13_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739388454/Screenshot_2025-02-12_at_2.27.13_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739388454/Screenshot_2025-02-12_at_2.27.13_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:-1.69deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">QGIS map of Hudson Valley region showing elevation or terrain data with color-coded gradient from blue to red, overlaid with highways and waterways.</figcaption>\n</figure>\n<p class=\"\">Playing with the color scale on the digital elevation model data, I am and always will be a fan of the <a href=\"https://research.google/blog/turbo-an-improved-rainbow-colormap-for-visualization/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://research.google/blog/turbo-an-improved-rainbow-colormap-for-visualization/\">turbo</a> color scheme, and when applied you can instantly see the mountains that run down the southeast of Orange County next to the Hudson River.</p>\n<figure role=\"figure\" aria-label=\"GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739393884/Screenshot_2025-02-12_at_3.57.46_PM.png\" alt=\"GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739393884/Screenshot_2025-02-12_at_3.57.46_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739393884/Screenshot_2025-02-12_at_3.57.46_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739393884/Screenshot_2025-02-12_at_3.57.46_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739393884/Screenshot_2025-02-12_at_3.57.46_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:-2deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">GIS map of Hudson Valley region showing DEM basemap with overlaid geographic features, place names, and data layers for environmental and planning analysis.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739502251/Screenshot_2025-02-13_at_10.03.56_PM.png\" alt=\"Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739502251/Screenshot_2025-02-13_at_10.03.56_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739502251/Screenshot_2025-02-13_at_10.03.56_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739502251/Screenshot_2025-02-13_at_10.03.56_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739502251/Screenshot_2025-02-13_at_10.03.56_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.\" width=\"1736\" height=\"1812\" style=\"--splay-rot:-2.91deg;\" data-dimensions=\"1736×1812\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Map of New South Wales showing regional boundaries with overlaid large black typography naming major regions and towns.</figcaption>\n</figure>\n<p class=\"\">Is this number for the size calculation correct? No, no it is not.</p>\n<figure role=\"figure\" aria-label=\"USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739502431/Screenshot_2025-02-13_at_10.06.55_PM.png\" alt=\"USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739502431/Screenshot_2025-02-13_at_10.06.55_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739502431/Screenshot_2025-02-13_at_10.06.55_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739502431/Screenshot_2025-02-13_at_10.06.55_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739502431/Screenshot_2025-02-13_at_10.06.55_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.\" width=\"1796\" height=\"1884\" style=\"--splay-rot:-0.6deg;\" data-dimensions=\"1796×1884\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">USGS topographic map overlay showing township/range grid, land parcels, terrain contours, and drainage patterns in red dashed lines across rural area.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739504590/Screenshot_2025-02-13_at_10.42.53_PM.png\" alt=\"QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739504590/Screenshot_2025-02-13_at_10.42.53_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739504590/Screenshot_2025-02-13_at_10.42.53_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739504590/Screenshot_2025-02-13_at_10.42.53_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739504590/Screenshot_2025-02-13_at_10.42.53_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:-2.33deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">QGIS map displaying Hudson Valley elevation data with contour lines, terrain visualization, and classified elevation ranges from -60 to 1270 meters.</figcaption>\n</figure>\n<p class=\"\">Now let's start converting the DEM to contour lines that we can style into 10 different layers.</p>\n<figure role=\"figure\" aria-label=\"Mind map organizing EJ Fox&#x27;s 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739552096/Screenshot_2025-02-14_at_11.54.38_AM.png\" alt=\"Mind map organizing EJ Fox&#x27;s 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739552096/Screenshot_2025-02-14_at_11.54.38_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739552096/Screenshot_2025-02-14_at_11.54.38_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739552096/Screenshot_2025-02-14_at_11.54.38_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739552096/Screenshot_2025-02-14_at_11.54.38_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Mind map organizing EJ Fox&#x27;s 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:-0.6deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Mind map organizing EJ Fox's 2025 life goals across career areas: Room302.studio projects, coding work, content creation, photography, and personal development initiatives.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641880/Screenshot_2025-02-15_at_12.51.10_PM.png\" alt=\"macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739641880/Screenshot_2025-02-15_at_12.51.10_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739641880/Screenshot_2025-02-15_at_12.51.10_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641880/Screenshot_2025-02-15_at_12.51.10_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739641880/Screenshot_2025-02-15_at_12.51.10_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.\" width=\"2064\" height=\"1096\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"2064×1096\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">macOS Finder window displaying Vulpecula Loom application files for ARM64 architecture, including DMG installer and configuration files.</figcaption>\n</figure>\n<p class=\"\">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!</p>\n<figure role=\"figure\" aria-label=\"Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641909/Screenshot_2025-02-15_at_12.51.34_PM.png\" alt=\"Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739641909/Screenshot_2025-02-15_at_12.51.34_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739641909/Screenshot_2025-02-15_at_12.51.34_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641909/Screenshot_2025-02-15_at_12.51.34_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739641909/Screenshot_2025-02-15_at_12.51.34_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.\" width=\"2624\" height=\"1824\" style=\"--splay-rot:2.61deg;\" data-dimensions=\"2624×1824\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Discord OAuth authorization dialog where Vulpecula app requests access to username, email, and permission to read bedtime stories from user account.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"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.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739675153/Screenshot_2025-02-15_at_10.05.40_PM.png\" alt=\"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.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739675153/Screenshot_2025-02-15_at_10.05.40_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739675153/Screenshot_2025-02-15_at_10.05.40_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739675153/Screenshot_2025-02-15_at_10.05.40_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739675153/Screenshot_2025-02-15_at_10.05.40_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"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.\" width=\"2624\" height=\"1824\" style=\"--splay-rot:-0.6deg;\" data-dimensions=\"2624×1824\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">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.</figcaption>\n</figure>\n<p class=\"\">There's still a bunch of weird issues with the vulpecula onboarding I need to work through…</p>\n<figure role=\"figure\" aria-label=\"IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641912/Screenshot_2025-02-15_at_12.51.40_PM.png\" alt=\"IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739641912/Screenshot_2025-02-15_at_12.51.40_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739641912/Screenshot_2025-02-15_at_12.51.40_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739641912/Screenshot_2025-02-15_at_12.51.40_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739641912/Screenshot_2025-02-15_at_12.51.40_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.\" width=\"2624\" height=\"1824\" style=\"--splay-rot:-0.6deg;\" data-dimensions=\"2624×1824\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">IssueBuilder AI tool interface for converting development documents into structured GitHub issues using Claude 3.5 Sonnet AI model.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739645233/Screenshot_2025-02-15_at_1.47.01_PM.png\" alt=\"Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739645233/Screenshot_2025-02-15_at_1.47.01_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739645233/Screenshot_2025-02-15_at_1.47.01_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739645233/Screenshot_2025-02-15_at_1.47.01_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739645233/Screenshot_2025-02-15_at_1.47.01_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.\" width=\"1458\" height=\"1374\" style=\"--splay-rot:-1.29deg;\" data-dimensions=\"1458×1374\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Project creation form for Vulpecula Chat with MICRO compute size, $15 monthly cost, and West US region selected.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"Meme about tire repair with text &#x27;When the tires are out, mend the nets&#x27; overlaid on archival footage of people working.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739291177/Screenshot_2025-02-11_at_11.26.00_AM.png\" alt=\"Meme about tire repair with text &#x27;When the tires are out, mend the nets&#x27; overlaid on archival footage of people working.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739291177/Screenshot_2025-02-11_at_11.26.00_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739291177/Screenshot_2025-02-11_at_11.26.00_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739291177/Screenshot_2025-02-11_at_11.26.00_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739291177/Screenshot_2025-02-11_at_11.26.00_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Meme about tire repair with text &#x27;When the tires are out, mend the nets&#x27; overlaid on archival footage of people working.\" width=\"2540\" height=\"1412\" style=\"--splay-rot:-2.61deg;\" data-dimensions=\"2540×1412\" class=\"img-full my-8 rounded-sm img-splay aspect-video w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Meme about tire repair with text 'When the tires are out, mend the nets' overlaid on archival footage of people working.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739414974/Screenshot_2025-02-12_at_9.49.17_PM.png\" alt=\"LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739414974/Screenshot_2025-02-12_at_9.49.17_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739414974/Screenshot_2025-02-12_at_9.49.17_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739414974/Screenshot_2025-02-12_at_9.49.17_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739414974/Screenshot_2025-02-12_at_9.49.17_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.\" width=\"2652\" height=\"2474\" style=\"--splay-rot:-1.27deg;\" data-dimensions=\"2652×2474\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">LeetCode solution for finding maximum wealth by summing account balances, accepted with 0ms runtime across all test cases.</figcaption>\n</figure>\n<p class=\"\">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.</p>\n<figure role=\"figure\" aria-label=\"MonkeyType typing test profile showing ejfox&#x27;s statistics: 126 WPM at 100% accuracy on 30 seconds, 132 WPM at 98% on 60 seconds, with activity heatmap spanning last 12 months.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739416306/Screenshot_2025-02-12_at_10.11.33_PM.png\" alt=\"MonkeyType typing test profile showing ejfox&#x27;s statistics: 126 WPM at 100% accuracy on 30 seconds, 132 WPM at 98% on 60 seconds, with activity heatmap spanning last 12 months.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1739416306/Screenshot_2025-02-12_at_10.11.33_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1739416306/Screenshot_2025-02-12_at_10.11.33_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1739416306/Screenshot_2025-02-12_at_10.11.33_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1739416306/Screenshot_2025-02-12_at_10.11.33_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"MonkeyType typing test profile showing ejfox&#x27;s statistics: 126 WPM at 100% accuracy on 30 seconds, 132 WPM at 98% on 60 seconds, with activity heatmap spanning last 12 months.\" width=\"2652\" height=\"2474\" style=\"--splay-rot:1.58deg;\" data-dimensions=\"2652×2474\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">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.</figcaption>\n</figure>\n<p class=\"\">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 &#x3C;ejfox.com/stats></p>","title":"2025 07","metadata":{"date":"2025-02-11T03:22:47.000Z","modified":"2025-02-16T17:18:59.000Z","dek":"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,","tags":["qgis","mapping","programming","personal"],"words":952,"images":16,"imageDetails":{"total":16,"cloudinary":16,"withDimensions":0},"links":17,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/blog/week-notes/2025-07.json","html":"https://ejfox.com/blog/week-notes/2025-07","index":"/blog.json"}}