# stocknear/frontend architecture

> Architecture diagram of the GitHub repository stocknear/frontend, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/stocknear/frontend
- Repository: https://github.com/stocknear/frontend

## Overview

Stocknear is a financial-market research web application: users explore stock and ETF data, market activity, options, earnings and analyst research, then save assets, manage alerts or portfolios, and use AI chat. The route tree and component names show these product areas; sampled handlers confirm selected chat, watchlist, alert, account and payment behavior. Many page-to-API connections and unsampled integrations are not shown because their wiring could not be verified.

Main entry points: [`src/lib/pocketbase.ts`](https://github.com/stocknear/frontend/blob/main/src/lib/pocketbase.ts) (PocketBase), [`src/routes/api/chat/+server.ts`](https://github.com/stocknear/frontend/blob/main/src/routes/api/chat/%2Bserver.ts) (Chat generation), [`src/routes/alerts/+page.server.ts`](https://github.com/stocknear/frontend/blob/main/src/routes/alerts/%2Bpage.server.ts) (Price alerts), [`src/routes/api/process-price-alert-triggers/+server.ts`](https://github.com/stocknear/frontend/blob/main/src/routes/api/process-price-alert-triggers/%2Bserver.ts) (Alert processing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_research["Market research"]
  node_home["Market dashboard<br/>[+page.svelte]"]
  node_stock["Stock research<br/>[+page.svelte]"]
  node_etf["ETF research<br/>[+page.svelte]"]
  node_calendar["Market calendars<br/>[+page.svelte]"]
  node_analysts["Analyst research<br/>[+page.svelte]"]
end

subgraph group_options["Options and flow"]
  node_options_ui["Options research<br/>[+page.svelte]"]
  node_options_api["Options data APIs<br/>[+server.ts]"]
  node_option_screener["Options screeners<br/>[+page.svelte]"]
end

subgraph group_personal["Personal tools"]
  node_watchlist_page["Watchlists<br/>[+server.ts]"]
  node_watchlist_update["Watchlist updates<br/>[+server.ts]"]
  node_portfolio["Portfolios<br/>[+server.ts]"]
  node_alerts_page["Price alerts<br/>[+page.server.ts]"]
  node_alert_triggers["Alert processing<br/>[+server.ts]"]
  node_push_api["Push delivery<br/>[+server.ts]"]
end

subgraph group_platform["App platform"]
  node_chat_ui["AI chat<br/>[+page.svelte]"]
  node_chat_api["Chat generation<br/>[+server.ts]"]
  node_chat_validation["Chat validation<br/>[chatValidation.ts]"]
  node_generation_state["Generation state"]
  node_pb[("PocketBase<br/>[pocketbase.ts]")]
end

subgraph group_account["Accounts and plans"]
  node_login["Sign in<br/>[+page.server.ts]"]
  node_register["Registration<br/>[+page.server.ts]"]
  node_profile["Account profile<br/>[+page.server.ts]"]
  node_payment["Subscription events<br/>[+server.ts]"]
end

node_user(("Investor"))
node_lemon["Lemon Squeezy"]
node_market_data["Market data"]

node_user -->|"opens dashboard"| node_home
node_user -->|"researches ticker"| node_stock
node_user -->|"researches ETF"| node_etf
node_user -->|"checks events"| node_calendar
node_user -->|"reviews analysts"| node_analysts
node_user -->|"explores options"| node_options_ui
node_user -->|"screens options"| node_option_screener
node_user -->|"asks questions"| node_chat_ui
node_user -->|"manages watchlist"| node_watchlist_page
node_user -->|"views portfolio"| node_portfolio
node_user -->|"manages alerts"| node_alerts_page
node_user -->|"signs in"| node_login
node_user -->|"creates account"| node_register
node_user -->|"manages account"| node_profile
node_options_api -->|"reads and writes"| node_pb
node_watchlist_update -->|"reads and writes"| node_pb
node_alerts_page -->|"cleans alert records"| node_pb
node_alerts_page -->|"loads via API"| node_alert_triggers
node_alert_triggers -->|"reads alert state"| node_pb
node_alert_triggers -->|"dispatches push"| node_push_api
node_push_api -->|"reads subscriptions"| node_pb
node_chat_api -->|"validates messages"| node_chat_validation
node_chat_api -->|"tracks generation"| node_generation_state
node_chat_api -->|"reads and saves chats"| node_pb
node_login -->|"authenticates users"| node_pb
node_register -->|"creates users"| node_pb
node_profile -->|"manages account data"| node_pb
node_payment -->|"updates subscription"| node_pb
node_lemon -.->|"sends webhook"| node_payment
node_market_data -.->|"provides market data"| node_stock

click node_home "https://github.com/stocknear/frontend/blob/main/src/routes/%2Bpage.svelte"
click node_stock "https://github.com/stocknear/frontend/blob/main/src/routes/chart/%5Bslug%5D/%2Bpage.svelte"
click node_etf "https://github.com/stocknear/frontend/blob/main/src/routes/etf/%5BtickerID%5D/%2Bpage.svelte"
click node_calendar "https://github.com/stocknear/frontend/blob/main/src/routes/earnings-calendar/%2Bpage.svelte"
click node_analysts "https://github.com/stocknear/frontend/blob/main/src/routes/analysts/%2Bpage.svelte"
click node_options_ui "https://github.com/stocknear/frontend/blob/main/src/routes/etf/%5BtickerID%5D/options/%2Bpage.svelte"
click node_options_api "https://github.com/stocknear/frontend/blob/main/src/routes/api/options-flow-feed/%2Bserver.ts"
click node_option_screener "https://github.com/stocknear/frontend/blob/main/src/routes/covered-call-screener/%2Bpage.svelte"
click node_chat_ui "https://github.com/stocknear/frontend/blob/main/src/routes/chat/%2Bpage.svelte"
click node_chat_api "https://github.com/stocknear/frontend/blob/main/src/routes/api/chat/%2Bserver.ts"
click node_chat_validation "https://github.com/stocknear/frontend/blob/main/src/lib/server/chatValidation.ts"
click node_generation_state "https://github.com/stocknear/frontend/blob/main/src/lib/server/chatGenerationRegistry.ts"
click node_watchlist_page "https://github.com/stocknear/frontend/blob/main/src/routes/api/create-watchlist/%2Bserver.ts"
click node_watchlist_update "https://github.com/stocknear/frontend/blob/main/src/routes/api/update-watchlist/%2Bserver.ts"
click node_portfolio "https://github.com/stocknear/frontend/blob/main/src/routes/api/get-portfolio/%2Bserver.ts"
click node_alerts_page "https://github.com/stocknear/frontend/blob/main/src/routes/alerts/%2Bpage.server.ts"
click node_alert_triggers "https://github.com/stocknear/frontend/blob/main/src/routes/api/process-price-alert-triggers/%2Bserver.ts"
click node_push_api "https://github.com/stocknear/frontend/blob/main/src/routes/api/sendPushSubscription/%2Bserver.ts"
click node_login "https://github.com/stocknear/frontend/blob/main/src/routes/login/%2Bpage.server.ts"
click node_register "https://github.com/stocknear/frontend/blob/main/src/routes/register/%2Bpage.server.ts"
click node_profile "https://github.com/stocknear/frontend/blob/main/src/routes/profile/%2Bpage.server.ts"
click node_payment "https://github.com/stocknear/frontend/blob/main/src/routes/payment/%2Bserver.ts"
click node_pb "https://github.com/stocknear/frontend/blob/main/src/lib/pocketbase.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_home,node_stock,node_etf,node_calendar,node_analysts toneBlue
class node_options_ui,node_options_api,node_option_screener toneAmber
class node_watchlist_page,node_watchlist_update,node_portfolio,node_alerts_page,node_alert_triggers,node_push_api toneMint
class node_chat_ui,node_chat_api,node_chat_validation,node_generation_state,node_pb toneRose
class node_login,node_register,node_profile,node_payment,node_user,node_lemon,node_market_data toneIndigo
```

## Components

### Market research

- [Market dashboard](https://github.com/stocknear/frontend/blob/main/src/routes/%2Bpage.svelte): `src/routes/+page.svelte`
- [Stock research](https://github.com/stocknear/frontend/blob/main/src/routes/chart/%5Bslug%5D/%2Bpage.svelte): `src/routes/chart/[slug]/+page.svelte`
- [ETF research](https://github.com/stocknear/frontend/blob/main/src/routes/etf/%5BtickerID%5D/%2Bpage.svelte): `src/routes/etf/[tickerID]/+page.svelte`
- [Market calendars](https://github.com/stocknear/frontend/blob/main/src/routes/earnings-calendar/%2Bpage.svelte): `src/routes/earnings-calendar/+page.svelte`
- [Analyst research](https://github.com/stocknear/frontend/blob/main/src/routes/analysts/%2Bpage.svelte): `src/routes/analysts/+page.svelte`

### Options and flow

- [Options research](https://github.com/stocknear/frontend/blob/main/src/routes/etf/%5BtickerID%5D/options/%2Bpage.svelte): `src/routes/etf/[tickerID]/options/+page.svelte`
- [Options data APIs](https://github.com/stocknear/frontend/blob/main/src/routes/api/options-flow-feed/%2Bserver.ts): `src/routes/api/options-flow-feed/+server.ts`
- [Options screeners](https://github.com/stocknear/frontend/blob/main/src/routes/covered-call-screener/%2Bpage.svelte): `src/routes/covered-call-screener/+page.svelte`

### Personal tools

- [Watchlists](https://github.com/stocknear/frontend/blob/main/src/routes/api/create-watchlist/%2Bserver.ts): `src/routes/api/create-watchlist/+server.ts`
- [Watchlist updates](https://github.com/stocknear/frontend/blob/main/src/routes/api/update-watchlist/%2Bserver.ts): `src/routes/api/update-watchlist/+server.ts`
- [Portfolios](https://github.com/stocknear/frontend/blob/main/src/routes/api/get-portfolio/%2Bserver.ts): `src/routes/api/get-portfolio/+server.ts`
- [Price alerts](https://github.com/stocknear/frontend/blob/main/src/routes/alerts/%2Bpage.server.ts): `src/routes/alerts/+page.server.ts`
- [Alert processing](https://github.com/stocknear/frontend/blob/main/src/routes/api/process-price-alert-triggers/%2Bserver.ts): `src/routes/api/process-price-alert-triggers/+server.ts`
- [Push delivery](https://github.com/stocknear/frontend/blob/main/src/routes/api/sendPushSubscription/%2Bserver.ts): `src/routes/api/sendPushSubscription/+server.ts`

### App platform

- [AI chat](https://github.com/stocknear/frontend/blob/main/src/routes/chat/%2Bpage.svelte): `src/routes/chat/+page.svelte`
- [Chat generation](https://github.com/stocknear/frontend/blob/main/src/routes/api/chat/%2Bserver.ts): `src/routes/api/chat/+server.ts`
- [Chat validation](https://github.com/stocknear/frontend/blob/main/src/lib/server/chatValidation.ts): `src/lib/server/chatValidation.ts`
- [Generation state](https://github.com/stocknear/frontend/blob/main/src/lib/server/chatGenerationRegistry.ts): `src/lib/server/chatGenerationRegistry.ts`
- [PocketBase](https://github.com/stocknear/frontend/blob/main/src/lib/pocketbase.ts): `src/lib/pocketbase.ts`

### Accounts and plans

- [Sign in](https://github.com/stocknear/frontend/blob/main/src/routes/login/%2Bpage.server.ts): `src/routes/login/+page.server.ts`
- [Registration](https://github.com/stocknear/frontend/blob/main/src/routes/register/%2Bpage.server.ts): `src/routes/register/+page.server.ts`
- [Account profile](https://github.com/stocknear/frontend/blob/main/src/routes/profile/%2Bpage.server.ts): `src/routes/profile/+page.server.ts`
- [Subscription events](https://github.com/stocknear/frontend/blob/main/src/routes/payment/%2Bserver.ts): `src/routes/payment/+server.ts`

### Other components

- **Investor**
- **Lemon Squeezy**
- **Market data**

## Connections

- Investor → Market dashboard: opens dashboard
- Investor → Stock research: researches ticker
- Investor → ETF research: researches ETF
- Investor → Market calendars: checks events
- Investor → Analyst research: reviews analysts
- Investor → Options research: explores options
- Investor → Options screeners: screens options
- Investor → AI chat: asks questions
- Investor → Watchlists: manages watchlist
- Investor → Portfolios: views portfolio
- Investor → Price alerts: manages alerts
- Investor → Sign in: signs in
- Investor → Registration: creates account
- Investor → Account profile: manages account
- Options data APIs → PocketBase: reads and writes
- Watchlist updates → PocketBase: reads and writes
- Price alerts → PocketBase: cleans alert records
- Price alerts → Alert processing: loads via API
- Alert processing → PocketBase: reads alert state
- Alert processing → Push delivery: dispatches push
- Push delivery → PocketBase: reads subscriptions
- Chat generation → Chat validation: validates messages
- Chat generation → Generation state: tracks generation
- Chat generation → PocketBase: reads and saves chats
- Sign in → PocketBase: authenticates users
- Registration → PocketBase: creates users
- Account profile → PocketBase: manages account data
- Subscription events → PocketBase: updates subscription
- Lemon Squeezy → Subscription events: sends webhook
- Market data → Stock research: provides market data
