Skip to content

Self-hosted · single user · MIT

Your invested net worth, on one screen.

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.

Run it locallyRuby + Postgres
 git clone https://github.com/rodacato/stockerly.git
 cd stockerly
 bin/setup
Panorama: net worth in MXN, a radar of positions with sparklines, technical signals, and market sentiment.

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.

A tracker made for one question

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

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.

02

Three tiers, not one list

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

CETES as a first-class asset

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

Signals with their rule on show

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

A PWA you install on your phone

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.

  • Ruby 4.0.6
  • Rails 8.1
  • PostgreSQL 16
  • Hotwire
  • Tailwind CSS 4
  • Solid Queue
  • Kamal 2
  • no Node.js

What the screens look like

Drawn in the project's own design system, which mirrors the shipped code.

Holdings: positions grouped by tier, with cost basis and gain in MXN.
Holdings — the three-tier ladder, values in MXN
Consolidado: portfolio value over time against a reinvested CETES comparison.
Consolidado — value over time vs. reinvested CETES
Trade capture sheet with ticker autocomplete and a pre-filled Banxico rate.
Registrar movimiento — capture with the FX rate pre-filled
Alert rules list with per-rule cooldowns.
Reglas — on a phone — price, RSI, volume, ex-dates, CETES auctions

What it costs you to run

Not money — it is MIT. Attention, and a short list of things that have to be true on your server.

8
market-data providers
6
bounded contexts. Writes cross them as domain events
4
PostgreSQL databases — primary
1
account on the instance
0
accounts with anyone else

One command, on your machine

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.

Dev container

Open the folder in VS Code or Codespaces and choose Reopen in Container. Setup runs itself; then bin/dev.

Bare metal

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.

Both paths end hereport 4100
 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.

Who this isn't for

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.

More than one person
Single-user by design. One instance, one account, no roles, no sharing, no multi-tenancy. A household needs two instances.
Investors outside Mexico
The math assumes MXN and USD through a Mexican broker: CETES, Banxico's FX fix, the BMV. It is not a generic international tracker.
Anyone wanting broker sync
No Plaid, no Yodlee, no SnapTrade, ever at this scale. You type trades or import a CSV.
Day traders
Prices refresh through periodic jobs, not streaming, and history is daily. No intraday candles, no real-time quotes.
Tax preparation
No ISR reports, no SAT integration, no lot tracking, no withholding math. It tracks patrimony; it does not replace your accountant.
Anyone who needs support
No SLA, no support guarantee, no advance notice of breaking changes. It is one person's daily driver that happens to be readable and runnable.

What you are getting

License
MIT — open source, no tiers, no premium features.Provided "as is", without warranty of any kind.
Version
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
Report privately through the repository's Security tab → Report a vulnerability.Never open a public issue for a vulnerability. Acknowledgment within 48 hours; see SECURITY.md.
Interface
Mexican Spanish (es-MX), single locale.Code, routes, commits and documentation are English. A second locale in the app is not a goal; this page is the one thing that exists in both languages.
Second factor
TOTP with one-time recovery codes, inside the instance.No external identity provider: login is delegated to nobody, which is the other half of holding no account anywhere. See ADR-018.
Legal pages
None, deliberately.It is software you host, not a service anyone provides to you, so it ships no privacy notice and no terms — the MIT license carries the terms.
Not advice
Stockerly shows market information, not investment advice.Prices, fundamentals and FX rates come from third parties and can be late or wrong. Check anything you act on against your broker.
Contributing
Bug reports, questions and pull requests are all welcome — open an issue to start.Read CONTRIBUTING.md first. It is one person's daily driver reviewed on evenings and weekends, so expect that pace rather than a team's.