market-lab: every score has to show its doubt.

A static research board scoring 1,600+ stocks on India’s National Stock Exchange.

  • 6 min read

A stock screener is dangerous when it looks cleaner than the market it describes. market-lab ranks the NSE, and every row carries the reason to be skeptical.

Open market-lab (opens in a new tab)

The market-lab board ranking NSE stocks with opportunity score, risk band, horizon, turnover, order impact, and arguments for and against each row.
Every screenshot here shows the board as it first shipped.

The data was fine. The reading wasn’t.

Screeners present data as if you already know how to weigh it. A high score can hide bad liquidity. A short-term signal can read like a long-term thesis.

A typical screener
  • Leads with a sortable number
  • Treats liquidity as secondary
  • Hides the counter-case in extra columns
  • Leaves you to guess the time horizon
market-lab
  • Pairs every score with its objection
  • Shows order impact beside turnover
  • Writes the argument in plain language
  • Puts the horizon in the row

Try the score-with-doubt rule

Example ticker84 research score

Strong candidate, but the row still carries the strongest objection.

Research score84
A simplified model of the rule.

I designed the whole stack and directed the build.

I also tested it. The design question was what the interface was allowed to imply.

1,600+
NSE stocks scored every trading day
0
runtime servers needed for the public board

Static was a design decision.

The product doesn’t need a live server to be useful, and static keeps it cheap, resilient, and easy to inspect.

  1. Official exchange data
  2. Scheduled fetch
  3. Clean and normalize
  4. Scoreopportunity, risk, horizon, liquidity
  5. Verification gates
  6. Static JSON
  7. TypeScript board
  8. CDN publish

Each layer pairs a design concern with the engineering choice behind it.

Article data table
LayerDesign concernEngineering choice
DataStale or malformed rows never become confident UINormalize the exchange feed before scoring and publish only generated data
ScoringNo single magic number pretending to be truthCalculate several signals and show the weakest next to the strongest
InterfaceFast comparison without hiding riskDense rows with score, risk, turnover, impact, horizon, and thesis together
DeliveryKeep the public product cheap and durableStatic files on a CDN, no always-on app server

The row is the product.

Rankings. Thesis, weakness, risk, liquidity, and order impact in one row, so the score never travels alone.

market-lab Rankings view showing highest-ranked NSE stocks with score, risk, thesis, weakness, turnover, and order impact.

The hardest call was resisting the detail-page instinct. In a financial product, a buried caveat is a deleted caveat for most people, so the row carries the full minimum argument.

The visual system has to make that warning readable without turning the board into an alarm panel.

The warning survives the phone.

On a phone, nothing that matters for safety hides in an overflow menu.

Mobile market-lab Rankings view at 390 pixels wide with market status cards, a responsive stock research card, and persistent bottom navigation.
Mobile Rankings at 390 × 844.

The same rules hold on both screens; only their expression changes.

Article data table
System ruleDesktop expressionMobile expression
Score never travels aloneScore, thesis, weakness, horizon, and liquidity line up in one dense rowThe card keeps score, risk, thesis, and weakest signal above the fold
Navigation stays availableResearch destinations use the wide application shellFive primary destinations become a persistent bottom bar within thumb reach
Status stays in contextSession freshness and market breadth sit above the ranking tableStatus becomes stacked disclosure cards that keep their labels and tap targets
Themes keep the hierarchyColor tokens separate surface, data, and warning rolesThe same semantic tokens hold contrast without changing the information order

How I kept the score honest.

Screener. Filters work only while each row still shows its risk and doubt.

market-lab Screener view showing controls for filtering and comparing NSE stocks.

Each signal on the row, why it exists, and how it appears.

Article data table
SignalWhy it existsHow it appears
Opportunity scoreGives research a starting orderBig enough to scan, never alone
Risk bandStops a high score from feeling good across the boardA chip next to the stock name, not buried at the end
Liquidity and order impactShows whether a real position can get in without moving the price too muchShown as practical rupee-order context
Argument againstForces the product to say why the score might misleadWritten next to the positive thesis in plain language
See every screen, failure state, and accessibility check

Every screen keeps the same posture.

Investors. Which investor, horizon, and risk appetite the signal fits.

market-lab Investors view showing stock research organized around investor needs and market context.
market-lab Portfolio view showing a portfolio-focused research surface.
Portfolio. What a set of choices means together.
market-lab Methodology view explaining how the scoring system works.
Methodology. What refreshes, where the data comes from, what the score means, and where the model is limited on purpose.
market-lab AI assistant panel opened on top of the stock research board.
AI assistant. It helps you interpret and compare, and it keeps reminding you this is research, not advice.

Missing data never looks like weak data.

Reliability lives in the shared data layer: malformed numbers become unavailable, duplicate or damaged rows get counted, and a score is suppressed when its risk, liquidity, or horizon context can’t support it.

market-lab recoverable market-data error showing the HTTP status, an explanation that scores are withheld without source data, and actions to retry or inspect the methodology.
Recoverable data failure.

Each failure class, the unsafe default, and the designed response.

Article data table
Failure classUnsafe behaviorDesigned response
Initial data failureRender an empty board or fabricate zero-like valuesWithhold scores, show the failure reason, and offer retry plus methodology
Background refresh failureReplace useful context with a generic errorKeep the last-known screen, mark it stale, and let the user retry
Malformed or partial rowsLet missing risk or liquidity look neutralMark fields unavailable, count rejected rows, and suppress unsupported rankings
Restrictive filtersTreat zero results like a system outageName the active constraint and give a direct way to clear or widen filters
Invalid portfolio or assistant inputAccept a success-shaped answerAttach the error to the field or request and keep the user’s work recoverable

Accessibility gated the release.

The sweep covered every primary view, factsheets, assistant setup, both themes, and loading, empty, degraded, and error states.

66
Playwright checks passed across product and failure states
0
automated WCAG 2.2 A/AA violations in tested surfaces
320–430
pixel-wide mobile viewports exercised
200%
equivalent zoom and reflow coverage at 640 pixels

Each user need, the evidence for it, and how I checked it.

Automated WCAG 2.2 A/AA checks found no violations in the views and states I tested. Automated tools can’t prove full screen-reader or assistive-technology conformance, so I don’t claim it.
User needImplementation evidenceHow I checked it
Understand status without colorRisk and quality use text, icons, and semantic labels as well as colorLight and dark contrast checks plus non-color state inspection
Operate the board without a pointerRows, filters, disclosures, factsheets, and assistant controls have keyboard semanticsTab order, focus visibility, Enter and Space activation, and focus-return tests
Hear updates and errorsLoading, result counts, assistant responses, and failures use the right status or alert behaviorAutomated role and name checks plus inspection of the critical live regions
Zoom or use a narrow viewportCards reflow without two-way page scrolling and primary controls keep usable targets320, 390, and 430 pixel viewports plus 200%-equivalent reflow
Automated WCAG 2.2 A/AA checks found no violations in the views and states I tested. Automated tools can’t prove full screen-reader or assistive-technology conformance, so I don’t claim it.

What this proves, and what it doesn’t.

I designed and directed this alone, with Claude Code writing the code. It shows end-to-end ownership, not team leadership, and the rankings say nothing about investment returns. Judge it on research quality: whether you notice the counter-argument, and whether confidence drops when the evidence is incomplete.

What I’d build next.

Next, I’d add a change log for why a score moved after each trading session, the raw fields behind every final judgment, and structured screen-reader and browser testing.

market-lab’s quality lives in the seam between the model and the interface: help people research faster, and never let speed turn into false confidence.