01
Multi-currency that tells the truth
Cost basis is FX-weighted. The unrealised gain is split into what the asset did and what the peso did — for a Mexican investor holding US stocks those are two different stories.
Self-hosted · single user · MIT
Stockerly tracks what you own — US stocks, crypto and Mexican CETES — and reports all of it in pesos using the exchange rate from the day of each trade, not today's. You run it on your own server. There is one account: yours.
For one person, investing through a Mexican broker. No broker sync, no tax reports. The interface is in Spanish.
git clone https://github.com/rodacato/stockerly.git cd stockerly bin/setup
One screen, read top-left to right: total net worth in pesos, then the positions with something happening today, then what the indicators said about them, then how the wider market feels. The whole product is an argument that those four things belong together. Every image here is an artboard from the design system in design/, not a capture of a running instance; the figures are fictional. The interface is in Mexican Spanish; the code, routes and documentation are in English.
Am I up or down, in the currency I actually spend? Everything else on the screen exists to explain that number or to keep it honest.
01
Cost basis is FX-weighted. The unrealised gain is split into what the asset did and what the peso did — for a Mexican investor holding US stocks those are two different stories.
02
Holdings is what you own, Watchlist is what you follow, and Tracked is the catalogue the sync jobs read. A symbol can be in the catalogue without pretending you bought it.
03
Mexican fixed income sits beside the equities, with maturity lead time, and the portfolio is compared against reinvested CETES — the benchmark a Mexican investor actually gives something up for.
04
A signal comes from a measured, stored observation — "AAPL entered oversold per RSI(14)", price crossed its 200-day average — and says whether it follows the trend or bets on a reversal. "Buy" and "sell" labels only appear when an observation backs them; there are no predictions and no price targets.
05
Install it to the home screen and get push notifications when a rule fires. Offline it shows a retry page: portfolio figures are never cached, so reading them needs a connection.
Drawn in the project's own design system, which mirrors the shipped code.
Not money — it is MIT. Attention, and a short list of things that have to be true on your server.
bin/setup is idempotent: it installs gems, creates and migrates the four PostgreSQL databases, seeds them on first creation, and starts the server. It starts without market-data keys, but two dependencies are worth knowing: without keys, prices come from Yahoo Finance, which needs Python 3 (only the production image ships it), and the automatic exchange rate for each trade needs a Banxico token; without it you enter the rate by hand.
Open the folder in VS Code or Codespaces and choose Reopen in Container. Setup runs itself; then bin/dev.
Ruby 4.0.6 and a PostgreSQL 16 on localhost. Node.js is not required — JavaScript ships through import maps and CSS through the Tailwind standalone compiler.
bin/setup # gems, databases, seeds, server bin/jobs # second terminal — alerts, syncs, notifications open http://localhost:4100
What the first screen actually is. The development seeds create four demo users, so bin/setup lands you on the login — sign in with demo@stockerly.com / password123. The Setup Wizard that creates the single real account only appears on an empty database, which is what a genuine first boot looks like. GETTING_STARTED.md has the one-liner to get there.
For production, Stockerly deploys to any Linux server with Kamal 2 and Docker. The reference deployment uses a VPS behind a Cloudflare Tunnel, so no inbound ports are opened — but nothing in the app depends on the maintainer's infrastructure. See docs/ops/deploy.md.
Self-hosted means you are about to spend an evening on this. These are not limitations waiting to be fixed — they are decisions, each one recorded in the repo.
v0.3.0Run the tagged release, not master: a tag is what a security advisory names when it is time to upgrade. The releases say what each one brought.SECURITY.md.ADR-018.CONTRIBUTING.md first. It is one person's daily driver reviewed on evenings and weekends, so expect that pace rather than a team's.