Now in private beta

Personalized feeds
for the fediverse

Add ML-powered recommendations to any Mastodon client in under an hour. Native token auth, 15ms response time, zero dependencies, privacy-first architecture.

import { CorgiClient } from '@corgi/sdk' const corgi = new CorgiClient({ token: mastodonToken, instance: 'mastodon.social' }) // Get personalized recommendations const posts = await corgi.getRecommendations()
91K+
Posts Crawled
1,669
Federated Instances
15ms
Response Time
0
External Dependencies

Privacy-first
recommendation infrastructure

Native Mastodon authentication. No separate OAuth. Your SDK makes HTTPS requests to our API, which validates tokens with the user's instance, generates personalized recommendations using vector similarity, and returns them in milliseconds. Zero PII stored. Pseudonymous by design.

Mastodon Client
Elk, Phanpy, etc.
@corgi/sdk
18KB, 0 deps
Corgi API
Flask + Redis
ML Engine
HNSW + Transformers

Built for scale.
Optimized for speed.

15-20ms

Response Time

Cached recommendations return in under 20ms. Uncached requests complete in ~200ms.

95%

Cache Hit Rate

Token validation and user profiles cached in Redis for lightning-fast responses.

Zero PII

Privacy-First

Pseudonymous user IDs (SHA256). No tokens stored permanently. GDPR compliant.

91K+

Posts Indexed

Continuously crawling 1,669 federated instances. ~25K new posts per day.

Everything you need.
Nothing you don't.

Native Token Auth

Use existing Mastodon tokens. No OAuth maze, no separate login flow. Validates with the user's instance directly.

Framework Agnostic

Works with Vue, React, Preact, Svelte, vanilla JS. One SDK, zero external dependencies, 18KB minified.

Privacy by Design

Pseudonymous user IDs. No PII storage. Users control their data via Mastodon. SSRF protection, rate limiting, HTTPS enforced.

Production Ready

Battle-tested on Elk and Phanpy. PostgreSQL + Redis + Celery. Monitoring, auto-scaling, and 99.9% uptime.

Works with your stack

Framework-agnostic SDK. TypeScript ready. Zero external dependencies. Choose your framework below.

import { CorgiClient } from '@corgi/sdk' const corgi = new CorgiClient({ token: mastodonToken, instance: 'mastodon.social' }) // Fetch recommendations const recs = await corgi.getRecommendations({ limit: 20 }) // Log user interaction await corgi.logInteraction({ postId: '123456', action: 'favorite' })
import { useCorgi } from '@corgi/sdk/vue' // In your component const { recommendations, loading, error } = useCorgi( mastodonToken, 'mastodon.social' ) // Recommendations are reactive watchEffect(() => { if (recommendations.value) { timeline.value.push(...recommendations.value) } })
import { useCorgi } from '@corgi/sdk/react' // In your component function Timeline() { const { recommendations, loading } = useCorgi( mastodonToken, 'mastodon.social' ) return ( <div> {recommendations?.map(post => ( <Post key={post.id} data={post} /> ))} </div> ) }
import { useCorgi } from '@corgi/sdk/preact' // Works exactly like React function Timeline() { const { recommendations, loading } = useCorgi( mastodonToken, 'mastodon.social' ) return ( <div> {recommendations?.map(post => ( <Post key={post.id} data={post} /> ))} </div> ) }

Privacy by design.
Security by default.

What We Store

Pseudonymous user IDs (SHA256 hash)
Interaction logs (favorites, boosts)
Aggregated preferences (hashtags, topics)
Public post content (for indexing)

What We Don't Store

Mastodon tokens (cached 5 min, then deleted)
Email addresses or phone numbers
IP addresses or device fingerprints
Private posts or DMs
Any personally identifiable information

Ready to fetch?

Join the beta and help shape the future of fediverse recommendations.