HDev Team HAF Updates - Waggle & HAF FYP: A For You Feed for Hive
Published on HivePostify by @hdev · Mon Jul 13 2026
This is the second post in our development-update series. The [prior post](https://actifit.io/hdev/hdev-team-haf-updates-june--new-haf-analytics--explorer-dashboards) covered our core-project analytics work. Today is about Waggle — an algorithmic "For You" discovery layer for Hive, built as an open HAF app, plus the app we built on top of it so you can actually feel what it does.
Hive has never had a personalized feed. Trending and Hot are the same for everyone, tag feeds are manual, and a brand-new account lands on an empty feed with no idea where to go. Every mainstream social app answers this with a per-user ranking layer — a feed that differs depending on who's looking. Hive didn't have one. So we built it.
(A note on the name: a bee's waggle dance is how the hive tells everyone else where the good stuff is. That's the whole product in one word.)
To be clear up front: this is an addition to Trending / Hot / New, not a replacement for them — a fourth, personalized lens that any Hive front-end can adopt. It's early, it's running on one node so far, and we're still tuning it. More on all of that below.
The work in this post: - [haffyp](https://gitlab.syncad.com/hive/haffyp) — the open-source HAF app that does the ranking. This is Waggle's engine, and it's usable by any Hive front-end, not just ours. - Waggle — a TikTok-style vertical feed app built directly on that API. (Live: [hdev-core.github.io/waggle](https://hdev-core.github.io/waggle/)) - HivePulse — our browser extension, which now carries a ✨ For You tab alongside trending/hot/new, powered by the same API. The first proof that this drops into an existing front-end.
---
The short version
Waggle watches what you already do on-chain — the posts you upvote, the ones you reblog, the communities you subscribe to — and uses that to rank fresh content for you. No tracking pixels, no ad profile, no off-chain surveillance: the input is your public Hive history, and nothing else.
Two things make it different from a normal recommendation feed:
- It's open, and it's inspectable. The ranking code is public, the weights are published in the API, and every post in your feed can tell you why it's there — tap "Why this post" and you get the actual per-signal scores that produced it. - It plugs into Hive rather than replacing it. The feed endpoints return posts in the exact shape Hivemind's bridge API already returns, so any existing Hive front-end can render a Waggle feed with essentially no work.
This is a fourth sort, not a replacement
Hive gives you Trending, Hot and New. Those are global orderings — everyone sees the same list, and that's a feature: they're transparent, predictable, and stake-legible. We're not proposing to replace any of them.
For You is simply a fourth lens, and the only one that differs per person. It's the one Hive has been missing, and it's the one every user coming from a mainstream social app expects to find. Adding it is additive value for the whole ecosystem — and because the API returns the same object shape as bridge.getrankedposts, any front-end can add it as one more tab next to Trending/Hot/New.
That's not hypothetical. We've already shipped it in our own HivePulse browser extension, which now carries a ✨ For You tab beside trending/hot/new — personalized when you're signed in, the global ranked feed when you're not, with a short "why you're seeing this" line on each post. It took very little work precisely because of the bridge-shape compatibility. Any other Hive front-end could do the same.
We'd genuinely like other front-ends to pick this up. It's open source, it's a HAF app, and it's designed to be adopted rather than owned.
One caveat we'd rather state early than bury: for now, any front-end adding this would be pointing at our node, since ours is the only one running haffyp today. Getting it into the standard hafapinode stack — so any operator can serve it — is the next step, and we're on it.
The For You feed. Note the "For You" chip on the card — every post tells you whether it came from your personalized feed or the global one.
Try it right now (no login, these are live): - Personalized feed: [/v1/fyp/feed/mcfarhat](https://testapi.hivescan.info/haf-fyp-api/v1/fyp/feed/mcfarhat) - Global feed: [/v1/fyp/global](https://testapi.hivescan.info/haf-fyp-api/v1/fyp/global) - The live algorithm + weights: [/v1/fyp/algorithm](https://testapi.hivescan.info/haf-fyp-api/v1/fyp/algorithm)
---
How the feed actually decides what you see
This is the part we most want people to understand, so here it is in plain language first.
Every recent post gets a score out of 1. That score is a blend of four signals:
| Signal | Weight | What it asks | |---|---|---| | Relevance | 40% | Is this post about the kind of thing you usually engage with? | | Recency | 30% | Is it fresh? | | Engagement | 20% | Are other people actually responding to it? | | Credibility | 10% | Is the author established and staked in Hive? |
Then a community boost is applied on top: a post from a community you're subscribed to (or picked when you signed up) gets a +20% lift; a post from a community you merely engage with a lot gets +10%. A post never gets boosted twice, and the score is capped at 1.
And you can see all of it, for any post, right in the app:
Tap "Why this post" on any card. These aren't illustrative numbers — they're the actual scores that produced this ranking, served by the API. This post scored 65 on relevance, 99 on recency, 96 on engagement and 94 on credibility, took the ×1.2 boost because the reader subscribes to that community, and came out at rank #1.
We think an algorithmic feed you can't interrogate is a bad deal. So ours shows its work.
A few things worth spelling out, because they're the interesting bits:
"Relevance" is semantic, not keyword-matching. Waggle doesn't look at tags at all. Instead, every post is turned into a 1,024-dimension vector — a numeric fingerprint of what the post means — using [HiveSense](https://gitlab.syncad.com/hive/hivesense), Hive's embedding app. Your own taste is turned into a vector the same way: we take the posts you've recently upvoted and reblogged, and average their fingerprints into a single "this is what you like" vector. Relevance is then simply how closely a post's fingerprint points in the same direction as yours. That's why it can surface a post about, say, urban beekeeping even if it shares no tags with anything you've read — it understands the subject matter rather than string-matching it.
Your taste vector decays. Recent activity counts for more than old activity, and a reblog counts for more than an upvote (you're vouching harder). We look at your last 200 interactions over 90 days, weight each by how recently it happened, and average.
Recency has a 24-hour half-life. A post that's a day old is worth half a brand-new one on that signal; two days, a quarter. This is what stops a permanently-high-scoring "greatest hits" feed from calcifying.
Engagement is deliberately hard to buy. It's built from unique commenters, reblogs and rshares — but each is log-compressed before being combined, so the 500th upvote adds far less than the 5th. A whale self-voting doesn't dominate; a post lots of different people are talking about does.
Credibility is stake- and reputation-aware, at only 10% — enough to damp spam and fresh throwaway accounts, not enough to make the feed an oligarchy.
What if you're brand new and have no history?
This is the empty-feed problem, and it's the one thing a ranking engine can't solve with on-chain history — because you don't have any.
So on first run Waggle shows you a community picker. You pick what you're into, and we synthesize a starting taste vector for you: we take the top-performing posts from the communities you chose, average their fingerprints, and use that as your seed. You get a genuinely personalized feed immediately, not a generic one.
Under the hood, saving your interests pings the ranker directly (over Redis) instead of waiting for the next scheduled pass, so your first real feed lands in seconds. The app polls for it and flips your feed from global to personalized the moment it's ready — you'll see a "Personalizing your feed…" banner, and then it just changes under you.
Until that vector exists, relevance is simply dropped and the remaining three signals are re-weighted to fill the gap — so a cold feed is still ranked sensibly (fresh + well-received + credible), just not yet yours.
And you can always tell which one you're getting: every post in every response carries an fyp.source field, reading either personalized or global. No guessing, no extra API call.
Signing your interests — without giving anything away
Declaring your interests writes to our database, so we have to know it's really you. But we're not going to run passwords, and we're certainly not asking for your keys.
Instead, the app asks your wallet to sign a short message with your posting key. The server recovers the public key from that signature and checks it against your account's real on-chain posting authority. If it matches, the write is accepted.
This is a signature, not a transaction. Nothing is broadcast to the chain, it costs nothing, it burns no Resource Credits, and your private key never leaves your wallet.
---
Waggle — the app
To make all of that tangible, we built Waggle: a full-screen, vertical, swipe-through feed for Hive.
- Two tabs — For You and Discover. Discover is the global ranked feed and needs no login at all; For You is yours. - Everything plays inline. Images, YouTube (including Shorts), 3Speak, and native video all render right in the card, with shared controls — seek, 1×/1.5×/2× speed, volume — and your preferences carry across every post. Only the post you're actually looking at plays; the rest unmount so your browser isn't quietly buffering ten videos. - Every action is a real on-chain Hive operation. Upvote (double-tap the card, or pick a weight), reblog, follow, and comment are all built and signed client-side in your wallet and broadcast to Hive. They're not Waggle actions — they're Hive actions, visible everywhere else on Hive. And they flow straight back into the ranker as fresh signal. - Sign in with Hive Keychain or HiveAuth. HiveAuth means mobile works too — QR on desktop, deep-link on your phone. There's also a read-only mode: type your username, get your personalized feed, sign nothing. - "Why this post." Tap it on any card for the actual score breakdown — relevance, recency, engagement, credibility, whether a community boost applied, and its final rank. We think an algorithmic feed you can't interrogate is a bad deal, so we made ours explain itself. - Sensitive content is gated, not silently dropped. nsfw/nsfl tags and Hivemind's own moderation signals blur the post and disable autoplay behind the blur, with a tap to reveal.
| | | |:--:|:--:| | | | | Discover — the global ranked feed, no login needed. | Reader — the full post, rendered inline, with vote / comment / reblog / follow right there. |
Sign in with HiveAuth (works on mobile) or Keychain — or skip signing entirely and browse your feed read-only. Your default upvote weight is yours to set.
It installs to your home screen as a PWA, and it ships as static files — there is no Waggle backend. The browser talks straight to the HAF node.
Tags: #hive-139531#Hive#HAF#Development#HAF_FYP#Waggle