[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-73459":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},73459,"OpenStock","Open-Dev-Society\u002FOpenStock","Open-Dev-Society","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.","https:\u002F\u002Fopenstock-ods.vercel.app",null,"TypeScript",13170,1743,83,22,0,122,351,1873,366,44.72,"GNU Affero General Public License v3.0",false,"main",true,[27,28,29,30,31,32],"coderabbit","inngest","nextjs","shadcn-ui","stock-market","tailwindcss","2026-06-12 02:03:13","\u003Cdiv align=\"center\">\n  Checkout new amazing projects also, \u003Ca href=\"github.com\u002Fopen-dev-society\u002Fopenreadme\" target=\"_blank\">OpenReadme \u003C\u002Fa> is live\n\u003C\u002Fdiv>  \n\u003Ca href=\"https:\u002F\u002Fhellogithub.com\u002Frepository\u002FOpen-Dev-Society\u002FOpenStock\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fabroad.hellogithub.com\u002Fv1\u002Fwidgets\u002Frecommend.svg?rid=5c4337a9e2dd4a8ba8aba87a88f04b8b&claim_uid=07HezcXv9puSGKQ&theme=neutral\" alt=\"Featured｜HelloGitHub\" style=\"width: 250px; height: 54px;\" width=\"250\" height=\"54\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fpeerlist.io\u002Fravixalgorithm\u002Fproject\u002Fopenstock\" target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\u003Cimg\n\t\t\t\t\tsrc=\"https:\u002F\u002Fpeerlist.io\u002Fapi\u002Fv1\u002Fprojects\u002Fembed\u002FPRJH8OED7MBL9MGB9HRMKAKLM66KNN?showUpvote=true&theme=light\"\n\t\t\t\t\talt=\"OpenStock\"\n\t\t\t\t\tstyle=\"width: auto; height: 54px;\"\n\t\t\t\t\u002F>\n\t\t\t\u003C\u002Fa>\n\u003Cdiv align=\"center\">\n  \u003Cbr \u002F>\n  \u003Ca href=\"#\" target=\"_blank\">\n    \u003Cimg src=\".\u002Fpublic\u002Fassets\u002Fimages\u002Fdashboard.png\" alt=\"Project Banner\" \u002F>\n  \u003C\u002Fa>\n  © 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.\n  \u003Cbr \u002F>\n  \u003Cbr\u002F>\n\n  \u003Cdiv>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Next.js-black?style=for-the-badge&logoColor=white&logo=next.js&color=000000\" alt=\"Next.js badge\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-TypeScript-black?style=for-the-badge&logoColor=white&logo=typescript&color=3178C6\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Tailwind%20CSS-black?style=for-the-badge&logoColor=white&logo=tailwindcss&color=38B2AC\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-shadcn\u002Fui-black?style=for-the-badge&logoColor=white&logo=shadcnui&color=000000\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Radix%20UI-black?style=for-the-badge&logoColor=white&logo=radixui&color=000000\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Better%20Auth-black?style=for-the-badge&logoColor=white&logo=betterauth&color=000000\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-MongoDB-black?style=for-the-badge&logoColor=white&logo=mongodb&color=00A35C\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Inngest-black?style=for-the-badge&logoColor=white&logo=inngest&color=000000\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Nodemailer-black?style=for-the-badge&logoColor=white&logo=gmail&color=EA4335\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-TradingView-black?style=for-the-badge&logoColor=white&logo=tradingview&color=2962FF\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Finnhub-black?style=for-the-badge&logoColor=white&color=30B27A\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-CodeRabbit-black?style=for-the-badge&logoColor=white&logo=coderabbit&color=9146FF\"\u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n# OpenStock\n\nOpenStock 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.\n\nNote: 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.\n\n## 📋 Table of Contents\n\n1. ✨ [Introduction](#introduction)\n2. 🌍 [Open Dev Society Manifesto](#manifesto)\n3. ⚙️ [Tech Stack](#tech-stack)\n4. 🔋 [Features](#features)\n5. 🤸 [Quick Start](#quick-start)\n6. 🐳 [Docker Setup](#docker-setup)\n7. 🔐 [Environment Variables](#environment-variables)\n8. 🧱 [Project Structure](#project-structure)\n9. 📡 [Data & Integrations](#data--integrations)\n10. 🧪 [Scripts & Tooling](#scripts--tooling)\n11. 🤝 [Contributing](#contributing)\n12. 🛡️ [Security](#security)\n13. 📜 [License](#license)\n14. 🙏 [Acknowledgements](#acknowledgements)\n\n## ✨ Introduction \u003Ca name=\"introduction\">\u003C\u002Fa>\n\nOpenStock is a modern stock market app powered by Next.js (App Router), shadcn\u002Fui and Tailwind CSS, Better Auth for authentication, MongoDB for persistence, Finnhub for market data, and TradingView widgets for charts and market views.\n\n## 🌍 Open Dev Society Manifesto \u003Ca name=\"manifesto\">\u003C\u002Fa>\n\nWe 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.\n\nWe believe there’s a better way.\n\n- Our Belief: Technology should belong to everyone. Knowledge should be open, free, and accessible. Communities should welcome newcomers with trust, not gatekeeping.\n- Our Mission: Build free, open-source projects that make a real difference:\n    - Tools that professionals and students can use without barriers.\n    - Knowledge platforms where learning is free, forever.\n    - Communities where every beginner is guided, not judged.\n    - Resources that run on trust, not profit.\n- Our Promise: We will never lock knowledge. We will never charge for access. We will never trade trust for money. We run on transparency, donations, and the strength of our community.\n- Our Call: If you’ve ever felt you didn’t belong, struggled to find free resources, or wanted to build something meaningful — you belong here.\n\nBecause the future belongs to those who build it openly.\n\n## ⚙️ Tech Stack \u003Ca name=\"tech-stack\">\u003C\u002Fa>\n\nCore\n- Next.js 15 (App Router), React 19\n- TypeScript\n- Tailwind CSS v4 (via @tailwindcss\u002Fpostcss)\n- shadcn\u002Fui + Radix UI primitives\n- Lucide icons\n\nAuth & Data\n- Better Auth (email\u002Fpassword) with MongoDB adapter\n- MongoDB + Mongoose\n- Finnhub API for symbols, profiles, and market news\n- TradingView embeddable widgets\n\nAutomation & Comms\n- Inngest (events, cron, AI inference via Gemini)\n- Nodemailer (Gmail transport)\n- next-themes, cmdk (command palette), react-hook-form\n\nLanguage composition\n- TypeScript (~93.4%), CSS (~6%), JavaScript (~0.6%)\n\n## 🔋 Features \u003Ca name=\"features\">\u003C\u002Fa>\n\n- Authentication\n    - Email\u002Fpassword auth with Better Auth + MongoDB adapter\n    - Protected routes enforced via Next.js middleware\n- Global search and Command + K palette\n    - Fast stock search backed by Finnhub\n    - Popular stocks when idle; debounced querying\n- Watchlist\n    - Per-user watchlist stored in MongoDB (unique symbol per user)\n- Stock details\n    - TradingView symbol info, candlestick\u002Fadvanced charts, baseline, technicals\n    - Company profile and financials widgets\n    - Optional cross-source sentiment insights for Reddit, X.com, news, and Polymarket\n- Market overview\n    - Heatmap, quotes, and top stories (TradingView widgets)\n- Personalized onboarding\n    - Collects country, investment goals, risk tolerance, preferred industry\n- Email & automation\n    - AI-personalized welcome email (Gemini via Inngest)\n    - Daily news summary emails (cron) personalized using user watchlists\n- Polished UI\n    - shadcn\u002Fui components, Radix primitives, Tailwind v4 design tokens\n    - Dark theme by default\n- Keyboard shortcut\n    - Cmd\u002FCtrl + K for quick actions\u002Fsearch\n\n## 🤸 Quick Start \u003Ca name=\"quick-start\">\u003C\u002Fa>\n\nPrerequisites\n- Node.js 20+ and pnpm or npm\n- MongoDB connection string (MongoDB Atlas or local via Docker Compose)\n- Finnhub API key (free tier supported; real-time may require paid)\n- Gmail account for email (or update Nodemailer transport)\n- Optional: Google Gemini API key (for AI-generated welcome intros)\n\nClone and install\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FOpen-Dev-Society\u002FOpenStock.git\ncd OpenStock\n\n# choose one:\npnpm install\n# or\nnpm install\n```\n\nConfigure environment\n- Create a `.env` file (see [Environment Variables](#environment-variables)).\n- Verify DB connectivity:\n```bash\npnpm test:db\n# or\nnpm run test:db\n```\n\nRun development\n```bash\n# Next.js dev (Turbopack)\npnpm dev\n# or\nnpm run dev\n```\n\nRun Inngest locally (workflows, cron, AI)\n```bash\nnpx inngest-cli@latest dev\n```\n\nBuild & start (production)\n```bash\npnpm build && pnpm start\n# or\nnpm run build && npm start\n```\n\nOpen http:\u002F\u002Flocalhost:3000 to view the app.\n\n## 🐳 Docker Setup \u003Ca name=\"docker-setup\">\u003C\u002Fa>\n\nYou can run OpenStock and MongoDB easily with Docker Compose.\n\n1) Ensure Docker and Docker Compose are installed.\n\n2) docker-compose.yml includes two services:\n- openstock (this app)\n- mongodb (MongoDB database with a persistent volume)\n\n3) Create your `.env` (see examples below). For the Docker setup, use a local connection string like:\n```env\nMONGODB_URI=mongodb:\u002F\u002Froot:example@mongodb:27017\u002Fopenstock?authSource=admin\n```\n\n4) Start the stack:\n```bash\n# from the repository root\ndocker compose up -d mongodb && docker compose up -d --build\n```\n\n5) Access the app:\n- App: http:\u002F\u002Flocalhost:3000\n- MongoDB is available inside the Docker network at host mongodb:27017\n\nNotes\n- The app service depends_on the mongodb service.\n- Credentials are defined in Compose for the MongoDB root user; authSource=admin is required on the connection string for root.\n- Data persists across restarts via the docker volume.\n\nOptional: Example MongoDB service definition used in this project:\n```yaml\nservices:\n  mongodb:\n    image: mongo:7\n    container_name: mongodb\n    restart: unless-stopped\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: root\n      MONGO_INITDB_ROOT_PASSWORD: example\n    ports:\n      - \"27017:27017\"\n    volumes:\n      - mongo-data:\u002Fdata\u002Fdb\n    healthcheck:\n      test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\nvolumes:\n  mongo-data:\n```\n\n## 🔐 Environment Variables \u003Ca name=\"environment-variables\">\u003C\u002Fa>\n\nCreate `.env` at the project root. Choose either a hosted MongoDB (Atlas) URI or the local Docker URI.\n\nHosted (MongoDB Atlas):\n```env\n# Core\nNODE_ENV=development\n\n# Database (Atlas)\nMONGODB_URI=mongodb+srv:\u002F\u002F\u003Cuser>:\u003Cpass>@\u003Ccluster>\u002F\u003Cdb>?retryWrites=true&w=majority\n\n# Better Auth\nBETTER_AUTH_SECRET=your_better_auth_secret\nBETTER_AUTH_URL=http:\u002F\u002Flocalhost:3000\n\n# Finnhub\n# Note: NEXT_PUBLIC_FINNHUB_API_KEY is required for Vercel deployment\nNEXT_PUBLIC_FINNHUB_API_KEY=your_finnhub_key\nFINNHUB_BASE_URL=https:\u002F\u002Ffinnhub.io\u002Fapi\u002Fv1\n\n# Sentiment insights (optional)\nADANOS_API_KEY=your_adanos_api_key\n# ADANOS_API_BASE_URL=https:\u002F\u002Fapi.adanos.org\n\n# AI Provider (optional, default: \"gemini\")\n# Supported: \"gemini\", \"minimax\", \"siray\"\n# AI_PROVIDER=gemini\n\n# Gemini\nGEMINI_API_KEY=your_gemini_api_key\n\n# MiniMax (optional, used when AI_PROVIDER=minimax or as fallback)\n# Get your key at https:\u002F\u002Fplatform.minimaxi.com\n# MINIMAX_API_KEY=your_minimax_api_key\n\n# Inngest Signing Key (required for Vercel deployment)\n# Get this from your Inngest dashboard: https:\u002F\u002Fapp.inngest.com\u002Fenv\u002Fsettings\u002Fkeys\nINNGEST_SIGNING_KEY=your_inngest_signing_key\n\n# Email (Nodemailer via Gmail; consider App Passwords if 2FA)\nNODEMAILER_EMAIL=youraddress@gmail.com\nNODEMAILER_PASSWORD=your_gmail_app_password\n```\n\nLocal (Docker Compose) MongoDB:\n```env\n# Core\nNODE_ENV=development\n\n# Database (Docker)\nMONGODB_URI=mongodb:\u002F\u002Froot:example@mongodb:27017\u002Fopenstock?authSource=admin\n\n# Better Auth\nBETTER_AUTH_SECRET=your_better_auth_secret\nBETTER_AUTH_URL=http:\u002F\u002Flocalhost:3000\n\n# Finnhub\n# Note: NEXT_PUBLIC_FINNHUB_API_KEY is required for Vercel deployment\nNEXT_PUBLIC_FINNHUB_API_KEY=your_finnhub_key\nFINNHUB_BASE_URL=https:\u002F\u002Ffinnhub.io\u002Fapi\u002Fv1\n\n# Sentiment insights (optional)\nADANOS_API_KEY=your_adanos_api_key\n# ADANOS_API_BASE_URL=https:\u002F\u002Fapi.adanos.org\n\n# AI Provider (optional, default: \"gemini\")\n# Supported: \"gemini\", \"minimax\", \"siray\"\n# AI_PROVIDER=gemini\n\n# Gemini\nGEMINI_API_KEY=your_gemini_api_key\n\n# MiniMax (optional, used when AI_PROVIDER=minimax or as fallback)\n# Get your key at https:\u002F\u002Fplatform.minimaxi.com\n# MINIMAX_API_KEY=your_minimax_api_key\n\n# Inngest Signing Key (required for Vercel deployment)\n# Get this from your Inngest dashboard: https:\u002F\u002Fapp.inngest.com\u002Fenv\u002Fsettings\u002Fkeys\nINNGEST_SIGNING_KEY=your_inngest_signing_key\n\n# Email (Nodemailer via Gmail; consider App Passwords if 2FA)\nNODEMAILER_EMAIL=youraddress@gmail.com\nNODEMAILER_PASSWORD=your_gmail_app_password\n```\n\nNotes\n- Keep private keys server-side whenever possible.\n- If using `NEXT_PUBLIC_` variables, remember they are exposed to the browser.\n- In production, prefer a dedicated SMTP provider over a personal Gmail.\n- Do not hardcode secrets in the Dockerfile; use `.env` and Compose.\n\n## 🧱 Project Structure \u003Ca name=\"project-structure\">\u003C\u002Fa>\n\n```\napp\u002F\n  (auth)\u002F\n    layout.tsx\n    sign-in\u002Fpage.tsx\n    sign-up\u002Fpage.tsx\n  (root)\u002F\n    layout.tsx\n    page.tsx\n    help\u002Fpage.tsx\n    stocks\u002F[symbol]\u002Fpage.tsx\n  api\u002Finngest\u002Froute.ts\n  globals.css\n  layout.tsx\ncomponents\u002F\n  ui\u002F…          # shadcn\u002Fradix primitives (button, dialog, command, input, etc.)\n  forms\u002F…       # InputField, SelectField, CountrySelectField, FooterLink\n  Header.tsx, Footer.tsx, SearchCommand.tsx, WatchlistButton.tsx, …\ndatabase\u002F\n  models\u002Fwatchlist.model.ts\n  mongoose.ts\nlib\u002F\n  actions\u002F…     # server actions (auth, finnhub, user, watchlist)\n  better-auth\u002F…\n  inngest\u002F…     # client, functions, prompts\n  nodemailer\u002F…  # transporter, email templates\n  constants.ts, utils.ts\nscripts\u002F\n  test-db.mjs\ntypes\u002F\n  global.d.ts\nnext.config.ts          # i.ibb.co image domain allowlist\npostcss.config.mjs      # Tailwind v4 postcss setup\ncomponents.json         # shadcn config\npublic\u002Fassets\u002Fimages\u002F   # logos and screenshots\n```\n\n## 📡 Data & Integrations \u003Ca name=\"data--integrations\">\u003C\u002Fa>\n\n- Finnhub\n    - Stock search, company profiles, and market news.\n    - Set `NEXT_PUBLIC_FINNHUB_API_KEY` and `FINNHUB_BASE_URL` (default: https:\u002F\u002Ffinnhub.io\u002Fapi\u002Fv1).\n    - Free tiers may return delayed quotes; respect rate limits and terms.\n\n- Adanos sentiment insights (optional)\n    - Structured stock sentiment snapshots across Reddit, X.com, news, and Polymarket.\n    - Set `ADANOS_API_KEY`; optionally override the API host with `ADANOS_API_BASE_URL`.\n    - Used only for the stock detail sentiment card and does not replace Finnhub or TradingView.\n\n- TradingView\n    - Embeddable widgets used for charts, heatmap, quotes, and timelines.\n    - External images from `i.ibb.co` are allowlisted in `next.config.ts`.\n\n- Better Auth + MongoDB\n    - Email\u002Fpassword with MongoDB adapter.\n    - Session validation via middleware; most routes are protected, with public exceptions for `sign-in`, `sign-up`, assets and Next internals.\n\n- Inngest\n    - Workflows:\n        - `app\u002Fuser.created` → AI-personalized Welcome Email\n        - Cron `0 12 * * *` → Daily News Summary per user\n    - Local dev: `npx inngest-cli@latest dev`.\n\n- Email (Nodemailer)\n    - Gmail transport. Update credentials or switch to your SMTP provider.\n    - Templates for welcome and news summary emails.\n\n## 🧪 Scripts & Tooling \u003Ca name=\"scripts--tooling\">\u003C\u002Fa>\n\nPackage scripts\n- `dev`: Next.js dev server with Turbopack\n- `build`: Production build (Turbopack)\n- `start`: Run production server\n- `lint`: ESLint\n- `test:db`: Validate DB connectivity\n\nDeveloper experience\n- TypeScript strict mode\n- Tailwind CSS v4 (no separate tailwind.config needed)\n- shadcn\u002Fui components with Radix primitives\n- cmdk command palette, next-themes, lucide-react icons\n\n## 🤝 Contributing \u003Ca name=\"contributing\">\u003C\u002Fa>\n\nYou belong here. Whether you’re a student, a self-taught dev, or a seasoned engineer — contributions are welcome.\n\n- Open an issue to discuss ideas and bugs\n- Look for “good first issue” or “help wanted”\n- Keep PRs focused; add screenshots for UI changes\n- Be kind, guide beginners, no gatekeeping — that’s the ODS way\n\n## 🛡️ Security \u003Ca name=\"security\">\u003C\u002Fa>\n\nIf you discover a vulnerability:\n- Do not open a public issue\n- Email: \u003Ca href=\"mailto:opendevsociety@cc.cc\">opendevsociety@cc.cc\u003C\u002Fa>\n- We'll coordinate responsible disclosure and patch swiftly\n\n## 📜 License \u003Ca name=\"license\">\u003C\u002Fa>\n\nOpenStock 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.\n\n## 🙏 Acknowledgements \u003Ca name=\"acknowledgements\">\u003C\u002Fa>\n\n- Finnhub for accessible market data\n- TradingView for embeddable market widgets\n- shadcn\u002Fui, Radix UI, Tailwind CSS, Next.js community\n- Inngest for dependable background jobs and workflows\n- Better Auth for simple and secure authentication\n- All contributors who make open tools possible\n\n— Built openly, for everyone, forever free. Open Dev Society.\n\n> © 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.\n\n## Our Honourable Contributors\n- [ravixalgorithm](https:\u002F\u002Fgithub.com\u002Fravixalgorithm) - Developed the entire application from the ground up, including authentication, UI design, API and AI integration, and deployment.\n- [Priyanshuu00007](https:\u002F\u002Fgithub.com\u002FPriyanshuu00007) - Created the official OpenStock logo and contributed to the project’s visual identity.\n- [chinnsenn](https:\u002F\u002Fgithub.com\u002Fchinnsenn) - Set up Docker configuration for the repository, ensuring a smooth development and deployment process.\n- [koevoet1221](https:\u002F\u002Fgithub.com\u002Fkoevoet1221) - Resolved MongoDB Docker build issues, improving the project’s overall stability and reliability.\n- [ettoreciolli1](https:\u002F\u002Fgithub.com\u002Fettoreciolli1) - updated Readme\n\n\n\n## ❤️ Partners & Backers\n\n\u003Ca href=\"https:\u002F\u002Fwww.siray.ai\u002F\">\n  \u003Cimg src=\"public\u002Fassets\u002Ficons\u002Fsiray.svg\" alt=\"Siray.ai Logo\" width=\"100\" \u002F>\n\u003C\u002Fa>\n\n**[Siray.ai](https:\u002F\u002Fwww.siray.ai\u002F)** — The robust AI infrastructure backing OpenStock. Siray.ai ensures our market insights never sleep.\n\n## Special thanks\nHuge thanks to [Adrian Hajdin (JavaScript Mastery)](https:\u002F\u002Fgithub.com\u002Fadrianhajdin) — his excellent Stock Market App tutorial was instrumental in building OpenStock for the open-source community under the Open Dev Society.\n\nGitHub: [adrianhajdin](https:\u002F\u002Fgithub.com\u002Fadrianhajdin)\nYouTube tutorial: [Stock Market App Tutorial](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=gu4pafNCXng)\nYouTube channel: [JavaScript Mastery](https:\u002F\u002Fwww.youtube.com\u002F@javascriptmastery)\n","OpenStock 是一个开源的股票市场平台替代方案，旨在为用户提供实时价格跟踪、个性化警报设置以及详细的公司洞察。项目采用 TypeScript 编写，并结合了 Next.js 和 Tailwind CSS 等现代前端技术栈，确保了高效且美观的用户体验。此外，通过集成如 Inngest 用于事件处理、MongoDB 作为数据库等工具，进一步增强了其功能性和扩展性。适合对股市有研究需求但希望避免高昂费用的个人投资者或小型团队使用。",2,"2026-06-11 03:45:38","high_star"]