Back to tools

N3XMarket

A self-hosted US market research center for SEC filings, alerts and AI-assisted analysis.

SELF-HOSTED MARKET INTELLIGENCEv0.5.2

US markets under control. On your server.

N3XMarket brings quotes, shared watchlists, SEC filings, alerts and AI analysis into a modular workspace with dedicated pages and a per-user dashboard. Each person gets an individual account and role while portfolios and secrets remain on your server.

Encrypted keys configured in the web UI · no public PostgreSQL port · no telemetry

Managed hosting by N3X

Want to use it without maintaining the server?

N3X can deploy and maintain this application, from initial setup and SSL to updates, monitoring and backups.

Ask about N3X hosting

A research desk, not another colorful chart

AI Research Copilot

Balanced bull and bear cases, catalysts, risks and data gaps — without pretending to provide guaranteed recommendations.

Technical Lab

SMA, EMA, RSI, MACD, Bollinger, ATR, ADX/DMI, Stochastic, OBV, relative volume, levels and returns calculated locally from OHLCV.

SEC Intelligence

Recent 8-K, 10-Q, 10-K, Form 4 and other filings directly from official EDGAR sources.

Screener and trader workspace

A multi-factor watchlist screener, portfolio P/L and stop risk, an R:R journal, plus earnings and custom-event calendars.

24/7 alerts

A separate worker evaluates conditions and delivers notifications through 10 integrations, including Telegram, Discord, Slack, Teams, ntfy and Gotify.

Teams and secure self-hosting

Separate owner, administrator, analyst and read-only accounts, scrypt, server-side sessions, AES-256-GCM encryption and non-root containers.

DOCKER COMPOSE

Ready for your reverse proxy

The app does not force a certificate or DNS provider. After startup, the panel is immediately available on host port 8790 and ready for any reverse proxy.

1N3XMarket Web — dashboard, first setup, authentication and encrypted configuration
2N3XMarket Worker — alerts running around the clock
3PostgreSQL 17 — private records and analysis history
4Your reverse proxy — HTTPS and your own domain

DOCKER CONFIGURATOR

Compose tailored to your server

Set the domain, bind address, port and image version. The configurator continuously prepares a ready-to-use Docker Compose file and startup commands — without an .env file.

The domain must already point to your reverse proxy. Do not include https:// or a path.

The default 0.0.0.0 works from the LAN and from a proxy. Use 127.0.0.1 only when the proxy runs directly on the host and the port must not be reachable from the network.

The application port reachable by your reverse proxy. The default is 8790.

Keep latest to pull the newest release automatically, or pin a specific version.

Application setup stays in the web panel. After startup, open http://SERVER_IP:8790 and create the owner account immediately. Before exposing the port to the Internet, restrict it with a firewall or put it behind an HTTPS reverse proxy. Configure the data provider, AI, notifications, time zone and public URL later in the web panel.
Public address
https://market.example.com
First-run address
http://DOCKER_SERVER_IP:8790
Reverse proxy target
http://DOCKER_SERVER_IP:8790
Health check
http://127.0.0.1:8790/api/health

Ready-to-use docker-compose.yml

name: n3xmarket

# Infrastructure settings that cannot be changed safely by a running web app
# live in this file: image versions, host bind/port, Docker networks, volumes
# and database service identity. Provider keys, AI, alerts, public URL and time
# zone are configured after first start in the authenticated web panel.
# No .env values are referenced or required by this stack.

x-app-environment: &app-environment
  N3XMARKET_DATABASE_PASSWORD_FILE: /run/n3xmarket/database_password

x-app-security: &app-security
  read_only: true
  security_opt:
    - no-new-privileges:true
  cap_drop:
    - ALL
  tmpfs:
    - /tmp:size=64m,mode=1777
    # Next.js image optimization writes a runtime cache even with a read-only
    # root filesystem. Keep it writable, private and ephemeral.
    - /app/.next/cache:size=128m,mode=0700,uid=1001,gid=1001

services:
  bootstrap:
    image: alpine:3.22
    restart: "no"
    environment:
      # Upgrade from N3XMarket 0.1 only: put the former PostgreSQL password
      # between these single quotes for the first upgraded start, then change
      # it back to an empty string. New installations must leave this empty.
      LEGACY_POSTGRES_PASSWORD: ''
    command:
      - /bin/sh
      - -ec
      - |
        umask 077
        if [ -n "$${LEGACY_POSTGRES_PASSWORD:-}" ]; then
          printf '%s' "$$LEGACY_POSTGRES_PASSWORD" > /run/n3xmarket/database_password
        elif [ ! -s /run/n3xmarket/database_password ]; then
          od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xmarket/database_password
        fi
        if [ ! -s /run/n3xmarket/settings_key ]; then
          od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xmarket/settings_key
        fi
        chmod 0444 /run/n3xmarket/database_password /run/n3xmarket/settings_key
    volumes:
      - runtime_secrets:/run/n3xmarket
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL

  web:
    image: ghcr.io/nexitpl/n3xmarket:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xmarket:ro
    ports:
      # Ready for first-run access from the LAN and for a reverse proxy in
      # another container or host. Restrict 8790 with the host firewall and
      # create the owner account before exposing this port to the Internet.
      - "0.0.0.0:8790:3000"
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:3000/api/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - frontend
      - backend
    <<: *app-security

  worker:
    image: ghcr.io/nexitpl/n3xmarket:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
      web:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xmarket:ro
    command: ["node", "dist/worker.mjs"]
    networks:
      - backend
    <<: *app-security

  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
    environment:
      POSTGRES_DB: n3xmarket
      POSTGRES_USER: n3xmarket
      POSTGRES_PASSWORD_FILE: /run/n3xmarket/database_password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - runtime_secrets:/run/n3xmarket:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n3xmarket -d n3xmarket"]
      interval: 5s
      timeout: 5s
      retries: 12
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true

volumes:
  postgres_data:
  runtime_secrets:

Start and health check

mkdir -p n3xmarket
cd n3xmarket
# Save the copied configuration as docker-compose.yml
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8790/api/health
Important: N3XMarket is a research tool, not an investment adviser. Coverage, delay and usage rights depend on the selected provider plan. AI can be wrong — verify every thesis against primary sources.