5 minTwo packages. One token. A working feed by lunch.

Add Activity Feeds
To Your App This Afternoon

Install two packages, mint a token, ship a working feed. No infrastructure to run, no schemas to design, no queues to babysit.

MAJ
5 minutes to your first feed read
install, mint a token, render — that's the whole loop
Dropin FitnessExploreFollowingNew activitymaya ▾
MMaya Torres2h
Ran 12.4 km · 52:10

Negative splits the whole way. Legs finally back under me.

♥ 34 likesShare
AAda Lindqvist5h
Rode 48 km · 1:41:22

Group ride, held the wheel to the last climb.

Notifications
Jonas started following you
Maya liked your 12.4 km run
Ada liked your swim
Who to follow
JJonas WeberFollow
PPriya RamanFollow
FEEDS✳FOLLOWS✳REACTIONS✳NOTIFICATIONS✳TIMELINE✳ACTIVITIES✳PROFILES✳STORIES✳
FEEDS✳FOLLOWS✳REACTIONS✳NOTIFICATIONS✳TIMELINE✳ACTIVITIES✳PROFILES✳STORIES✳
Integration

Drops Into The Stack You Already Run

No credentials to hand over, no webhook plumbing. Your backend mints tokens offline and the SDKs speak plain fetch.

1Mint a token

One line on your server signs a short-lived token. Your secret stays on your box — Dropin never sees it.

// server-only
const server = new DropInServer({
  tenantId: 'acme', apiKey, apiSecret,
})
await server.createUserToken(id)
2Follow, post, react

One isomorphic client, zero dependencies. Same import works in the browser, on the server, or at the edge.

// browser or node
await feed.follow('user', 'maya')
const page = await feed.get({
  next: prev.next,
})
3Render with hooks

Reactive counts with optimistic updates that roll back on failure. No query library, no extra state manager.

// optimistic + rollback
const { activities } = useFeed(
  'user', userId,
)
const { unseen } = useNotifications()
How it works

Ship A Complete Feed This Week

Timeline, notification bell, profile. Every screen below is the showcase app — built on the three SDKs and nothing else.

Dropin FitnessExplore
MMaya Torres2h
Ran 12.4 km · 52:10
♥ 34Share
AAda Lindqvist
Notifications
J
Jonas Weber started following you
new_follower · 4m
M
Maya Torres liked your run
reaction · 18m
A
Ada Lindqvist liked your swim
reaction · yesterday
P
Priya Raman started following you
new_follower · 2h
E
Erik Sjöberg commented on your ride
comment · 3h
S
Weekly summary · 4 new reactions this week
summary · yesterday
MFollowing ✓
Maya Torres
user:maya · 1,204 followers
142
activities
2.1k
reactions

SDK-first, not HTTP-first

Three packages mirror the ergonomics your team already knows. Drop feeds into an app without touching the raw transport.

@dropinnodex/client@dropinnodex/react@dropinnodex/server

You are the IdP

Per-tenant data isolation, with no shared rows. Your backend signs tokens offline — we hold no credentials.

Built to scale

Feeds stay fast as your network grows. Constant in page size, no hot keys.

FAQ

Frequently Asked Questions

Everything else lives in the docs — quickstart, walkthrough, guides and the full OpenAPI reference.

Browse the docs
Do I hand over my user credentials?

No. Your backend is the identity provider — it mints short-lived HS256 tokens offline with your tenant secret, and the gateway verifies them without ever phoning home.

How is tenant data isolated?

Every tenant lives in its own data store, not a shared table with a tenant column. Cross-tenant reads are impossible by construction — there is no row that could leak.

Is there a realtime websocket?

Not by design. Notification feeds are flat and polled — useNotifications takes a pollInterval — which keeps the surface small and the failure modes obvious.

What does a feed read cost?

One round trip, constant in page size — feeds stay snappy as your network grows.

Which framework do I need?

None. @dropinnodex/client is isomorphic, fetch-only and dependency-free. @dropinnodex/react adds hooks with optimistic updates if you want them.

Your First Feed Read Is Five Minutes Away

Install two packages, mint a token, read a feed. The walkthrough takes it all the way to a finished screen.