I spent too long writing this so I might as well submit it here. It's about a weird Firefox? Fedora? AMD? performance regression, but actually not really as it's about Go image encoder file size & latency.
I'm not sure what you mean with the rest of the comment though, it's a very small change and it gets cached by the browser like other static assets, so I'm not sure what is the overkill here.
It's a pretty deep rabbit hole. For semantic search CLIP and cosine similarity are just fine. SmolVLM(2) mentioned by spacecadet looks interesting though. I haven't integrated face recognition myself, but [deepface] seemed pretty complete.
I focused more on fast rendering in [photofield] (quick [explainer] if you're interested), but even the hacked up basic semantic search with CLIP works better than it has any right to. Vector DBs are cool, but what is cooler is writing float arrays to sqlite :)
Similar one I wrote a while ago using Pupetteer for the IoT low power display purposes. Neat trick is that it learns the refresh interval, so that it takes a snapshot just before it's requested :) https://github.com/SmilyOrg/website-image-proxy
You do not need a banner, you need informed consent. I'm sure there are other ways of getting consent other than a half screen pop-up with a big red accept button on first visit, but they probably won't get 70% "opt in" rate.
Law: You have to get some form of affirmative consent if you want to do specific often-abused things.
Companies: We'll do it in the most obnoxious way possible ("here are our 853 technology partners... no, there's not a 'deselect all' option, have fun clicking") so people blame the law instead of the industry that didn't want to allow consent at all.
There's always a deselect all option (or rather, the equivalent "accept only the technically required ones"), because it's required by law. Sometimes the operator tries to hide the option. That, too, is illegal.
In Go you can do errorf("%w: %s", err, path) so that you get "file not found: foo/bar.json", while still being able to match on the wrapped error value with errors.Is(). The caller can do the same with this error and so on up the stack
I dislike this style in Go. It adds a lot of noise to the source and essentially builds a stack trace manually. In Go 1.23 there is errors.Wrap() that adds the error stack automatically so maybe at some point Go will consider again adding some sugar for automatic error propagation.
Check out https://github.com/zombiezen/go-sqlite if you're interested in trying out Sqlite in Go again. Nice interface, negligible compile time impact, fast, compiles without CGO. It's very comfortable.
I agree that going from text to sqlite is a bit of a hurdle, especially if you're not writing C :)