MUTXRI TERMINAL is a financial terminal for African equity markets - a Bloomberg/Godel-style shell covering four exchanges:
| Exchange | Country | Currency | Securities |
|---|---|---|---|
| JSE | South Africa | ZAR (ZAc) | 431 |
| EGX | Egypt | EGP | 374 |
| NGX | Nigeria | NGN | 156 |
| NSE | Kenya | KES | 69 |
1,030 securities, 0 duplicate tickers. Every security is classified into a real industry sector (0 "Other" cells).
Click JSE / EGX / NGX / NSE to switch markets. The tape, watchlist and heatmap update instantly.
Scrollable list of all securities with price, change % and volume. Click any row to open the stock panel on the right.
| Tab | What it shows |
|---|---|
| HEATMAP | Sector treemap of the active exchange - every stock as a sized cell |
| SCREENER | Filter stocks by exchange, sector, price range |
| FINANCIALS | Income statement / balance sheet / cash flow + verified filing PDF links |
| REG · GLCO · BND · FX · TAS · RATINGS | Regulatory, commodities, bonds, FX, and ratings panels |
| Source | Used for | Honesty label |
|---|---|---|
| Yahoo Finance | JSE/EGX live quotes & history | LIVE (delayed) |
| kwayisi (afx.kwayisi.org) | NGX/NSE EOD board + period returns | EOD |
| African Financials | NGX/NSE statements, descriptions | FILED |
| Company IR sites | Verified annual-report PDF links | FILED |
| Official exchange listings | Security universe (verified) | VERIFIED |
No number is fabricated. Missing data renders as "-" or an honest "no market data" message - never a guessed figure.
Sign up with your email (password min 6 chars). Passwords are pbkdf2-hashed - never stored in plaintext. Sessions last 30 days. Users persist in MongoDB.
| Endpoint | Action |
|---|---|
/api/auth/signup | Create account (email + password + optional name) |
/api/auth/login | Log in, returns session token |
/api/auth/me | Validate session, returns user |
/api/auth/logout | End session |
| Endpoint | Description |
|---|---|
/api/listing?exchange=X | Full security list for an exchange |
/api/heatmap?exchange=X | Heatmap cells (price, sector, volume) |
/api/chart?symbol=X&range=R&interval=I | OHLCV bars |
/api/quotes?symbols=A,B | Live quotes |
/api/metrics?symbol=X&exchange=E | Full 70-field metrics suite |
/api/financials?ticker=X&statement=income|balance|cashflow | Financial statements |
/api/indices | Market indices tape (EGX 30, JSE Top 40, + baskets) |
/api/fx · /api/news · /api/rates | FX rates, news, interest rates |
/api/health | Server health check |
No free structured source exists for South African or Egyptian financial statements. African Financials covers 0 SA/Egypt companies. Company IR PDFs are mostly image scans. Paths forward: OCR, or a licensed feed (Twelve Data ~$8/mo).
Yahoo dropped Kenyan/Nigerian tickers. The terminal shows honest EOD period-return history (1W/1M/3M/6M/1Y) - real published returns, never fabricated candles.
22 securities (Uchumi, Mumias, DUNLOP, UBN, KPLC prefs...) have no quotes on any free feed - the market itself produces no data. Shown honestly with status.
Their PDFs use unusual formats (quarterly management reports, encoded text layers). Filing PDF links are shown instead.
cd /d/mutxri-terminal python afri_server.py # -> http://127.0.0.1:8081/
This site serves a data snapshot (EOD listings, heatmaps, indices). Live quotes/charts are available on the local server. The badge in the footer tells you the mode: ● LIVE or ● SNAPSHOT.
Host afri_server.py on Render/Fly (PORT env supported, CORS
enabled), set API_BASE in index.html, redeploy. See the repo
README for the full guide.
The command line is the input at the bottom right of the status bar. Click it,
type, press Enter. Input is upper-cased before it is matched. There is no global
keyboard shortcut to focus it: the ` glyph in the status bar is a label,
not a binding.
Full user-facing reference, with the tour video: guide.html.
| Input | Resolves via | Action |
|---|---|---|
HELP | literal | Lists every panel label in the info rail |
SOL | resolveSec() | Ticker, bare ticker (ABG for ABG.JO) or exact name → quote sheet |
HEATMAP | panelFor() | Panel label or lower-case id → opens in the stage |
ABG FINANCIALS | both | Last token is a panel, the rest is the security → panel scoped to it |
PANEL_ALIAS)| Code | Target | Status |
|---|---|---|
DES, SPLC | info (quote sheet) | works |
FA, FIN, RV | financials | works |
EQS | screener | works |
CN | news | works |
GP, HP | chart | dead: no panel has id chart, so panelFor() returns null and the input falls through to "unknown" |
Removed from this table: CF, DIV and
WEI were documented here but were never implemented in either
PANELS or PANEL_ALIAS.