All apps · 0 apps
myTickrs
OfficialDocker app from myTickrs' Repository
Overview
Security: the self-hosted edition has no sign-in. Anyone who can reach the port can use the app, so do not expose it outside your network.
If you change the WebUI port, set PORT to the same number.
Readme
View on GitHubmyTickrs
A private investment ledger for stocks and options, across the world's stock markets.
You record your trades and myTickrs works out your holdings, cost basis, profit and loss, and performance charts. It gives you one view of every brokerage account in every currency, and it answers the questions a brokerage app usually doesn't: what did I actually pay, what have I earned, and how is each position doing?
This is the source-available desktop edition:
- Free for noncommercial use. The source is published under the PolyForm Noncommercial 1.0.0 license, with no subscription, no ads and no usage limits for personal and other noncommercial use. The built-in Yahoo Finance provider needs no API key, so it works without signing up anywhere.
- Your data stays on your computer. Everything is kept in one SQLite file on your own machine. There is no account, no sign-in, no telemetry and no server of ours in between.
myTickrs is a record-keeping tool. It does not place trades, connect to brokers for execution, or give investment advice.
Features
📸 AI import: start an account from a screenshot
Setting up a new account can be as simple as taking a screenshot of your current holdings.
- Take a screenshot of the positions page in your broker's app or website, and drop it on the Import page. AI reads each holding from it: ticker, quantity, average price, and unrealized and realized P/L. Stocks, ETFs and options are all read.
- Review before saving. Every holding is listed with a checkbox, so you can correct or leave out any row. Rows the AI is unsure about start unticked. If the screenshot shows market value and unrealized P/L but no average price, the average price is worked out for you. The totals printed on the screenshot are shown next to the sum of the rows, so you can see that nothing is missing.
- Save to a new account. Each holding becomes one opening trade, and its realized P/L is carried in, so your gains so far are counted from day one. After that, add transactions as they happen.
- CSV, JSON and XML files (including OFX and QFX) work too. Their columns are matched for you and remembered for the next file laid out the same way. If a file can't be matched, you can let the AI read it instead.
Screenshots are read through a myTickrs cloud account, so you sign in before you upload, and each account has a monthly number of AI files. Files are passed to the AI model only to read the holdings and are not saved. CSV, JSON and XML files whose columns are matched are read on your computer.
🌍 Global stock markets
- 42 markets built in, one per country: North and South America, Europe, the Middle East, Africa and Asia-Pacific. Among them are the US (NYSE, Nasdaq), Canada (TSX, TSXV), the UK, Germany, France, Switzerland, Japan, Hong Kong, mainland China, Taiwan, Korea, India, Singapore and Australia.
- Each market knows its time zone, currency, trading hours (including lunch breaks), weekend days and public holidays. Prices are treated as live only while that market is open.
- Listings use Yahoo-style suffixes, so
SHOP.TO,7203.T,0700.HKandSAP.DEall resolve to the right exchange. Symbol search with autocomplete shows the company name and exchange. - You can add, edit or turn off markets in Settings → Markets.
📈 Stocks and ETFs
- Buy and sell, cash dividends, reinvested dividends (DRIP) and stock splits.
- Holdings show quantity, average price, market value, day change, and unrealized and realized gain.
- FIFO cost basis, and an average price over all history or the current holding.
- A stock detail page charts the price with your buy and sell points marked on it.
- Selling short: sell short and buy to cover, with FIFO realized P&L. Payments in lieu of dividends and stock-loan (borrow) fees are recorded too. Borrow fees go to realized P&L or to their own short-costs line, whichever you choose.
🧾 Options
- Buy-to-open, sell-to-open, buy-to-close and sell-to-close on calls and puts.
- The full lifecycle: expiration, assignment and exercise. Assignment and exercise create the matching stock trade at the strike automatically.
- Option premium either rolls into the cost basis of assigned stock or is tracked separately. You choose.
- Rolls in one step, with the old and new contracts linked so you can see their combined P&L.
- Multi-leg strategies (verticals, iron condors, straddles, strangles, calendars) and strategy tags such as covered call, cash-secured put and the wheel.
- Open positions show days to expiry, premium, current mark and unrealized P&L. Expired contracts are flagged for action. Option P&L and premium income can be viewed by period.
- Contract terms can be adjusted by hand after corporate actions.
- Options on stocks, ETFs and indexes in the United States, Canada, the United Kingdom, Germany, France, the Netherlands, Belgium, Switzerland, Hong Kong, Japan, Australia, Singapore and India, in each market's currency and contract size. Index options (S&P 500, S&P/TSX 60, FTSE 100, EURO STOXX 50, DAX, SMI, Hang Seng, Nikkei 225, Nifty 50 and more) settle in cash.
- UK options are entered in pounds, like UK shares: a premium your broker shows as 12.5p is 0.125. Indian options ask for the lot size, which the exchange sets per stock and revises.
🏦 Multiple accounts, multiple currencies
Track every brokerage account you have, in every currency, in one place.
- Unlimited brokerage accounts, such as an RRSP, a TFSA, a margin account or an account at a second broker. Each trade belongs to one account.
- Each account has its own currency. US stocks go in a USD account, Canadian stocks in a CAD account, Japanese stocks in a JPY account, and so on.
- One account per currency in a single step. When you add an account, tick the currencies you hold there. myTickrs creates a matching account for each one, for example "TFSA - USD" and "TFSA - CAD".
- See one account or all of them together. Filter by account, or pick All accounts for the whole portfolio. Holdings can be grouped by symbol, which combines the same stock across accounts, or by account.
- Totals in your base currency. Each position keeps its own currency, while portfolio totals, the dashboard and charts are converted into your base currency at the current exchange rate.
- Fee schedules per account (commission plus regulatory fees). Fees are calculated as you enter a trade, and you can override them.
💱 Global currencies
- Keep your own list of currencies in Settings → Currencies. Any ISO 4217 code works: USD, CAD, EUR, GBP, JPY, HKD, CNY, AUD and so on.
- Each account has a currency, so you can track holdings in different currencies side by side.
- Every amount is kept in its own currency. Totals, the dashboard and charts are shown in your base currency, using the current exchange rate. Exchange-rate history is synced once a day.
📊 Dashboard
- The dashboard shows portfolio value over time, total return (all time or this year), and a comparison with a benchmark such as SPY, QQQ or VTI.
🌐 Multiple languages
The interface is available in 9 languages:
| English | Français (French) | Deutsch (German) |
| Italiano (Italian) | Español (Spanish) | 日本語 (Japanese) |
| 한국어 (Korean) | 简体中文 (Simplified Chinese) | 繁體中文 (Traditional Chinese) |
Numbers, dates and currencies are formatted for the language you choose. The app also has light and dark themes.
🔌 Pluggable market data
Prices come from data-provider plugins. The desktop edition ships with:
Plugin Key needed What it provides Yahoo Finance No Quotes, history and dividends for most markets. Always installed, so the app works out of the box Finnhub Free key Live quotes and ticker search Twelve Data Free key Price history, splits and dividends iTick Key Quotes and daily history for 30+ markets, including Hong Kong, China and Japan For more timely and accurate prices, add Finnhub and Twelve Data. Yahoo Finance is an unofficial source: its quotes can lag, and it can be slow or unavailable at times. Finnhub and Twelve Data are official market-data APIs. Both have a free plan, so signing up costs nothing.
- Finnhub: fast, live quotes and ticker search. The free plan allows 60 requests a minute.
- Twelve Data: clean daily price history, plus splits and dividends, so your charts and cost basis stay correct. The free plan allows 8 requests a minute and 800 a day.
Create a free account, then add the provider to your markets with your API key in Settings → Data providers. Each market asks its own providers first, and uses Yahoo Finance only as a fallback.
For each market you choose which providers to use and in what order. If one fails or reaches its rate limit, the next one is asked.
Your API keys are yours. They are encrypted at rest, never shown again after you save them, and tested when you enter them.
New providers can be added without changing myTickrs.
📂 Your data, your machine
Your transactions, holdings and settings live in one SQLite file on your computer. Back it up by copying it, or move it to another machine.
What leaves your computer: only requests for market data. The tickers you hold are sent to the price providers you enable, such as Yahoo Finance or Finnhub, to get quotes, price history and exchange rates. Your trades, quantities and balances are never sent, except when you choose to import a screenshot (see AI import).
Optional sync with a myTickrs cloud account at mytickrs.app (Settings → Sync). It is off unless you turn it on, and only then does your portfolio leave your machine. You can also use it as a backup and restore:
- Back up: send the data on this computer to your cloud account. This replaces what is in the cloud.
- Restore: bring your cloud data back to this computer, for example after reinstalling or on a new machine. This replaces what is on this computer.
Both directions ask you to confirm first, because they overwrite the other side.
Getting started
There are 3 ways to run the desktop app:
- Install it with the installer for your system.
- Run it with Docker.
- Run it from source.
Requirements
- Windows, macOS or Linux
- Node.js 24 or newer for methods 1 and 3. The installer checks for it and, if it is missing or too old, asks before installing it for you. Docker (method 2) needs nothing else.
1. Install
Open a terminal and run the line for your system.
Windows (PowerShell):
irm https://files.mytickrs.app/install.ps1 | iex
macOS (Terminal):
curl -fsSL https://files.mytickrs.app/install-macos.sh | bash
Linux:
curl -fsSL https://files.mytickrs.app/install-linux.sh | bash
The installer:
- Checks for Node.js 24 or newer. If it is not there, it asks for permission and then installs it:
with winget or the official installer on Windows, the official installer on macOS, and
NodeSource (apt, dnf or yum) or the official build in
~/.local/nodeon Linux. Installing Node.js may ask for your administrator password. - Downloads the latest myTickrs and unzips it into a
mytickrsfolder in your home folder (%USERPROFILE%\mytickrson Windows,~/mytickrson macOS and Linux). SetMYTICKRS_DIRbefore running it to use another folder. - Installs the dependencies and adds a myTickrs shortcut: on the Desktop and in the Start menu on Windows, in Applications with a link on the Desktop on macOS, and in the applications menu and on the Desktop on Linux.
- Starts the app and opens it in your browser.
If the browser does not open, go to http://localhost:5050. The database is created at
data/tickrs.db inside the install folder on first start.
Start it again later: double-click the myTickrs shortcut. It starts the app in a terminal window and opens your browser; if the app is already running, it just opens the browser. Close that window (or press Ctrl+C in it) to stop the app.
Update: stop the app, then run the install line again. The new version replaces the old one,
and your database (data/), your settings (.env) and any plugins you added are kept.
Uninstall: stop the app, delete the install folder and the myTickrs shortcuts. This also
deletes your database, so back up data/ first if you want to keep it.
2. Run with Docker
You can also run myTickrs in Docker, with nothing else installed on your computer. This works well
on a home server or NAS too. The image is files.mytickrs.app/mytickrs, for x86-64 and ARM
(including Apple silicon). Open a terminal and run the line for your system.
Windows (PowerShell):
irm https://files.mytickrs.app/install-docker.ps1 | iex
macOS and Linux:
curl -fsSL https://files.mytickrs.app/install-docker.sh | bash
The installer:
- Checks for Docker with Docker Compose v2. If they are not there, it asks for permission and then
installs them: Docker Desktop on Windows (with WSL 2, which needs a restart of Windows) and on
macOS (with Homebrew, or the disk image from docker.com), and Docker Engine from
get.docker.com on Linux. It starts Docker if it is not running.
Installing Docker needs administrator rights: on macOS and Linux the installer uses
sudo, which asks for your password, so run it from an administrator account. - Downloads docker-compose.yml into a
mytickrs-dockerfolder in your home folder, then downloads the image and starts it. SetMYTICKRS_DIRbefore running it to use another folder. - Opens http://localhost:5050 in your browser.
The app then starts whenever Docker starts. Your data (the database and the key that encrypts
stored provider keys) is kept in the data folder of the install folder. To run it without the
installer, in an empty folder:
curl -fsSLO https://files.mytickrs.app/docker-compose.yml
docker compose up -d
To change the port or reach the app from other computers, set these before running the installer,
or put them in a .env file next to docker-compose.yml:
| Variable | Default | Purpose |
|---|---|---|
MYTICKRS_PORT |
5050 |
The port the app is on |
MYTICKRS_BIND |
127.0.0.1 |
Use 0.0.0.0 to reach it from your network. Anyone who can reach the port can use the app |
Other settings go under environment: in docker-compose.yml.
In the install folder:
| To | Run |
|---|---|
| Stop or start it | docker compose stop, docker compose start |
| Update it | the install line again, or docker compose pull then docker compose up -d |
| Back up your data | docker compose stop, then copy the data folder. Keep the key with the database |
| See its log | docker compose logs |
| Uninstall | docker compose down -v, then delete the install folder. Deleting its data folder deletes your database, so back it up first |
3. Run from source
To run the app from the source code instead (needs Node.js 24 or newer):
Clone the repository, or download the source code and unzip it:
git clone https://github.com/myTickrs/myTickrs.git mytickrs cd mytickrsInstall the dependencies:
npm i # Windows without Visual Studio C++ tools: npm i --ignore-scriptsBuild and start the app:
npm start
It opens http://localhost:5051 in your browser. One process serves the app and the API, and the
database is created at data/tickrs.db in the source folder. Press Ctrl+C to stop it.
Configuration
Settings are read from .env in the install folder (or the repository root when you run from
source). Restart the app after changing it. See .env.example for the full list.
| Variable | Default | Purpose |
|---|---|---|
HOST |
127.0.0.1 |
Address the server listens on. Use 0.0.0.0 to reach it from your network |
PORT |
5051 |
API port (the Docker image uses 5050) |
WEB_PORT |
5050 |
Web dev server port (npm run dev only) |
SQLITE_PATH |
./data/tickrs.db |
Location of the database file |
LOG_LEVEL |
info |
fatal, error, warn, info, debug, trace or silent |
ERROR_LOG_DIR |
./logs |
Every logged error is also written here, one file per day (errors-YYYY-MM-DD.log). Set it empty for no file |
ERROR_LOG_DAYS |
30 |
Days of error files kept; older ones are deleted |
KEY_ENCRYPTION_KEY |
generated | Base64 of 32 bytes; encrypts stored provider keys. If unset, one is generated and saved to data/.master-key |
MARKET_DATA_BASE_PROVIDER |
yahoo |
Keyless fallback provider for every market. Set it empty for none |
CLOUD_URL |
https://mytickrs.app |
The myTickrs cloud to sync with. Enables Settings → Sync |
GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET, MICROSOFT_OAUTH_CLIENT_ID |
(unset) | Desktop OAuth clients used to sign in to the cloud when you sync (Google or Microsoft) |
Security note: the desktop edition has no sign-in. Anyone who can reach
HOST:PORTcan use the app. Keep the default127.0.0.1unless you trust your network.
Project structure
This is a TypeScript monorepo using npm workspaces: a React web app on top of an Express API.
apps/
api/ Express server for the desktop edition (SQLite)
web/ React app (Vite, Material UI)
plugins/dataproviders/ installed data-provider plugins
packages/
core/ calculation engine: lots, cost basis, P&L, returns
shared/ types, enums, validation schemas, market catalog
market-data/ provider registry, routing, rate limits, market hours and holidays
server/ routes and services shared by every edition
store-sql/ SQLite storage (Kysely)
ui/ shared UI components, app shell, i18n
conformance/ tests every storage implementation must pass
Development
To work on the code, clone the repository and run it with hot reload:
git clone https://github.com/myTickrs/myTickrs.git mytickrs
cd mytickrs
npm i # Windows without Visual Studio C++ tools: npm ci --ignore-scripts
npm run dev
Open http://localhost:5050. The API runs on port 5051, and the web dev server forwards requests to it.
Contributing translations
UI text lives in JSON message files under apps/web/src/locales/<lang>/ and
packages/ui/src/locales/<lang>/. To add or improve a language, edit those files. apps/web/src/locales/GLOSSARY.md lists
the preferred financial terms for each language.
Roadmap
These are not supported yet:
- futures, bonds and crypto
- margin
- tax forms
License
PolyForm Noncommercial License 1.0.0. You may use, modify and share myTickrs for any noncommercial purpose, including personal investing. Commercial use needs a separate license.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/mytickrs/mytickrs:latestRuntime arguments
- Web UI
http://[IP]:[PORT:5050]/- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Port for the web interface. Keep it equal to PORT.
- Target
- 5050
- Default
- 5050
- Value
- 5050
Port the app listens on inside the container. Must equal the WebUI port.
- Default
- 5050
- Value
- 5050
SQLite database and the key that encrypts stored provider keys. Back up the whole folder; keep the key with the database.
- Target
- /app/data
- Default
- /mnt/user/appdata/mytickrs
- Value
- /mnt/user/appdata/mytickrs
Optional. Folder for extra data-provider plugins. Leave empty to use the plugins built into the image; a folder here replaces them.
- Target
- /app/apps/plugins/dataproviders
User the app runs as and that owns App Data. 99 is Unraid's nobody.
- Default
- 99
- Value
- 99
Group the app runs as. 100 is Unraid's users.
- Default
- 100
- Value
- 100
fatal, error, warn, info, debug, trace or silent.
- Default
- info
- Value
- info
Optional. Base64 of 32 bytes that encrypts stored provider keys. If empty, one is generated and saved in App Data.
Optional time zone, e.g. America/New_York.