Expanded Query
List statuses and include the profile of each user who created one.
Lexicon type: query
function handle() local limit = tonumber(params.limit) or 20 if limit > 100 then limit = 100 end
local result = db.query({ collection = "xyz.statusphere.status", did = params.did, limit = limit, cursor = params.cursor, })
-- Collect unique DIDs from the statuses local seen = {} local profile_uris = {} for _, status in ipairs(result.records) do local did = string.match(status.uri, "at://([^/]+)/") if did and not seen[did] then seen[did] = true profile_uris[#profile_uris + 1] = "at://" .. did .. "/app.bsky.actor.profile/self" end end
-- Load all profiles in parallel local profiles = {} if #profile_uris > 0 then local loaded = Record.load_all(profile_uris) for i, profile in ipairs(loaded) do if profile then profiles[#profiles + 1] = profile end end end
return { statuses = result.records, profiles = profiles, cursor = result.cursor, }endHow it works
Section titled “How it works”- Query statuses from the target collection with pagination, same as a normal list query.
- Extract the unique DIDs from the returned status URIs using
string.match. - Build an AT URI for each DID’s
app.bsky.actor.profile/selfrecord (this is where Bluesky profiles live). - Load all profiles in parallel with
Record.load_all. Profiles that aren’t indexed locally returnniland are skipped. - Return statuses and profiles as separate keys, with the cursor from the status query.
GET /xrpc/xyz.statusphere.listStatusesWithProfiles?limit=10GET /xrpc/xyz.statusphere.listStatusesWithProfiles?did=did:plc:abcGET /xrpc/xyz.statusphere.listStatusesWithProfiles?cursor=<opaque>&limit=20{ "statuses": [ { "uri": "at://did:plc:abc/xyz.statusphere.status/3abc123", "status": "😊", "createdAt": "..." }, { "uri": "at://did:plc:def/xyz.statusphere.status/3def456", "status": "🌟", "createdAt": "..." } ], "profiles": [ { "uri": "at://did:plc:abc/app.bsky.actor.profile/self", "displayName": "Alice", "avatar": "..." }, { "uri": "at://did:plc:def/app.bsky.actor.profile/self", "displayName": "Bob", "avatar": "..." } ], "cursor": "MjAyNi0wMS0wMVQxMjowMDowMFp8YXQ6Ly9kaWQ6..."}Use case
Section titled “Use case”This avoids N+1 queries on the client side — the client gets statuses and profiles in one call. The deduplication step loads each profile only once even if multiple statuses share an author.
Record.load_all reads from HappyView’s local index. Profiles only appear if app.bsky.actor.profile is also indexed. Missing profiles are skipped.

