upvote
Very nice, ran well in a VM on my home NAS.

I've always noodled about this marketplace idea where an optimization algorithm could match your interests and a dollar amount you can afford to let you rent/buy artist's music. The optimization would maximize the purchase of the differently valued music(analogus to the weighted knapsack problem but this could have multiple solutions, knapsack is a nice way of thinking about it logically, in reality implementation may be completely different) based only on your interests, like history and dollars u have. I am wondering how might one apply a distributed systems approach without having music pirated and shotgunned all across the internet? Like how would you quickly match a person to all the available music metadata? How would you model for interest matching if the music library is spread out across multiple nodes.

I would imagine a lot of people are ok with paying 5-10$ a month instead of 15-20$ for music they like from a set of artists they like.

reply
I think you can still make the distinction of vibe coded vs using LLM for specific things(like review your code and write tests).

Vibe coding signifies a lack of control over one's own code and generally only if it's to generate ideas or throwaway. The negative connotation that goes with it is appropriate too.

In reality any project that takes 6 months means your have invested a lot of time thinking about the code, in which case LLMs become more useful for the things you care about e.g. maintainability, forcing LLMs to bend to your will, which is like saying: " I know this design is the best so just make this instead of whatever abstraction you think is better".

reply
Yes to be clear what I meant was that it’s not a prompt engineered project. I actually, for the most part, understand the code I’ve written :p

I have used LLMs to understand certain concepts and unfamiliar APIs. Gtk and Rust is actually a pretty funky combo.

reply
Looks incredible, well done
reply
This is pretty darn awesome. I haven’t checked it out yet, but I’m already psyched about it.
reply
Nice, thanks! I’ve been looking for a decent alternative to PlexAmp for Jellyfin.
reply
Does GTK work for your use case therein? Does the documentation work for you?
reply
This is awesome, gonna check it out. Thanks! Helpful to look at a big rust project too as I’m learning rust.
reply
This is cool but who owns music collection these days?
reply
Definitely more common to just use streaming services like Spotify, but some people do own their music library. There’s probably a decent sized overlap of those who buy music and those who self host things like jellyfin
reply
I do, I buy albums on Bandcamp, rip my CDs, and as a last report buy MP3s on Amazon, which are surprisingly DRM free.
reply
curious about not vibe coded, is it because you wanted to learn? or some thing else as well?
reply
Maybe they care about it being robust in the long run, maintainable, secure and/or not too bloated.
reply
Pretty much. I plan on using this program for a long time. I don’t want a codebase that looks like something out of a H.P. Lovecraft novel when I have to fix something in the future.
reply
Here's an analysis of your codebase by Claude Opus 4.6 and Kimi 2.5 -- I don't code in Rust or GTK so I can't vouch for how spot on this is but I hope it's not too far off the mark and helps you improve your code. (Claude is wrapping both analyses together.)

  Strong agreement                                                                                                                                                                                                             
                                                                                                                                                                                                                               
  - Panicking error handling — both flag unwrap()/expect() on fallible operations (secrets, HTTP client, GStreamer). Kimi specifically calls out get_stream_uri returning String instead of Result, which I missed — good      
  catch.                                                                                                                                                                                                                       
  - Excessive cloning — both note the Jellyfin client and string cloning. Kimi's phrasing ("host.to_string() on every request construction") is more specific than mine.
  - Application struct overloaded — both agree it holds too many responsibilities. Kimi suggests splitting into LibraryService, PlaybackService, etc. I focused more on the RefCell exposure.
  - Silent error suppression — both flag let _ = sender.send(...) and unwrap_or_default() patterns.
  - Code duplication in UI — both identify the repetitive list/detail/sorter patterns. Kimi specifically calls out call_on_visible_page widget comparisons, which I grouped under the broader "5+ copies of factory setup"
  observation.
  - Missing HTTP timeouts — Kimi flags this explicitly. I noted it indirectly via the buffer_unordered without timeout, but Kimi is clearer.

  Things Kimi caught that I didn't emphasise

  - get_stream_uri returning String instead of Result — a genuine API design issue I glossed over.
  - String-based signal names being error-prone with no compile-time checking — fair point, though it's idiomatic GTK4/Rust.
  - glycin potentially unused — I didn't check dependency usage.
  - Position polling not accounting for seeks — a practical UX observation I missed.
  - /proc/sys/kernel/hostname read being cached in OnceLock — Kimi approves the caching but notes it could be done once at startup. Minor but valid.

  Things I caught that Kimi missed

  - Actual bugs — queue reorder off-by-one, playlist DnD index error, toast format string "HTTP {} error" never substituted, double-wrapped Result in stream_info.rs, reversed comment in shuffle logic. These are concrete
  defects, not just style issues.
  - Concurrency issues in depth — the Cell<bool> shuffle state race, futures::Mutex inside glib::spawn_future_local deadlock risk, queue mutation race between remove_all() and extend_from_slice().
  - Signal handler accumulation on widget reuse in ListView factories — a slow memory leak.
  - Main-thread blocking from synchronous library filtering in detail views.
  - Image cache with no eviction — unbounded disk growth.
  - bytes_to_texture panicking inside a Result-returning function — defeats the entire error contract.
reply
Are you serious? You don’t think I’m capable of running the codebase through an LLM? Or is this supposed to be some kind of gotchya? Rude and lame.
reply
I'm not the OP.

Not everyone is paying for LLMs, even now. So I think it is perfectly reasonable to assume good intentions, here.

Someone spent their own tokens to ponder your code and thought they'd share the result. For anyone else looking, like me, I can see that this is probably going to come up relatively clean without having to spend my own tokens, or install it, and I'm more likely to, now that I can see that.

reply
Turns out it was bad intentions, I respect the optimism though. And thanks for taking a look!
reply
Ignore them. These people are insane, don't ruin your day reading their messages.
reply
Oh I'm ever so sorry -- because of course "I don’t want a codebase that looks like something out of a H.P. Lovecraft novel when I have to fix something in the future." is not at all rude and lame and you write perfect non-Lovecraftian code all day every day …
reply
Am I reading this correctly? You got offended on behalf of LLMs because of some quip I made about how I choose to write code on my spare time?

This is fascinatingly psychotic - but for your own good you might want to shut down the agents for a bit and take a walk.

reply
Ah I see -- you're apparently one of these people who'll make snide judgemental remarks like It's not vibe coded. Sad that I have to make that qualification these days, but here we are. and I don’t want a codebase that looks like something out of a H.P. Lovecraft novel and then acts all non-plussed when someone should take issue with the judgemental attitude. And of course then straight in with the ad hominem This is fascinatingly psychotic. You're a totally normal and non-judgemental and even-keeled kind of person, aren't you?
reply