GETTING STARTED.
Bet Tracker is a desktop app, not a website. Right now the only way to get it on your machine is to build it from source. The steps below take about ten minutes the first time and under a minute on every subsequent pull.
REQUIREMENTS.
The app works on macOS, Windows, and Linux. You need three things installed before building:
- Rust — install via rustup.rs. The stable toolchain is fine; Tauri's build driver pulls the targets it needs.
- Bun — install via
bun.com
(
curl -fsSL https://bun.com/install | bash). Bun runs the Vite dev server and drives the Tauri CLI. npm or pnpm work too if you prefer — swapbunfor your package manager in the commands below. - Platform toolchain — macOS needs Xcode Command Line
Tools (
xcode-select --install). Windows needs the Microsoft Visual Studio C++ build tools and WebView2 (preinstalled on Windows 11). Linux needswebkit2gtk,libgtk, and a few build deps — Tauri's prerequisites page has the exact apt/dnf lines.
INSTALL FROM SOURCE.
Clone the repo, install JS deps, and launch the dev build:
git clone https://github.com/WalrusQuant/rust-bet-tracker.git
cd rust-bet-tracker
bun install
bun tauri dev The first build is the slow one — Rust compiles Tauri, rusqlite, and statrs from source, which takes a few minutes on modern hardware. Subsequent runs are incremental and cold-start in a couple of seconds. A native window opens when the build finishes.
To produce a distributable binary instead of a dev build:
bun tauri build
The installer lands in
src-tauri/target/release/bundle/ — .dmg on
macOS, .msi on Windows, .AppImage or
.deb on Linux. Nothing is signed; macOS will ask you to
right-click → Open the first time.
YOUR FIRST RUN.
The first time the app opens, it creates a fresh SQLite file with a default set of sportsbooks, leagues, bet types, and strategies. Your bankroll starts at $0. A five-minute loop to get oriented:
- Seed your bankroll. Open Bankroll, click Add transaction, and log a deposit for whatever amount you're actually betting with. The overall balance on the dashboard updates instantly.
- Log a bet. Open Tracker → Add bet. Pick a sportsbook, league, bet type, and enter your odds + stake. If you know the fair odds (from a sharp book or a devig), drop them in too — it unlocks expected-value tracking downstream.
- Settle it. When the result comes in, click the W / L / P buttons on the row. Push returns the stake; loss zeroes out; win applies the profit. Bankroll and analytics both recompute.
- Look at Analytics. Three sections: where you stand (current vs peak, live exposure, last 30 days), are you sharp (expected profit, CLV beat rate, bankroll curve), and where profit comes from (per-book / league / bet-type breakdown). With one bet logged you won't see much — but it's the shape you'll be looking at once you've logged fifty.
- Set your sizing rule. Back on Bankroll, choose fixed $, fixed %, or fractional Kelly. The app doesn't auto-size bets for you — it's a reference while you're logging.
USING THE CALCULATORS.
The Calculators tab has twenty-one tools grouped by purpose. They're independent of the tracker — you don't have to log a bet to use them — but most of them complement each other.
Pre-bet workflow
A typical "is this bet worth it" loop uses three to four of the calcs:
- Devig a sharp book's price on the same market to get a fair probability. Pick a method that matches the market shape — EM for vanilla two-way lines, Shin for three-way soccer, Logarithmic when the favorite is very heavy.
- Expected Value takes the fair probability + your book's price and returns EV%. Positive means long-run edge.
- Kelly Criterion converts the edge into a suggested stake. Most bettors run a fraction of Kelly (quarter or half) — the calc has a slider.
- Risk of Ruin (optional) simulates tens of thousands of bankroll paths at your edge + variance to show how aggressive is too aggressive.
Market analysis
Vig Comparison ranks multiple books' hold on the same market so you know which one is the pricing floor. Arbitrage and Hedge size the second leg once you already have the first. Middle Finder and Teaser EV are for the specific structures they're named after.
Game simulators
Poisson Match, Negative Binomial Match, and Player Prop Simulator take a model input (expected goals, expected points, etc.) and return a full score matrix or prop distribution — fair ML, spread, total, over/under at every line. Use them when you have a projection and want every derived market at once.
Where to read more
Every calculator has a short blurb in the app explaining what it does. For the full derivation and worked examples, the docs write-ups cover each one in depth — they're the source material the in-app blurbs are condensed from.
WHERE YOUR DATA LIVES.
Everything — bets, transactions, sportsbooks, strategies — sits in one SQLite file under the OS app-data directory:
- macOS —
~/Library/Application Support/com.adamwickwire.bettracker/ - Windows —
%APPDATA%\com.adamwickwire.bettracker\ - Linux —
~/.local/share/com.adamwickwire.bettracker/
Backup is just copying the .db file
somewhere safe. Restore is copying it back.
Move to a new machine is the same thing plus a fresh
build of the app. The file is portable across platforms — Rust's SQLite
build is the same on every OS.
The Settings tab has a Reset database button that wipes everything and re-seeds the defaults. It's destructive and confirms twice; there's no undo.
TROUBLESHOOTING.
The dev build fails with a webkit/gtk error on Linux
You're missing system libs. Run the apt/dnf one-liner on the
Tauri prerequisites page
for your distro, then bun tauri dev again.
macOS won't open the built app
Right-click the .app and pick Open. You'll get a
Gatekeeper warning; approve it once and macOS remembers. Because the
bundle is unsigned, double-click won't work until Apple is paid the
notarization toll.
I added a new calculator / command and it 404s
New #[tauri::command] handlers only register at startup.
Kill bun tauri dev and relaunch — the hot reloader picks
up Svelte changes but not Rust handler registrations.
I want to nuke everything and start over
Quit the app. Delete the SQLite file from the path above. Relaunch. The migration runner creates a fresh database with default seeds. (Or just use Settings → Reset database, which does the same thing without the file dance.)
When you want the math under the hood — why Shin devig works on soccer three-ways, how the NFL teaser EV accounts for key numbers, what makes the Poisson match predictor miss on low-scoring games — read the docs. Fifteen write-ups, one per calculator family.