New: Orbit. Free, open-source macOS screen recorder, screenshot tool and video editor: auto-zoom, smooth cursor, backgrounds, web recordings and AI agent recording.
© Open Dev Society. This project is licensed under AGPL-3.0; 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.
OpenStock is an open-source alternative to expensive market platforms. Track real-time prices, watch the whole market, and explore detailed company insights — built openly, for everyone, forever free.
❤️ 13,000+ people use OpenStock for free. Help keep it that way: sponsor from $5 a month, or read how OpenStock is funded.
Note: 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.
OpenStock is a modern stock market app powered by Next.js (App Router), shadcn/ui and Tailwind CSS, Better Auth for authentication, MongoDB for persistence, Finnhub for market data, and TradingView widgets for charts and market views.
We live in a world where knowledge is hidden behind paywalls. Where tools are locked in subscriptions. Where information is twisted by bias. Where newcomers are told they’re not “good enough” to build.
We believe there’s a better way.
Because the future belongs to those who build it openly.
Core
Auth & Data
Automation & Comms
Language composition
Prerequisites
Clone and install
git clone https://github.com/Open-Dev-Society/OpenStock.git
cd OpenStock
# choose one:
pnpm install
# or
npm install
Configure environment
.env file (see Environment Variables).pnpm test:db
# or
npm run test:db
Run development
# Next.js dev (Turbopack)
pnpm dev
# or
npm run dev
Run Inngest locally (workflows, cron, AI)
npx inngest-cli@latest dev
Build & start (production)
pnpm build && pnpm start
# or
npm run build && npm start
Open http://localhost:3000 to view the app.
You can run OpenStock and MongoDB easily with Docker Compose.
Ensure Docker and Docker Compose are installed.
docker-compose.yml includes two services:
.env (see examples below). For the Docker setup, use a local connection string like:MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin
# from the repository root
docker compose up -d mongodb && docker compose up -d --build
Notes
NODEMAILER_EMAIL and NODEMAILER_PASSWORD are optional for local Docker runs. If they are omitted, the app still starts but email features stay disabled.Optional: Example MongoDB service definition used in this project:
services:
mongodb:
image: mongo:7
container_name: mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mongo-data:
Create .env at the project root. Choose either a hosted MongoDB (Atlas) URI or the local Docker URI.
Hosted (MongoDB Atlas):
# Core
NODE_ENV=development
# Database (Atlas)
MONGODB_URI=mongodb+srv://<user>:<pass>@<cluster>/<db>?retryWrites=true&w=majority
# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000
# Finnhub
# Note: NEXT_PUBLIC_FINNHUB_API_KEY is required for Vercel deployment
NEXT_PUBLIC_FINNHUB_API_KEY=your_finnhub_key
FINNHUB_BASE_URL=https://finnhub.io/api/v1
# Sentiment insights (optional)
ADANOS_API_KEY=your_adanos_api_key
# ADANOS_API_BASE_URL=https://api.adanos.org
# AI Provider (optional, default: "gemini")
# Supported: "gemini", "minimax", "siray"
# AI_PROVIDER=gemini
# Gemini
GEMINI_API_KEY=your_gemini_api_key
# MiniMax (optional, used when AI_PROVIDER=minimax or as fallback)
# Get your key at https://platform.minimaxi.com
# MINIMAX_API_KEY=your_minimax_api_key
# Inngest Signing Key (required for Vercel deployment)
# Get this from your Inngest dashboard: https://app.inngest.com/env/settings/keys
INNGEST_SIGNING_KEY=your_inngest_signing_key
# Required in production so sign-up can send the welcome-email event
INNGEST_EVENT_KEY=your_inngest_event_key
# Market data (optional)
# Several free Finnhub keys, rotated per request: each adds 60 requests/min.
# FINNHUB_API_KEYS=key_one,key_two
# "cached" (default) refreshes quotes hourly for everyone; "realtime" refreshes every 15s
# and turns on email price alerts (an OpenStock Cloud feature).
# NEXT_PUBLIC_OPENSTOCK_DATA_MODE=cached
# Social sign-in (optional; each provider is hidden server-side until set)
# Callback URLs: <BETTER_AUTH_URL>/api/auth/callback/google and /api/auth/callback/github
# Leave these commented out until you have real credentials: any value turns the provider on
# GOOGLE_CLIENT_ID=your_google_client_id
# GOOGLE_CLIENT_SECRET=your_google_client_secret
# GITHUB_CLIENT_ID=your_github_client_id
# GITHUB_CLIENT_SECRET=your_github_client_secret
# Email (optional; Nodemailer via Gmail, consider App Passwords if 2FA)
# [email protected]
# NODEMAILER_PASSWORD=your_gmail_app_password
Local (Docker Compose) MongoDB:
# Core
NODE_ENV=development
# Database (Docker)
MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin
# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000
# Finnhub
# Note: NEXT_PUBLIC_FINNHUB_API_KEY is required for Vercel deployment
NEXT_PUBLIC_FINNHUB_API_KEY=your_finnhub_key
FINNHUB_BASE_URL=https://finnhub.io/api/v1
# Sentiment insights (optional)
ADANOS_API_KEY=your_adanos_api_key
# ADANOS_API_BASE_URL=https://api.adanos.org
# AI Provider (optional, default: "gemini")
# Supported: "gemini", "minimax", "siray"
# AI_PROVIDER=gemini
# Gemini
GEMINI_API_KEY=your_gemini_api_key
# MiniMax (optional, used when AI_PROVIDER=minimax or as fallback)
# Get your key at https://platform.minimaxi.com
# MINIMAX_API_KEY=your_minimax_api_key
# Inngest Signing Key (required for Vercel deployment)
# Get this from your Inngest dashboard: https://app.inngest.com/env/settings/keys
INNGEST_SIGNING_KEY=your_inngest_signing_key
# Required in production so sign-up can send the welcome-email event
INNGEST_EVENT_KEY=your_inngest_event_key
# Market data (optional)
# Several free Finnhub keys, rotated per request: each adds 60 requests/min.
# FINNHUB_API_KEYS=key_one,key_two
# "cached" (default) refreshes quotes hourly for everyone; "realtime" refreshes every 15s
# and turns on email price alerts (an OpenStock Cloud feature).
# NEXT_PUBLIC_OPENSTOCK_DATA_MODE=cached
# Social sign-in (optional; each provider is hidden server-side until set)
# Callback URLs: <BETTER_AUTH_URL>/api/auth/callback/google and /api/auth/callback/github
# Leave these commented out until you have real credentials: any value turns the provider on
# GOOGLE_CLIENT_ID=your_google_client_id
# GOOGLE_CLIENT_SECRET=your_google_client_secret
# GITHUB_CLIENT_ID=your_github_client_id
# GITHUB_CLIENT_SECRET=your_github_client_secret
# Email (optional; Nodemailer via Gmail, consider App Passwords if 2FA)
# [email protected]
# NODEMAILER_PASSWORD=your_gmail_app_password
Notes
NEXT_PUBLIC_ variables, remember they are exposed to the browser..env and Compose.app/
(auth)/
layout.tsx
sign-in/page.tsx
sign-up/page.tsx
(root)/
layout.tsx
page.tsx
help/page.tsx
stocks/[symbol]/page.tsx
api/inngest/route.ts
globals.css
layout.tsx
components/
ui/… # shadcn/radix primitives (button, dialog, command, input, etc.)
forms/… # InputField, SelectField, CountrySelectField, FooterLink
Header.tsx, Footer.tsx, SearchCommand.tsx, WatchlistButton.tsx, …
database/
models/watchlist.model.ts
mongoose.ts
lib/
actions/… # server actions (auth, finnhub, user, watchlist)
better-auth/…
inngest/… # client, functions, prompts
nodemailer/… # transporter, email templates
constants.ts, utils.ts
scripts/
test-db.mjs
types/
global.d.ts
next.config.ts # i.ibb.co image domain allowlist
postcss.config.mjs # Tailwind v4 postcss setup
components.json # shadcn config
public/assets/images/ # logos and screenshots
Finnhub
NEXT_PUBLIC_FINNHUB_API_KEY and FINNHUB_BASE_URL (default: https://finnhub.io/api/v1).Adanos sentiment insights (optional)
ADANOS_API_KEY; optionally override the API host with ADANOS_API_BASE_URL.TradingView
i.ibb.co are allowlisted in next.config.ts.Better Auth + MongoDB
sign-in, sign-up, assets and Next internals.Inngest
app/user.created → AI-personalized Welcome Email0 9 * * 1 → Weekly News Summary (every Monday at 9 AM, Kit broadcast)npx inngest-cli@latest dev.Email (Nodemailer)
OpenStock supports 30+ international stock exchanges including NSE, LSE, TSX, and more. However, please be aware of important limitations based on our data providers.
Quick Facts:
See MARKET_SUPPORT.md for:
For the latest supported symbols and exchanges, see Finnhub's exchange list.
Package scripts
dev: Next.js dev server with Turbopackbuild: Production build (Turbopack)start: Run production serverlint: ESLinttest:db: Validate DB connectivityDeveloper experience
You belong here. Whether you’re a student, a self-taught dev, or a seasoned engineer — contributions are welcome.
If you discover a vulnerability:
OpenStock is and will remain free and open for everyone. This project is licensed under the AGPL-3.0 License - see the LICENSE file for details.
— Built openly, for everyone, forever free. Open Dev Society.
© Open Dev Society. This project is licensed under AGPL-3.0; 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.
OpenStock is free, open source and used by 13,000+ registered people. Keeping it that way costs money every month: hosting, the database, market data keys, AI and email, and the hours that go into reviewing pull requests and shipping fixes.
How OpenStock is funded
Pick a tier. Each link opens GitHub Sponsors with the amount already selected. Cancel any time.
| Tier | Monthly | What you get |
|---|---|---|
| Backer | $5 | Your name in this README |
| Supporter | $25 | Name and avatar on the sponsor wall and the sponsor page |
| Company | $100 | Your logo in the footer of every public page, in this README and on the sponsor page |
| Partner | $500 | One of three sponsor slots in the app sidebar, seen by 13,000+ registered users, plus your logo on the landing page |
Rather give once? Make a one-time gift. Want an invoice or a custom partnership? Talk with us. Everything, including where the money goes, is on the sponsor page.
Sponsorships are paid through GitHub Sponsors to @ravixalgorithm (Ravi Pratap Singh, founder of Open Dev Society).
Can't sponsor right now? Pick a good first issue, star the repo, or share OpenStock with someone who pays too much for a terminal.
**Current spon
Content type
Image
Digest
sha256:6ab787515…
Size
505.1 MB
Last updated
4 days ago
docker pull birdxs/openstock