Work

Not the “we built everything perfectly” story — an honest account of what shipped first and why.

PortfolioDream

Live

Congressional stock trading data, tracked and surfaced.

Members of Congress have to publicly file their stock trades under the STOCK Act, and corporate insiders file theirs with the SEC. PortfolioDream collects both: House and Senate disclosures, plus insider transactions from company officers and directors. Users follow the lawmakers and insiders they care about and get alerted when a new filing lands.

Buy vs. build

The core data — congressional stock trading disclosures — is publicly filed but not publicly usable: scattered across government databases, inconsistent formats, no clean feed. The fast path would have been buying access to an existing aggregator’s data.

Built the pipeline in-house instead, and it runs itself: collection, parsing, cleanup, and publishing all happen on a schedule, with no manual steps.

The pipeline

The whole thing runs on a schedule (GitHub Actions, every weekday) with no manual steps. For the House, the pipeline downloads the Clerk’s annual index of filings, pulls each new transaction report as a PDF, and extracts the trades from the document text. For the Senate, it queries the eFD filing system directly and parses each report. A companion job keeps dividend dates current for the tickers users actually hold or watch.

Raw filings aren’t app-ready, so every trade is normalized on the way in: the company name is resolved to a ticker, the filer is matched to their party, state, and district, the STOCK Act amount ranges become values, and duplicates — the same trade filed twice, or refiled as an amendment — are removed against a natural key. What can’t be parsed isn’t guessed at: scanned paper filings that yield no text are skipped automatically, and a guard drops filings with impossible dates.

The clean data lands in a Postgres database (Supabase). The app reads from it, and a daily notification job alerts users when someone they follow files. Failures aren’t silent, either: scraper and insert errors report to Sentry, so a broken run gets noticed the same day instead of whenever someone happens to check.

Releases and monetization

PortfolioDream is free to use, with a premium subscription sold through RevenueCat and paywalls presented with Superwall. It has shipped 18 App Store releases, from v1.0 to v1.4.7, and holds a 5.0-star average rating — every release built, submitted, and supported by the same person who wrote the pipeline behind it.

Allegedly

Live

A meme-style parody app for the group chat: type a silly question, set joke odds, and share a realistic-looking fake prediction-market card. Free on the App Store and Google Play, with an optional Allegedly Gold subscription (no ads, extra card looks, a pinned comment of your own).

How a card is made

A card isn’t a picture someone designed — it’s data: a question, a set of odds, a market look, and a comment thread drawn from a fixed cast of fictional commenters. The app renders that data into the finished card, and the render is deterministic: the same inputs always produce the same card. That one decision is what makes the share loop below possible, and it means making a card needs no account and no server round-trip.

Getting past App Review

App Review rejected it under Guideline 1.1.1 (objectionable content) twice, on September 23 and September 30; an earlier build had also been rejected for a keyboard bug.

The fix was a repositioning and a narrowing, not a new idea. The app became a meme-style parody for the group chat. Three of its eight comment tones, the edgiest ones, were deleted. Every example question was rewritten around situations instead of named people. Two features that weren’t the problem but added surface area, GIF export and a send-to-contacts flow, came out too. And user-content safeguards went in: a content filter in the app and on the public share pages, a “before you send” prompt on each card, and a “Report this card” link on shared cards.

Shipping the share loop

The product depends on one moment: someone gets a card in a group chat and makes one back. A shared card is an image plus a link. The link opens a server-rendered page on Cloudflare Pages that rebuilds the same card from a few parameters, using the same card code as the app, with a per-card preview image for the chat.

Branch deep linking was integrated, then switched off during its trial; “Make one back” now goes straight to the App Store or Google Play.

Measuring the loop

The loop is instrumented end to end in PostHog: card shared, share page viewed, “Make one back” tapped, App Store opened, app installed. Downloads alone don’t say whether the loop works; the funnel does — it shows exactly which step loses people, and that’s the step that gets fixed next.

Monetization

A free tier with ads (Google AdMob) and Allegedly Gold through RevenueCat: weekly with a 7-day free trial, and yearly. A Monthly plan was created, then pulled from sale after App Review flagged it as missing from the binary.