开源的股票市场追踪平台,提供实时价格监控、个性化提醒和详细的公司分析,完全免费且永久开放

AGPL-3.0TypeScriptOpenStockOpen-Dev-Society 5.5k Last Updated: October 24, 2025

OpenStock 项目介绍

项目概述

OpenStock 是一个现代化的开源股票市场应用程序,旨在为所有人提供免费、开放的市场追踪工具。它是昂贵市场平台的开源替代方案,支持实时价格追踪、个性化提醒和详细的公司洞察分析。

核心理念: 知识应该是开放、免费和可访问的,技术应该属于每个人。

主要特性

🔐 身份认证

  • 基于 Better Auth + MongoDB 的邮箱/密码认证系统
  • 通过 Next.js 中间件保护的路由
  • 完整的用户会话管理

🔍 全局搜索

  • 快速的股票搜索功能,由 Finnhub API 支持
  • 闲置时显示热门股票,支持防抖查询
  • Command + K 快捷键调出命令面板

⭐ 自选股列表

  • 每个用户的自选股存储在 MongoDB 中
  • 每个用户的每个股票代码唯一
  • 便捷的添加/移除功能

📊 股票详情

  • TradingView 提供的股票符号信息
  • K线图/高级图表、基线图、技术指标
  • 公司资料和财务数据小部件

📈 市场概览

  • 热力图、行情报价和头条新闻
  • 使用 TradingView 嵌入式小部件
  • 实时市场数据更新

🎯 个性化入门流程

  • 收集用户所在国家、投资目标
  • 风险承受能力和偏好行业
  • 定制化用户体验

📧 邮件与自动化

  • AI 个性化欢迎邮件(通过 Inngest 调用 Gemini)
  • 每日新闻摘要邮件(定时任务)
  • 基于用户自选股的个性化内容

🎨 精致的用户界面

  • shadcn/ui 组件 + Radix UI 基础组件
  • Tailwind v4 设计系统
  • 默认深色主题
  • 响应式设计

技术栈

核心技术

  • Next.js 15 (App Router)
  • React 19
  • TypeScript
  • Tailwind CSS v4 (通过 @tailwindcss/postcss)
  • shadcn/ui + Radix UI 基础组件
  • Lucide 图标库

认证与数据

  • Better Auth - 邮箱/密码认证,配合 MongoDB 适配器
  • MongoDB + Mongoose - 数据持久化
  • Finnhub API - 股票代码、公司资料和市场新闻
  • TradingView - 可嵌入的图表小部件

自动化与通信

  • Inngest - 事件处理、定时任务、AI 推理(Gemini)
  • Nodemailer - 邮件发送(Gmail 传输)
  • next-themes - 主题切换
  • cmdk - 命令面板
  • react-hook-form - 表单处理

语言组成

  • TypeScript (~93.4%)
  • CSS (~6%)
  • JavaScript (~0.6%)

项目结构

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       # Inngest API 端点
├── globals.css
└── layout.tsx

components/
├── ui/                        # shadcn/radix 基础组件
├── forms/                     # 表单组件
├── Header.tsx
├── Footer.tsx
├── SearchCommand.tsx
└── WatchlistButton.tsx

database/
├── models/watchlist.model.ts
└── mongoose.ts

lib/
├── actions/                   # 服务器操作
│   ├── auth
│   ├── finnhub
│   ├── user
│   └── watchlist
├── better-auth/
├── inngest/                   # Inngest 客户端和函数
├── nodemailer/               # 邮件发送配置
├── constants.ts
└── utils.ts

scripts/
└── test-db.mjs               # 数据库连接测试

types/
└── global.d.ts

public/assets/images/         # Logo 和截图

快速开始

前置要求

  • Node.js 20+
  • pnpm 或 npm
  • MongoDB 连接字符串(MongoDB Atlas 或本地 Docker)
  • Finnhub API 密钥
  • Gmail 账户(用于发送邮件)
  • 可选:Google Gemini API 密钥(用于 AI 生成内容)

安装步骤

  1. 克隆仓库
git clone https://github.com/Open-Dev-Society/OpenStock.git
cd OpenStock
  1. 安装依赖
pnpm install
# 或
npm install
  1. 配置环境变量

创建 .env 文件:

# 核心配置
NODE_ENV=development

# 数据库
MONGODB_URI=your_mongodb_connection_string

# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000

# Finnhub
FINNHUB_API_KEY=your_finnhub_key
NEXT_PUBLIC_FINNHUB_API_KEY=
FINNHUB_BASE_URL=https://finnhub.io/api/v1

# Inngest AI (Gemini)
GEMINI_API_KEY=your_gemini_api_key

# 邮件配置
NODEMAILER_EMAIL=youraddress@gmail.com
NODEMAILER_PASSWORD=your_gmail_app_password
  1. 验证数据库连接
pnpm test:db
  1. 启动开发服务器
pnpm dev
  1. 启动 Inngest(用于工作流和定时任务)
npx inngest-cli@latest dev
  1. 访问应用

打开浏览器访问 http://localhost:3000

Docker 部署

项目提供了 Docker Compose 配置,可以快速启动应用和 MongoDB:

# 启动 MongoDB
docker compose up -d mongodb

# 构建并启动应用
docker compose up -d --build

使用 Docker 时,MongoDB 连接字符串应该是:

MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin

数据与集成

Finnhub API

  • 提供股票搜索、公司资料和市场新闻
  • 免费版本可能返回延迟行情
  • 需要注意速率限制

TradingView

  • 提供可嵌入的图表、热力图、行情等小部件
  • 外部图片来自 i.ibb.co

Better Auth + MongoDB

  • 邮箱/密码认证
  • MongoDB 适配器用于会话存储
  • 大多数路由受保护,除了登录/注册页面

Inngest 工作流

  • 用户创建事件 → AI 个性化欢迎邮件
  • 定时任务 (每日中午12点) → 发送新闻摘要邮件
  • 本地开发使用 npx inngest-cli@latest dev

邮件发送(Nodemailer)

  • 使用 Gmail 作为传输方式
  • 提供欢迎邮件和新闻摘要模板
  • 建议生产环境使用专业 SMTP 服务

可用脚本

  • pnpm dev - 启动开发服务器(Turbopack)
  • pnpm build - 生产环境构建
  • pnpm start - 启动生产服务器
  • pnpm lint - 运行 ESLint
  • pnpm test:db - 验证数据库连接

开发者体验

  • TypeScript 严格模式
  • Tailwind CSS v4(无需单独配置文件)
  • shadcn/ui 组件库
  • cmdk 命令面板
  • next-themes 主题切换
  • lucide-react 图标

Open Dev Society 宣言

我们生活在一个知识被付费墙隐藏的世界,工具被锁定在订阅服务中,信息被偏见扭曲,新手被告知他们"不够好"无法构建。

我们的信念:

  • 技术应该属于每个人
  • 知识应该是开放、免费和可访问的
  • 社区应该以信任而非门槛来欢迎新手

我们的使命:

  • 构建真正有用的免费开源项目
  • 专业人士和学生都可以无障碍使用的工具
  • 学习永远免费的知识平台
  • 引导而非评判初学者的社区
  • 基于信任而非利润运行的资源

我们的承诺:

  • 永远不会锁定知识
  • 永远不会收取访问费用
  • 永远不会用信任换取金钱
  • 在透明度、捐赠和社区力量的基础上运行

贡献指南

欢迎所有人贡献!无论你是学生、自学开发者还是资深工程师。

  • 通过 Issue 讨论想法和 Bug
  • 寻找标记为 "good first issue" 或 "help wanted" 的问题
  • 保持 PR 专注,UI 变更请附上截图
  • 友善待人,引导初学者,拒绝门槛 - 这就是 ODS 之道

安全性

如果发现安全漏洞:

  • 不要公开提交 Issue
  • 发送邮件至:opendevsociety@cc.cc
  • 我们会协调负责任的披露并快速修补

许可证

OpenStock 采用 AGPL-3.0 许可证。如果你修改、重新分发或部署它(包括作为 Web 服务),你必须在相同许可证下发布你的源代码并注明原作者。

致谢

  • Finnhub - 提供可访问的市场数据
  • TradingView - 提供可嵌入的市场小部件
  • shadcn/ui, Radix UI, Tailwind CSS, Next.js 社区
  • Inngest - 可靠的后台任务和工作流
  • Better Auth - 简单安全的认证
  • 所有让开源工具成为可能的贡献者

特别感谢 Adrian Hajdin (JavaScript Mastery),他出色的股票市场应用教程为 Open Dev Society 构建 OpenStock 提供了重要帮助。

构建于开放,为每个人,永远免费。—— Open Dev Society

项目地址: https://github.com/Open-Dev-Society/OpenStock

Star History Chart