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-jsWASM (SVG → PNG). - Media ingest: upload PNG via
media.upload, then post withreddit.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-jshas a WASM build that works in Devvit, but getting the binary loaded was tricky. Also withoutfs, 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
fetchand notaxios, which the SnapTrade SDK uses by default. Fortunately axios supports custom adapters, so I was able to swap in afetchadapter. - 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
- devvit-web
- express.js
- lottie
- react
- redis
- resvg
- satori
- snaptrade
- tailwind
- typescript
Log in or sign up for Devpost to join the conversation.