Open-Dev-Society/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.
OpenStock은 Next.js와 MongoDB, Finnhub, TradingView를 조합해 주가 검색·관심 종목·기업 정보·시장 뉴스·알림을 제공하는 오픈소스 주식 시장 앱입니다. 이메일 인증과 개인화 뉴스 요약, Docker 실행을 지원하지만 데이터 지연과 거래소별 제공 범위는 각 공급자 정책의 영향을 받습니다.
AI 요약
OpenStock은 비싼 시장 정보 플랫폼의 대안으로 제시된 오픈소스 주식 시장 애플리케이션입니다. 사용자는 종목을 검색하고, 개인별 관심 종목 목록을 관리하며, 기업 정보와 재무 데이터, 차트, 시장 뉴스, 시장 개요를 한 화면에서 확인할 수 있습니다. 프로젝트는 커뮤니티가 함께 구축하는 무료 도구이며, 자체적으로 증권사나 브로커리지(brokerage)가 아닙니다. 따라서 화면에 표시되는 시장 데이터는 공급자 정책과 설정에 따라 지연될 수 있고, 프로젝트도 이를 금융 조언으로 보지 않는다고 명시합니다.
■ 기술 스택과 애플리케이션 구조
핵심 프레임워크는 Next.js 15의 App Router와 React 19이며, TypeScript를 중심으로 작성되어 있습니다. 저장소의 언어 구성은 TypeScript 약 93.4%, CSS 약 6%, JavaScript 약 0.6%입니다. UI는 Tailwind CSS v4와 shadcn/ui, Radix UI primitives를 조합하고, Lucide 아이콘과 next-themes를 사용합니다. Tailwind CSS v4는 별도의 tailwind.config 파일 대신 @tailwindcss/postcss 기반으로 설정합니다. 검색과 빠른 동작을 위한 command palette는 cmdk로 구현하며, Cmd/Ctrl + K 단축키로 호출할 수 있습니다.
인증은 Better Auth의 이메일·비밀번호 방식을 사용하고 MongoDB adapter로 연결합니다. MongoDB와 Mongoose가 영속 저장소를 담당하며, Next.js middleware로 보호된 라우트를 검사합니다. 공개 예외는 로그인·회원가입 페이지와 정적 자산, Next.js 내부 경로이며, 대부분의 애플리케이션 경로는 세션 검증을 거칩니다. 사용자별 watchlist는 MongoDB에 저장되고, 한 사용자 안에서는 종목 심볼이 중복되지 않도록 구성되어 있습니다.
■ 시장 데이터와 주요 기능
종목 검색, 기업 프로필, 시장 뉴스는 Finnhub API를 사용합니다. 검색창은 입력을 지연 처리하는 debounced querying을 적용하며, 사용자가 입력하지 않을 때는 인기 종목을 보여줍니다. 종목 상세 화면에서는 TradingView 위젯을 이용해 심볼 정보, 캔들스틱·고급 차트, baseline 차트, 기술적 지표, 기업 프로필과 재무 정보를 표시합니다. 시장 개요 화면에는 TradingView의 heatmap, quote, 주요 스토리 위젯을 배치합니다.
선택적으로 Adanos API를 연동하면 Reddit, X.com, 뉴스, Polymarket을 가로지르는 구조화된 sentiment snapshot을 종목 상세 화면의 감성 정보 카드에 표시할 수 있습니다. 이 기능은 Finnhub이나 TradingView를 대체하지 않고 추가적인 sentiment 정보로 사용됩니다. 사용자가 가입할 때는 국가, 투자 목표, 위험 감수 수준, 선호 산업을 입력하는 개인화 온보딩을 진행합니다.
이메일과 백그라운드 작업에는 Inngest와 Nodemailer를 사용합니다. 사용자가 생성되면 app/user.created 이벤트를 기반으로 Gemini를 활용한 개인화 환영 이메일을 만들 수 있습니다. 또한 cron 표현식 0 12 * * *으로 매일 뉴스 요약을 실행하며, 사용자의 watchlist에 맞춰 개인화된 뉴스 이메일을 보냅니다. AI 공급자는 기본적으로 Gemini를 사용하고, 설정에 따라 MiniMax와 Siray를 지원합니다. Gmail transport를 사용하는 Nodemailer 설정은 다른 SMTP 공급자로 바꿀 수 있으며, 프로젝트는 운영 환경에서 개인 Gmail보다 전용 SMTP 공급자를 선호하라고 안내합니다.
■ 지원 시장과 데이터 제공 범위
OpenStock은 NSE, LSE, TSX 등을 포함한 30개 이상의 국제 주식 거래소를 지원한다고 설명합니다. 다만 지원 범위는 실제로 연결된 데이터 공급자의 제약을 받습니다. Finnhub은 대부분의 글로벌 거래소를 지원하지만, TradingView 무료 요금제는 인도 NSE와 베트남 등 일부 신흥 시장에 제한이 있을 수 있습니다. 무료 요금제에서는 미국 이외 종목의 실시간 데이터가 15분 이상 지연될 수 있으며, Finnhub 역시 무료 플랜에서 지연 시세를 반환하거나 요청량 제한을 적용할 수 있습니다. 프로젝트는 전체 거래소 목록과 알려진 제한, 특정 심볼에 “This symbol is only available on TradingView”가 표시되는 이유를 별도의 MARKET_SUPPORT.md에서 설명하도록 구성했습니다.
■ 로컬 실행과 Docker 구성
개발자는 Node.js 20 이상과 pnpm 또는 npm, MongoDB 연결 문자열, Finnhub API 키를 준비해야 합니다. 저장소를 clone한 뒤 의존성을 설치하고 .env 파일을 작성한 다음 pnpm test:db 또는 npm run test:db로 데이터베이스 연결을 확인합니다. 이후 pnpm dev 또는 npm run dev로 Next.js 개발 서버를 실행하며, 기본 접속 주소는 http://localhost:3000입니다. Inngest의 워크플로, cron, AI 기능을 로컬에서 확인하려면 npx inngest-cli@latest dev를 별도로 실행해야 합니다. 운영 빌드는 pnpm build && pnpm start 또는 npm run build && npm start로 실행합니다.
Docker Compose에는 애플리케이션과 MongoDB 두 서비스가 포함되어 있습니다. MongoDB는 mongo:7 이미지를 사용하고 root 계정과 영속 볼륨을 설정합니다. 로컬 Compose 네트워크에서는 MONGODB_URI를 mongodb://root:example@mongodb:27017/openstock?authSource=admin으로 지정해야 하며, root 사용자를 이용할 때 authSource=admin이 필요합니다. mongodb 서비스를 먼저 시작한 뒤 docker compose up -d --build로 애플리케이션을 올릴 수 있고, mongo-data 볼륨을 통해 재시작 이후에도 데이터가 유지됩니다. 프로젝트는 Dockerfile에 비밀값을 하드코딩하지 말고 .env와 Compose 설정을 사용하라고 안내합니다.
■ 환경 변수와 배포 시 주의점
필수 설정에는 NODE_ENV, MONGODB_URI, BETTER_AUTH_SECRET, BETTER_AUTH_URL, Finnhub API 키와 기본 API 주소가 포함됩니다. Vercel 배포에서는 NEXT_PUBLIC_FINNHUB_API_KEY가 필요하다고 설명하지만, NEXT_PUBLIC_ 접두사가 붙은 값은 브라우저에 노출될 수 있으므로 비밀 키를 서버 측에 유지해야 합니다. 선택 기능에는 ADANOS_API_KEY, GEMINI_API_KEY, MINIMAX_API_KEY, INNGEST_SIGNING_KEY가 있으며, 이메일 발송에는 NODEMAILER_EMAIL과 NODEMAILER_PASSWORD가 사용됩니다. Atlas 연결 문자열을 사용할 수도 있고, Docker Compose의 로컬 MongoDB를 사용할 수도 있습니다.
■ 라이선스와 기여 방식
OpenStock은 AGPL-3.0으로 배포됩니다. 프로젝트를 수정하거나 재배포하거나 웹 서비스로 배포하는 경우에도 같은 라이선스로 소스 코드를 공개하고 원저작자를 표시해야 합니다. 기여자는 이슈에서 아이디어와 버그를 논의하고, good first issue나 help wanted 항목을 찾으며, 변경 범위를 집중한 PR과 스크린샷을 제출하도록 안내받습니다. 보안 취약점은 공개 이슈로 올리지 않고 [email protected]로 책임 있는 공개 절차를 요청해야 합니다. 저장소에는 애플리케이션 전체를 개발한 ravixalgorithm, 로고를 만든 Priyanshuu00007, Docker 구성을 담당한 chinnsenn 등의 기여자가 기록되어 있습니다.
원문: GitHub / 번역·요약: Trawling