Context
The API is getting a dedicated, edge-cached notifications endpoint:
SkateHive/skatehive-api#36 — GET /api/v2/notifications/[username].
It was modeled on this app's implementation (the gold standard): it returns each notification with an isRead flag (matching our HiveNotification shape), plus lastRead and an unread count, and derives read status with the same recursive last-read scan (findLastNotificationsReset logic, up to 5×1000 history ops). It supports limit (max 100) and last_id pagination.
Response:
{
"success": true,
"data": {
"notifications": [{ "id": 1, "type": "reply", "score": 40, "date": "...", "msg": "...", "url": "...", "isRead": false }],
"lastRead": "2026-07-03T03:00:00",
"unread": 2
}
}
Task (do this once skatehive-api#36 lands)
Switch notification reads from direct Hive RPC to the API, consistent with how lib/api.ts already consumes feed/profile/balance:
Out of scope
Mark-as-read stays a client-signed broadcast (write) — the API endpoint is read-only. No change to signing.
Blocked by
Context
The API is getting a dedicated, edge-cached notifications endpoint:
SkateHive/skatehive-api#36 —
GET /api/v2/notifications/[username].It was modeled on this app's implementation (the gold standard): it returns each notification with an
isReadflag (matching ourHiveNotificationshape), pluslastReadand anunreadcount, and derives read status with the same recursive last-read scan (findLastNotificationsResetlogic, up to 5×1000 history ops). It supportslimit(max 100) andlast_idpagination.Response:
{ "success": true, "data": { "notifications": [{ "id": 1, "type": "reply", "score": 40, "date": "...", "msg": "...", "url": "...", "isRead": false }], "lastRead": "2026-07-03T03:00:00", "unread": 2 } }Task (do this once skatehive-api#36 lands)
Switch notification reads from direct Hive RPC to the API, consistent with how
lib/api.tsalready consumes feed/profile/balance:getNotifications(username, { limit, lastId })wrapper inlib/api.ts(reusefetchWithRetry).lib/hooks/useNotifications.ts/lib/notifications-context.tsxat the API wrapper instead offetchAllNotifications/fetchNewNotificationsinlib/hive-utils.ts.{ success, data: { notifications, lastRead, unread } }envelope to the existingHiveNotification[]shape (theisReadflag is already provided).getVideoFeed), then deprecate the RPC helpers inhive-utils.tsonce stable.Out of scope
Mark-as-read stays a client-signed broadcast (write) — the API endpoint is read-only. No change to signing.
Blocked by