Bablworld is a social app for collecting things from across the internet. A babl is a curated collection: Instagram posts, X threads, YouTube videos, TikToks, Pinterest pins and Spotify tracks gathered under one title, which other people can follow, comment on and share. It runs on iOS and Android in English, Turkish, French and Indonesian.
App and API
The app is React Native on Expo, with over-the-air updates through EAS and GitHub Actions. Behind it is a NestJS API on Prisma and PostgreSQL: collections, feeds, comments, follows, blocks, reports and notifications, plus importers that turn a link from each platform into structured content.
Parts: Mobile app (React Native · Expo), Website (Next.js · embeds), Bablworld API (NestJS · Prisma), Link importers (one per platform), Social platforms (posts · videos), Postgres (babls · comments).
- Mobile app to Bablworld API (share link)
- Website to Bablworld API
- Bablworld API to Link importers
- Link importers to Social platforms
- Link importers to Postgres (structured)
Direct messages run over Socket.IO with unread counts, and push notifications go through OneSignal with deep links. Users buy coins through RevenueCat, confirmed by authenticated webhooks, and spend them on gifts. Sign-in is by phone number through Prelude, and media goes to Cloudflare R2 through presigned uploads.
AI and the feed
The in-app assistant searches the user’s collections and the social platforms through OpenAI function calling, and suggests babls inline in the chat. Collections are embedded with pgvector, which powers semantic search and AI-generated collections. The home feed averages the embeddings of the babls a user recently interacted with, weighted by the kind of interaction, and caches that vector in Redis, recomputing it in the background every 20 interactions. Postgres returns the nearest published babls, leaving out the user’s own, blocked accounts and anything viewed recently, and the service ranks that shortlist by similarity, recency and engagement. A user with no history gets the same shortlist ordered by score and recency instead.
- Mobile app to Feed service: next page of the feed
- Feed service to Redis: cached user embedding?
- Feed service to Postgres: on a miss: recent interactions
- Feed service to Redis: cache the average
- Feed service to Postgres: nearest babls by vector distance
- Postgres to Feed service: shortlist, minus blocked and seen
- Feed service to Postgres: likes, shares, comments, views
- Feed service: score and sort
- Feed service to Mobile app: ranked page
- Mobile app to Feed service: interactions
- Feed service to Redis: recompute every 20 interactions
Around the app sit a Next.js website, which handles SEO, app deep links and embeddable babl pages, and an internal admin dashboard with AI content generation on a QStash job queue.
