Own product · Live · sign-in · 2026
NEPSE Copilot
NEPSE Copilot is a full investing copilot for the Nepal Stock Exchange, built for a family of accounts. It ingests market, company and floorsheet data from four sources, syncs each member's holdings and IPO applications from their depository account, scores trade ideas on measured evidence, proposes orders for one-tap approval on Telegram, runs paper strategies against a real-fee ledger, and grades every signal against what the market did 5, 10 and 20 days later. It speaks English and Nepali, and has a read-only voice mode with 31 tools.
nepse.mytrya.com↗By Suraj Malla · Kathmandu
The problem
Retail investors on NEPSE work from broker screenshots and group chats. The daily floorsheet is public and almost nobody processes it. There is no order API; the only route to a trade is the broker's web terminal.
Nothing tracked several family members' holdings in one place, told them what was worth a look in plain language, or kept an honest record of whether its own ideas had worked. So I built it.
How it works
ShareSansar · chukul · merolagani ─┐ paced, with fallbacks
MeroShare (per member, encrypted) ─┼─▶ Postgres, 23 tables
full-market floorsheet ─┘
│
┌───────────────┬───────────────────┼──────────────────┐
▼ ▼ ▼ ▼
signals · RS market regime smart money events · IPOs
backtests (top-down gate) broker flows auto-apply rules
└───────────────┴─────────┬─────────┴──────────────────┘
▼
conviction 0–100 (evidence, not prediction)
│
┌─────────────┬───────┴────────┬──────────────┐
▼ ▼ ▼ ▼
web (en/ne) Telegram card voice, 31 tools paper ledger
Approve / Skip read-only real fees
│
▼
next session: submit approved ─▶ broker adapter
scoreboard: real return at +5 / +10 / +20 days grades each band- Ingest from ShareSansar (server-rendered pages and the DataTables endpoints behind them, with session cookie and CSRF), chukul's unofficial JSON at a measured 1 request per second, merolagani for valuation fields the others lack, and MeroShare for each member's holdings, applicable issues and applications. Every source keeps an older path as a fallback.
- A full-market floorsheet store: raw contracts pruned after a retention window, broker flows kept forever, and a smart-money layer that fires only when one broker's flow in a scrip is both concentrated and persistent across the window, because a single day's number from a venue is noise.
- Signals, a market-regime classifier, relative strength over 20, 60 and 120 sessions ranked across the liquid universe, a sector layer with both the published cap-weighted index and an equal-weight one built from stored prices, a corporate events calendar, and market holidays that are inferred when the feed is still on yesterday's date at noon.
- Conviction scoring, a forward scoreboard, a reliability page, named strategies with paper ledgers, and a strategy backtest that replays the whole rulebook, sizing, position limits, exits and round-trip costs, as an equity curve against the equal-weight market.
- One-tap trading: the evening scan proposes orders, each member gets a Telegram card with Approve and Skip, and approved orders are submitted the next session through a broker adapter. A paper account seeded with the real portfolio's value fills at the next session's open with real one-way fees, and tracks whether the paper record has earned the right to be trusted.
- IPO auto-apply per account, with rules for which issue types and how many units, behind a master switch and requiring the member's CRN and PIN. Intraday alerts for targets crossed, circuit limits and big moves, evaluated against the live feed by an external pinger while nobody has the app open.
- Multi-user access with a single authorisation choke point, an admin area for members, access, activity and usage, per-person daily budgets for chat and voice, an activity log that records every job, external call and AI call with its cost, an issues detector that tells the admin once, on Telegram and email, when a login breaks or a feed goes stale, and a status page with verdicts rather than dates.
Decisions that mattered
6
A score for how much evidence there is, not for whether you'll win
Conviction is a 0 to 100 score. The comment in the source says it is not a prediction of success. It adds up backtested hit rate and edge, sample size, how many independent signals agree, liquidity, whether the model agrees, and whether the position fits the portfolio. A buy into a scrip that's already heavy loses points.
A scoreboard job records the actual return 5, 10 and 20 trading days after every signal and grades each score band against what happened. Moves beyond a day's circuit limit are treated as bonus or rights adjustments, not returns, so a corporate action can't look like a good call. The reliability page shows every strategy next to a plain market baseline, including the ones that underperform it.
The market regime gates every idea
NEPSE moves in long liquidity-driven waves, and a mean-reversion buy that works in a flat market is a falling knife in a broad decline. In August 2026 the technical buy signals went 1 for 38 while the market fell 7%. The regime classifier is deliberately simple and explainable, and every stock idea is read against it.
The 2019 to 2026 backtest over 9,767 scrip-days found that six-month relative strength is contrarian on this exchange: the top quintile lagged. The relative-strength module carries that finding in its header so nobody re-learns it.
Market rules changed mid-history, so the code knows the date
Nepal moved to a Saturday–Sunday weekend on 6 April 2026, and the exchange's trading week moved with it. The daily circuit limit widened from 10% to 15% on 20 April 2026. Every statistic that depends on what a legal one-day move is goes through one module that knows both regimes, because the price history straddles them.
Treating the data sources as temporary
The main JSON source is undocumented. I measured it on 1 September 2026: bursts of about 4 requests return 429, 1 request per second sustained is clean, page size caps at 500. Every caller shares one pacing gate built to those numbers, keeps its older scraper as a fallback, and treats an unexpected response shape as an outage rather than data.
The external pinger's API had drifted from its documented schema before, so everything it returns is treated as unknown and coerced.
Voice can look, not act
The Gemini Live voice session has 31 tools: portfolio, quotes, ideas, pending orders, the paper account, smart money, regime, sectors, events, the floorsheet, alerts, news, IPOs, the brief, the watchlist, the track record, a glossary, the family overview, system status. None of them approve an order. Approval stays on the Telegram card and the orders page, where you can see what you're tapping.
Chat shares the same tools and ground rules with a different preamble, because prose that is read can carry markdown, exact figures and links, where speech wants two rounded sentences.
Cost and credentials
Anyone with a Google account can sign in, so each person has a daily ceiling on chat turns and voice minutes, counted from the activity log per Nepal-time day. Per-endpoint stats are batched and flushed to Postgres at most once a minute, because a browser polling the live feed every 60 seconds had been keeping the database compute awake around the clock.
Members' depository passwords and transaction PINs are encrypted with AES-256-GCM, a fresh nonce per value, under a key that exists only in the deployment environment. The database alone is useless without it. The format is versioned so the key can rotate.
A scheduled job runs a roster of Gemini and OpenRouter models over identical inputs and keeps every result. One model was dropped because its median call took 259 seconds and its maximum 295, most of a 300-second function budget.
What is and isn’t shown
My own product. Live, with Google sign-in; access to accounts is admin-controlled, so the link lands on the sign-in page. The regime and backtest figures are from my own data.
Next step
Have a system like this in mind?
Describe it: what it is, who does it, how often, and what goes wrong when it's late. I reply within one working day with a scoping call or a reason it isn't worth automating.