LTT Engine Room · Internal

LER BinderReaper

One stack in — every bill split, sorted, and summed.
Local-only — runs in Chrome / Edge, no upload
v44
25-Jun-26
LERBinderReaper-App.HTML
LTT Outsourced CFO Sdn. Bhd.
STAGE 1Capture & Rename — in RMReap the binder → each file tagged: MI/MO · currency · MB · page-set · SOA

01 Entity & key

With a key, each page image is read by Claude (best accuracy). Without one, it falls back to in-browser OCR (tesseract.js) + rules. Key is saved to this browser only, never to a file.

SF Short forms / abbreviations

Applied to file names — Left = full phrase, Right = short form (one per line). Synced with your LER ShortForm app: edit here, or pull the latest from the shared server. Re-run / Review to apply to names.

Open LER ShortForm ↗

02 Folder & options

No folder selected.
STAGE 2Clear leftover issues — 2a–2iTriage the S2 queue · fix names (2f / 2h) with Bulk rename

S2 Stage 2 issue codes — 2a to 2i

These appear in the file name as S2.xx (e.g. S2.2a2d), in the Stage2 column of the Results table, and in the Stage 2 Queue tab of the Excel. Any file carrying a code is held back from Stage 3 until it is cleared.

2a Multi-bill on one page — two or more bills on a single page; each was split into its own file. Check the split is correct.
2b Multi-page / supporting doc — the document spans 2+ pages, or is a supporting page (delivery order, receipt) that backs the bill before it (see the sup# reference).
2c Statement of account (SOA) — a supplier statement; processed separately — reconcile its line items rather than posting it as one bill.
2d Foreign / ambiguous currency — a non-RM amount or an unclear symbol (e.g. “$”); confirm the currency and the RM conversion.
2e Incomplete info — a key field is missing or unclear: date, payee / vendor name, reference no., or amount.
2f Over-long file name — the name exceeds the safe length (Windows path limit); shorten it before writing.
2g Wrong meta (MI/MO) — the money-in / money-out control tripped (e.g. a purchase bill read as a sales invoice); confirm the direction.
2h Off LTT naming standard — vendor unidentified, or the class / format does not meet the naming standard.
2i Other / low confidence — flagged for review: low AI confidence, or an issue not covered by 2a–2h.

BR Bulk rename (output file names)

Adjust the generated file names in bulk — find/replace, prefix/suffix, remove, case, numbering — then Write files now. Operates on the names from the last Reap/Review. (Don\'t Reap after renaming — that rebuilds the names.)

STAGE 3Provenance QC & HandoverLTT check → route to Claims / Finance / Payroll / Rental & Utilities / Recurring / Relief / Fixed assets

QC Provenance check & handover

Stage 3 combines the Stage 1 tags with your Stage 2 fixes, runs the LTT provenance check (owner, amount, date, vendor and MI/MO all present & consistent) and routes each cleared file to its destination app. Files still carrying a Stage-2 issue (S2.xx in the name) are held back; cleared files are named …~[…QC.App].

Destinations: Claims · Finance · Payroll · Rental & Utilities · Recurring expenses · Personal relief · Fixed assets · BankSweep · File Whiz. The handover lists are the Stage 2 Queue, Stage 3 Routing and Provenance QC tabs in the Excel (Download Excel in Stage 2), plus the Dest column in the Results table.

i Version history

Downloads LERBinderReaper-App.HTML (your API key is never included).
Changelog
v95 · 07-Jul-26 — Preview & edit before writing. The crop tool’s Close & Review now loads the cropped pieces into the Results table without writing, so you can check them first. Result rows are click-to-edit (Folder, LTTclass, DocType, Spend, Brand, Outlet, Date, Cur and the final New name — the filename recomputes as you edit), each row has an ✕ to drop it, and Bulk-rename still works — then Write files now saves. Cropped pieces are no longer re-split by the multi-bill detector (fixes duplicate outputs), and the uncropped original is archived into a _cropped-originals folder.
v94 · 07-Jul-26 — Crop tool upgrades. Slice mode now does a full Rows × Cols grid (vertical cuts as well as horizontal) plus draggable outer edges so you can crop the dark border/table off before splitting. Two clear finish buttons: Save PDFs now (no AI) writes the cropped pieces straight to a _cropped folder in your output folder immediately (no API, no renaming) — and Add to Reap queue → Close & Reap runs them through the full classify/rename/Excel pipeline. Added an in-modal status line so you can see what happened without leaving the crop window.
v93 · 07-Jul-26 — Manual crop / split tool (CamScanner-style). New Manual crop / split… button opens a viewer where you load an image or a PDF page, set how many pieces (e.g. 4), and cut it up two ways: slice lines (drag the dashed dividers — fast for stacked receipts) or free boxes with corner dewarp (drag each box’s 4 corners to correct skew/perspective). Each piece is perspective-corrected and added to the processing queue as an image, so Reap the binder then reads, classifies, renames and writes them out as PDFs (into your chosen output folder). Use it whenever the automatic multi-bill split misses.
v92 · 07-Jul-26 — Multi-bill split now works on photos with a dark background. The splitter samples the image border to detect the background: white/scanned pages split on white gaps (as before), but photos of receipts on a dark surface (e.g. a wooden table) now split by finding the bright receipt rectangles instead — with a thinner gap threshold and support for up to 8 receipts per photo. Fixes the case where 4 receipts on a table came through as a single bill.
v91 · 07-Jul-26 — Two new source options. (1) Choose files… — pick individual PDFs/images instead of a whole folder; you’re then asked for a destination folder where the sorted, renamed output is written. (2) Images are now accepted alongside PDFs — .jpg .jpeg .png .tif .tiff .webp .gif .bmp (TIFF via the UTIF library). Each image runs through the same pipeline (multi-bill split, blank check, classify, Excel listing) and is written out as a single-page PDF. Folder mode now also picks up any images sitting in the folder.
v90 · 05-Jul-26 — Added an on-screen legend for the Stage 2 issue codes 2a–2i under the Stage 2 banner, explaining what each code means (multi-bill, multi-page/supporting, SOA, foreign currency, incomplete info, over-long name, wrong MI/MO meta, off-standard naming, other/low-confidence).
v89 · 05-Jul-26 — Failed writes are now captured, not just logged. Any page that can't be written (usually an over-long Windows path — the Stage-1 ~[…] tag block adds length) is copied into a _FAILED subfolder as its own PDF, next to _FAILED-list.csv (source file, page, seq, intended name, name length, reason). The Results table gains a Write column that shows FAIL on those rows — type FAIL in the row filter to isolate them.
v88 · 05-Jul-26 — Reliability fix for stalled runs. Every API request now has a 120-second abort timeout, so a hung read can no longer freeze the batch at "Processed N doc(s)… (x running)" (this happened mostly on Opus at high concurrency — a request that never returned was never retried or failed). Timed-out pages now back off, retry, then fall back to OCR, so the run always completes. FX lookups get a 15s timeout too. Tip for large binders: use Haiku 4.5 as the primary model with Opus as escalation, and/or lower Parallel requests to ~3 to avoid overload stalls.
v87 · 05-Jul-26 — Model line-up refreshed and defaults raised to the most advanced model: the AI model and Escalation model now both default to Claude Opus 4.8 (most accurate), Sonnet updated to Claude Sonnet 5, and both lists are ordered most-advanced first so you can lower to Sonnet 5 or Haiku 4.5 in one click. "Check latest models" now falls back to Opus. Note: with both on Opus every page runs on Opus (best accuracy, but slower & more credit) — lower the AI model for speed.
v86 · 05-Jul-26 — Reorganised the app into the 3-stage workflow with labelled banners: Stage 1 Capture & Rename (Entity & key, Short forms, Folder & options + Reap), Stage 2 Clear leftover issues 2a–2i (Results triage + Bulk rename), Stage 3 Provenance QC & Handover (routing to Claims/Finance/Payroll/Rental & Utilities/Recurring/Relief/Fixed assets/BankSweep/File Whiz). Also set three defaults to off: option 1 Foreign currencies, option 2 Multiple bills on one page, option 8 Reuse cached AI results.
v85 · 05-Jul-26 — 3-stage LTT workflow. Stage 1 now tags every renamed file with a compact ~[…] block: money-in/out (MI/MO, defaulting to MO unless it is clearly your own sale — ! marks an unconfirmed control check), foreign/ambiguous currency, multibill position (MBnOfm), multi-page sets (pNofM), a sup# back-reference from a supporting document to the bill it belongs to, and an SOA marker for statements. Stage 2 buckets every leftover issue into 2a multibill · 2b multipage/supporting · 2c SOA · 2d foreign currency · 2e incomplete info · 2f over-long name · 2g wrong meta · 2h off-standard naming · 2i other, shown as S2.xx and in a new Stage 2 Queue Excel sheet. Stage 3 runs an LTT provenance QC then routes cleared files to their app — Claims, Finance, Payroll, Rental & Utilities, Recurring expenses, Personal relief, Fixed assets, BankSweep or File Whiz (QC.App in the name; new Stage 3 Routing & Provenance QC sheets). New results columns: MI/MO, Stage2, Dest.
v84 · 29-Jun-26 — The version date now tracks the build date (shown in the masthead & here), updated with every new version.
v83 · 25-Jun-26 — Results panel is now a sortable, filterable database view: click any column header to sort (Folder, Class, LTTclass, DocType, Spend, Acct, Brand, Outlet, Date, Amt, Cur, Conf, Model, Flag, New name), filter by category, and free-text filter rows — review/triage everything before generating files. The summary shows shown-vs-total counts and RM.
v82 · 25-Jun-26 — Built-in Bulk rename (Bulk Rename Utility style) for the output file names: find/replace (plain or regex, match-case), prefix/suffix, remove first/last N, change case, and sequential numbering — with a live Preview, Apply, and Write files now (writes the renamed PDFs without re-reading; don\'t Reap after, as that rebuilds names).
v81 · 25-Jun-26 — New Short forms panel: an editable list (Left = phrase, Right = short form) applied to file names, synced with your LER ShortForm app — pull the latest from the shared server (endpoint + X-LTT-Token), edit in-app, or open the ShortForm app directly. Re-run / Review re-applies them across all names (bulk rename).
v80 · 25-Jun-26 — "Save dated copy of this app" now stamps the time too: LERBinderReaper-App.HTML-<version>-yymmdd.hhmmss.html.
v79 · 25-Jun-26 — Compulsory filename abbreviations: Sdn. Bhd. → SB (incl. truncated / look-alike endings like "Sdn Bh"), Enterprise → Ent, Marketing → Mkt, Taman → TMN, Document → Doc, Berhad → Bhd. And when the brand and legal name are the same (one just adds the SB suffix), only one is kept in the filename (no more "X(XSB)"). Excel keeps the full names.
v78 · 25-Jun-26 — (1) Multi-bill split made much more conservative — a page is only cropped into regions when there are 2–4 clearly-separated blocks each ≥15% of the page and none fills >72% (a single bill is left whole, uncropped). (2) Filename class abbreviated Document → Doc. (3) No-vendor docs are named Unidentified (or their spend category) instead of "NA" — so no more "Document-NA".
v77 · 25-Jun-26 — Tidied the Folder & options panel with running numbers (1–10) on every selection. The three batch questions are up front: 1 Foreign currencies may appear (untick → read everything as RM/MYR, no foreign reading or inference), 2 Multiple bills on one page → split, 3 Remove blank pages (+ 4 Sort into sets/subfolders).
v76 · 25-Jun-26 — Multi-bill splitting confirmed working; added "Re-detect page splits (ignore cached layout)". Tick it to force fresh detection on a re-run when a page's split layout was cached earlier (or by an older build) and you want it re-evaluated. Leave it off to reuse the cached layout (faster).
v75 · 25-Jun-26 — Currency inference made conservative: only VND / IDR are auto-assigned (and only when a VND/IDR bill sits in the same ±5-day / month / file window). Every other unsure case — an ambiguous "$", or a large "MYR" with no VND/IDR nearby — now stays RM instead of guessing GBP/SGD/USD/etc. Currencies the AI actually read are left untouched; correct the odd real-foreign one via the corrections template.
v74 · 25-Jun-26 — Amount suggestions now handle 2-decimal foreign currencies (GBP/USD/EUR/SGD/AUD…): when the RM-equivalent is implausibly large, it suggests the missing-decimal fix in that currency (e.g. GBP 21,480 → GBP 214.80). Note: the L1/L2/etc. flag is a warning that stays until you accept the correction — it isn't auto-applied. Use Save corrections template (now pre-filled with the suggestion) → Load corrections → Reap to apply.
v73 · 25-Jun-26 — Future-date guard: any bill dated after today is rolled back to the same date last year (e.g. 2026-12-31 → 2025-12-31, 2026-07-22 → 2025-07-22) and flagged DateEst, since an incurred expense can't be in the future. Applies on Reap / Review / cache reload.
v72 · 25-Jun-26 — Bank-currency fix, properly: (1) loading a previous-run JSON now re-applies all the classification guards (bank→RM, secretarial, TNG, payroll/tax, proper-case, etc.) — before it only re-ran amount flags, so a snapshot kept its old GBP. (2) The currency-inference now never reassigns a Malaysian bank (Public Bank, Maybank…) to a foreign currency, even for large amounts. So Public Bank statements stay RM.
v71 · 25-Jun-26 — Added a "Clear results" button (in the Results panel), and the results table is now auto-cleared at the start of every new Reap/Review so old rows never linger.
v70 · 25-Jun-26 — Loading an AI cache / previous run now auto-ticks "Cache only" so a re-run can't spend API credit by accident. Untick it if you want the API to read the remaining (uncached) pages.
v69 · 25-Jun-26 — Payroll & Tax folders are now included in the expenses listing and reclassified to Financial: supplier man-hour bills (mis-read as Payroll) → 92671000 IE - Casual wages; import-duty charges (mis-read as Tax) → 92803771 IE - Misc. tax paid. Both now get account codes and appear in By-Category / Summary-by-account / totals.
v68 · 25-Jun-26 — Company-secretary / corporate-services vendors (e.g. Sky Corporate Services) now book to 92839000 IE - Secretarial fee, & exp., and the SOA Transactions tab now carries the Account Code + Account Name on every statement line so the Finance app picks them up under the right code.
v67 · 25-Jun-26 — Corrections now apply currency too (e.g. fix a bank statement read as GBP back to RM): edit the "currency" field in the corrections template (RM or any ISO code), Load corrections + Reap. A user-set currency is locked so the auto currency-inference won't change it back, and the RM total updates accordingly. Also: Malaysian banks (Public Bank, Maybank, CIMB, RHB, Hong Leong, AmBank, BSN, Bank Islam/Rakyat…) now default to RM, so a statement misread as GBP/USD is corrected automatically.
v66 · 25-Jun-26 — The run results JSON (LERBinderReaper-<ver>-results-yymmdd.hhmmss.json) is now auto-saved into the loaded folder's _BinderReaper-out subfolder after every Reap and Review (not just on Reap), and the "Save run (JSON)" button writes there too — so an exact-reload snapshot always lives next to your data.
v65 · 25-Jun-26 — PDF report: the By-Category and Summary-by-account tables now have a bold TOTAL footer row (total count/lines and total RM).
v64 · 25-Jun-26 — PDF report detail table: Account name now sits right after the account code, and the Spend column is removed.
v63 · 25-Jun-26 — Proper Case keeps DIY, EK, MYI in capitals (e.g. Mr DIY, EK Smartmover, MYI).
v62 · 25-Jun-26 — Touch N Go / SmartTAG / RFID now book to 96848300 IE - TRV - Touch N Go (its own SpendCat), separate from cash Toll charges (96848400). Applied even when the AI first read it as Toll.
v61 · 25-Jun-26 — Important fix: the scanner now ignores BinderReaper's own output PDFs sitting in the folder (the results-report, blank_* pages, anything named LERBinderReaper-*). Previously a leftover report PDF was read as a "binder", turning each report page into a bogus bill (its timestamp parsed as the amount → RM-millions "Critical" rows). The status shows how many output PDFs were skipped.
v60 · 25-Jun-26 — Proper Case dictionary expanded with business-type words in Malay & English — Restoran/Restaurant, Perniagaan, Syarikat, Koperasi, Klinik, Farmasi, Pasaraya, Perusahaan, Perdagangan, Perkhidmatan, Holdings, Ventures, Resources, Hotel, Resort, Catering, Enterprise, Trading and more — so these always render in the correct case and smashed names split around them.
v59 · 25-Jun-26 — (1) Model-aware cache: a stronger read (Opus) is never overwritten by a weaker one (Sonnet/Haiku) on a later run — Overwrite only upgrades, and already-Opus pages are skipped (no wasted credit). (2) Proper Case: section codes like SS2 / SS15 / SS3/5 stay all-caps in outlets; added more place/mall words (Mall, Megamall, Plaza, Avenue, Sentral…) so smashed outlet names read cleanly. (3) Section 03 Results gains a Model column showing which Claude model / OCR / cache produced each row (↑ = escalated).
v58 · 25-Jun-26 — New "Column Guide" tab in the Excel: every column is classified as Read from the document (Brand, Outlet, Date, Amount, Currency, Ref, DocType, SpendCat, line items, AI Conf — these use Claude credit when read fresh, free from cache/OCR) or Computed by the app (names, account codes, flags, totals, RM conversion via free FX — never cost credit), with notes on the ones the AI reads then the app refines.
v57 · 25-Jun-26 — Ambiguous "$" amounts are now resolved the same travel-aware way as large MYR: a bare "$" picks a dollar-family currency (SGD/USD/HKD/AUD…) seen within ±5 days, then same month, then file/batch — falling back to the period's dominant foreign currency if no dollar is nearby. Flagged "currency inferred … verify".
v56 · 25-Jun-26 — Section 03 Results now shows readable Brand / Legal name / Outlet columns (proper case) for easy reading, with the filename-format name kept in the "New name" column.
v55 · 25-Jun-26 — Currency inference is now date-aware for travel: a large "MYR" amount picks the foreign currency seen within ±5 days of its date first, then the same month, then the same file, then the batch — so a trip's VND bills don't get mixed with another trip's currency. The Reason notes which window matched.
v54 · 25-Jun-26 — Button reorg: Review only on the left, Reap the binder (primary) on the right — left-to-right workflow. The Pause & save cache button now sits next to Save AI cache in the cache row, and the cache/correction buttons are on their own line under the checkboxes.
v53 · 25-Jun-26 — Currency inference: a suspiciously-large "MYR" amount (≥ RM20,000) is reassigned to the foreign currency used elsewhere in the same file (else the batch's foreign currency) and re-converted to RM — so a hotel bill read as RM400,000 becomes VND400,000.00 in the filename, with the RM-equivalent in the Excel, flagged "currency inferred … verify". No more dividing/rounding a foreign amount as if it were ringgit.
v52 · 25-Jun-26 — New "Overwrite cache" mode for a quality second pass: load your fast Haiku cache, set both AI model & Escalation to Opus 4.8, tick Overwrite, and Reap — it re-reads every page with the API and replaces the cached results, while reusing the saved page layout so regions/keys stay identical. (Overwrite forces the API even if "Cache only" is ticked; the per-minute autosave + Pause keep the new Opus reads safe.)
v51 · 25-Jun-26 — Stronger duplicate catch: two rows with the same amount appearing one after another are flagged as a duplicate when they're on the same page (a multi-bill mis-split) or share the same date with a low-confidence / blank read — independent of vendor name. The weaker read (lower AI confidence / no vendor) gets the Dup flag, so cases like two "2026-05-18 / 400,000" regions of p26 are caught.
v50 · 25-Jun-26 — PDF report restyled to the LER blue theme (#5392C5 headers + title). The AI cache, expenses Excel and PDF report now save into a _BinderReaper-out subfolder of your loaded folder with traceable LTT names — LERBinderReaper-<version>-<kind>-yymmdd.hhmmss.ext (e.g. LERBinderReaper-v50-expenses-260625.143000.xlsx) — instead of going to Downloads. Reap outputs and the per-minute autosave use the same naming/folder.
v49 · 25-Jun-26 — Long-run safety net: while a read is running, the AI cache is auto-saved to your selected folder once a minute as LERBinderReaper-aicache-autosave.json (rolling, overwritten), plus a final write when it stops. If the browser crashes or you close it, just load that file to resume. (Still also saved to this browser and on Pause.)
v48 · 25-Jun-26 — Every element now uses Poppins (the "mono" slot no longer falls back to a monospace face); numeric columns keep tabular-figure alignment. (The downloadable PDF report still uses its built-in font.)
v47 · 25-Jun-26 — Masthead is now constrained to the page width (inside the centered container), aligned with the panels, instead of spanning the full browser width.
v46 · 25-Jun-26 — Clearer resume: loading a partial AI cache now says exactly what happens on Reap — cached pages are skipped and only the remaining pages are read (or OCR'd if "Cache only" is ticked). Loading a cache never blocks running; it merges, so you load the old one then run the rest. AI model & Escalation model dropdowns now sit side by side.
v45 · 25-Jun-26 — Model dropdowns for AI model & Escalation model + "Check latest models (Claude API)" which lists what your key can use (newest first) and fills both dropdowns. A live hybrid hint warns if both are the same model (which makes it run full Opus = slow). New "Pause & save cache" button: stops the AI read after the in-flight pages, keeps everything read so far, saves the AI cache (downloads it + to this browser), and renders the partial results — re-run with "Cache only" to resume free. Cache is also auto-saved every 200 pages and via "Save AI cache" any time.
v44 · 25-Jun-26 — Re-skinned to the LTT visual identity (SOP001): embedded Poppins, LTT blue (#5392C5) accent with the left spine, and the standard LER masthead (logo band + blue header + version box) matching FolderWays / File Whiz. Functionality unchanged.
v43 · 25-Jun-26 — Merged "Load AI cache" and "Load previous run" into one "Load AI cache / previous run" button that auto-detects the file: an AI cache (LERBinderReaper-aicache-*.json) is loaded into memory for free re-runs and shown in the review table; a saved run (LERBinderReaper-results-*.json) opens straight into review. One button, right file, no confusion.
v42 · 25-Jun-26 — Separator cross-check for high-denomination currencies: a VND (or IDR/LAK/KHR/KRW/MMK) amount that comes out too small (e.g. VND < 20,000) is flagged for re-check, because VND uses "." for thousands while RM uses "." for decimals — so VND500.000 can be misread as 500. The spot-check suggestion offers ×1000 (and ×100) to restore the thousands; foreign face values are otherwise trusted (no spurious ÷100). Filenames never show "MYR" — ringgit is always "RM" directly before the amount with thousand separators.
v41 · 25-Jun-26 — Filename amount now always carries the currency: ringgit shows RM (e.g. …-RM190.00.pdf) and foreign currencies keep their code (…-VND500,000.00.pdf), with thousand separators + 2dp — consistent across every file.
v40 · 25-Jun-26 — Cache & credit fix. New "Cache only" checkbox: never calls the API — anything not in the loaded cache is read by free OCR instead, so reloading a cache can't burn API credit. Status now reports the split (X from cache · Y via API · Z via OCR) so you can see the cache working. Note on why some pages still hit the API without this: your cache holds 779 multi-bill region results but no saved page-layout (SEG) entries, so region detection is recomputed on reload and a page that re-splits differently produces a new key that misses the cache — "Cache only" makes those free. New runs now also save the layout so future re-runs match exactly.
v39 · 25-Jun-26 — Fixed the stale "v4" filename shown under "Save dated copy" — it now auto-updates from the app version, so it always matches the current build.
v38 · 25-Jun-26 — (1) Proper Case: USJ (and OUG/TTDI/PJU) kept all-caps; Malaysian place/street words added to the dictionary (Pyramid, Puchong, Merbau, Kenanga, Segambut, Sinar, Sunway, Bandar, Taman… ) so they proper-case and smashed names split correctly; Jaya stays proper. (2) New RM After-Check column + total in the Excel (and an "After spot-check RM" figure in the PDF summary): it uses your manual correction where you made one, otherwise the auto spot-check suggestion — so you can see the corrected financial total without overwriting the raw amounts.
v37 · 25-Jun-26 — PDF report now renders non-Latin vendor/outlet names (e.g. Vietnamese "Phở Việt", "Hồ Tùng Mậu") by folding accents to ASCII for the PDF only — no more (cid) boxes. The Excel and filenames keep the original Unicode unchanged.
v36 · 25-Jun-26 — "Download PDF report" for Section 3 Results: a real generated PDF (summary, By-Category, Summary-by-account, and the full detail table) written straight to your selected folder — no Chrome print-to-PDF. Filename LERBinderReaper-results-report-ddmmyy.hhmmss.pdf. (If no folder is chosen, it downloads to Downloads instead.)
v35 · 25-Jun-26 — Proper Case now handles apostrophes/possessives: GOODIES' Nest → Goodies' Nest, FOODIES' Nest → Foodies' Nest, O'BRIEN → O'Brien.
v34 · 25-Jun-26 — (1) Undetected currency now defaults to MYR (RM); only a detected non-MYR currency at low confidence is flagged. (2) Supplier statements of account now use the LER ShortForm SOA in the filename Class and DocType instead of "Statement"/"Stmt".
v33 · 25-Jun-26 — Catch misfiled bills: any item in NameCards, Correspondence or Unsorted that carries a money amount is reclassified to a Bill (Financial) and captured — only genuine identity/legal/tax docs (NRIC, Passport, Agreement, Cert, Tax form) are left in place even when a number appears, and zero-amount items stay put. So those folders no longer hide claimable bills.
v32 · 25-Jun-26 — Second-pass account check: any item heading for General exp. (92713000) is re-examined first — vendor, outlet, channel and the itemised lines are scanned for petrol / toll / parking / transport / groceries / food / stationery signals, and moved to the matching specific account if found. Only genuinely unidentifiable items remain in General exp.
v31 · 25-Jun-26 — One unified merchant-name check (merchantClassify) runs before trusting the AI's category: petrol stations → Petrol, restaurants/cafes/food → Food, supermarkets → Groceries, other retail → Bill, and a cropped receipt mislabelled Correspondence → Financial. Real supplier Statements (≥2 transaction lines) are left alone. Vendor/brand name pickup hardened (best-of brand/vendor/outlet/legal fallback + prompt nudge to always read the shop name). Low-value rule default lowered to RM100. Chart of accounts wired in: the Excel now fills Account Code + Account Name from your LTT claim codes (Food/Groceries→96701000, Petrol→96848100, Transport→96848900, Parking→96848200, Toll→96848400, Stationery→92801000, else General exp.→92713000) plus a "Summary by account" tab, so the Finance app follows these codes instead of reassigning.
v30 · 25-Jun-26 — Finance hand-off: the main Expenses listing in the output folder now carries two extra columns — Suggested Amt (BinderReaper's best-guess fix for an OCR-flagged amount: decimal/÷100 logic) and Suggest Basis — right alongside the raw Amount, Flag and Reason. So your Finance app reads the output folder and processes the suspect amounts itself (accept or override the suggestion); no separate correction round-trip needed. (TOTAL row also realigned under Amount(RM).)
v29 · 25-Jun-26 — Correspondence re-check: retail merchants (7-Eleven, Family Mart, 99 Speedmart, KK Mart, AEON, Giant, Tesco, Lotus's, Mydin, NSK, Watsons, Guardian, Mr DIY, Cold Storage, Circle K, Dairy Farm group, etc.) are now treated as a Bill (Financial), never Comms — even when the scan is cropped. Any item the AI put in Correspondence that has a money amount (and isn't a letter/email/agreement/cert/ID) is reclassified to Financial too. Plus Correspondence pages now also get the stronger-model re-read pass. Applies on a fresh run and on "Load previous run (review)".
v28 · 25-Jun-26 — Petrol guard: Petronas, Shell, BHP, Caltex, Petron, Esso, BH Petrol and other fuel stations are now categorised as Financial with spend = Petrol (IE - TRV - Petrol), not Utility. Utility stays for water, electricity, Indah Water, maintenance fee, waste disposal, telephone/internet, satellite TV and the like. Applies on a fresh run and on "Load previous run (review)".
v27 · 25-Jun-26 — Two name/category fixes: (1) Malaysian company suffixes are normalised in vendor/legal/outlet names — SDN BHD → Sdn. Bhd. (also Sendirian Berhad, standalone Bhd./Sdn., Berhad, Enterprise, Trading). (2) Food-by-default: any vendor/outlet that reads like food or F&B (restoran, kopitiam, cafe, bak kut teh, kitchen, catering, mamak, etc.) is set to spend = Food rather than General exp. Both apply on a fresh run and on "Load previous run (review)" from your cache, so reloading recategorises existing data with no new API calls.
v26 · 25-Jun-26 — Filename Class for financial documents is now Bill instead of Purchase (e.g. Entity_Bill-CounterParty-CashBill-…). The Excel "Class" column matches.
v25 · 25-Jun-26 — "Load previous run (review)" now also accepts your existing AI cache file (LERBinderReaper-aicache-*.json), not just a results.json. It reconstructs every record straight from the cache (brand, amount, category, date, currency→RM, flags, output name, SOA guard) and shows them in the table for review / corrections / Download Excel — no binder re-processing. (Page size & medium need a folder Reap, but the cache is loaded so that Reap is free.) Going forward, every run also writes results.json for an exact reload.
v24 · 25-Jun-26 — Output mode choices: (1) New timestamped folder each run _BR-<ts> — a clean, self-contained set every run (PDFs + Excel + manifest + results.json), no overwrites, no stale files, no manual deleting (the short name keeps it within Windows' path limit); (2) one .zip to Downloads — everything packed into LERBinderReaper-out-<ts>.zip (large batches use more memory); plus the existing single-folder and rename-in-place modes. Timestamped is now the default.
v23 · 25-Jun-26 — Resume a previous run for review without re-processing the binder. Every run now also saves LERBinderReaper-results-<ts>.json (and a "Save run (JSON)" button in Results). "Load previous run (review)" loads that JSON straight into the table — re-applies any loaded corrections, recomputes amount flags & duplicates, and enables Download Excel — no folder, no API, no PDF rendering. (Writing renamed PDFs still needs Choose folder + Reap, since that needs the source files.)
v22 · 25-Jun-26 — SOA guard: a Statement of Account is only kept as "Statements" when there's real SOA evidence (≥2 transaction lines, or wording like statement of account / outstanding balance / brought-forward / previous balance). A restaurant/food/general-spend receipt that lacks that evidence is reclassified to Financial (spend = Food where applicable, DocType Stmt→CashBill, class SOA-Supp→Bill) so it no longer lands in the Statements folder.
v21 · 25-Jun-26 — Smart amount suggestions for flagged items: tests the missing-decimal rule first (÷100), then weighs ÷1000 / drop-extra-digit / foreign-currency against a plausible range for the category, and proposes the most likely value. Shown as Suggested Amt / Basis / Alternatives in the Exceptions tab, and the corrections template pre-fills "amount" with the best guess (with _original & _alternatives) — accept or edit, then Load corrections + Reap.
v20 · 25-Jun-26 — Output files now follow LTT naming with yymmdd.hhmmss and are kept as version history (no overwrite): LERBinderReaper-expenses-.xlsx, -manifest-.csv, -renamemap-.csv. The Download Excel button is timestamped too (also avoids the "file open" lock).
v19 · 25-Jun-26 — Smart Proper Case improved: all-caps words with vowels are now cased (FIVE→Five, AYAM→Ayam, ROCK→Rock) while true consonant acronyms (KFC, TNB, SS3) stay; added Malay/English & number words. Proper Case is also re-applied to the AI-read Brand/Outlet/Legal each run. Added a 5th amount-control tier (> RM50 spot-check).
v18 · 25-Jun-26 — Amount controls: tiered sanity flags (>RM100k Critical incl. Malaysian-vendor check, >RM50k re-check currency/OCR, >RM1,500, >RM500) shown in a Flag/Reason column and an "Exceptions" Excel tab. Correction round-trip: "Save corrections template" (editable JSON of flagged items) → edit amount/category/spend → "Load corrections" → Reap re-applies them (into filename, Excel & RM total). Saved JSON files now carry yymmdd.hhmmss.
v17 · 25-Jun-26 — Fix the 17 write-failures: those were over-long Windows paths. The filename counterparty is now capped (drops the (LegalName) when long — it stays in the Excel), keeping Brand.Outlet/date/ref/amount, so every file fits. Tip: close expense_listing.xlsx before re-running.
v16 · 25-Jun-26 — Speed: page layout (blank + bill regions) is cached too, so a cached re-run SKIPS the heavy page render for single-document pages (only multi-bill pages re-render to crop). The first run builds this layout cache; every re-run after is near-instant. Save AI cache after a run to keep it.
v15 · 25-Jun-26 — Fix: "Load AI cache" file picker now accepts .json reliably (broadened filter, resets, clear "Loaded N" confirmation) so cached re-runs actually skip the API. Reload a new version → Load the JSON (wait for the confirmation) → Choose folder → Reap = no API calls.
v14 · 25-Jun-26 — Fixes from the first full run: writing is now fault-tolerant (filenames sanitised; one bad file can't abort the batch — failures listed in console). Currency: totals & By-Category now sum in RM (Amount(RM) column) so foreign amounts no longer inflate the total. Normalise: spend values that leaked into Category go back to Financial; DocType aliases fixed (Invoice→Inv, purchase Receipt→CashBill). Filename keeps the bill's ORIGINAL currency with thousand-separator + 2dp (e.g. VND500,000.00); cached results now reload even without an API key.
v13 · 25-Jun-26 — Batch C+D. Currency: historical FX→RM by bill date (RM Equiv column) + ambiguous-currency flag (CcyFlag). Multi-owner: Owner-entities list (Prefix=Name=aliases) detects which client each doc belongs to (Owner/Entity column + filename prefix), role-aware so related-party suppliers aren't excluded. Duplicates: persistent cross-batch registry flags same brand+outlet+date+amount (Group + Dup columns; Clear dup registry button). Statements/utilities: Amount = current-month charge (b/f excluded), with b/f + prev bill + prev payment in a new "Statement Detail" tab.
v12 · 25-Jun-26 — Batch B taxonomy: filename first segment is now the Class (Purchase/Utility/Tax/KYC/Legal/Comms…) not "Document", so non-financial docs (TaxForm, Letter, AITS, NameCard…) are clearly separated. New DocType set — Bill / CashBill / BillPymt / MoneyOut (Inv & Receipt reserved for sales/money-in). LER ShortForm applied to tokens (TNB, LHDN, EPF…) + editable list. Smart Malaysian Proper Case (AHSANGBAKKUTTEH → AhSangBakKutTeh) on names.
v11 · 25-Jun-26 — Owner-entity exclusion: tell it your client's name(s) so the bill-to party on credit invoices isn't picked up as the vendor (AI + OCR). SOA Transactions sheet now shows Source File / Page-Region / Output File per line. (Run column = batch id.)
v10 · 25-Jun-26 — Excel traceability batch: every row now carries Run-stamp, Model used (Haiku/Opus/OCR/Cache), separate Brand/LegalName/Outlet (readable) plus the filename token, Itemised line items, MultiBill & SplitPart flags, Source File + Page/Region + Output File, and blank GL/Account-Code columns for batch editing. (Placeholders added for RM-Equiv & CcyFlag, coming with the FX batch.)
v9 · 25-Jun-26 — Speed: AI calls now run in parallel (Parallel-requests setting, default 5) instead of one-by-one — large runs go from hours to minutes. Multi-bill splitter made more conservative (bigger whitespace gaps, ≥7% area, max 6 regions/page) to stop over-splitting single receipts.
v8 · 25-Jun-26 — AI-result cache (re-run after a fix without re-calling the API; Save/Load/Clear cache); sanity-check AI dates against the claim period (implausible years flagged + corrected); backstop category→Financial / LTTclass→Bill when the model under-classifies; reject junk Source.Medium.
v7 · 25-Jun-26 — Hybrid model escalation: Haiku runs first, then low-confidence / handwritten (HW) / Statement-of-Account pages get a second pass with a stronger model (default Opus), keeping the higher-confidence result. Escalated rows marked ↑. Fix: pdf.js was detaching the file buffer, breaking PDF export — now uses a copy.
v6 · 25-Jun-26 — Always detect the outlet/branch location (KLCC, IOI City Mall, Rimbayu…) so chains read as Brand.Outlet; outlet + legal name now captured in OCR-fallback mode too.
v5 · 25-Jun-26 — ≤RM200 rule now only applies when the vendor is unreadable; a clear vendor is always kept (a missing reference no. no longer triggers "General exp").
v4 · 25-Jun-26 — Split smashed words into CamelCase (CASHBILL → CashBill); version history + dated-copy export.
v3 · 25-Jun-26 — Robust JSON parsing (balanced braces, ignores fences/prose); coerce numeric AI fields; "General exp" label; currency inferred from foreign vendor country/address; proper-case file names.
v2 · 25-Jun-26 — Multi-bill page splitter (whitespace XY-cut) — each bill on a page becomes its own PDF; safe rename-in-place (originals moved to _originals).
v1 · 25-Jun-26 — Initial HTML app: folder pick, pdf.js render, Claude-vision extraction with tesseract.js OCR fallback, classify, split, rename/subfolder export, Excel listing, blank / size / currency / date-ladder / ≤RM200 rules.