tejas.k

Work

Projects with the receipts.

₹ Rupee Engine

FlagshipActiveFeb 2026 – present
  • 13 algorithms
  • 2,600+ stocks per run
  • -91% backtest memory
  • fails loudly, never guesses

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 scoring 2,600+ NSE stocks in a full run, 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
  • 108 challenges
  • ~330x faster than real time
  • matches queueing theory within 6-8%
  • retry-storm lesson

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
108 guided challenges scored from one to three stars, 23 component types, request-trace waterfalls, chaos injection and shareable designs. Engine checked against queueing theory within 6-8%.

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.

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 lead and senior backend and distributed-systems roles. LinkedIn is the best way to reach me.

Bengaluru, India

↑↓ navigate · ↵ run · esc close

tejas@portfolio ~

The 30-second version

Tejas Kothari

Message on LinkedInSee the workLinkedIn