Uptoolkit
GitHub

Wall Feed

Activity feed for a profile wall: posts, boosts, reactions, follows, and photo albums in one grouped stream.

500

Today

  1. Ada Okoye wrote on Mira Halvorsen’s wall

    Congratulations on the atlas launch. Ten years of survey work and it finally has a front door.

  2. Tobi Ferrand reacted to a post “Spent the week redrawing a 1:25000 coastline by hand. The s…”
    • Hand-drawn coastline contour map with annotated survey markers
    • Comparison overlay of the 1984 and current shoreline
  3. Bergen, Norway

    Spent the week redrawing a 1:25000 coastline by hand. The shoreline has moved 40 metres inland since the 1984 survey.

    Every map is a snapshot of a place that has already changed. #cartography #openstreetmap

    Hand-drawn coastline contour map with annotated survey markers
    Comparison overlay of the 1984 and current shoreline
    #cartography#openstreetmap
    • Is the 1984 survey digitised anywhere? I would love to run the two through a diff.

    • The hand-drawn linework is beautiful. Are you inking these on vellum?

  4. Mira Halvorsen boosted

    What we learned running a mapping co-op for five years

    Five years in, the hardest part was never the software. It was agreeing on what counts as done.

    Full write-up on our site, including the governance docs we wish we had started with.

    #cooperatives
  5. Kestrel Adeyemi started following Mira Halvorsen
  6. Juno Park wrote on Mira Halvorsen’s wall

    Found these from the Svalbard trip. You were holding the theodolite backwards.

    Two surveyors on a snowfield with a theodolite
    A weathered field notebook open on a rock
  7. Rahel Kebede reacted to a post “Spent the week redrawing a 1:25000 coastline by hand. The s…”
    • Hand-drawn coastline contour map with annotated survey markers
    • Comparison overlay of the 1984 and current shoreline
  8. New set of glacier recordings up. Thanks @mira@fediverse.example for the coordinates. #fieldrecording

    Twelve minute glacier field recording
    #fieldrecording

Yesterday

  1. Mira Halvorsen added photos to an album Atlas plates, 2019-2025
    • Contour plate one, inked
    • Contour plate two, inked
    • Contour plate three, with survey annotations
    • Contour plate four, coastline detail
    • Contour plate five, elevation shading
  2. Mira Halvorsen joined a group Atlas Collective

June 2025

  1. Mira Halvorsen updated their profile New cover image
    • Cover image: a stylised contour field

Installation

npx shadcn@latest add https://ui.uptoolkit.com/r/wall-feed.json

Usage

A wall is wider than a timeline. Alongside Create and Announce it carries the small signals a plain feed throws away — reactions, follows, album additions, profile changes, group joins — and this block renders all of them in one stream.

import { WallFeed } from "@/components/wall-feed";

const outbox = await fetchOutbox(owner);

<WallFeed
  owner={owner}
  viewer={viewer}
  collection={outbox}
  showComments
  onPublish={(activity) => postToOutbox(viewer, activity)}
  onLoadMore={(next) => fetchPage(next)}
/>

Two row shapes

Create and Announce render as full post-card cards with reactions and an optional comment thread. Everything else collapses to a single attributed line with an avatar, a verb, and a timestamp — the same visual language as notifications-panel, so the two read as one system. An Add of a photo album additionally renders a thumbnail strip.

Owner posts and visitor posts

A post counts as written on the wall when it addresses the owner in cc or audience and comes from someone else. Those get a "wrote on X's wall" ribbon above the card, and the Wall posts filter narrows to exactly that set. No extra field is needed — the addressing already says it.

Filters and grouping

The filter row counts each bucket up front and disables the empty ones, so you never tab into a blank list. Entries are then bucketed into Today, Yesterday, and month headings. Both the buckets and the relative timestamps are computed from the now prop rather than the wall clock, so a server render and its hydration agree.

Publishing and pagination

Composed posts are prepended immediately and kept until you refetch, so the wall never appears to swallow a post in flight. When the collection has a next URL, a "Load earlier activity" button passes it to onLoadMore.

Structured data

The block emits one Schema.org CollectionPage wrapping an ItemList of postings. Only real posts go in it — a "liked a post" row is not itself a posting, so it is left out rather than padding the list.

Without a collection the block renders its own wall-activities fixtures, which cover every activity type it knows how to draw.