Portfolio/Blog

Saikospeed Communities

A full-stack social platform for car enthusiasts — posts, comments, real-time interactions, media uploads, follows, and community spaces. The kitchen-sink project that exercises every layer of the stack: API, database, auth, storage, real-time, search, moderation, and a polished frontend.

Preview

Saikospeed Communities preview

Why I built it

Car culture lives in scattered Discords, Instagram comment threads, niche Facebook groups, and forum software that hasn’t been rethought in fifteen years. None of those surfaces are great at the things enthusiasts actually do — share build progress over months, ask fitment-specific questions, find local meets, and follow specific cars rather than specific people. Saikospeed Communities is the platform I wanted to use as an enthusiast: build journals as first-class objects, communities organized around platforms and disciplines, and a feed that ranks substance over engagement bait.

It is also the kitchen-sink project that touches every technology I work with — REST + WebSocket APIs, relational + object storage, auth, media pipelines, search, moderation, ranking, and a frontend that has to hold up under real interaction.

Feature set

Architecture

┌─────────────────────────────────────────────────────────────┐
│  Web client (Next.js, App Router)                           │
│  - Server Components for shells, Client Components for UI   │
│  - SWR for HTTP cache, native WS client for live updates    │
└────────────┬───────────────────────────────────┬────────────┘
             │ HTTPS (REST + GraphQL)            │ WSS (events)
             ▼                                   ▼
┌──────────────────────────────┐   ┌────────────────────────────┐
│  API gateway (Node/Fastify)  │   │  Realtime gateway          │
│  - Auth, rate limit, schema  │   │  (WebSocket + pub/sub)     │
└────────────┬─────────────────┘   └──────────────┬─────────────┘
             │                                    │
             ▼                                    ▼
┌─────────────────────────────────────────────────────────────┐
│  Service layer (Node/TypeScript, modular monolith)          │
│  ├─ identity     auth, sessions, OAuth, profiles            │
│  ├─ social       follows, communities, garages              │
│  ├─ content      posts, comments, build journals            │
│  ├─ media        upload sign, transcode jobs, CDN purge     │
│  ├─ feed         ranking, fan-out, timelines                │
│  ├─ search       indexing + query                           │
│  ├─ notify       in-app, email, push                        │
│  └─ moderation   reports, rules, automod                    │
└──┬──────────┬──────────┬──────────┬──────────┬──────────────┘
   │          │          │          │          │
   ▼          ▼          ▼          ▼          ▼
┌──────┐  ┌──────┐  ┌────────┐  ┌──────┐  ┌──────────┐
│ Pg   │  │ Redis│  │ S3 +   │  │ OS   │  │ Worker   │
│ (rel │  │ cache│  │ CloudF │  │ (sea │  │ queue    │
│ data)│  │ +pubs│  │ ront   │  │ rch) │  │ (BullMQ) │
└──────┘  └──────┘  └────────┘  └──────┘  └──────────┘

Layers

Data

Feed and ranking

A hybrid model: a chronological “Following” feed plus a ranked “For You” feed. The ranked feed scores candidates from followed entities, joined communities, and recent platform-wide activity, then re-ranks on freshness, engagement velocity, author affinity, and a content-type mix penalty so the feed doesn’t degenerate into one media type. Fan-out-on-write for users with small audiences, fan-out-on-read for high-follower accounts — the standard hybrid that keeps both the timeline and the celebrity case fast.

Auth

Email + password with Argon2id, plus OAuth (Google, Apple). Sessions are JWTs (short-lived access + rotating refresh) backed by a Redis session store so revocation is immediate. The realtime gateway authenticates the WebSocket handshake against the same session store.

Media pipeline

  1. Client requests a pre-signed POST from media.
  2. Browser uploads the original directly to S3.
  3. S3 event triggers a transcode job (FFmpeg in a worker) that produces the streaming variants and a poster frame.
  4. On completion the post becomes visible and the realtime gateway pushes a media.ready event to the author.

Moderation

Reports queue into Postgres, automod runs simple rules first (rate, link patterns, banned-term lists), then escalates to a per-community moderator queue. Soft-deletes preserve the audit trail; shadow bans return success to the offender while hiding their content from everyone else, which kills most low-effort spam without pushing the bad actor to make new accounts.

Tech stack

Status

In development — launching soon. Feed, posts, comments, follows, garages, and the realtime layer are wired end-to-end; communities, search, and moderation tooling are next.