Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
OpenStock은 고가 시장 플랫폼의 오픈소스 대안으로 실시간 가격 확인·맞춤 알림·기업 상세 인사이트 제공, 영구 무료
OpenStock is an open-source alternative to expensive market platforms. Track real-time prices, set personalized alerts, and explore detailed company insights — built openly, for everyone, forever free
금융TypeScript · JavaScriptGitHub @Open-Dev-Society온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기OpenStock is an open-source alternative to expensive market platforms. Track real-time prices, set personalized alerts, and explore detailed company insights — built openly, for everyone, forever free.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Open OpenStock · Changelog · Self-host it · Sponsor · Discord
Markets, minus the paywall. OpenStock is a free, open-source alternative to expensive market platforms: track prices, watch the whole market and dig into company insights. Use it at openstock-ods.vercel.app, or run your own copy with every feature.
❤️ 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 depending on the provider and your setup. Nothing here is financial advice.
Markets
Stock pages
Watchlist and alerts
Accounts
Community
Charts always stream live from TradingView. Quotes, watchlist prices and alerts come from Finnhub:
| Quotes | Price alerts | Cost | |
|---|---|---|---|
| Community: openstock-ods.vercel.app | Every hour, shared by everyone | No | Free |
| OpenStock Cloud (coming soon) | Every 15 seconds | By email | $5 a month |
| Self-hosted | Every hour, or every 15 seconds with NEXT_PUBLIC_OPENSTOCK_DATA_MODE=realtime and your own Finnhub keys | By email, in realtime mode | Free |
| App | Next.js 15 (App Router), React 19, TypeScript, Tailwind CSS v4, shadcn/ui and Radix |
| Accounts and data | Better Auth, MongoDB with Mongoose |
| Market data | Finnhub, TradingView widgets, Adanos (sentiment) |
| Background jobs | Inngest |
| Nodemailer (Gmail), Kit for the newsletter | |
| AI | Gemini, MiniMax or Siray |
| Hosting | Vercel; a Docker image on GitHub Container Registry for self-hosting |
You need Node.js 22 LTS, a MongoDB database (a free Atlas cluster, or the Docker setup) and a free Finnhub key.
git clone https://github.com/Open-Dev-Society/OpenStock.git
cd OpenStock
npm ci
cp .env.example .env # fill in MONGODB_URI, BETTER_AUTH_SECRET and FINNHUB_API_KEY
node scripts/check-env.mjs # checks your .env
npm run test:db # checks the MongoDB connection
npm run dev # http://localhost:3000
Welcome emails, price alerts and the weekly digest run as Inngest jobs. Locally, start Inngest's dev server alongside the app: npx inngest-cli@latest dev.
For production: npm run build && npm start.
Every variable is listed with comments in .env.example. The ones that matter:
| Variable | Needed | What it's for |
|---|---|---|
MONGODB_URI | Yes | Your MongoDB database |
BETTER_AUTH_SECRET | Yes | Signs sessions. Generate it with openssl rand -hex 32. Auth refuses to run in production without it |
BETTER_AUTH_URL | Yes | The app's public URL, used for auth callbacks and links in emails |
FINNHUB_API_KEY | Yes | Market data. Or put several free keys, comma-separated, in FINNHUB_API_KEYS: they're rotated, and each adds 60 requests a minute |
NEXT_PUBLIC_OPENSTOCK_DATA_MODE | No | cached (hourly, the default) or realtime (every 15 seconds, with price alerts). Fixed when the app is built: rebuild after changing it |
INNGEST_SIGNING_KEY, INNGEST_EVENT_KEY | In production | Background jobs: welcome emails, price alerts and the weekly digest |
NODEMAILER_EMAIL, NODEMAILER_PASSWORD | No | Sending email through Gmail, with an app password. Without them, emails are skipped |
GEMINI_API_KEY (or MiniMax or Siray) | No | AI-written welcome emails and the news digest |
ADANOS_API_KEY | No | The sentiment card on stock pages |
KIT_API_KEY, KIT_API_SECRET, KIT_WELCOME_FORM_ID | No | The weekly digest newsletter in Kit |
GOOGLE_CLIENT_ID / _SECRET, GITHUB_CLIENT_ID / _SECRET | No | Social sign-in. Callbacks: <BETTER_AUTH_URL>/api/auth/callback/google and /github |
NEXT_PUBLIC_FINNHUB_API_KEY still works as a name for the Finnhub key. No key is ever sent to the browser.
Runs OpenStock and MongoDB together. MongoDB is only reachable inside the Docker network; it isn't published on your machine.
.env (see above). For the bundled database, choose a password and use it in both places. Letters and digits are simplest; @ : / ? # must be percent-encoded in the URI.
MONGO_ROOT_PASSWORD=change-me
MONGODB_URI=mongodb://root:change-me@mongodb:27017/openstock?authSource=admin
docker compose up -d --buildThe image build needs no secrets: every variable is read when the container starts, except NEXT_PUBLIC_OPENSTOCK_DATA_MODE, which Compose passes to the build from .env. Data lives in the mongo-data volume, and the MongoDB password is only applied when that volume is first created.
Every push to main publishes ghcr.io/open-dev-society/openstock for amd64 and arm64, tagged latest, sha-<commit>, and a version for each release (for example 2026.10.18). To use it, replace build: under openstock in docker-compose.yml with:
image: ghcr.io/open-dev-society/openstock:latest
then run docker compose pull && docker compose up -d. The prebuilt image runs in cached mode; build it yourself for realtime.
OpenStock ships a railway.json that builds the Dockerfile, checks health on /sign-in and restarts on failure. The template above sets everything up; to do it by hand:
+ New → Database → MongoDB).+ New → GitHub Repo).MONGODB_URI=${{MongoDB.MONGO_URL}}
BETTER_AUTH_SECRET=${{secret(32)}}
BETTER_AUTH_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
FINNHUB_API_KEY=your_finnhub_key
GEMINI_API_KEY=your_gemini_api_key
INNGEST_SIGNING_KEY=your_inngest_signing_key
INNGEST_EVENT_KEY=your_inngest_event_key
[email protected]
NODEMAILER_PASSWORD=your_gmail_app_password
For background jobs, add your Railway domain as an app in the Inngest dashboard, pointing to https://<your-domain>/api/inngest. To turn on realtime mode, also set NEXT_PUBLIC_OPENSTOCK_DATA_MODE=realtime; Railway passes it to the build.
Import the repository, set the variables above for Production, and connect Inngest (its Vercel integration sets both keys). vercel.json pins functions to Mumbai (bom1), next to the hosted database; change it to the region nearest yours.
app/
(marketing)/ public pages: landing, about, help, api-docs, sponsor, love, changelog, terms, /s/[ticker], /compare
(auth)/ sign-in, sign-up, forgot-password, reset-password
(root)/ the signed-in app: dashboard, watchlist, stocks/[symbol], profile
api/ auth/[...all] (Better Auth), inngest (background jobs), quotes (live prices)
components/ shell/ (sidebar, tabs), stocks/, watchlist/, landing/, marketing/, sponsors/, forms/, ui/ (shadcn)
database/ MongoDB connection and models (watchlist, alert)
lib/
actions/ server actions: auth, profile, watchlist, alerts, Finnhub, sentiment
better-auth/ auth setup (connects to MongoDB on first use, so builds need no database)
inngest/ background jobs and AI prompts
nodemailer/ email sending and templates
markets.ts the dashboard's markets market-data.ts cached vs realtime
changelog.ts releases and contributor credits sponsors.ts sponsors and tiers
rate-limit.ts MongoDB-backed limits for auth and live quotes
middleware.ts public marketing, /s and /compare pages; app pages redirect to sign-in
scripts/ check-env.mjs, test-db.mjs, and one-off maintenance scripts
__tests__/ Vitest tests
Finnhub: search, quotes, company profiles and news. Responses are cached and shared (for an hour, or 15 seconds in realtime mode), with timeouts and a key pool, so a slow upstream never hangs a page.
TradingView: the chart, heatmap, financials, technicals and profile widgets.
Adanos (optional): the sentiment card.
Better Auth with MongoDB: accounts and sessions. Pages and server actions check the session on the server; the middleware only redirects signed-out visitors.
Inngest runs the background jobs:
| Job | When |
|---|---|
| AI-personalised welcome email | On sign-up |
| Price alert check | Every 5 minutes, in realtime mode |
| Weekly news digest (a Kit broadcast) | Mondays at 09:00 UTC |
Email: Nodemailer (Gmail) sends welcome, alert and password-reset emails; Kit sends the weekly digest.
| Market | Charts (TradingView embeds) | Quotes, watchlist prices, alerts (Finnhub free) |
|---|---|---|
| 🇺🇸 United States | Live | Yes |
| Crypto (Binance pairs) | Live | Yes |
| Forex | Live | No |
| 🇨🇦 Canada, 🇦🇺 Australia | Delayed | No |
🇮🇳 India (BSE; .NS symbols chart on BSE), 🇩🇪 Germany | End of day | No |
| London, Tokyo, Hong Kong, Korea and others | Candles blocked; financials, technicals and profile work | No |
The full table, and why some markets are limited, is in MARKET_SUPPORT.md.
| Command | What it does |
|---|---|
npm run dev | Development server (Turbopack) |
npm run build, npm start | Production build and server |
npm test | Vitest tests (npm run test:watch to keep watching) |
npm run lint | ESLint |
npx tsc --noEmit | Type check. Builds skip type errors, so run this before opening a PR |
npm run test:db | Checks the MongoDB connection |
node scripts/check-env.mjs | Checks your .env |
You belong here. Whether you're a student, a self-taught dev or a seasoned engineer, contributions are welcome.
main, then npm ci and cp .env.example .env.npm test, npx tsc --noEmit and npm run lint.Every merged pull request, and every issue that leads to a fix, is credited on the changelog and below. Be kind, guide beginners, no gatekeeping: that's the Open Dev Society way. Participation is covered by the Code of Conduct.
OpenStock is built by everyone below: the people who wrote the code and the people whose issues led to a fix. Every release, and who made it happen, is on the changelog.
@ravixalgorithm founded and maintains OpenStock, and built it from the ground up: authentication, UI design, API and AI integration, and deployment.
Also thanks to Priyanshuu00007, who designed the OpenStock logo and visual identity, and koevoet1221, who fixed the MongoDB Docker build. Their GitHub accounts are no longer available, so they aren't linked above.
Want to be here? Pick a good first issue or report a bug you hit.
Found a vulnerability? Please don't open a public issue. Report it privately on GitHub; we'll work on a fix with you and credit you.
OpenStock is and will remain free and open for everyone. It's 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.
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.
Built openly, for everyone, forever free. © Open Dev Society.
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 sponsors are shown at the top of this README: RapidProxy · Orbit Previously backed by: Atlas Cloud · Siray.ai (2026)