Raj Parikh.

Available

PlainStock PlainStock

Understand your stocks, not just track them.

Live data, AI generated analysis, and peer comparisons turned into plain language reports you can read in seconds.

Role

Solo designer and builder. Product, interface, backend, database, API integrations, and the prompt engineering behind every report.

The only project here that is public and live. Everything else on this site is client work under NDA.

The PlainStock dashboard: a sortable table of held stocks with live price movement across three timeframes, and an AI brief open alongside it
Outcome

A tool for reading one stock in plain language, designed and built end to end, and the only project here you can open and use right now.

Part 01: The problem

More consumption than comprehension

I use Fidelity to manage my portfolio, but getting a clear picture of one stock takes multiple tabs, pages, and clicks. Every session felt like more consumption than comprehension.

Role
Solo designer and builder
Design and build
Claude, Antigravity, Google Stitch, Figma
APIs and infrastructure
Gemini API, Finnhub, Polygon, Supabase, Vercel
Status
Built for personal use, now shared with others

Part 02: The product

Live data, AI reports, and peer analysis in a single view

PlainStock offers a complete read on your portfolio without leaving the page. Each stock shows real time price movement across three timeframes, with one click access to an AI generated report and peer comparison.

The main view

Dashboard

The main view pulls live market indices and stock performance into one sortable table. Stocks can be added, removed, or moved to a future prospects watchlist.

The dashboard: market indices across the top, then a sortable table of held stocks with price and movement across three timeframes
The main table, sortable across three timeframes.
The report

AI Brief panel

Each AI Brief synthesizes the stock's current position, recent movement, and analyst signals into a plain language report.

An AI brief for a single stock: current position, recent movement and analyst signals written as plain prose with cited sources
One stock, written out in plain language.

Part 03: The approach

A system designed before it was built

I mapped every data source, API dependency, caching layer, and security requirement before anything got built. Every build decision traced back to a product decision.

  • Decision

    A table, not a dashboard of charts

    Scanning across stocks and timeframes is the core behavior, so the main view is a sortable table rather than a wall of visualizations.

  • Decision

    Plain language, not charts

    Charts require a level of financial literacy the person this was built for does not need to have.

  • Decision

    Owned stocks separated from prospects

    Monitoring something you hold and evaluating something you might buy are two different mindsets, so they are two different lists.

The build

I used Claude, Antigravity, and Google Stitch to build across domains I don't own: backend infrastructure, database architecture, API integrations, and AI prompt engineering.

Part 04: Trust

Trust was the hardest thing to build

This project started as a personal tool to simplify how I check my stocks. It grew into a fully shipped product with live data, AI generated reports, peer analysis, and multi-user support.

Pivotal moment

Decision

An AI report you can't rely on is worse than none

The AI Brief went through roughly 13 versions. Better prompts alone did not fix it. I defined a quality rubric, scored against it, and engineered toward that standard.

The output rambled, hallucinated sources, dropped sections, and changed tone between runs. Better prompts alone did not fix it. I defined a quality rubric, scored one report against it until it met the bar, then made that the standard every report generated after it had to match.

Early reports cited junk sources, so I added explicit blocking rules and Google Search grounding to keep citations credible.

Then a second failure, and a quieter one. Early builds regenerated the report on every page load, so users saw different content each visit with no explanation. I switched to a fetch once model with manual refresh, caching reports until the user explicitly asks for a new one. That one change restored trust in the output.

A tool I built because I wanted it to exist, and kept working on until I trusted what it told me.