In my workflow, this browser-local assistant reduced a recurring holdings-entry task from roughly 1–2 hours to 3–5 minutes. This is a firsthand operational observation, not a controlled benchmark.
Try the synthetic demo or read how the project started.
The reconstructed intake interview shows the original requirements.
- Detects the holdings header and maps common CSV column names.
- Groups positions by account and flags cash, duplicates, unusual pricing, and unmapped account types.
- Shows every row before entry and excludes blocked rows by default.
- Prepares ticker, units, and cost basis in a versioned fill packet.
- Runs only when the operator clicks a bookmark on an eMoney Holdings page. Save remains manual.
I designed the tool to stop on ambiguous matches instead of guessing. I exclude market value from the fill packet so the operator can compare it on screen.
flowchart LR
CSV["Holdings CSV"] --> Parser["holdings-csv-parser.ts<br/>header detect + column map"]
Parser --> Schema["holdings-schema.ts<br/>group by account, flag rows"]
Schema --> Review["review-export-surface.ts<br/>every row shown, blocked rows excluded"]
Review --> Packet["paste-conductor.ts<br/>versioned fill packet to clipboard"]
Packet --> Helper["emoney-browser-helper.ts<br/>bookmark, runs on the eMoney page"]
Helper --> Save["Operator clicks Save in eMoney"]
The current browser build does not send holdings data to a project server. When the operator asks for a prepared packet, the browser copies it to the system clipboard. The bookmark reads the packet on the visible eMoney page.
“Clear session” removes loaded data from the page. It clears the clipboard only if the clipboard still contains this session's last payload. If the operator copied something else afterward, the command leaves it alone. Use only synthetic or otherwise authorized data.
See DISCLAIMER.md for the project boundary and SECURITY.md for private vulnerability reporting.
npm ci
npm test
npm run typecheck
npm run build:demo
npm run build:portable
npm run test:portablenpm run start:demo serves the browser build locally. The portable build produces one self-contained HTML file with a restrictive content security policy.
The implementation is TypeScript and plain DOM code, with Node’s built-in test runner, esbuild for the portable artifact, and an optional Tauri shell.
MIT. See LICENSE.
