▶ Full Post Text
Hi everyone,
I'm Calesthio, a solo dev who ships open source side projects when something annoys me enough. Two of my previous ones are Crucix (\~10k github stars) and OpenMontage(\~4k github stars). I also happen to trade options, and the workflow has been driving me crazy for a while.
Here's the thing that finally pushed me to build my own platform.
\- I trade off the SPY (underlying symbol) chart. I know where I want in, where I'm wrong, and where I'd take profit, all in underlying price.
\- Then I have to switch to my broker's options ticket, pick an expiration, scroll a strike ladder, figure out how many contracts $1k buys, set the stop in \*option premium\* dollars (not the SPY level I actually understand), submit.
\- Then watch a market-maker tap my stop on a 30-second wick fifteen minutes into the session.
So I built and just Open Sourced OptionsCanvas, locally run Trading platform for Option Buyers.
The two things it does that I haven't seen anywhere else (open or closed source):
\*\*1. Your stops never touch the broker.\*\* SL and TP live in a local SQLite DB on your machine. A background loop polls the underlying quote. Only at the moment the underlying actually breaches your level does the platform fire a market order. The broker order book never sees the stop, so market-makers can't hunt what they can't see.
\*\*2. You never touch the options chain.\*\* You drag your entry, SL, and TP pills directly on the underlying's chart. The system picks the strike, the DTE, the contract count (based on your position size preset), and projects the option premium + dollar P&L in real time as you drag the pills. No chain picker, no strike ladder. You think in underlying equity price, you trade options.
Other stuff that's in there:
1. 15 Hotkeys for immediate open/close, bracket order, etc. etc.
2. Browser-based first-run wizard. Double-click the launcher, paste your broker keys, pick a watchlist (recommended 30 names or full 110), click Start Trading. No JSON editing, no terminal. Easy to onboard your own symbols.
3. Trade journal that auto-writes every fill + daily aggregates to SQLite. Query with pandas, DuckDB, Datasette, your llm whatever. Your data, on your disk.
4. Runs 100% locally on Flask + a vanilla JS frontend on TradingView Lightweight Charts. Zero telemetry. Only outbound traffic is to your broker.
5. Currently supports Alpaca (paper + live, production tested) and Tradier (implementation is in the repo but I haven't validated it end-to-end against a Tradier sandbox account yet — marked experimental in the README).
6. The broker layer is abstracted so adding IBKR, Tastytrade, etc. is easy.
I'm dropping this here because I want to know if it's genuinely useful to other options traders, or if I've just built something that solves my own niche workflow. If it lands, I'll dedicate more time, add more features, resolve bugs, more brokers, etc.
If you try it out, please open issues, feature requests, PRs, or just drop a discussion in the repo. "I tried to install it and it crashed" is valuable feedback too.
Repo: [https://github.com/calesthio/OptionsCanvas](https://github.com/calesthio/OptionsCanvas)
\-----------------------------------------------------------------------------------------
A few honest disclaimers before anyone tries this:
1. This is a solo dev project. I have a full-time job and also maintain the other two repos above. Please don't expect it to be completely without any issues. Feel free to report them however.
2. I do use this to trade my own paper account basically every day.
3. The README has a \`Broker support status\` section where I'm transparent about what's actually tested vs what's experimental.
4. Paper trading is the default in the wizard; live mode requires you to deliberately flip the toggle and shows a giant red border + warning banner so you can't end up there by accident.
Cheers,
https://preview.redd.it/kuepqjjjnc3h1.png?width=2548&format=png&auto=webp&s=4ab145304230a5a0be97eb336cc5b6951c2d955d
https://preview.redd.it/k84suywjnc3h1.png?width=973&format=png&auto=webp&s=deb1e6ab3516bef20a2fd67b1a004d55c66154b4