← All work
Social, 2026

JFK Social — Nostr social network

Go API, relay, media server and React clients for a decentralised social network, plus a law-enforcement portal.

Role
Contributor across API, clients and infrastructure
Context
Whitehat Engineering for JFK Social
Scale
~600 commits across six repos, Jan – Jul 2026

Background

JFK Social is a social network built on the Nostr protocol: posts are signed events on relays, so users own their identity and data. The stack is a Go API and relay, a Blossom media server, an offline-first web client, an admin panel, a browser extension and a Tauri desktop build.

I worked across the stack on a team of about eight, with the largest share of my work in the API, the web client and the media and monitoring infrastructure.

The problem

A Nostr client has two sources of truth: the relay, which holds signed events, and the application database, which holds everything a normal social app needs (feeds, counts, moderation, verification). Keeping likes, comments, reposts, follower counts and mutes consistent between the two, in both directions, was the recurring source of bugs.

Media was the other pressure. Video uploads from phones failed on flaky connections, and playback needed adaptive streaming rather than a single MP4.

Approach

  1. Publish likes, comments and reposts to the relay as Nostr events from the Go API, with follower-count sync and mute subscriptions reconciled against the relay stream.
  2. Extend the Blossom media server with chunked, resumable 5 MB uploads, a concurrent HLS transcoding worker, blurhash placeholders and Prometheus metrics.
  3. Build the law-enforcement portal: agency registration with duplicate-ORI checks, primary-contact rules and a verified registry search, backend and UI.
  4. Client work: bookmarks, mute and unmute, like and comment sync, verification status, retry for failed dynamic imports. Admin: owner role with RBAC and user search.
  5. Stand up the monitoring stack for production and test servers on Prometheus, Loki and Grafana with health checks.

Architecture

jfksocial-api / AI_CodingGo 1.26 API: WebSocket, S3, badger, govips, blurhash, pdqhash, web push, Nostr crypto. Postgres + RabbitMQ on Docker Swarm.
jfksocial-relayGo Nostr relay fork.
jfksocial-blossomBlossom media server: TypeScript, Drizzle, S3, HLS.
JFKSocial / Front_AI_CodingOffline-first React client with Cashu wallet, DMs, Tauri build, browser extension.
jfksocial-server-utilsPrometheus + Loki + Grafana stack. Main author.

Outcome

  • Media server handles resumable uploads and HLS playback in production.
  • Law-enforcement portal shipped with verified-agency registration and search.
  • Monitoring stack covers both production and test environments.

Lessons

  • With a protocol as the source of truth, treat the app database as a cache and make reconciliation idempotent. Every bug we fixed twice was a place we had not.

Stack

GoNostrPostgreSQLRabbitMQWebSocketReactViteTauriDrizzleS3HLSDocker SwarmPrometheusGrafana