spacecowboy
@spacecowboy17.bsky.social
620 followers 50 following 1.6K posts
Interests in ML and social aspects of tech. Building For You feed: https://bsky.app/profile/spacecowboy17.bsky.social/feed/for-you Hobby project: linklonk.com
Posts Media Videos Starter Packs
spacecowboy17.bsky.social
Ah, this appears on the feed if you haven't liked the feed itself yet. Please give it a like and this post will go away.

bsky.app/profile/spac...

I should probably make a video of how to like the feed.
spacecowboy17.bsky.social
How to like a feed is not super obvious. Here are the steps:

1. Open the feed page: bsky.app/profile/spac...
2. Tap on the feed title at the top
3. Tap "like"
spacecowboy17.bsky.social
Vite + React + Tailwind
spacecowboy17.bsky.social
Haven't thought of creating a global rating out of individual rankings.

The goal is to create personalized recommendations based on shared collection items.
spacecowboy17.bsky.social
Try For You - a personalized feed based on your likes. It is often less random than Discover.
spacecowboy17.bsky.social
I was trying to get oauth to work and ran out of Claude Pro session limit - oauth will have to wait till tomorrow.

Deployed the version with the app password login - it works now but it does not automatically redirect from rankthat.net/login to rankthat.net/ so you may need to edit the url.
RankThat - Collections
rankthat.net
spacecowboy17.bsky.social
I guess switching to OAuth is the next step so the user does not have to trust it with a password.

This is quite amazing how you can go from localStorage based demo to something that actually is visible to everyone.
spacecowboy17.bsky.social
We now have the demo app write to the PDS when you login with an app password rankthat.net/login

All I needed to tell Claude was: "let's now do the heavy lifting and switch to real PDS storage"

Added my first item: pdsls.dev/at://did:plc...
spacecowboy17.bsky.social
Try For You - it shows a mix of furry and cars based on your likes. No sports.
spacecowboy17.bsky.social
I haven't thought of that, but I guess a collection could be an item in another collection since an item is just a url (at:// or https:/ /).
spacecowboy17.bsky.social
2. The items and the dividers are ordered by the user. I'm thinking of how to attach the notion of "priority" to them for the purposes of making recommendations to the user. Should we have a "rating" attached to each item and/or divider. Or should we use the order in the collection as the priority?
spacecowboy17.bsky.social
Yes, the initial step is the single-player experience where you can create collections.

The real goal is a collaborative discovery.
spacecowboy17.bsky.social
Share our thoughts on the lexicon draft: rankthat.net/about

Maybe we could build a lexicon that is useful across apps.
RankThat - Collections
rankthat.net
spacecowboy17.bsky.social
I asked Claude to fake the PDS calls with localStorage. So the UI works with it as if it's an async PDS API. Hopefully, it should be easy to switch to the real PDS backed implementation.
spacecowboy17.bsky.social
Open questions:

1. How to represent seen and disliked items? Store them as a divider that has "seen items"/"disliked items" type? Or should they not be stored in PDS at all and be private on the app server? Or maybe give that choice to the user? Or encrypt them in PDS so only the user can read?
spacecowboy17.bsky.social
Once I'm happy with the UI (which I think is pretty close) I'm planning:
1. Create the lexicon
2. Replace faked PDS calls on the client with the real PDS calls
3. Build a recommendation "app server" that would have similar logic to For You
spacecowboy17.bsky.social
I'm starting with a client only UI prototype and I'm faking the PDS calls with localStorage: bsky.app/profile/spac...
spacecowboy17.bsky.social
I want to make an atproto app for creating collections of anything - create book shelves, rate movies, collect science papers, fictional character tier list, etc.

Before committing to a lexicon I want to understand what a good user experience would look like and then build the corresponding lexicon
spacecowboy17.bsky.social
I changed that to two levels: collections that hold items and dividers (like a book divider) as a flat list. You can drag either items or dividers, you can delete dividers and add new ones.

Give a try to the demo and let me know what you think. I'll pass it to Claude :)
spacecowboy17.bsky.social
It’s been super useful to do the prototype. At first I wanted to use a 3 level hierarchy: collection -> shelf -> item. But that turned out to be too heavyweight. As a user you need to think about the shelf structure and then dragging items within and between shelves was awkward.
spacecowboy17.bsky.social
So I’ve spent some time with Claude Code to build a demo website: rankthat.net

This is just a UI prototype - all data is stored in local storage, no PDS integration. The recommendations are hard-coded. More details and the current lexicon draft here rankthat.net/about
RankThat - Collections
rankthat.net
spacecowboy17.bsky.social
I want to make an atproto app for creating collections of anything - create book shelves, rate movies, collect science papers, fictional character tier list, etc.

Before committing to a lexicon I want to understand what a good user experience would look like and then build the corresponding lexicon
spacecowboy17.bsky.social
Let me know what works and what doesn't in For You so we can make it better.

It already demotes generally popular content (often politics) but we can further tweak it.
spacecowboy17.bsky.social
For You stores all likes over the last ~60 days and then generates the personalized feed on user request.
spacecowboy17.bsky.social
Can you elaborate? Are you talking about the Bluesky app UI?

I was thinking creating a "Customized For You" - a version of "For You" that people could configure the parameters like how much to penalize popular content (popularity_penalty=0.2).

Are you thinking along those lines?