Inspiration

r/wallstreetbets proved something simple: people love sharing their best (and worst) trades. But screenshots are easy to fake and hard to read on mobile. I wanted a way to bring that same energy to Reddit—with receipts.

What it is

Diamond Hands is a Devvit Web app that lets a user connect a broker via SnapTrade (read-only), pick a stock or option position, and post a server-rendered image card to Reddit. The card shows ticker/contract, number of shares or contracts, market value, cost basis, and total return.

Supported brokers: Robinhood, Webull, Fidelity, E*TRADE, Public, tastytrade, Wealthsimple (Canada)

Why it matters (for Reddit)

  • Authentic UGC: verified numbers discourage fake screenshots.
  • Mobile-first feed design: big, legible typography and clear hierarchy.
  • Conversation starter: posts come with real context that invites comments.

How I built it

  • Runtime: Devvit Web (client) + server functions.
  • Portfolio Syncing: SnapTrade TypeScript SDK.
  • Rendering pipeline: satori (React → SVG) → @resvg/resvg-js WASM (SVG → PNG).
  • Media ingest: upload PNG via media.upload, then post with reddit.submitPost.
  • Design: meme-friendly gradient, 💎🙌 iconography, and a “Verified by SnapTrade” badge; stock & option layouts.

Challenges & learnings

  • Blocks + Web coexistence: Initially I wanted the shared post to be an interactive post utilizing Devvit Blocks, but this proved to be a challenge. Getting a Blocks app to co-exist with a Web app took me down a rabbit hole and I was never able to get it working. I pivoted to a server-rendered image card instead, which ended up being a better experience for users and a more straightforward implementation.
  • No fs / native deps: Devvit forbids Node native modules; this means getting a PNG rendered from SVG was tricky. resvg-js has a WASM build that works in Devvit, but getting the binary loaded was tricky. Also without fs, I couldn't read/write any fonts/images from disk, so I had to inline them as base64 data URLs, which fortunately worked fine.
  • fetch Devvit server only supported fetch and not axios, which the SnapTrade SDK uses by default. Fortunately axios supports custom adapters, so I was able to swap in a fetch adapter.
  • strict CSP and domain whitelisting: Devvit has a strict CSP and requires domain whitelisting for outbound requests. This made calling out to SnapTrade's API and the Connection Portal a bit tricky.

Built With

Share this project:

Updates

Submission history