Chart
Browse any ticker, any timeframe. Configurable moving averages, ADR and ATR overlays, secondary chart for market context, drawing tools, log/linear scale.
PivBO is “coffeeware”: completely FREE and open source, running purely on donated caffeine.
Study momentum setups on historical US equities. Replay any ticker one bar at a time, manage positions with full risk discipline, and challenge a friend to a timed head-to-head duel.
A self-hosted environment for everything before you put real money on a setup: chart it, replay it, duel it, and own the data.
Browse any ticker, any timeframe. Configurable moving averages, ADR and ATR overlays, secondary chart for market context, drawing tools, log/linear scale.
Replay charts bar-by-bar. Place market and limit orders, set stop losses, take partials, track R-multiples and batting average. Save, resume, and analyze every session.
Head-to-head practice against a friend. Same ticker, same bars, synchronized countdowns. Trade blind or visible. Side-by-side comparison report at the end.
Browse your local chart data. Add new tickers, download fresh bars from Yahoo Finance, bulk-update the whole library, and check coverage ranges per symbol.
PivBO is coffeeware: no ads, no tracking, no paywall, no subscription.
Every new feature is written between sips.
If it saved you from a bad trade or taught you something new, fuel the next feature.
winget install PivBO
To run: type pivbo on a fresh terminal.
Update: winget upgrade PivBO
PivBO.exe.PivBO.app into Applications..AppImage anywhere.chmod +x PivBO-x86_64.AppImage (or right-click → Allow executing)../PivBO-x86_64.AppImage.Tip: Gear Lever adds AppImages to your app menu and keeps them updated.
docker compose up -d.http://localhost:5051/.Recommended for long-running self-hosted setups (auto-restart, declarative config, easy upgrades).
docker run -d \
-p 5051:5051 \
-v pivbo-data:/data \
ghcr.io/mbelgin/pivbo:latest
http://localhost:5051/.Image: ghcr.io/mbelgin/pivbo · multi-arch (amd64, arm64).
Linux bind-mount? Add PUID and PGID env vars matching your host user so files aren't root-owned. Docker Desktop on Mac and Windows handles UID translation automatically, no env vars needed.
For developers, or anyone who'd rather run directly from the code. Requires Python 3.10+ and git.
# Clone the repo
git clone https://github.com/mbelgin/PivBO.git
cd PivBO
# Install dependencies (a venv is recommended)
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
# Start the server (opens at http://localhost:5051/)
python pivbo_server.py
On first launch PivBO seeds a library of historical bars from the repo; after that it runs fully offline. Your simulations, templates, and analyses live under your user data directory and are never uploaded.
A concise tour of what's in PivBO and how to use it. Expand any section below.
Launching PivBO opens a small control window and your default
browser at http://localhost:5051/. The app runs
as a local server on your own machine. Nothing ever leaves it.
On the very first launch a banner at the top of the page says One-time Download and progresses through ~930 compressed historical CSVs pulled from the project's GitHub repo. Tickers become available in the sidebar as each file lands; the whole seed takes a few minutes on a typical connection. When it finishes, PivBO offers to refresh each ticker with the most recent bars from Yahoo Finance. Skip it if you don't need today's close.
Windows + winget tip: a winget install does not
create a Start menu shortcut (winget portable packages can't).
Open a fresh command prompt or PowerShell and type
pivbo. (A pre-existing terminal will not see the
new pivbo command until restarted.) When the icon
appears in the taskbar, right-click it and choose
Pin to taskbar. After that it's a permanent
one-click launcher. Same idea works for Pin to Start.
Sharing PivBO with another machine on your Wi-Fi:
the launcher window has a Listen on local network
switch. Flip it on (then click Stop, then Start) and the status
line shows both the loopback URL and an
http://<your-LAN-IP>:5051 address. Open that
on another computer on the same network and you get the same
PivBO. The choice is remembered across launches. Use only on
networks you trust; do not enable on public Wi-Fi.
Where your data lives and how it's organized: see the Your data section below.
The left sidebar lists every ticker you have data for, with its first and last bar date. Click any row to chart it.
Top-of-chart controls cover the usual axes:
Drawing tools are on the left edge: horizontal line, line, ray, segment, text, measure, freeform note. Drawings are per-ticker and persist across sessions.
From the Simulations page click + New Simulation. Fill in a name, starting capital, and optionally the “skip to first bar with an N-period MA” warmup offset. Then pick one of two modes:
Click Start Simulation. The chart switches to sim mode: only bars up to the current one are visible, the right side becomes a trade panel, and playback controls appear at the bottom.
Navigate bar-by-bar with the arrow keys:
A sim auto-saves after every meaningful event (trade, advance, retreat, SL move). You can close the tab and come back. The sim resumes exactly where you left it.
Click Long or Short on the trade panel. The entry form lets you specify:
Flex open-bar SL. A separate toggle that solves a specific same-bar fill problem. When enabled: on the bar a trade enters, PivBO uses only the bar's close to check the stop loss, and caps any fill at the SL price. Without it, you can get impossible fills on bars that open past SL, rally to trigger entry, dip back, and close above SL. Recommended on. See the FAQ for a worked example.
Once a trade is open, the chart shows entry and SL levels as live lines. The trade panel flips to show open positions:
R-multiples use the risk frozen at entry, so moving your SL later doesn't skew the R stats. Analytics refresh live as you advance bars.
The Simulations page lists every sim you've started, with its name, ticker, date range, open P/L, and last-modified time. Select one to resume where you left off. Multi-select enables:
Templates: save the current chart and indicator setup (MAs, secondary-chart symbol, volume/equity panes, etc.) as a named preset. New simulations can start from a template instead of the default layout. Manage them from the Templates button on the sim panel.
PivBO keeps everything you generate in a single per-user folder on your own machine. No cloud sync. No accounts. No upload of any kind.
%LOCALAPPDATA%\PivBO\~/Library/Application Support/PivBO/~/.local/share/PivBO//data inside the container, mapped to a Docker named volume by default. Bind-mount a host path to /data if you'd rather see the files on disk.What's inside:
collected_stocks/: the historical
ticker CSVs (around 900 daily-bar files seeded on first launch,
plus anything you've downloaded since).simulations/: one JSON per saved sim.templates/: saved chart-and-indicator
presets.analyses/: saved Analysis and Compare
reports.preferences.json: your gear-icon settings.drawings.json: per-ticker drawings.Reinstalling or upgrading never touches this folder. Wider date ranges you've pulled for individual tickers are preserved across updates. If you ever want to start over, close PivBO and delete the folder; the next launch re-seeds from scratch.
Backup is whatever your normal disk-backup is. To move PivBO to a new machine, copy the folder over before first launch on the new machine; PivBO will skip the seeder and pick up exactly where you left off.
A 1v1 remote simulation where two traders race the same ticker from their own machines. Signaling is done over a public MQTT broker; a 6-character room code scopes the match. No accounts, no servers you have to run.
From the Duel tab:
Flow:
A dropped connection triggers an auto-pause for up to 3 minutes; if the peer reconnects within that window, the duel resumes cleanly. Refreshing a tab mid-duel also restores state on reconnect.
Click Data in the topbar to open the ticker downloader. You can:
The update path only fetches missing dates from Yahoo; it never re-downloads entire histories. Existing wider date ranges are always preserved. A re-run of the first-launch seeder never overwrites a file you already have.
Open the gear icon top-right. The main settings:
@ becomes your name, and the
full email never leaves your machine).Sim playback (active during a simulation):
Drawing tools (chart view):
Modals:
Browser-native chords (Ctrl+F find, Ctrl+R reload, etc.) are never hijacked. Typing in any input or the inline-rename field also disables the sim and drawing shortcuts so keystrokes go to the input you're focused on.
Closing the browser tab only closes the UI. PivBO is
still running in the background. Reopen the tab at
http://localhost:5051/ anytime.
To actually stop the server, use the small PivBO control window that opens with the app: click Stop (pauses, keeps the launcher open) or Quit (closes everything). If you launched from a terminal, you can also Ctrl-C that terminal.
Yes. MIT-licensed, open source, no ads, no tracking, no accounts. It's coffeeware: free forever, with an optional Ko-fi tip if it helped you.
Nowhere. PivBO runs as a local server on your own machine. Every
simulation, trade, preference, and analysis stays in a per-user
folder on your disk: %LOCALAPPDATA%\PivBO\ on Windows,
~/Library/Application Support/PivBO/ on macOS,
~/.local/share/PivBO/ on Linux, or /data
inside a container (named volume by default, or bind-mount a host
path if you'd rather see the files on disk). Reinstalling or
upgrading never touches it. No cloud, no accounts, no tracking.
See the Docs → Your data section for
what's inside and how to back it up.
First launch pulls a prebuilt library of historical daily bars (around 900 US tickers, ~50 MB) from the project repo so you can start trading immediately. Happens once. After that, PivBO runs fully offline unless you ask it to fetch more data.
PivBO leans heavily into Qullamaggie-style momentum trading, but it works for any approach. You get the core price and volume action, plus a small set of key indicators (MAs, ATR, ADR).
A toggle in the trade form that fixes a specific same-bar-entry edge case. Recommended on by default.
The problem it solves. Imagine you submit a long limit at $100 with a stop at $98, mid-day on bar X. The rest of bar X then prints: open $97 (already below SL), high $103 (touches your limit so the order fills), low $96 (would retrigger SL), close $101. Without Flex, the simulator could fill you at the limit AND register the low as a stop-out on the same bar. In a real market that sequence is rarely tradable as written; you'd more likely have skipped the entry entirely once price gapped under your stop.
What Flex does on the entry bar. It checks your stop only against the bar's close, and caps any exit at the SL price. So in the example: you fill at $100, and the bar closes at $101 above your stop. Your trade is live and the SL just hasn't triggered yet. The next bar processes normally.
Cost. A small percentage of trades that the unconstrained engine would have stopped out on the entry bar stay open instead. In practice this is negligible compared to the impossible-fill artifacts it prevents.
The indicator set is intentionally lean, so attention stays on price and volume action. I'll consider adding commonly-requested ones when caffeine levels permit. File requests on the GitHub repo. High-quality PRs for indicators are also welcome.
The Simulations interface lets you export selected sims as a
.zip bundle, and import a previously-exported zip on any other PivBO install.
Depends on what you want from it, but three patterns I find especially useful:
Open an issue on GitHub: github.com/mbelgin/PivBO/issues.
Thanks for asking. This is not a one-person job. A few ways to pitch in: