akkila.dev
← cd ../#projects

Thrust - Crypto Social Trading Platform

Full-stack crypto social trading platform, real-time price dashboard, live chat, and creator monetization, shipped web and mobile.

Fullstack Engineer·Sep 2025 – Apr 2026

Overview

Thrust is a crypto social trading platform where users discover creator tokens, trade on a bonding curve, and interact via live DMs and tipping. Built and shipped across both web and mobile clients in a Turborepo monorepo, owning the full stack from the WebSocket price pipeline to the PostgreSQL schema and CI/CD release pipeline. Results: sub 100ms price updates under sustained WebSocket load, +25% average user session time from the live chat experience, and −15% UI related production bugs from strict TypeScript enforcement.

Thrust crypto trading dashboard showing live price charts

The Problem

Crypto trading platforms are untrusted, also no product combined sub second price updates with a real social layer, creator profiles, live chat, tipping, and gated content all in one place.

What I Built

Full-stack delivery across the React web client and Node.js/Express services, owning the real time data pipeline, the chat system, the API layer, and the CI/CD pipeline. The hardest problems were keeping the UI smooth under bursty WebSocket events, keeping chat state consistent across optimistic updates and reconnects, and enforcing type safety across three consuming apps from a single shared package.

Thrust mobile app showing creator token listing screen

Thrust live chat and DM interface

Thrust bonding curve trading and token creation flow

Tech Stack

  • Frontend: React (Vite), TanStack Router, Jotai, socket.io-client, TanStack Query, TypeScript
  • Backend: Node.js (Express), JWT authentication, RBAC middleware, Prisma ORM, PostgreSQL, Redis, background job queues
  • Infrastructure: Docker, GitHub Actions CI/CD, Jest, Supertest

Key Features

Frame batched WebSocket price dashboard. Crypto price events arrive in bursts, multiple tokens updating within the same millisecond. Incoming curvePoolUpdated events are accumulated into a deduped Map keyed by token address and flushed once per requestAnimationFrame. The UI re renders exactly once per paint cycle regardless of event volume delivering sub 100ms updates without frame drops even under heavy market activity.

Live chat with Jotai and optimistic messaging. The DM system uses Jotai atoms for connection state, typing indicators, and unread counts, keeping ephemeral chat state out of React Query's server cache model. Outgoing messages are written to the cache optimistically before the server responds; on WebSocket confirmation, the optimistic entry is reconciled in place. Per thread typing indicators self expire after 5 seconds via a ref managed timeout. Average user session time increased by 25%.

Strict TypeScript generics across a shared monorepo package. All API contracts, WebSocket event types, and query key factories live in a shared @thrust/shared package consumed by the web, mobile, and panel apps. CI runs tsc --noEmit across all workspaces on every PR, catching breaking type changes before they reach production and reducing UI related production bugs by 15%.

JWT + RBAC REST API. Express routes protected by a JWT middleware and a role guard that enforces creator vs. subscriber vs. admin permission tiers before any handler runs. Request bodies are validated at the boundary so handlers never receive malformed input, backed by PostgreSQL via Prisma with fully typed query results.

Redis caching and background job queues. High frequency trade and chat flows hit Redis as a read layer in front of Postgres to keep hot path latency low. Async work, video processing, attachment readiness notifications, post delivery goes through a background job queue so HTTP responses stay fast and processing is decoupled from the request lifecycle.

Results & Impact

  • Sub 100ms UI updates on the crypto price dashboard under sustained WebSocket load
  • +25% average user session time driven by the live chat experience
  • −15% UI related production bugs from TypeScript enforcement and CI type checking across all workspaces
share: