This release adds 2 notable features for engineering teams evaluating rollout.
Published 2mo
Productivity & Wikis
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
api
journal
stocks
trading
Summary
AI summaryFirstrade CSV import now correctly calculates cost basis and P&L for notes, options, and commissions; Interactive Brokers error handling improved; image upload UX allows clipboard paste.
Full changelog
Bug Fixes
Firstrade CSV import (now flagged as Alpha)
- Treasury notes/bonds (CUSIP 9128*) now use the CSV
Amountcolumn for cost basis instead ofqty * price, which was inflating P&L by orders of magnitude - Same-day mixed buys/sells are reordered by net daily flow so a partial close on an existing long position is no longer misclassified as opening a short
- Options assigned/exercised/expired close at $0 so the premium becomes realised P&L instead of leaving the contract permanently open
- Bloomberg-style symbols derived from descriptions for US Treasuries (e.g.
T 4.25 12/31/26) instead of surfacing raw 9-character CUSIPs - Options realised P&L matched to the CSV
Amountcolumn, capturing exchange/regulatory fees Firstrade rolls into the amount without itemising - Commission and Fee columns tracked separately on trades
- Generic broker selection routes to the Firstrade parser when headers unambiguously match
- EXEC TIME hints extracted from row descriptions; execution datetimes rewritten monotonically post-sort to preserve position-aware order
- Heads up: the Firstrade parser is now labelled Alpha in the import UI. Please review imported trades and report incorrect P&L or symbol mappings via GitHub Issues.
Interactive Brokers (IBKR)
- Rewrote error code dictionary against the official Flex Web Service v3 docs (e.g.
1007was incorrectly labelled token-expired; that's actually1012) - Added all transient codes (
1001,1004-1009,1018,1019,1021) to the retry set requestFlexReportnow retries up to 5x on transient IBKR/DNS errorsfetchFlexReportpoll loop uses the retryable set instead of a hardcoded1019check- Scheduler cleans up zombie
fetching/startedlog entries on startup
Trade filters & detail
- URL filter params are now authoritative — click-throughs like
/trades?symbol=Xno longer pick up a stalestatus:openfilter from localStorage - Open option positions in Trade Detail now show entered premium plus unrealized P&L (using the dashboard's manual option price) instead of
Open - Max Drawdown click in Analytics now force-enables the drawdown chart if hidden and adds a brief ring highlight on scroll
- Display Currency description in Settings clarified — it changes the symbol only, no FX conversion
Broker sync date range
- New
sync_start_datecolumn onbroker_connections(NULL = All Time) Sync Trades Frompreset selector (All Time, This Year, Last 30/90 Days, Last 1 Year, Custom) in both the IBKR setup modal and the connection settings modalsyncConnection()falls back to the connection'ssync_start_datewhen no explicit start is supplied, applying the floor to scheduled auto-syncs as well
Image upload UX
- Paste images from the clipboard directly into the trade and diary upload zones (shortcut label adapts to platform)
- Warn before saving an edited trade when images are selected but not yet uploaded, then flush pending uploads on confirm
Features
Stock Analyzer / DCF valuations
- Auto-save every Calculate — no more clicking Save Valuation
- Saved Valuations panel always visible (was hidden until a symbol was searched)
- Colored symbol chips per row; current-symbol rows group at top with an
Only {symbol}filter - Click a saved valuation for a different symbol to switch the analyzer and auto-load its assumptions/fair values
- Loading a saved row rehydrates the Bear/Base/Bull cards from stored fair values; margin-of-safety recomputed client-side
Fixes
saveValuationnow roundsshares_outstandingbefore INSERT (Finnhub returns shares in millions; the *1e6 multiply yielded floating-point residue like1036160000.0000001for NOW, which Postgres rejected on the BIGINT column with a 500)- Added migration
180_create_email_log.sql—emailService.logEmail()and the retention email schedulers reference anemail_logtable that no migration ever created, causingrelation "email_log" does not existerrors on every scheduled run
Other
- Simplified the quick deployment script
- GitHub Pages landing page
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Beta — feedback welcome: [email protected]