HN user

mnorris

46 karma

I built Mukbang 3D (mukba.ng), an app that turns food photos into interactive 3D models using Gaussian splats.

I'm also continuing to investigate ways to turn short videos into interactive 3D videos with content that pops out using Gaussian splats and photogrammetry.

email is mnorris@mukba.ng

Posts5
Comments24
View on HN

TLDR; I accidentally allowlisted only my domains, so no one else was able to generate <image-3d>

I was testing this on my own domains and it was working, so I wrongly assumed that no one was trying this. But I do see quite a few failures which will hopefully succeed now.

But I made an allowlist for only my domains yesterday that rejects everything not on the list, and forgot to toggle OFF the switch I built that opens it up to everyone.

Anyway, happy hacking and if anyone else stops in and tries this out and it fails or succeeds let me know.

I'm Michael. I built https://mukba.ng because I felt like 3D creation tools were too complicated.

All of the Gaussian Splat embeds that I see on the web require you to create a Gaussian Splat first, and then embed it. I thought, what if we could just turn every photo on the web into 3D.

I built a web component that turns any image URL into an interactive 3D embed. Drag to rotate, pinch to zoom. Install in two lines:

<script src="https://mukba.ng/image-3d/embed.js" defer></script>

<image-3d src="/your-photo.jpg"></image-3d>

The component fetches from a Cloudflare Worker that either returns a cached Gaussian Splat or generates one on the spot. Splats are ~5 MB, but have a 15 KB preview mesh that you can interact with while it streams in on slower connections.

Works with any image URL.

Docs + live demo: https://mukba.ng/image-3d/docs/ Source: https://github.com/imichaelnorris/image-3d

I haven't seen any performance issues for Claude Code, even when I'm running like 20 in one browser tab and looking at them all at the same time (rendered with xterm.js), but Gemini and OpenCode flicker a lot even if you have one open.

I built DeepSteve (https://github.com/deepsteve/deepsteve) with a similar itch but went the other way. Instead of adding graphics to the terminal, I put the terminal in a place that already has graphics.

I kept trying to optimize my terminal layout and realized I could just run my terminals inside of the browser, and let Claude Code write JavaScript in the same browser tab to customize the experience however I want. It's kind of a terrible idea, but it's my terrible idea, and I love it.

I’m making a detective themed iOS-based visual novel with React Native.

Making the game engine was easy. Making the story consistent, believable, and interesting has been the biggest challenge for me.

I’ve written a few bad novels but never any narrative games, so it’s been a good exercise for me.

Thanks for the feedback.

Deepsteve is a node server that runs on your machine, so the website is designed to look like DeepSteve's UI. You really just access it at localhost:3000 in your browser, not via deepsteve.com

But now I can see how that would be confusing.

disclaimer: I work on a different project in the space but got excited by your comment

DeepSteve (deepsteve.com) has a similar premise: it spawns Claude Code processes and attaches terminals to them in a browser UI, so you can automate coordination in ways a regular terminal can’t: Spawning new agents from GitHub issues, coordinating tasks via inter-agent chat, modifying its own UI, terminals that fork themselves.

Re: native vs external orchestration, I think the external layer matters precisely because it doesn’t have to replicate traditional company hierarchies. I’m less interested in “AI org chart” setups like gstack (we don’t have to bring antiquated corporate hierarchies with us) and more in hackable, flat coordination where agents talk to each other via MCP and you decide the topology yourself.

Why food? It's static, and AI 3D models do not make food that I want to eat. Using photogrammetry means that high quality reconstructions of real food look tasty - it's an easy qualitative metric for me.

Previously the app only produced 3D models and threw away the original video, but incorporating the underlying videos both shows off to new users what type of content they're supposed to record (i.e. a 1 second video of a darkly lit pizza box is NOT going to produce good content), and it makes the output shareable content.

Thanks for sharing!

I've been doing this for the last year with YouTube. YouTube is just a search bar now which prevents mindless browsing and distractions.

If I find myself using a site mindlessly I add it to my /etc/hosts file to block them.

The existence of LLMs has made me feel more alive and better able to live in the moment.

So what if a machine can write a novel? I don't even want to read it.

Human intention is what gives meaning and value to my life.

The things that I want to build need me to make them. Why would I wait for a machine to do it later without my imperfect human perspective?

Thanks for sharing this!

This is a cool game concept and I feel like it compressed a lot of geometry intuition into a short period of time. I have a math degree but managed to never take a geometry class in college or high school, so this was the first time I've had my (non-existent) knowledge of geometry "graded."

I hope more games like this can be incorporated into the formal educational process in the future; I feel like my childhood video game addiction could have been exploited by the education system just as much as the gaming companies, but with a better outcome.

Maybe the same type of game could be made for other subjects, too.

I'd like to see the concept extended in 3d with augmented reality with a limited set of construction tools. Maybe I'll try to do that if I get the time.

Also, I just realized that I only played the tutorial! There goes my morning.

How much prep have you done?

People have a wide range of reactions to FAANG interviews. One of my friends has panic attacks when thinking about interviews. I actually find LeetCode questions to be fun way to spend the evening and I like being interviewed, but I know I'm in the minority.

I consider myself a deep thinker too. And I've been slower at solving interview questions before and got faster over time.

The key about doing these problems is not memorization. I haven't memorized binary search. That's not why I'm fast. But I know the concepts and I can reproduce it at will, maybe with a bug or two which I can iron out while walking through it.

Solving problems in 40 minutes is actually the very last step in the learning process. So not being able to do that just means you haven't completed your training yet.

The process of practicing different problems over and over helps you see the patterns across different types of problems. Similar problems will have similar code structure, data structures, and algorithmic choices.

If I hear a new song on the radio I can guess what band it is before the singing starts because bands often have the same style of songs. It's the same thing when I see a coding problem and choose how to solve the problem. It's an impulse I learned from training, it has nothing to do with me being a quick thinker.

Some people on Blind mention that they do 100's of questions on LeetCode before doing FAANG interviews. Some still fail. I've failed plenty.

The paper by Elizabeth Derryberry [1] is really fascinating.

They classified four distinct dialects of white-crowned sparrows in urban and rural communities and studied the changes of their bird song when background noise levels lowered during the pandemic. They measured a doubling of the signal-to-noise ratio of bird songs to urban noise, which doubled the distance you can hear birds and lead to a 4-fold increase in the amount of birds that you heard during that time.

I recently learned how to distinguish between different bird types by appearance and their songs thanks to Merlin Bird ID, which is essentially a Pokédex for birds. Being able to identify different bird species has been eye-opening since I had never paid much attention to the different songs and behaviors of different birds.

Anyone can record audio and the spectrum of bird songs in the recording can be used to classify the bird species. It's super accessible to anyone who's interested in getting started.

Also, white crown sparrows are really cute.

[1] http://www.engdes.com/sigwin/company/biblio/papers/Singing%2...

Flutter 3 4 years ago

Thanks for sharing! The design looks really slick.

As a hobbyist Flutter developer who hasn't figured out how to make Flutter apps look remotely appealing yet, it's been cool poking around your code and trying to learn from it. Bloc and Cubit look especially interesting.

Here's my story:

I've had 3 "dream jobs." I only regret joining one of them and it basically followed the pattern you describe, and I think I just narrowly avoided entering into this cycle in my most recent job search. In the last year, I had multiple opportunities to continue the cycle and switch jobs to another local maxima, but I think I broke the cycle, but mostly by refusing to keep playing the game.

I had weekly conversations with my friend who ended up hearing about all of my job complaints and this friend was able to see how my feelings about work changed over time. At times this friend was ready to hit me over the head because of how repetitive my complaints were.

Every time I interviewed and got a job offer, I would convince myself that I wanted to switch companies because company Y was offering me more money and responsibilities than company X and I thought company Y would give me growth opportunities beyond what I would have at company X. I would rationalize the decision in a lot of ways and would be thorough in comparing the pros and cons of switching to company Y.

And then I would talk to my friend. And my friend would say "okay, so company Y is offering you more money than company X. What do you want to do?" And I would say something like "I'm not 100% sure if I will be happy at company Y, but they're offering me more money and the company / team / product is cool. If I'm not happy in 1-2 years I can use that money to start my own company and be in a better position."

It didn't seem like I wanted to work at company Y that badly if my answer to "what do you want to do" isn't "work at company Y!" I justified my decision to change jobs by finding the things I didn't like at company X and contrasted them with the things I liked at company Y.

Leaving company X needs to be a separate decision from joining company Y in order to make the best decision. In the past I always considered them as the same decision. Even when I was interviewing at lots of companies which should have given me more choice, it always came down to making decisions about company Y based on company X instead of being about what I wanted to do for the long-term.

I talked to a bunch of other friends and family about switching to company Y and everyone else except this one friend went along with whatever I said. Some people lightly questioned what I said but only to see that I had an answer for their questions, but the human mind can rationalize basically anything and I had already fooled myself into thinking I wanted to switch jobs when I was just unhappy with company X.

I fooled everyone except my one friend, because my friend realized that my decision-making process was fundamentally flawed. That gave my friend the confidence to push-back on what I said. Having a contrary perspective gave me the space to reconsider my decisions.

I quit my job at company X and am currently trying to start my own company since that's what I wanted to do all along.

I used this to create a short poem after I noticed that all of the imperfections of translation accumulate across translations but the output was thematically similar to the input.

The odd-numbered lines are sentences I wrote, and the even-numbered lines are sentences from the model. Then I came up with a sentence that would continue the previous sentence.

input: Nothing can break my spirit;

output: I couldn't do anything

input: Because I was lifeless.

output: Why don't you live?

input: Enter into eternal communion with the human species;

output: Forever with such a person.

input: I am the link between my ancestors and my descendants,

output: I am a good relationship between my visitors and disregard.

>> I quickly lose interest

Working on self-directed projects didn't come naturally to me either and I had to learn how to get over this motivation issue.

It's taken me 10 years of working on side projects to finally be able to figure out which things I will actually finish vs. which ones I just like the idea of and will invariably give up on. It's some combination of what do I think is useful to myself or others, what can I turn into a small prototype in a short amount of time, and what can I actually accomplish in a short time [1].

Accountability was important for me to launch three side projects in the last year. I declared to my friends on New Years that I was going to make and launch a game that I had designed within that year. I kind of entangled my desire to finish projects with my desire to follow through with what I commit to.

I didn't actually finish it in that year, I finished it in January of this year, but I tried! I set it down a lot and ended up getting stuck multiple times. Probably because of that pesky day-job and regular life. My friend asked me if I had launched, and that caused me to put in a final weeklong sprint and launch it. If I knew how close I was to finishing I would have finished it months earlier. I ended up simplifying a lot of code in the first few days of that last sprint and all of a sudden finishing seemed possible.

Because I devoted myself to launching that one game, I have since been creating more and more things and launching them or getting them to a stage where they're generally useful.

In my case, having the confidence from finishing one project made it easier to start newer projects because I knew whether I could finish them based on my past success.

>> I lack the ability to see everyday "issues" that could be resolved with programming.

Almost every idea that I have could initially be conceptualized as a revamp of an existing product or game, but I'm super excited about them because they're my revamp that I'll gain a skill from and will help me to work on more complicated things later.

I take notes whenever I have an idea and will expand on ideas that I'm still interested in later. I basically use the snowflake method, creating more elaborate detail about the ideas I'm most interested in. Sometimes they evolve a lot after expanding on them too.

Honestly 99% of my ideas are terrible, so I trained myself to try to write down every idea that I have and then later on when I'm itching to start a new project I can decide whether it's a project that I will actually finish vs. ones I just like the idea of.

[1] https://xkcd.com/1425/