Justin Chavez

Isometric SF

Isometric SF is out, and I'm excited for people to see it. You can explore the map here.

What you can do

  • Glide from the whole Bay down to a single building. Press H to come back out.
  • Search a place, a town, a street address, or a latitude and longitude, and the map flies you there.
  • Not sure where to go? Hit Surprise me (the dice, or R) and land somewhere like the USS Hornet, Apple Park, or the Winchester Mystery House.
  • Found your spot? The yellow Share button makes a link to exactly what's on your screen, with an optional note. Keep it or send it to someone.

I've wanted this to exist ever since I saw Andy Coenen's Isometric NYC in January. It wasn't the one-shot I was hoping for, but nine months of frontier AI progress had abstracted away much of the work his write-up describes.

Coding agents wrote the code, took screenshots to check their own progress, and fixed what looked wrong. I came up with product ideas like the share button, caught edge cases like a bridge being drawn as water, and when the agents needed more compute, or more SSDs to hold all the data, I went and got them.

I keep catching myself drifting over the map, lingering on the parts of the Bay tied to core memories. First job interview. First apartment. First date. I sit back and take in how much of my life happened throughout this landscape, and how grateful I am for it.

And I am still being surprised. Like I had no idea the Stanford particle accelerator runs under the highway I used to commute on.

Google 3D imagery of the SLAC campus, with the long straight linac gallery as a beige strip passing under Interstate 280 and into the hills. Wide Isometric SF view of the SLAC campus with the long straight linac gallery running under Interstate 280 and into green hills.
Left: Google's 3D imagery of the same view, before painting. Right: Isometric SF. Imagery: Google.

On Google Maps you'd never know. It looks like just another road.

I also had no idea we had a dam up in the Marin hills. On Google Maps it's hidden among the trees. From up here it stands right out.

Google 3D imagery of Alpine Dam, a small grey curve at the end of Alpine Lake, among dark forest. Isometric SF view of Alpine Dam standing out as a pale curved wall at the end of Alpine Lake in dense forest.
Left: Google's 3D imagery of the same view, before painting. Right: Isometric SF. Imagery: Google.

There's more up here than I can find on my own. If you find something cool, hit Share and send it to me.

Looking for my next thing, whether that's contracting, a job, or consulting. If you know a team that would want the person who made this, an intro would mean a lot. Also happy to chat if you're working on something cool. And if you've been thinking about where software developers fit as agents write more of the code, DM me. I'd like to hear your take.

justin.chavez22@gmail.com · Twitter · LinkedIn


Disclaimer: Above was largely written by myself with AI functioning for grammar. Below is the first pass at describing the technical details with LLMs. I plan to rewrite it by hand more extensively.

Subscribe to get the full technical write-up when it's out.

How it was made

Diagram in two rows. Top: 45 Google renders, shown with a hillside of orange-roofed housing; 45 Nano Banana 2 targets, the same view restyled; 225 fill-in examples, shown as five versions of that target with a red-boxed area swapped for darkened photo; then a LoRA on the 20-billion-parameter Qwen, with Qwen's logo. An arrow carries Qwen, its LoRA and the Lightning adapter down as the teacher. Bottom: 1,460 places as raw photos, shown with a curving housing tract; 1,460 Qwen paintings; 4,380 examples, shown as three color versions of the photo; a LoRA on the 4-billion-parameter Klein, with Black Forest Labs' logo; then about 177,000 paintings, shown with Salesforce Tower

The top row teaches the look. I started with 45 Google renders, views of the Bay from the map's angle. Nano Banana 2 restyled each one as pixel art, in the same view, and those 45 images set the look of the map. Painting the whole map with Nano Banana 2 would have cost about $7,000, so I needed an open model I could train.

That model was Qwen-Image-Edit-2511, with 20 billion parameters. I trained a LoRA on it, a small add-on that teaches a model one style, using 225 fill-in examples. Each Nano Banana target was used 5 ways: a red-boxed area swapped for a darkened photo, which Qwen had to paint back.

The bottom row moves that look to a smaller model. Qwen, its LoRA and the Lightning adapter, which cuts it to 4 steps, became the teacher. It painted 1,460 places from raw photos, and those paintings became the targets for FLUX.2 Klein 4B, a model a fifth its size. Each photo went in 3 ways, in true color, shifted, and shifted more, always with the same target, to teach Klein not to copy Google's color quirks. That's the 4,380 examples.

Klein runs nearly 4 times faster than Qwen, which is what made painting the whole Bay affordable. You'd expect a model that small to lose the city. By my own measure, it kept buildings and roads in place a little better than its teacher. It went on to make about 177,000 paintings, like the Salesforce Tower at the end of the diagram.

Each painting is made alone, so neighbors disagree at the edges. Stitching them took two tricks. Only the middle of each painting is kept, and it fades into the next one across a thin band I call the hem. A color correction then evens out each painting against its neighbors, and the joins mostly disappear.

A more extensive write-up is coming, detailing the code fixes, evals, color corrections and seam addressing that were involved. Subscribe above to get it when it's out.

Thank you, Modal

The GPU hours

This map wouldn't exist without Modal. It took about 172 H100-hours from first test to final map, and I never waited on capacity. About 119 of those generated the map itself, roughly 177,000 images from a custom LoRA on FLUX.2 Klein, re-runs included. Training that LoRA took under 6 hours across four versions, and the first one finished in under an hour.

The agents

My coding agents ran all of it from the CLI:

  • modal run to launch
  • modal container list to watch
  • modal billing summary to read the bill
  • modal app stop to shut it down

A small guard script polled the bill and stopped the app at a set dollar amount, so they could run overnight while I slept.

The big speed-up: a queue

We kept six batches always in flight with .spawn() and a longer scaledown_window, so containers stayed warm instead of paying repeated cold starts. Three H100s went from 29 to about 68 images a minute at 1536 px.