Seven Years of Building StockOptions.io

In March 2019, I had a simple problem. I’d received stock option grants from a couple of companies and wanted to see what they’d be worth under different vesting schedules and stock price scenarios. The spreadsheet I was using was getting unwieldy. So I spent a weekend building a small web app to replace it.

That was seven years and 923 commits ago.

StockOptions.io is now a full options analysis platform: backtesting, position sizing, portfolio sync, real-time monitoring. It’s the side project that taught me the most about what it means to build something over a long time horizon.

The evolution

The first version was simple. You entered your grants, set a target stock price, and it showed you a chart of your vesting schedule with projected values. Built in Laravel with a basic Vue frontend.

Then I started trading options myself. Once I had skin in the game, the feature requests came from me. Each new itch became a new feature.

Backtesting came first. Multiple algorithms: a standard approach, a ladder strategy that scales in at different strikes, a shotgun approach that diversifies across many positions, and a blanket strategy. Each one runs against historical price data across about 6,000 symbols to show what would have actually happened, not what a theoretical model says should happen.

Then Kelly criterion for position sizing. It tells you the mathematically optimal position size given your edge and the odds. Most people either bet too much (risking ruin) or too little (leaving returns on the table). I integrated it directly into the position analysis so I can see the Kelly-optimal allocation for every trade. I usually bet a fraction of the full Kelly recommendation (half-Kelly or quarter-Kelly), because the Kelly criterion assumes you know your true edge, and I know I don’t.

The Schwab integration changed daily use entirely. Instead of manually entering every trade, my portfolio syncs directly with Schwab via their API. Positions, transactions, and current prices all flow in automatically. It turned StockOptions.io from a tool I used occasionally into something I check daily. If your side project requires manual data entry to be useful, you’ll eventually stop entering data. Removing that friction was the single most important feature I added.

Most recently, correlation analysis. Pearson correlation coefficients across all ticker symbols in my portfolio. When you’re selling options on multiple stocks, you want to know if they’re correlated, because correlated positions means correlated risk. This helps keep the portfolio diversified at a statistical level, not just an intuitive one.

Daily workflow

The core loop: open the dashboard and see all positions across every account. Each position shows the current price, entry point, probability of expiring out of the money, delta, and annualized return. Drill into any position for full analysis including historical performance of similar setups. When evaluating a new trade, I run it through the backtester first and look at how that strategy has performed historically.

Seven years of compounding

Side projects that last need to solve your own problem. I’ve tried building things for hypothetical users. They die. StockOptions.io has survived because I use it every single day. When the user and the builder are the same person, the feedback loop is instant.

The compound effect is real too. Any single feature was maybe a weekend of work. But 923 commits over seven years created something I couldn’t have designed upfront. The platform evolved organically based on real needs, and the result is far more useful than anything I would have spec’d out on day one.

The temptation to throw everything away and start fresh is strong, especially when you look at code you wrote years ago. I’ve mostly resisted. The frontend is still Vue 2.7 with Buefy components. Not fashionable, but it works. I migrated the build system from Laravel Mix to Vite, and I’ve incrementally upgraded Laravel through several major versions. Incremental upgrades have served me better than rewrites.

The technical debt that doesn’t matter

After seven years of commits, the codebase has layers. Code from 2019 sitting next to code from last week. Patterns I wouldn’t choose today.

Technical debt only matters if it slows you down. The Buefy components work. The chart rendering is stable. The API endpoints do what they need to do. I could spend six months rewriting the frontend in Vue 3, and at the end of it, the app would do exactly what it does today.

The places where I invest in upgrades are the ones that actually block new features. Migrating to Vite was worth it because build times were painful and hot reload was broken. Upgrading Laravel major versions is worth it for security patches. But I’ve watched too many side projects die because the builder decided to rewrite instead of iterate.

The asymmetry

There’s an asymmetry I’ve come to appreciate: the time I spend building StockOptions.io improves my investing, and the investing teaches me what to build next. The two activities feed each other in a way that neither could achieve alone.

Seven years in, I’m still adding features. Recent work has included RUT index support, automatic portfolio syncing on a schedule, and transaction history imports. The project isn’t going anywhere because the problem isn’t going anywhere. As long as I’m trading options, I’ll want better tools.

StockOptions.io is live.