OpenTraderWorld
Your trading workspace, on your own machine.
A free, self-hosted platform that bundles the tools traders and investors actually use: trading journal, market data and backtesting, portfolios, news, planning. Your data stays on your machine. And if you want it, your own AI agent runs the whole thing alongside you.
Website · Documentation · Install in 2 minutes · Module tour · Suggest a feature · Hosting it
▶ Try the live demo
No account, no install, already full of realistic data. It is a shared sandbox, wiped every 15 minutes.
Nobody needs a new Bloomberg Terminal
Every few weeks another product promises to be "the Bloomberg Terminal for the rest of us". It is the wrong target, because Bloomberg does not sell software.
- A Bloomberg Terminal costs roughly $30,000 per user per year, on two-year contracts. LSEG Workspace, ex-Refinitiv Eikon, sits around $22,000 for the full tier.
- What that money buys is immediacy and access: news in under a second, dealer runs, liquidity, and a closed chat network holding the people on the other side of your trade.
- The screens, the charts, the functions are the wrapper. Nobody signs a $30k contract for the UI.
OpenTraderWorld is not trying to be the next Bloomberg Terminal. It is the workspace around your own decisions: your journal, your portfolios, your backtests, your research, your automations, enhanced by your favorite AI model. Free, on your machine, with the data providers you already pay for (or the free ones).
Why OpenTraderWorld?
- 🆓 Free. No subscription, no paywall, no "pro tier". Free for everyone, whether you trade for a living or on the side. The idea behind it: get profitable before spending a dime.
- 🔒 Private and self-hosted. It runs on your computer or your server with Docker. No account, no cloud, no telemetry. Right after install it only answers on localhost, until you decide otherwise.
- 🧩 Modular. 25+ modules. Install what you use, detach the rest.
- 🔁 Updated constantly. New modules and improvements land regularly. The app tells you when a version is out, updating is a couple of commands it shows you, and your data always survives the upgrade.
- 🗳️ Built with its users. Feature ideas come from the people using it. Suggest yours, vote on other people's, watch the roadmap move. See Contributing ideas.
- 🌍 7 languages. English, French, German, Spanish, Italian, Portuguese, Chinese.
- 🤖 AI built in, on your terms. There is a built-in assistant that chats with your own data. You bring the provider (Anthropic, or any OpenAI-compatible endpoint), and it gets memory, skills and tool access scoped by token. There is also a built-in MCP server, so external agents can read or update your modules through that same token-scoped gateway. Both are off until you turn them on. Your keys are encrypted at rest and never reach the browser.
- ⚙️ Automate as much or as little as you like. The automator turns your routines into scheduled workflows: imports, reports, market scans, alerts, daily reviews. Any of them can hand a step to your own AI model, or be driven by it from end to end. You stay in charge the whole way: nothing runs, sends or writes anything you did not switch on yourself.
- 🔑 Secrets stay sealed. An encrypted Vault holds the credentials the app needs on your behalf. Encrypted at rest, write-only once saved, and plugged into any module by reference so you never paste them twice.
Quick start
You need Docker (macOS, Linux or Windows).
curl -fsSL https://raw.githubusercontent.com/G-OTW/OpenTraderWorld/master/install.sh | bash
The installer asks a few questions, generates strong secrets, pulls the prebuilt images and starts the stack, creates your admin account and prints its password once. Then open http://localhost:5454 and sign in. If you want the long version (manual setup, headless servers, LAN/HTTPS/public exposure, backups), it is all in the documentation.
[!TIP] Prefer to be walked through it? The guided install on the website takes you through it step by step.
If the page won't load over plain HTTP. Browsers with HTTPS-only mode (Chrome/Edge HTTPS-First, Firefox HTTPS-Only, Safari) rewrite
http://intohttps://and then cache that redirect, so a LAN install answers nothing at all. Open the address in a private window to confirm that is what is happening, then allow HTTP for that host. Or switch to the LAN + HTTPS mode in Settings → Network and get a real certificate.
A look inside
Every image below is the real app, captured from a local install. Prices, news and backtests are real; the journal, portfolio and fundamentals figures are sample data. The images follow your GitHub theme, light or dark.
Dashboard
Workspaces for each hat you wear (investor, trader, quant, portfolio), built from widgets: net worth, positions, live quotes, headlines, upcoming macro releases, goals. Rearrange them or add your own.
Charts
Up to twelve linked charts per workspace, drawing tools, built-in studies and alerts. Paste a Pine Script v5/v6 indicator once, keep it in your library, and add it to any chart.
Trade from the chart (experimental): send, move and cancel orders and close positions on Interactive Brokers, Binance, Binance USDⓈ-M Futures and the app's own paper trading account, with your own risk limits and a kill switch. A live account takes orders only once you turn live trading on for it, with its limits set. See Trading from the chart.
[!WARNING] Chart trading is new. It is heavily tested, against simulated venues and the brokers' own test environments, but bugs can remain. Check every order at your broker, start small, and trade at your own risk.
Backtest
Load a saved strategy, pick a dataset, run. The report puts every trade on the chart, with the figures that matter next to buy and hold. Shown here: an EMA 21/55 crossover on ten years of AAPL daily bars, +375% against +1,217% for buy and hold. The engine does not flatter a strategy.
Trading Journal
Your trades with their equity curve, win rate, profit factor, Sharpe and drawdown, filtered by side, ticker, strategy, class or tag. R-multiple analytics, behaviour patterns and a PnL calendar sit one click away.
Portfolio Tracker
Holdings priced daily, cost basis, unrealized and realized P/L, allocation by asset or class, and the full ledger of operations behind them.
Quant Tools
The risk profile of any stored dataset: volatility, drawdown, value at risk, expected shortfall and the return distribution. Then correlation, efficient frontier, position sizing and derivatives in the next tabs.
Fundamentals
Macro series from central banks and statistics offices, charted together with recession shading. Company statements, filings, ETFs, a market calendar and alternative data live in the next tabs.
News
Your RSS and JSON-API feeds in one stream, polled on a schedule, searchable and filterable by source.
Automator
Chain blocks into a workflow: a call to the app's own API or any URL, an AI step, a condition, a notification. Put it on a schedule and read every run afterwards.
Trading Routines
Pre-market, in-session and review checklists, each step with its own how-to, tracked by week, month and year.
Upgrading
Settings → Update app tells you when a new version is out. The app cannot update itself (it has no shell or Docker access, by design), so run these on the host. Take a database backup first; migrations run automatically on the new container's first boot.
A default install (prebuilt images, no git checkout) refreshes deploy/ from the latest
release (the public master), then pulls the new images. Your .env, network.env and dns.env are left alone.
cd /path/to/opentraderworld
TMP=$(mktemp -d)
curl -fsSL https://codeload.github.com/G-OTW/OpenTraderWorld/tar.gz/master | tar -xz -C "$TMP"
cp -R "$TMP"/*/deploy/. deploy/
rm -rf "$TMP"
docker compose -f deploy/docker-compose.yml -f deploy/docker-compose.images.yml \
--env-file deploy/.env --env-file deploy/network.env \
pull
docker compose -f deploy/docker-compose.yml -f deploy/docker-compose.images.yml \
--env-file deploy/.env --env-file deploy/network.env \
up -d
A source build (installed with --build, from a full clone) refreshes the checkout and
rebuilds. Releases are fresh snapshots, so reset to the release rather than git pull.
git reset --hard discards any local edits to tracked files.
cd /path/to/OpenTraderWorld
git fetch origin
git reset --hard origin/master
docker compose -f deploy/docker-compose.yml \
--env-file deploy/.env --env-file deploy/network.env \
up -d --build
Try it without installing
There is a public sandbox at demo.opentraderworld.com, also linked from the website. No account, no install, and it comes seeded with realistic data so you land in an instance that looks used rather than empty.
One thing to keep in mind: it is shared. Everything you type is visible to other visitors, the whole database is wiped and re-seeded every 15 minutes, connectors are read-only, and settings, the Vault, broker accounts, notification channels and paper trading are disabled. It runs on a small free-tier server with free AI models, so it is slower than a local install. For anything real, install it. Two minutes.
What's inside
Every module ships with the app. Install what you use, detach the rest.
Trading
Market data and analysis
Portfolios and money
News and research
Notes and organization
AI
The full tour, with details, is in the module docs.
Backtesting: signals, grid, DCA
One engine, three ways to describe a strategy. No code.
- Signals. Entry and exit rules from indicators, price and values, long or short, with stops, pyramiding, and sizing by fixed quantity, percent of equity, risk per trade, Kelly or equity tiers. Build your own indicators, and the chart draws the same ones.
- Grid. A ladder of levels between two bounds, long, short or neutral. Each cell buys low and sells one level up.
- DCA. A weighted basket bought over time, never rebalanced: recurring contributions, buy tranches on a dip, sell rules on a gain objective. Measured like a savings plan, with IRR and a deposit-adjusted drawdown.
Run any of them on one instrument or a whole portfolio, with exposure limits and a per-asset breakdown.
Optimizer
Take a run and vary its parameters: indicator lengths, thresholds, stops, sizing, costs, portfolio limits, grid settings, DCA amounts, excluded weekdays. Each gets a from / to / step.
- It prices the job first, from what past runs measured on your own machine. Stop at any point and keep what is computed.
- Rank on Sharpe, Sortino, return, net PnL, profit factor, win rate, expectancy, average trade, drawdown or trades. Any column re-sorts after, except the out-of-sample return: it is shown, never ranked.
- The spread matters more than the winner: worst, average, best, and how many variants came out positive. One good number surrounded by terrible neighbours is noise.
- A multiple-testing haircut puts the best Sharpe against the bar the best of N worthless strategies would clear anyway. Below it, the winner is explained by the number of tries.
- Click any variant to read its full backtest. Nothing is stored until you keep it.
Add an in-sample / out-of-sample split and the two stat blocks sit side by side. A wide gap between them is overfitting.
Paper trading: the backtest, left running forward
Press one button on a run you like and it keeps going on new candles. There is no second engine and no serialized simulator to drift: each tick reloads the window, runs the ordinary backtest, and diffs the trades against what is already stored. A session opened from a result reproduces that result exactly.
- Its own schedule: every N minutes, daily, weekly, monthly or once, in your timezone.
- Live alerts on entries and exits, or a period summary instead. Alert on every tick, only when something changed, or never.
- Summary cadence: on each tick, hourly, daily or weekly. Entry and exit alerts always leave on the tick that produced them; turn them off to get only the summary.
- Your wording, not ours. Entry, exit and summary messages are templates you write, with a preview against a sample trade before you save.
- Anything the app could not deliver waits in the session inbox. You read it at the next login.
Filter alerts down to the tickers you care about, and pick which channels a session pushes to.
Data connectors
One connector list for the whole app. A connector is a provider account, its credentials (typed in or plugged from the encrypted Vault, write-only once saved), an optional request limit, and the modules allowed to use it. Modules have no provider settings of their own.
Every provider connects directly, with an API key or none at all. Interactive Brokers is the exception: you run IB Gateway or TWS yourself and the connector stores a host and a port. OANDA, TradeStation, FOREX.com and Capital.com are broker feeds: they read the prices of the account you already have there, so they ask for that account's credentials. Details in the connectors guide.
Live feeds
Every timeframe a provider downloads, it also streams, daily and weekly included. A provider that publishes one grain (Alpaca, Massive, Interactive Brokers) has the larger timeframes folded from it, and a session-shaped candle (daily, weekly) is re-read from the provider once it closes.
OANDA, TradeStation and FOREX.com download history but do not stream: their live prices are not served over a WebSocket. A chart can draw the live best bid and ask as two lines, and paper trading fills on them.
Missing a provider? Ask for it and it gets added.
Broker accounts
A broker account links to the place you trade, and only reads by default. It imports your fills into the journal, aligns a portfolio on what the account holds, draws positions and working orders on the chart, and reads a tax year. It sends orders only where the broker takes them and you turn Trading on for the account (experimental).
Where a broker issues a view-only key, the form asks for that one. Journal imports from Interactive Brokers go through the Flex account. A live account trades only once you turn Live trading on for it, which requires a size limit per order, a size limit per position and a loss limit. Details in the broker accounts guide.
Fundamentals
Macro series, company statements, SEC filings, earnings-call transcripts, ETF holdings, a market calendar and alternative data, read from the sources that publish them and stored in your own database. Every source is a data connector granted to the module; nothing is fetched until you add one. When several providers serve the same data, they are tried in the order you set.
Prices and market ratios come from any market-data connector with daily equity bars. Details in the Fundamentals guide.
Notifications
These are the notification methods available today. More are planned: if your preferred one is missing, ask for it.
Secrets are sealed on save and never shown again. What can notify you: chart alerts and broker reconcile notices, paper trading sessions, watchlist alerts, reminders, finished or parked data downloads, fundamentals refreshes, new mail, journal, portfolio and tax imports, live feed outages, sign-in alerts, inbound webhooks, and any automator workflow. Everything is off until you switch it on, and in-app notifications work without configuring a single channel.
Voice control
Push to talk, never always listening: the microphone opens while you hold a shortcut (or click the mic in the top bar) and closes when you release.
- Command mode (
Alt+V): what you say becomes a plan. "open journal" works out of the box in seven languages; anything no command matches can go to the AI agent. - Dictation mode (
Alt+Shift+V): what you say is typed into the focused text field, never read as a command. - Voice commands: a phrase you choose runs a sequence of steps (open a page, ask the agent, run an Automator workflow, switch theme, hide figures, speak a sentence). Say several in one go, "turtle, then open settings", and they run in order.
- Confirmation first: every plan is shown before it runs, unless you mark a command to skip it (off by default). A phrase fires only on its own, never as a word inside a sentence.
Speech engines work like the other brokers: one list in Settings → Voice, keys sealed or plugged from the Vault.
The browser only allows the microphone over HTTPS or on localhost. Details in the voice control guide.
⭐ Enjoying it? Help it grow
OpenTraderWorld is free and built in the open. If it is useful to you, the easiest way to give back costs nothing:
- Star the repo. It is a quick signal, and it helps other people find the project.
- Share it. A word to a fellow trader, a link in your community, a mention anywhere. It helps more than you would think.
No pressure. Even just trying it out and telling a friend means a lot. 🙏 Got ideas, or found a bug? See Suggest, vote, contribute below.
💡 Suggest, vote, contribute
This project grows on user feedback:
- Suggest a feature or a module. Head to opentraderworld.com/suggestions and describe what you are missing and how you would use it.
- Vote. 👍 the suggestions you want most on the website. Popular requests get prioritized.
- Report bugs. Open an issue with the symptom and a few log lines.
- Write for the community. Guides written in the app's Editor can be submitted for publication in the shared Community Docs library, where every install can read them.
Project links
Under the hood
OpenTraderWorld/
├── install.sh # one-command installer (fetches deploy/, runs setup)
├── deploy/ # docker-compose stack, setup.sh, Caddy config
├── core/ # Rust workspace (API, store, scheduler, feeds…)
├── frontend/ # SvelteKit app (modules UI)
├── docs/ # documentation site (VitePress)
├── scripts/ # validation and parity checks
└── testbook/ # non-regression run against a throwaway instance
Status
Actively developed. It is usable today and moving fast. Check Settings → Update app in the app to know when a new version is out.
Disclaimer
This software is for educational and informational purposes only. It is not financial, investment, or trading advice. USE IT AT YOUR OWN RISK. The author and any affiliates accept no responsibility for your trading or investment results, or for any loss or damage arising from use of this software. Never risk money you cannot afford to lose. There will be bugs: the software is provided "as is", without warranty of any kind. You alone are responsible for how you use it and for the decisions you make with it.
License
FSL-1.1-MIT (Functional Source License). Free for everyone, including commercial use, self-hosting at work, modification, redistribution and forks. The one thing it does not grant is a Competing Use: selling the software, or offering it to others as a paid product or a hosted service. Each release turns into plain MIT two years after it is published.