tejas.k

Work

Projects with the receipts.

What I built, why, how, and what came out of it. Open a case study for architecture and decisions.

Selected work

Things I actually built.

Each one answers four questions: what, why, how, and what came out of it.

₹ Rupee Engine

FlagshipActiveFeb 2026 – present

A modular equity-analysis and portfolio engine for Indian markets, with a CLI, an API and a dashboard.

Why
Scattered fundamentals, technicals and sentiment are hard to compare. One pipeline makes the reasoning repeatable and testable.
How
Async ingestion with TTL caching and incremental refresh feeds a relational store. A registry of pluggable algorithms scores each stock, and a risk/return-aware optimizer builds the portfolio.
Result
13 registered algorithms, 1,300+ NSE stocks, backtesting and walk-forward calibration, and a React dashboard on top.

Under the hood

01Async ingestion02TTL cache + incremental refresh03Relational store04Scoring engine05Portfolio optimizer06Backtest + calibration07CLI · API · dashboard

Key decisions
  • Why PostgreSQL only? Backtesting, run history and analysis snapshots are relational and need transactions and migrations. Running one database everywhere removes a whole class of local-versus-production differences.
  • Why async ingestion? The pipeline is I/O bound. Concurrent fetching with caching turns a slow serial crawl into something that can run daily.
  • Why a plugin registry for algorithms? Each algorithm is one file behind one interface and is registered by decorator. Adding or retiring one never touches the rest, and the docs are checked against the registry so they cannot drift.
Trade-offs
  • Operational simplicity (one database, one machine) over horizontal scale.
  • Measurability over cleverness: every algorithm must be scoreable against history.
  • A small, explicit public surface rather than exposing engine internals.

PythonFastAPIasynciohttpxPostgreSQLAlembicDockerReact

Case study →

System Design Playground

Open sourceActiveOct 2026 – present

A browser simulator: sketch a system, send traffic, watch it break, then fix it.

Why
System design is learned by seeing queues fill, pools run dry and retries pile up, not by reading about them.
How
A deterministic discrete-event engine in Go streams live state over WebSockets to a hand-drawn canvas UI in React.
Result
Guided challenges scored from one to three stars, request-trace waterfalls, chaos injection and shareable designs.

Under the hood

01Canvas UI02WebSocket session03Discrete-event engine04Chaos and traffic05Scenarios + scoring06REST API + sharing

Key decisions
  • Why Go for the engine? A tight event loop with predictable performance. A 30 s run of a 1,000 rps, 20-node design takes about 90 ms, so the simulation can run many times faster than real time.
  • Why deterministic? Same diagram and seed give the same result, which makes challenges fair, tests reliable and bugs reproducible.
  • Why run the simulation on the server? One authoritative engine, no duplicated logic in the browser, and the UI stays a thin editor and renderer.
Trade-offs
  • A request-flow and capacity model rather than a full distributed-systems emulator.
  • Stateful server sessions in exchange for live editing.
  • Anonymous sharing by capability link rather than accounts.

GoWebSocketReactTypeScriptViteDocker

Case study → GitHub ↗

More projects

AOV Studios Website

ShippedJun – Aug 2023

The official website for AOV Studios, a React single-page app that I led and built.

Live in production.

JavaScriptReact

Visit site ↗

Twitter Malicious Bot Detection

HackathonOct 2021

A metric that flags malicious bots and botnets from a Twitter handle or hashtag.

Won “Most Radical Idea” among 40+ teams, presented to a C-level panel.

JavaPythonSQLRedisVertica

Contact

Let's build something.

Open to distributed-systems and senior backend conversations, and to interesting problems in general.

Bengaluru, India

↑↓ navigate · ↵ run · esc close

tejas@portfolio ~

The 30-second version

Tejas Kothari

Email meSee the workLinkedIn