194 pointsby cannoneyed3 hours ago23 comments
  • cannoneyed3 hours ago
    Hey HN!

    I wanted to share something I built over the last few weeks: isometric.nyc is a massive isometric pixel art map of NYC, built with nano banana and coding agents.

    I didn't write a single line of code.

    Of course no-code doesn't mean no-engineering. This project took a lot more manual labor than I'd hoped!

    I wrote a deep dive on the workflow and some thoughts about the future of AI coding and creativity:

    http://cannoneyed.com/projects/isometric-nyc

    • cannoneyedan hour ago
      Sorry about the hug of death - while I spent an embarassing amount of money on rented H100s, I couldn't be bothered to spend $5 for Cloudflare workers... Hope you all enjoy it, it should be back up now
    • filoleg7 minutes ago
      This is awesome, thanks for sharing this!

      I am especially impressed with the “i didn’t write a single line of code” part, because I was expecting it to be janky or slow on mobile, but it feels blazing fast just zooming around different areas.

      And it is very up to date too, as I found a building across the street from me that got finished only last year being present.

      I found a nitpicky error though: in Brooklyn downtown, where Cadman Plaza Park is, your webite makes it looks like there is a large rectangular body of water there (e.g., a pool or a fountain). In reality, there is no water at all, it is just a concrete slab area.

    • cheschire4 minutes ago
      > I’m not particularly interested in getting mired down in the muck of the morality and economics of it all. I’m really only interested in one question: What’s possible now that was impossible before?

      Upvote for the cool thing I haven’t seen before but cancelled out by this sentiment. Oof.

    • ivangelion33 minutes ago
      Want to thank you for taking the time to write up the process.

      I know you'll get flak for the agentic coding, but I think it's really awesome you were able to realize an idea that otherwise would've remained relegated to "you know what'd be cool.." territory. Also, just because the activation energy to execute a project like this is lower doesn't mean the creative ceiling isn't just as high as before.

    • relium16 minutes ago
      Very cool. Street names with an on/off toggle would be nice.
    • bigwheels2 hours ago
      Very impressive result! are you taking requests for the next ones? SF :D Tokyo :D Paris :D Milan :D Rome :D Sydney :D

      Oh man...

      • cannoneyed33 minutes ago
        Really want to do SF next. Maybe the next gen of models will be reliable enough to automate it but this took WAY too much manual labor for a working man. I’ll get the code up soon if people wanna fork it!
    • xnx2 hours ago
      I see you used Gemini-CLI some but no mention of Antigravity. Surprising for a Googler. Reasons?
      • cannoneyedan hour ago
        I used antigravity a bit, but it still feels a bit wonky compared to Cursor. Since this was on my own time, I'm gonna use the stuff that feels best. Though, by the end of the project I wasn't touching an IDE at all.
    • 40 minutes ago
      undefined
    • ChrisArchitect2 hours ago
      Appreciate that writeup. Very detailed insights into the process. However those conclusions left me on the fence about whether I 'liked' the project. The conclusions about 'unlocking scale' and commodity content having zero value. Where does that leave you and this project? Does it really matter that much that the project couldn't exist without genAI? Maybe it shouldn't exist then at all. As with alot of the areas AI touches, the problem isn't the tools or use of them exactly, it's the scale. We're not ready for it. We're not ready for the scale of impact the tech touches in multitude of areas. Including the artistic world. The diminished value and loss of opportunities. We're not ready for the impacts of use by bad actors. The scale of output like this, as cool as it is, is out of balance with the loss of huge chunk of human activity and expression. Sigh.
      • cannoneyedan hour ago
        At the risk of rehashing the same conversation over and over again, I think this is true of every technology ever.

        Personally I'm extremely excited about all of the creative domains that this technology unlocks, and also extremely saddened/worried about all of the crafts it makes obsolete (or financially non-viable)...

      • dreadlordbone2 hours ago
        Does it really matter that much that a sewage treatment plant couldn't exist without automated sensors? Maybe it shouldn't exist then at all.
  • nzeid4 minutes ago
    Amazing. Took forever but I found my building in Brooklyn as well as the nearby dealership, gas station, and public school.
  • dormento2 hours ago
    Not working here, some CORS issue.

    Firefox, Ubuntu latest.

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://isometric-nyc-tiles.cannoneyed.com/dzi/tiles_metadat.... (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 429.

    Edit: i see now, the error is due to the cloudflare worker being rate limited :/ i read the writeup though, pretty cool, especially the insight about tool -> lib -> application

    • flaviolivolsi2 hours ago
      Not working here either. Two different errors with two different browsers on Arch.

      - Chromium: Failed to load tiles: Failed to fetch

      - Zen: Failed to load tiles: NetworkError when attempting to fetch resource.

      • cannoneyedan hour ago
        Yeah I'm gonna blame Claude (and my free plan) for this one. Fixing!
        • an hour ago
          undefined
        • cannoneyedan hour ago
          Cloudflare caching should be back. Turns out that there were a lot of tiles being served, who could have seen that coming?
      • jen20an hour ago
        Same in Safari on macOS here, FWIW.
  • natufunu7 minutes ago
    One thing I learned from this is that my prompts are much less detailed than what author has been using.

    Very cool work and great write up.

  • cannoneyedan hour ago
    Author here: Just got out of some meetings at work and see that HN is kicking my cloudflare free plan's butt. Let me get Claude to fix it, hold tight!
    • cannoneyedan hour ago
      We should be back online! Thanks for everyone's patience, and big thanks to Claude for helping me debug this and to Cloudflare for immediately turning the website back on after I gave them some money
  • gregsadetsky24 minutes ago
    amazing work!

    gemini 3.5 pro reverse engineered it - if you use the code at the following gist, you can jump to any specific lat lng :-)

    https://gist.github.com/gregsadetsky/c4c1a87277063430c26922b...

    also, check out https://cannoneyed.com/isometric-nyc/?debug=true ..!

    ---

    code below (copy & paste into your devtools, change the lat lng on the last line):

        const calib={p1:{pixel:{x:52548,y:64928},geo:{lat:40.75145020893891,lng:-73.9596826628078}},p2:{pixel:{x:40262,y:51982},geo:{lat:40.685498640229675,lng:-73.98074283976926}},p3:{pixel:{x:45916,y:67519},geo:{lat:40.757903901085726,lng:-73.98557060196454}}};function getAffineTransform(){let{p1:e,p2:l,p3:g}=calib,o=e.geo.lat*(l.geo.lng-g.geo.lng)-l.geo.lat*(e.geo.lng-g.geo.lng)+g.geo.lat*(e.geo.lng-l.geo.lng);if(0===o)return console.error("Points are collinear, cannot solve."),null;let n=(e.pixel.x*(l.geo.lng-g.geo.lng)-l.pixel.x*(e.geo.lng-g.geo.lng)+g.pixel.x*(e.geo.lng-l.geo.lng))/o,x=(e.geo.lat*(l.pixel.x-g.pixel.x)-l.geo.lat*(e.pixel.x-g.pixel.x)+g.geo.lat*(e.pixel.x-l.pixel.x))/o,i=(e.geo.lat*(l.geo.lng*g.pixel.x-g.geo.lng*l.pixel.x)-l.geo.lat*(e.geo.lng*g.pixel.x-g.geo.lng*e.pixel.x)+g.geo.lat*(e.geo.lng*l.pixel.x-l.geo.lng*e.pixel.x))/o,t=(e.pixel.y*(l.geo.lng-g.geo.lng)-l.pixel.y*(e.geo.lng-g.geo.lng)+g.pixel.y*(e.geo.lng-l.geo.lng))/o,p=(e.geo.lat*(l.pixel.y-g.pixel.y)-l.geo.lat*(e.pixel.y-g.pixel.y)+g.geo.lat*(e.pixel.y-l.pixel.y))/o,a=(e.geo.lat*(l.geo.lng*g.pixel.y-g.geo.lng*l.pixel.y)-l.geo.lat*(e.geo.lng*g.pixel.y-g.geo.lng*e.pixel.y)+g.geo.lat*(e.geo.lng*l.pixel.y-l.geo.lng*e.pixel.y))/o;return{Ax:n,Bx:x,Cx:i,Ay:t,By:p,Cy:a}}function jumpToLatLng(e,l){let g=getAffineTransform();if(!g)return;let o=g.Ax*e+g.Bx*l+g.Cx,n=g.Ay*e+g.By*l+g.Cy,x=Math.round(o),i=Math.round(n);console.log(` Jumping to Geo: ${e}, ${l}`),console.log(` Calculated Pixel: ${x}, ${i}`),localStorage.setItem("isometric-nyc-view-state",JSON.stringify({target:[x,i,0],zoom:13.95})),window.location.reload()};
        jumpToLatLng(40.757903901085726,-73.98557060196454);
  • shredprez23 minutes ago
    This is so cool! Please give me a way to share lat/long links with folks so I can show them places that are special to me :)
  • tptacek2 hours ago
    So, wait: this is just based on taking the 40 best/most consistent Nano Banana outputs for a prompt to do pixel-art versions of isometric map tiles? That's all it takes to finetune Qwen to reliably generate tiles in exactly the same style?

    Also, does someone have an intuition for how the "masking" process worked here to generate seamless tiles? I sort of grok it but not totally.

    • NAR878940 minutes ago
      I think the core idea in "masking" is to provide adjacent pixel art tiles as part of the input when rendering a new tile from photo reference. So part of the input is literal boundary conditions on the output for the new tile.

      Reference image from the article: https://cannoneyed.com/img/projects/isometric-nyc/training_d...

      You have to zoom in, but here the inputs on the left are mixed pixel art / photo textures. The outputs on the right are seamless pixel art.

      Later on he talks about 2x2 squares of four tiles each as input and having trouble automating input selection to avoid seams. So with his 512x512 tiles, he's actually sending in 1024x1024 inputs. You can avoid seams if every new tile can "see" all its already-generated neighbors.

      You get a seam if you generate a new tile next to an old tile but that old tile is not input to the infill agorithm. The new tile can't see that boundary, and the style will probably not match.

      • cannoneyed31 minutes ago
        That’s exactly right - the fine tuned Qwen model was able to generate seamless pixels most of the time, but you can find lots of places around the map where it failed.

        More interestingly, not even the biggest smartest image models can tell if a seam exists or not (likely due to the way they represent image tokens internally)

        • NAR878923 minutes ago
          I'm curious why you didn't do something like generate new tiles one at a time, but just expand the input area on the sides with already-generated neighbors. Looks like your infill model doesn't really care about tile sizes, and I doubt it really needs full adjacent tiles to match style. Why 2x2 tile inputs rather than say... generate new tiles one at a time, but add 50px of bordering tile on each side that already has a pixel art neighbor?
  • _august17 minutes ago
    This is very cool, it would be awesome if I could rotate it as well by 90 degree increments to peek at different angles! I loved RCT growing up so this is hitting the nostalgia!
  • blintzan hour ago
    I was most surprised by the fact that it only took 40 examples for a Qwen finetune to match the style and quality of (interactively tuned) Nano Banana. Certainly the end result does not look like the stock output of open-source image generation models.

    I wonder if for almost any bulk inference / generation task, it will generally be dramatically cheaper to (use fancy expensive model to generate examples, perhaps interactively with refinements) -> (fine tune smaller open-source model) -> (run bulk task).

    • cannoneyedan hour ago
      In my experience image models are very "thirsty" and can often learn the overall style of an image from far fewer models. Even Qwen is a HUGE model relatively speaking.

      Interestingly enough, the model could NOT learn how to reliably generate trees or water no matter how much data and/or strategies I threw at it...

      This to me is the big failure mode of fine-tuning - it's practically impossible to understand what will work well and what won't and why

      • blintz30 minutes ago
        I see, yeah, I can see how if it's like 100% matching some parts of the style, but then failing completely on other parts, it's a huge pain to deal with. I wonder if a bigger model could loop here - like, have GPT 5.2 compare the fine-tune output and the Nano Banana output, notice that trees + water are bad, select more examples to fine-tune on, and the retry. Perhaps noticing that the trees and water are missing or bad is a more human judgement, though.
  • lagniappe2 hours ago
    Failed to load tiles: NetworkError when attempting to fetch resource.
  • xnx2 hours ago
    > This project is far from perfect, but without generative models, it couldn’t exist. There’s simply no way to do this much work on your own,

    Maybe, though a guy did physically carve/sculpt the majority of NYC: https://mymodernmet.com/miniature-model-new-york-minninycity...

    • sp9k5 minutes ago
      Also, sites like Pixeljoint used to (or still do? I haven't really kept up) collaborations. This would be a mammoth one, but the result would be much more impressive. This is a cool concept, but it's definitely not pixel art by any definition.
    • cannoneyedan hour ago
      This project is awesome, and I love that there are people who are driven enough to make something with so much craft, attention, and duration.

      That being said I have three kids (one a newborn) - there's no possible way I could have done this in the before times!

    • pavel_lishin2 hours ago
      Huh, the linked instagram account is no longer available :/
    • fwip2 hours ago
      I got a recommended video in Youtube just the other day, where a bunch of users made NYC in Minecraft at a 1:1 scale: https://www.youtube.com/watch?v=ZouSJWXFBPk

      Granted, it was a team effort, but that's a lot more laborious than a pixel-art view.

  • _0xdd22 minutes ago
    Nice work! But not all of NYC. Where's the rest of Staten Island?
  • cyrusradfar2 hours ago
    Insane outcome. Really thoughtful post with insights across the board. Thanks for sharing
  • honeycrispy33 minutes ago
    This is kind of beautiful. Great work! I mean it.
  • jesse__2 hours ago
    > Slop vs. Art

    > If you can push a button and get content, then that content is a commodity. Its value is next to zero.

    > Counterintuitively, that’s my biggest reason to be optimistic about AI and creativity. When hard parts become easy, the differentiator becomes love.

    Love that. I've been struggling to succinctly put that feeling into words, bravo.

    • NelsonMinar43 minutes ago
      I agree this is the interesting part of the project. I was disappointed when I realized this art was AI generated - I love isometric handdrawn art and respect the craft. But after reading the creator's description of their thoughtful use of generative AI, I appreciated their result more.
  • sanufaran hour ago
    Seems to have been hugged to death as of now
    • cannoneyedan hour ago
      Should be back after some help from Claude and some money to Cloudflare
      • sanufar26 minutes ago
        Class, looks amazing. The embed in the writeup looks so cool!
  • tehlike2 hours ago
    Some people reported 429 - otherwise known as HN hug of death.

    You probably need to adjust how caching is handled with this.

    • cannoneyed30 minutes ago
      Yup the adjustment was giving cloudflare 5 bucks :)
      • tehlikea few seconds ago
        Hah! I forgot that was the case, I too have been giving cloudflare 5$ for a while now :D
  • squigz2 hours ago
    Hugged to death? :(
    • cannoneyedan hour ago
      Should be back online now!
    • RationPhantoms2 hours ago
      Seems so. Shame! Really wanted to see this.
      • tptacek2 hours ago
        You really, really do. It's quite something.
  • k1rd2 hours ago
    Really nice.
  • detectivestory2 hours ago
    beautiful!
  • fuckyah2 hours ago
    [dead]