Skip to content
Back to Home
Syntax Studios

Synq

Next.js 16 React 19 TanStack Query NestJS 11 BullMQ Redis (ioredis) Dome API Privy TypeScript

Synq is a single feed for prediction markets. Instead of juggling tabs across Polymarket, Kalshi, Limitless, and Triad, traders search once and see every matching outcome side by side, with the best odds and depth on each venue surfaced per row. I built it at Syntax Studios with a Next.js (App Router) + React 19 + TanStack Query frontend, and a NestJS 11 backend with BullMQ on Redis.

The backend is structured as one Nest module per venue: PolymarketModule, KalshiModule, LimitlessModule, TriadModule. Each exposes a thin venue service that wraps the platform's public REST API and types the response, so the rest of the app sees a uniform surface (get-markets, get-event-by-slug, search) regardless of who's behind it. An events service composes the four in parallel and folds them into a single shape used everywhere downstream.

A separate Dome integration is the cross-venue identity layer. I hit Dome's matching endpoint with a Polymarket slug or a Kalshi event ticker and it returns the corresponding identifiers on the other platforms, so a Polymarket condition with its token-id pair and a Kalshi event with its child markets collapse into one card keyed by a stable marketKey. That mapping is what lets the UI render one card per real-world question instead of four. Dome is private and only owns the sports cross-listing matrix where multiple venues genuinely run the same game, so politics, finance, culture, and the long tail still hit each venue directly.

Keeping that joined view fresh without DDOSing anyone is the real work. Two BullMQ queues drive the pipeline. A sports-sync job walks every supported league across a forward-looking date window, calls Dome's sport-by-date endpoint, and writes a cached match list to Redis. On completion it chains an enrichment job that reads those cached pairs, fans out per platform, calls each venue's market endpoint for every leg, captures errors as a typed record so a single bad market doesn't poison the batch, and writes back an enriched cache. Inter-request sleeps absorb venue rate limits, and a final pass strips Polymarket and Kalshi responses down to the bid/ask/volume/liquidity fields the card actually renders so the JSON over the wire stays small.

The frontend uses TanStack Query for caching and revalidation, Privy for auth, and Radix + Tailwind v4 for UI. Search debounces and fans out to each venue's native search in parallel, ranked active-first by volume. Single market detail pages hit Dome's enriched endpoint to populate a side-by-side comparison.

Synq doesn't take custody, doesn't execute trades, and doesn't quote its own market. It's a transparent window into where the odds are best right now, and a watchlist that spans venues that would otherwise refuse to acknowledge each other's existence.