TL;DR

Stockplus is a stock tracker that pings you.

  • Drag a line on the chart. Close the app. A push arrives when the price gets there.
  • Congress, insider and 13F trades one tab over from the chart. The 10-K's Risk Factors read for you.
  • Kotlin Multiplatform, one codebase for Android and iOS. On both stores since August 13, 2026.
  • A free tier that works. Pro at $3.99/mo or $39.99/yr through RevenueCat, enforced on the server.
  • US market and the Uzbek stock exchange. 8 languages, local prices.

Inspiration

Every free stock app has a customer. It isn't you.

It's the broker. The app is free because the broker earns when you trade, so the app is built to make you trade. Red flashes, green flashes, a badge, a nudge. Tap.

Stockplus has no broker. It cannot sell your order flow. It earns one way: if what it shows you is worth $3.99 a month. That single constraint designed everything in it.

I hold a handful of stocks. Answering one question, "did anything actually happen?", took five apps. A brokerage for the price. A news app for the noise. One site for insider filings, another for what Congress members were buying, the SEC for a 10-K I never finished. The data that moves a stock is public and free. Nobody had put it in one place, next to the chart.

So Stockplus does. Open a stock and it's all there: why it's moving today, a Pulse Score that gives one honest number, Financial Health read from SEC filings, what analysts say, an AI SWOT, who owns it, the Risk Factors out of the 10-K in five themes with what changed since last year. One tab over: Congress trades, insider filings, 13F funds. A screener, a compare view, a morning briefing before the open. I'm a senior engineer in Tashkent. The Uzbek stock exchange had no app at all. Stockplus reads its statutory filings and gives it one.

What it does

Alerts that fire. Drag a line on the chart: price above, price below, or a ±% move. Keypad for the exact cent. Keyword alerts ("FDA approval" + MRNA). Congress filings on tickers you hold. Earnings. Every one arrives as a push and deep-links to the stock. One Inbox holds them all.

Stock detail, 5 tabs, swipe between them.

  • Summary: live quote, candle or line chart, 52-week range, key stats, why it's moving today, analyst consensus, a Signal Dial with buy and sell zones and a confidence read.
  • Analysis: Pulse Score (0–100 from analyst consensus and recent move, with a plain verdict, and "not enough data" instead of a fake number), Financial Health from SEC XBRL (margins, growth, leverage, cash quality), analyst ratings with bullish %, AI SWOT.
  • Ownership: top 13F holders and the funds you follow, insider filings on the ticker, Congress trades on it.
  • News: publisher-credited, AI summaries, the company's own disclosures.
  • Reports: EPS actual vs estimate, annual reports, earnings reminders, and Risk Factors: Item 1A of the 10-K in 5 themes (financial, market, operations, regulation, technology) with what shifted up or down since last year.
  • Uzbek listings get the same tabs from OpenInfo.uz filings, bank forms included. Markets. Trending with a one-line reason. Screener with saved presets and screener alerts. Insider filings. 13F funds, per fund and per stock. Congress trades with member pages you can follow. Market-wide earnings calendar, list or calendar view. Home. Watchlist and portfolio P&L, compare tickers, market overview and indices, morning briefing. Home-screen widget on Android and iOS with no login. Guest mode: browse and build a watchlist first, it merges when you sign up. Keeps the last prices and news when the connection drops.

How it feels.

  • Chart Morph: the sparkline in the watchlist row is the hero chart. Tap, it grows into place, the ticker avatar morphs with it. Back is the same motion reversed.
  • Odometer Scrub: drag across the chart, the price rolls digit by digit.
  • Settling Gauge: Pulse Score decelerates into the number.
  • Delta Label: one component draws every ▲ +1.24% and ▼ −0.80%. Green and red are reserved for exactly this.
  • Light ground, one violet accent, tabular numerals, reduced motion respected. 143 screenshot tests guard every screen.

Revenue model

Freemium: Free, no card, no nag: 10 watchlist tickers, 3 price alerts, 1 keyword alert, 1 SWOT a day, 5 saved screens, 2-ticker compare. Congress, insiders, funds, earnings: open.

Pro, $3.99/month or $39.99/year: unlimited watchlist, alerts, keyword alerts and SWOT. Risk Factors and Financial Health on every stock. Morning briefing. 4-ticker compare, 20 screener alerts. Congress filing alerts on the tickers you hold.

How it's wired.

  • RevenueCat SDK on Android and iOS. The server checks the RevenueCat entitlement before anything unlocks. A modified APK gets the same answer as an honest one.
  • Every limit lives in one server file.
  • The paywall headline changes with the gate that opened it: watchlist cap, alert cap, briefing, Risk Factors. The pitch matches the wall the user just hit.
  • Annual leads, with the per-month equivalent underneath.
  • Prices localized, Uzbek soum included.

How I built it

  • Platform: Android, iOS (Kotlin Multiplatform).
  • Native where it has to be: Glance and WidgetKit widgets fed by one JSON snapshot. OneSignal SDK per platform for push and in-app messages: price alerts, ±% moves, keyword hits, Congress filings, earnings, digests, each deep-linked to the stock. RevenueCat SDK per platform. Supabase Google and Apple sign-in.
  • Server: Spring Boot 3.5, Kotlin, jOOQ, Flyway, PostgreSQL on Railway. WebSocket quotes.
  • AI: Groq for SWOT, briefing, why-moving, trending. Gemini for Risk Factors.
  • Data: Finnhub, SEC XBRL and 10-K, Congress disclosures, 13F, OpenInfo.uz.

Challenges we ran into

  1. Three versions alive at once, one developer. Store review takes days and the two stores never finish on the same day. So at any moment there is a version live, a version in review, and a version being built. A bug found in the live build has to be fixed in the review build without dragging in half-done features, then land in the next one too. What worked: main is always shippable, every fix is its own small PR from its own git worktree, and the build number comes from the git commit count so any branch produces a unique, ordered versionCode without a manual bump. Hotfix, review build, next release: same tree, no branch juggling.
  2. Distribution is harder than code. $0 budget. Every finance subreddit bans self-promotion; r/investing is a permanent ban on the first post. Head terms like "stock app" are unrankable for a new listing, so the ASO bet went on the long tail the app actually owns: "insider trading", "congress trades". 21 Play listing locales written by hand. The landing page got feature pages and an indexing pipeline before it got a hero image. Building is one person's job; being found is a second one.

  3. OneSignal never subscribed on Android. FIREBASE_FCM_INIT_ERROR: a Firebase BOM pulled firebase-messaging outside OneSignal's supported range. Pinned it in two modules.

  4. The quote socket ate itself. The app's own WebSocket keepalive was killing every Android quote socket, and a blocked dispatcher then starved token refresh. Two fixes, one week of "prices stop after a minute" reports.

  5. Selling things a country doesn't have. The first paywall promised US Congress alerts to users in Uzbekistan. Rewrote it per market.

Accomplishments that we're proud of

1. Bringing terminal-grade research to a phone I am proud that Stockplus does things retail investors were told they needed a Bloomberg terminal for. Open a stock and the Risk Factors out of its 10-K are already read into five themes with a year-on-year shift. Financial Health is computed from the company's own XBRL filings. Who owns it comes from 13F. What Congress members and insiders are doing with it sits one tab from the chart. All of it is public data that was never put in one place on a phone. Stockplus puts it there, and then lets you drag a line on the chart and close the app.

2. Giving a market its first app

I am proud that the Uzbek stock exchange has a consumer app now, and that it is Stockplus. It is served from the exchange's own statutory filings, bank forms included, with its own analysis tabs and prices in soum. No investor here had that before. It is a small market. It was still worth doing, and the same playbook (a filings source, a tab, a strings file) is how Stockplus will reach the next one.

3. Mastering the complexity of one codebase for three platforms

I am proud of the architecture, because it is the reason one person could do this. Stockplus is 33 Kotlin Multiplatform modules and 27 screens on one codebase, with 96% of client code shared across Android and iOS. The server is 123 endpoints, 44 scheduled jobs and 94 migrations feeding six data pipelines (Finnhub, SEC XBRL, 10-K text, Congress disclosures, 13F, OpenInfo.uz) into one schema. 5,444 tests, 143 of them pixel-level screenshot goldens, guard all of it. It is a system a team could inherit tomorrow, built by a team of one.

4. A business model that doesn't need a broker

I am proud that Stockplus makes money honestly. There is no broker behind it and no order flow to sell. A free tier that is a real product: 10 tickers, 3 alerts, every data tab open. A Pro tier at $3.99 a month or $39.99 a year, checked on the server, priced in the user's currency, with a paywall whose headline answers the exact gate the user just hit. Six weeks in, with $0 ad spend: 418 customers through RevenueCat, 288 of them since launch day, and the first paying subscriber within two weeks of launch.

5. Built with the people using it

I am proud that four of Stockplus's most important decisions came from public replies, not from me: guest mode, the per-market paywall, the two-input Pulse Score, and drag-to-set alerts. Every step from the review queue to today was posted the day it happened on X, Reddit and Instagram.

What we learned

1. The store listing is the product's critical path, not the code

I spent the first week of the window polishing screens while the App Store review and the Google Play 14-day test were the only things that could actually stop Stockplus from existing. Everything I shipped after August 13 reached users. Everything I shipped before it waited in a queue. Next time the listing goes in on day one and the features follow it.

2. Users write the roadmap if you post the bug before the fix

Four of Stockplus's most important decisions came from replies: guest mode, the per-market paywall, the two-input Pulse Score, drag-to-set alerts. None was on my list. All four arrived because I posted the countdown, the crash, the ugly paywall, the wrong number, on the day they happened. The posts that got the most replies were never the launch posts. They were the ones where something was broken.

3. Localizing the price is easy. Localizing the promise is the work

RevenueCat gave Stockplus prices in soum in an afternoon. It took a user in Uzbekistan to point out that the paywall above those prices was selling US Congress alerts to someone who could never use them. A localized price under an unlocalized promise is worse than no localization. Now the paywall headline is written by the gate that opened it and the market the user is in.

4. A fake number costs more than a missing one

Pulse Score shipped with three sub-scores. One never had data, and the app still showed a confident total. Nobody complained; the number looked fine. That is the problem. Cutting it to two inputs and writing "not enough data" on the gauge lost nothing and made every other number in Stockplus more believable. In a finance app, trust is the only feature.

5. One codebase is not a shortcut. It is a discipline

96% shared code did not come from Kotlin Multiplatform. It came from deciding, every time, what is allowed to be native. Widgets, push registration, purchases and sign-in stayed native on purpose, behind one interface each. Everything else was forced into commonMain, including the twenty files that used a JVM-only format call and quietly broke the iOS build. The platform count is nobody's achievement. The ping arriving on the phone the user actually owns is.

6. Building is one job. Being found is a second, bigger one

Every finance subreddit bans self-promotion. "Stock app" is unrankable for a new listing. A $0 marketing budget does not buy reach; it buys the obligation to post every day and to rank for the long tail: "insider trading", "congress trades". I underestimated this by half. The next sixty days are weighted toward it.

What's next for Stockplus

Product:

  • Earnings call transcripts with a live summary while the call is running, next to the EPS card we already show.
  • Natural-language screener: "profitable US small caps insiders bought this quarter" instead of filter chips.
  • Connect a brokerage (Plaid) so the portfolio is real, not typed.
  • ETF and fund pages, options and crypto quotes.
  • Automated tasks: "every Monday, summarise what changed in my 10 stocks" delivered as a push.
  • Risk Factors diff alerts: a ping when a 10-K adds a new risk.

Growth:

  • Marketing over features for the next 60 days: one post per shipped feature, with the store link, every day.
  • ASO: the listing ranks for "insider trading" and "congress trades", not "stock app". Double down on the long tail that converts, rewrite the 21 Play locales around it.
  • Localization: 8 in-app languages today. Next: Turkish, Indonesian, Vietnamese, Arabic, German, Portuguese, with local currency pricing and local-market data where a public source exists.
  • More countries: Korea, Japan, Turkey are next on the same playbook.
  • RevenueCat pricing experiment on the annual plan. OneSignal Journeys for onboarding and win-back.

Built With

Share this project:

Updates

Submission history