What OpenStock Is
OpenStock is a self-hosted market dashboard built with Next.js 15 and React 19. Watchlists, company profiles, TradingView charts, a command palette, and automated email digests, all running on infrastructure you control.
It is the most-starred project covered in this series so far, at over 17,300 stars, and it comes from Open Dev Society, a community that publishes a manifesto about keeping tools free rather than a pricing page.
Before anything else, the project's own note, which deserves to be repeated rather than buried:
OpenStock is community-built and not a brokerage. Market data may be delayed based on provider rules and your configuration. Nothing here is financial advice.
That is an unusually straight thing to put at the top of a README, and the rest of this write-up takes it seriously. Nothing here is financial advice either.
What Real-Time Actually Means Here
This is the section to read before you decide whether to deploy it, because "real-time prices" is the headline and the reality has conditions attached.
OpenStock does not have its own market data. It reads from Finnhub, and what you get depends entirely on the Finnhub plan behind your API key. The project documents this plainly rather than hiding it:
- Free Finnhub tiers may return delayed quotes.
- Real-time data for non-US stocks is delayed by 15 minutes or more on the free tier.
- TradingView's free tier restricts emerging markets, India's NSE and Vietnam among them, which is why some symbols show "only available on TradingView".
So the accurate framing is this. Deployed with free keys, OpenStock is an excellent watchlist, research and monitoring tool. It is not a real-time trading screen, and anyone treating a delayed quote as a live one is going to have a bad time in exactly the situations where the delay matters most.
Put a paid Finnhub plan behind it and the picture changes, which is the honest upgrade path. The software is free; market data at low latency is the part nobody gives away, because redistributing exchange data in real time is expensive and licensed.
None of this is a criticism of the project. It is the structural reality of every free finance tool, and OpenStock is one of the few that says so out loud.
It Is Not a Bloomberg Terminal
The comparison gets made constantly, so it is worth being precise about what the gap actually is.
A Bloomberg Terminal costs somewhere around 30,000 dollars per user per year. What that buys is not a nicer interface. It is licensed real-time data across essentially every asset class, proprietary analytics, a newsroom, and the messaging network that a large part of the industry uses to actually transact.
OpenStock is a well-built web dashboard over a free market data API and embedded charts. For following a personal watchlist, reading company fundamentals and getting a weekly digest, it does a genuinely good job, and for that use case the 30,000 dollars buys you very little extra.
The two are not competing for the same person. If you are a retail investor tracking twenty positions, OpenStock plus a free Finnhub key may be entirely sufficient. If your job depends on sub-second quotes and the chat network, no open-source project is going to replace that, and none of them claim to.
The useful question is not "is this as good as Bloomberg" but "do I need any of the things Bloomberg has". For most people the honest answer is no.
How It Differs From OpenBB
If you have looked at open-source finance before, you have met OpenBB, and the two are different enough that picking wrong wastes a weekend.
| OpenStock | OpenBB | |
|---|---|---|
| Shape | A web app you deploy and log into | A data platform and toolset |
| Language | TypeScript, Next.js, React | Python |
| Built for | Individuals tracking a watchlist | Analysts and data engineers building workflows |
| Interface | Dashboard, charts, email digests | Terminal, notebooks, an integration layer |
| Data | Finnhub plus TradingView widgets | Many providers, integrated as sources |
OpenBB is the heavyweight if you want to pull data into your own analysis, plug in licensed feeds, and build on top. OpenStock is the better answer if you want a clean interface your family could use, running on your own hosting, without writing any Python.
They are complementary rather than competing, and it is entirely reasonable to run OpenBB for analysis and OpenStock as the daily dashboard.
What You Actually Get
The feature set is focused, which is a compliment. It does a small number of things properly rather than half-building a trading platform.
- Watchlists, stored per user in MongoDB with one entry per symbol, so two people on the same deployment do not see each other's positions.
- Global search with a Cmd or Ctrl + K palette, backed by Finnhub, debounced, with popular stocks shown when idle.
- Stock detail pages combining TradingView symbol info, candlestick and advanced charts, baseline and technical widgets, plus company profile and financials.
- Market overview with a heatmap, quotes and top stories.
- Optional sentiment insights through Adanos, pulling cross-source snapshots from Reddit, X, news and Polymarket. This one is opt-in and sits on the stock detail page only.
- Personalised onboarding collecting country, investment goals, risk tolerance and preferred industry.
- Email automation through Inngest: an AI-written welcome email, and a weekly news summary on a Monday 9am cron.
- 30 or more international exchanges, including NSE, LSE and TSX, subject to the data caveats above.
The sentiment card is the most interesting and the one to treat most carefully. Aggregated Reddit and X sentiment is a genuinely useful signal about attention, and a genuinely poor signal about value. It tells you what retail is talking about, which is information, just not the information people often assume it is.
Market caps and volumes come back as very large numbers, and if you are cross-checking them against another source a scientific notation converter removes the zero-counting. For percentage gains and position sizing, a markup and margin calculator covers the arithmetic that spreadsheets usually get imported for.
The Stack
The technology choices are current and conventional, which for a project handling your data is the right kind of boring.
| Layer | Choice |
|---|---|
| Framework | Next.js 15 App Router, React 19 |
| Language | TypeScript, about 93 percent of the codebase |
| Styling | Tailwind CSS v4, shadcn/ui, Radix primitives |
| Auth | Better Auth, email and password, MongoDB adapter |
| Database | MongoDB with Mongoose |
| Market data | Finnhub |
| Charts | TradingView embeddable widgets |
| Background jobs | Inngest for events and cron |
| Nodemailer over Gmail | |
| AI | Gemini by default, MiniMax and Siray also supported |
Using TradingView widgets for charts rather than building charting is the single best decision in here. Financial charting is a genuinely hard problem with years of edge cases, and embedding the people who solved it means the project gets to spend its effort on watchlists and alerts instead.
Because it is Tailwind v4 with design tokens and a dark theme by default, theming it to your own palette is mostly a token exercise, and a colour converter saves time moving between the hex values a designer gives you and the formats the token files want.
AGPL-3.0 Bites Harder Here Than Usual
The licence is AGPL-3.0, and for this project specifically that matters more than it would for most.
AGPL's distinguishing clause covers use over a network. The repository states it directly:
If you modify, redistribute, or deploy it (including as a web service), you must release your source code under the same license and credit the original authors.
For a desktop application, AGPL rarely triggers, because most people never distribute a modified copy. OpenStock is a web app, so deploying it publicly is the exact activity the licence is written about.
In practice:
- Running it for yourself, your family or internally at work: fine. No obligation, because you are not providing it to the public as a service.
- Deploying a modified version where other people can use it: you must publish your source under AGPL-3.0, including your changes.
- Building a commercial product on it: the same applies, which for most commercial plans is a dealbreaker, and that is deliberate.
This is a licence chosen on purpose by a group whose manifesto says they will never lock knowledge. It is not an accident or an oversight, and it is the mechanism that keeps a fork from being turned into a paid product with the source closed. If you are evaluating this for a company, involve whoever handles licensing before you get attached to it.
Running It Yourself
The setup is more involved than the single-binary projects in this series, because it genuinely needs several services.
You will need Node 20 or newer, a MongoDB connection string from Atlas or local Docker, and a Finnhub API key. A Gmail account handles outbound email unless you swap the Nodemailer transport. Optional additions are a Gemini key for the AI welcome email, an Inngest signing key for deployment, and an Adanos key for sentiment.
There is a Docker Compose path for the whole thing including MongoDB, which is the route to take if you would rather not install a database.
One deployment detail worth knowing in advance: NEXT_PUBLIC_FINNHUB_API_KEY is required for Vercel deploys, and the NEXT_PUBLIC_ prefix means that key ships to the browser. That is how Finnhub's client-side usage works and it is not a flaw in OpenStock, but it does mean the key is visible to anyone who opens devtools. Use a key scoped to exactly this purpose, keep an eye on your rate limits, and do not reuse a key that has anything else attached to it.
If you want your watchlist data outside the app, it lives in MongoDB and exports cleanly, at which point a JSON to CSV converter is the shortest path into a spreadsheet.
The Community Behind It
Worth a paragraph, because it explains several of the decisions above.
Open Dev Society opens its README with a manifesto rather than a feature list: knowledge should not sit behind paywalls, tools should not be locked in subscriptions, newcomers should be guided rather than judged, and the project runs on transparency and donations rather than profit.
That is easy to be cynical about and the licence choice suggests they mean it. AGPL-3.0 is what you pick when you want to prevent someone closing a fork, and picking it costs you commercial adoption. They took the trade.
The contributor list is short and honest about who did what. One developer, ravixalgorithm, built the application end to end. Others contributed the logo, Docker configuration, a MongoDB build fix and README improvements. Seventeen thousand stars with a contributor list that size is worth reading as a signal in both directions: the idea clearly resonated, and the bus factor is small.
The public demo runs on a free Vercel subdomain, which tells you this is a community effort rather than a funded product. That is not a criticism, but it is the right expectation to set before relying on the hosted demo for anything.
Who Should Deploy This
A good fit if you want a clean, self-hosted dashboard for a personal watchlist, you are comfortable running a Next.js app and a MongoDB instance, you value owning your own data, and delayed quotes are acceptable for how you actually invest.
A bad fit if you need genuine real-time data without paying a data provider, since no software choice fixes that, or if you want a brokerage, because this deliberately does not place trades, or if you are building something commercial, where AGPL-3.0 will almost certainly stop you.
Set expectations on maturity. The project is about a year old, effectively one primary developer, and depends on several third-party services staying available on their free tiers. Free-tier terms change, and when a provider tightens theirs, a project like this feels it immediately.
What it does well, it does properly: a modern stack, an honest README, a licence that matches its stated values, and charting delegated to people who already solved charting. For a self-hosted personal market dashboard, that is a sound set of choices, as long as you go in understanding what the word free is doing in "free market data".



