Your portfolio. Your machine. Sync on your terms.
A blazing-fast, privacy-first desktop app for tracking personal investments — built with Tauri 2 & React 19.
Stockfolio combines real-time market data with a beautiful, native desktop experience — without ever sending your financial data to a server. Every position, every purchase, every gain — stored locally on your machine.
Dashboard — Novice mode with portfolio health, winners/losers, and holdings breakdown:
Analysis — Per-ticker price chart, cost basis overlay, P&L metrics, and live news:
Watch List — Track tickers before buying, with sparklines, target price alerts, and notes:
Purchases — Full purchase log with live P&L, market value, and daily change:
Organize your investments into as many named portfolios as you like:
- Create, rename, star, and delete portfolios
- Reorder the portfolio list in the sidebar
- Each portfolio maintains its own holdings, purchases, and settings independently
- Two kinds, chosen when you create one: Manual, which you fill in yourself, and Brokerage, which mirrors a connected account
Connect a broker and its holdings appear as a read-only portfolio, alongside the ones you keep by hand.
- Alpaca supported today — Margin and Paper accounts, each connected separately
- Every figure comes from the broker. Share counts, average cost, market value and profit are read straight from the brokerage, so your totals match what they show you — nothing is recalculated or estimated
- Nothing is invented. Where the broker supplies no value, the app says so rather than filling in a guess
- Prices refresh every 30 seconds, and options and crypto are priced properly — both of which a market-data-only source cannot do
- Dated transaction history where the broker publishes it
Manual and brokerage data never mix. A brokerage portfolio cannot accept hand-entered purchases, and a manual portfolio can never receive broker holdings — enforced in the database, not just hidden in the UI. Manual portfolios work exactly as they always have; connecting a broker is purely additive.
Read-only, by construction. The brokerage client can only issue GET requests — there is no code anywhere in the app that places or cancels an order, so it cannot trade on your behalf even by accident.
Switch between Novice and Advanced modes to match your experience level — no clutter, no confusion.
| Novice Mode | Advanced Mode |
|---|---|
| Plain-English labels with helpful tooltips | Full suite of professional metrics |
| Portfolio Health indicator (diversification score) | Concentration risk analysis |
| Winners vs. Losers count card | 10-column sortable table with all data |
| Simplified 5-column holdings view | Asset Allocation breakdown by type |
Click any ticker for a full per-position breakdown:
- Mountain chart with 8 time ranges —
1D · 5D · 1M · 6M · YTD · 1Y · 5Y · MAX - Cost basis overlay — visualize your average entry price against the price curve
- Live news feed — latest articles pulled via Yahoo Finance RSS for each ticker
- Upcoming earnings — detects earnings dates and generates a one-click calendar invite (
.ics) - Drag-to-reorder favorites — pin your most important holdings to the top
- Yahoo Finance link — one click opens the ticker in your browser or in an in-app window
Organize pre-buy research across multiple named watchlists:
- Create, rename, reorder, and delete watchlists
- Live search-as-you-type — finds tickers by name or symbol via Yahoo Finance
- Keyboard navigation — arrow keys, Enter, Escape all work in the dropdown
- Sparkline mini-charts — quick at-a-glance price trend per watchlist item
- Target price — shows analyst mean price estimate alongside your watch price
- Notes — attach free-text notes to any watchlist item
- Extended hours indicators — pre-market and post-market price tags
- One-click buy — purchase directly from the watchlist when you're ready
- Backup & restore — export/import entire watchlists to CSV
Accurately track your positions across stocks, ETFs, mutual funds, and crypto:
- Log purchases with shares, price per share, and purchase date
- Automatic unrealized P&L calculation (dollar and percent)
- Daily change % for every position
- Extended hours pricing — pre-market and post-market prices with market-state indicators
- Cost basis tracking across multiple purchases of the same ticker
See your entire portfolio sorted by what matters most:
- Rank all positions by unrealized gain/loss — dollar or percent
- Instantly spot your best and worst performers across every holding
- Color-coded gain/loss bars for fast visual scanning
Keep your database wherever you want and sync across devices — entirely on your own infrastructure:
- Custom database location — move the SQLite file to any local folder, mapped drive, or cloud-synced folder (OneDrive, Google Drive, Dropbox, etc.)
- Local / network path sync — copy the database to a NAS, SMB share, or any folder on your network
- WebDAV / cloud sync — sync directly to Nextcloud, ownCloud, or any WebDAV server using app passwords
- Auto-sync on a schedule — every 5, 15, 30, or 60 minutes while the app is open
- Manual sync button — trigger a sync any time from the header, with inline last-synced timestamp
- Conflict resolution — newer database always wins; remote is backed up before overwrite
- Lock file protection — prevents two devices from writing simultaneously
- No third-party accounts, no proprietary cloud service, no subscription
You own your data — completely:
- Export to CSV or Excel (XLSX) — save your purchases any time
- Import from CSV or Excel (XLSX) — restore or migrate from another tool
- Ameriprise CSV import — dedicated import for Ameriprise account exports
- Watchlist backup/restore — export and import watchlists via CSV
- Theme support — System / Light / Dark / Warm, persisted automatically
- Dashboard mode persisted per device
- Link open mode — open Yahoo Finance links in your default browser or in a focused in-app window (no address bar)
- Info tooltips toggle — show or hide contextual help labels
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 (Rust) |
| UI framework | React 19 + TypeScript 6 |
| Styling | Tailwind CSS 4 |
| Components | Radix UI primitives |
| Charts | Recharts 3 |
| Icons | Lucide React |
| Spreadsheet | SheetJS (xlsx) |
| Database | SQLite via rusqlite (Rust-native, bundled, no server) |
| Sync transport | reqwest — HTTP WebDAV PUT/GET + local file copy |
| Market data | Yahoo Finance (fetched natively via Rust reqwest) |
| News | Yahoo Finance RSS (parsed via Rust rss crate) |
| Build tool | Vite 8 |
Stockfolio makes zero network requests from your browser. All market data fetching happens in the Rust backend process and is stored in a local SQLite database on your machine. No accounts. No telemetry.
Sync is entirely optional and self-hosted. If you enable it, your database is copied directly between devices via a path or WebDAV server you control — no Stockfolio servers are ever involved. The sync feature works with your own NAS, Nextcloud instance, or any WebDAV-compatible service.
Credentials never leave your machine. Brokerage API keys and sync passwords are stored in your operating system's credential manager — Windows Credential Manager, macOS Keychain, or the Secret Service on Linux — and the database holds only an opaque reference to them. Because sync copies the database wholesale, this is what keeps a key out of the copy that lands on your NAS or Nextcloud. A regression test sweeps every value in every table to keep it that way.
A database synced to a second device therefore arrives without its keys, which is deliberate: the brokerage portfolios are visible and read-only there until you add the credentials on that machine too.
See SETUP.md for the full development environment setup guide.
Quick start for developers:
# 1. Clone the repo
git clone https://github.com/MTGMAD/StockFilo.git
cd StockFilo
# 2. Install JS dependencies
npm install
# 3. Run in development mode
npm run tauri devnpm run tauri buildOutput installers are placed in src-tauri/target/release/bundle/.
Pull requests are welcome. For major changes, open an issue first to discuss what you'd like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Distributed under the ISC License. See LICENSE for more information.
Made with ♥ using Tauri + React + Rust



