Comment by Tallain
10 days ago
Two things right now:
1. A music recommendation tool based on Last.fm scrobble history.
It's graph-based, no ML or "fancy" techniques, but I've had good results with it so far. It builds recommendations based on a listening window or just recent history. It combines several different recommendation algorithms (including an Auralist-inspired "serendipity" score for novel recommendations, meant to simulate the serendipity of being recommended something novel by a friend), scores and ranks candidates, and takes in feedback that inform subsequent recommendations.
Fun project. Found some good new music with it already. :)
2. A code exploration / indexing tool with CLI and MCP interfaces for exploring concepts and impacts of changes in a codebase.
Essentially, an overwrought "find all uses" that doesn't depend on exact symbol or string matching.
I have a codebase of non-trivial size, but thankfully it's fairly well-structured. This tool indexes the code and bundles modules into "concepts" -- these can be auto-discovered or preconfigured. Dependencies, inheritance trees, symbols and symbol usage are all also indexed.
Then you can ask, "what's the impact of extending the domain model of XYZ" or "I want to remove this property" and it shows where to start, where to look next, and fuzzy edges or dependencies that might need deeper exploration. It surfaces non-obvious connections, too, or things a junior dev (or LLM) might miss, like when a model is mapped to an API DTO, or intermediary states, etc.
It's been useful for a new dev exploring the codebase, because you can ask in terms of business concepts instead of needing to know the exact symbol name in the code. And it's been much more token efficient than grep for exploration subagents. But it's limited to dotnet only.
1. I'm interested and would like to know more! Will you be publishing it? How do the recommendations work?
It's published but I would doxx myself by posting the link here -- I can email you if you'd like.
Also, full disclosure, because this was written entirely for myself, the code behind it is 100% LLM generated. I set the specs and direction but didn't touch code at all, just let agents churn while I did my day job and tested the results later.
For the recommendations:
- Seed selection is performed by building a mix of seed artists from recent listening, lifetime favorites, old obsessions, and underexplored artists.
- Seed weight combines `log(1 + play count)`, track diversity, number of listening months, and a recency decay
- Candidates are generated at the union of artists reached by "similar artist" edges through Last.fm and MusicBrainz-enriched local data (APIs are used to enrich DB initially, then after that it's all offline)
- Discovery excludes known artists, hidden and recently-reviewed artists
- Discovery requires edges with at least two distinct seeds, or one strong seed edge
- Discovery is scored by similarity (Last.fm + tag), feedback, and rediscovery thresholds. Then score is subtracted for excessive knownness within a genre, obviousness, recommendation fatigue, and shallow prior listening. The thresholds are by default but configurable:
- Serendipity is additional score provided when a candidate connects several seeds that are themselves weakly connected, or are in separate connected components. This is a weak implementation of the Auralist serendipity algorithm, and will be improved on.
- Finally, diversity reranking; a greey MMR-style reranker.
Very cool, thanks for the write up on the recommendations. I'm always hungry for new music and I have a somewhat patchy last.fm history going back to 2005. I'd love to check out your tool, email in profile. Cheers!