A unified activity timeline showing what family members have been up to — new posts, album uploads, milestone announcements, family tree additions. One scroll covers everything without jumping between apps.
nself-activity-feed subscribes to events from other ɳFamily plugins. It produces no data of its own — it aggregates. Requires nself-family. Works best alongside nself-social and nself-photos.
nself license set nself_pro_...
nself plugin install family activity-feed
nself build
nself startnself-activity-feed listens to Hasura events from every installed ɳFamily plugin and writes normalized activity records into a single table. The timeline endpoint returns these records in reverse chronological order, grouped by day. Each record carries enough context to render a preview without fetching the source object.
Activity types are configurable. If your family does not use nself-social, disable social activity records in config — the feed silently ignores unregistered event types. The plugin is purely additive and read-only from the perspective of other plugins; it never writes back to them.
Visibility rules are inherited from the source plugin. If a social post is visible only to grandparents, the corresponding activity record is also hidden from everyone else. The activity-feed enforces this at query time via a Hasura permission join against the source plugin's visibility column.
| Variable | Required | Default | Description |
|---|---|---|---|
PLUGIN_ACTIVITY_SOURCES | No | social,photos,family,cms | Comma-separated list of event sources to index. Remove any plugin you have not installed. |
PLUGIN_ACTIVITY_RETENTION_DAYS | No | 365 | Activity records older than this are purged by the daily cleanup cron |
PLUGIN_ACTIVITY_PAGE_SIZE | No | 30 | Items returned per page in the timeline endpoint |
PLUGIN_ACTIVITY_GROUP_BY_DAY | No | true | Group consecutive same-day items in the API response |
| Endpoint | Method | Description |
|---|---|---|
/activity | GET | Paginated timeline for the authenticated member. Query: ?cursor=&limit= |
/activity/member/:id | GET | Activity for a specific family member (subject to visibility rules) |
/activity/types | GET | List enabled activity types and their configured sources |
/health | GET | Plugin health check |
| Table | Purpose |
|---|---|
np_activity_records | Normalized event: type, actor_id, source_plugin, source_id, preview JSON, created_at |
np_activity_visibility | Cached visibility grants per record, refreshed on source plugin events |
| Type | Source plugin | Trigger event |
|---|---|---|
post.created | nself-social | social.post.created |
album.created | nself-photos | photos.album.created |
photos.uploaded | nself-photos | photos.media.uploaded (batched per album per hour) |
member.joined | nself-family | family.member.joined |
milestone.announced | nself-cms | cms.post.published where category=milestone |
The activity feed is read-only from the app's perspective. Configure your client to poll /activity with a cursor for real-time feel, or subscribe to activity.record.created via Hasura subscriptions for push updates.
// Subscribe to new activity via Hasura GraphQL subscription
const ACTIVITY_SUBSCRIPTION = `
subscription OnActivity($memberId: uuid!) {
np_activity_records(
where: { visible_to: { _contains: $memberId } }
order_by: { created_at: desc }
limit: 1
) {
id
type
actor_id
preview
created_at
}
}
`| Feature | nself-activity-feed | Facebook Notifications | Tinybeans Timeline |
|---|---|---|---|
| Self-hosted | Yes | No | No |
| Aggregates multiple sources | Yes (all ɳFamily plugins) | Facebook only | Tinybeans only |
| Visibility inheritance | Yes — source rules propagate | Partial | No |
| Symptom | Fix |
|---|---|
| Activity not appearing after post | Hasura events are async. Check the event log in Hasura Console under Events. Common cause: event trigger not registered after build. Run nself build again. |
| Activity visible to wrong members | Visibility cache may be stale. Trigger a manual refresh: POST /activity/admin/refresh-visibility. |
PLUGIN_ACTIVITY_SOURCES lists a plugin not installed | The plugin will log warnings and skip that source. Remove the entry from the env var to silence warnings. |
Port: 3827 | Bundle: ɳFamily ($0.99/mo) or ɳSelf+ ($3.99/mo) | Last Updated: May 2026 | Plugin Version 1.0.13