A local-first, browser-native accounting app for Indian SMBs. No cloud, no subscription, no data leaving the device. One .khata file per company.
For the accountant
Daily invoicing, vendor bills with TDS, bank reconciliation, GSTR-1 / 3B / 26Q. Everything a day-to-day bookkeeper needs in one HTML file.
For the chartered accountant
Open one .khata per client. Trial balance, balance sheet, day book review, annotations, and a printable review report — per client, in seconds.
Two modes, one app
Bahi asks who are you? the first time you open it. Your answer flips a single flag in the browser, reshapes the sidebar, and tags every entry you post with the right actor in the audit log. You can switch any time from the topbar badge or with Ctrl+Shift+M. Both modes read and write the same .khata files — nothing is hidden from either side.
OWNER
Owner mode
The day-to-day bookkeeper running a business
Manage one company at a time — the .khata file you have open is yours
Raise invoices, record receipts, enter purchase bills, pay vendors with TDS, reconcile bank
Run GSTR-1, GSTR-3B, CMP-08, Form 26Q / 27EQ / 27D straight out of the ledger
Switching modes: click the OWNER / CA · AB badge in the topbar, or press Ctrl+Shift+M. The first time you pick CA mode, Bahi collects name, firm, and ICAI membership number — stored in IndexedDB on your machine only, never inside any client's .khata file. Your clients get the audit trail, not your profile.
Why local-first
Every Indian accounting tool on the market sends your books to someone else's database. Bahi doesn't. The whole application is one HTML file. Your data is one .khata file. You own both.
One file
Every company is a single .khata zip — manifest.json + books.sqlite. Copy, backup, version-control. Nothing else.
Zero servers
Bahi is a static HTML page. There's no backend to exfiltrate from, nothing to subscribe to, nothing to renew.
Audit-proof
Every entry appends to a signed, hash-linked audit log inside the file itself. Any tampering breaks the chain.
CA-ready
Built-in CA mode, review markers, annotations, and a printable review report. Works across multiple client files without a login.
The three sample files
Three intentionally different shapes — goods+services, goods-only, services-only — to prove the app handles every branch of the chart of accounts. All three pass the 45-assertion data integrity test suite.
Steel products manufacturer. Heavy inventory (500+ stock movements across 2 FYs), WAC valuation, multiple godowns, high-value B2B invoices with e-way bills.
Consulting — Services only
Arjun Rao Advisory LLP
GSTIN29AAEFA9012C1Z7
State Karnataka
Fileconsulting.khata
Professional services LLP. SAC 9982xx only, no inventory, no purchases. Smaller scale — closer to what a single-partner or boutique firm looks like.
Try it yourself — 3 steps
The screenshots below are static. To click through the real app with the real data, grab a sample file from the repo and open it in the live build. No install, no account, no upload.
Download a sample file
Pick whichever shape you want to explore. These are the exact files used throughout this demo — synthetic data, 2 FYs each.
Use Chrome, Edge, Brave, Arc or Opera. Safari and Firefox don't expose the File System Access API that Bahi needs to write back to your disk.
→ Launch Bahi in a new tab. You'll land on the Workspace screen with the first-run welcome.
Click "Open existing .khata"
Pick the file you just downloaded. Bahi will ask permission to read & write the file on your disk — allow it.
Once open, you'll see the dashboard with real receivables aging, top customers, and recent activity. Click anywhere in the sidebar to explore.
Download pharma sample (1.3 MB)Open app ↗Files open read-write in place. Nothing uploads anywhere. If you prefer to keep the sample untouched, copy it first and open the copy.
Accountant walkthrough
Every route the day-to-day accountant touches, captured against the pharma sample. Click any screenshot to open the live Bahi route in this build (load pharma.khata first).
Daily
The work the accountant does every morning. Raise invoices, record receipts, enter purchase bills, pay vendors.
Sales invoices
Every invoice with status badge (paid / partial / unpaid / cancelled), customer, date, amount and tax split. Filterable by series, customer, date range, and status.
Pharma sample#/#/invoices
New invoice form
HSN/SAC items, auto-routed CGST+SGST (intra-state) or IGST (inter-state), place-of-supply captured per invoice, round-off, notes, and live preview of the outgoing ledger entry.
Pharma sample#/#/invoice/new
Record a customer receipt
Pick the customer, amount, mode (bank/cash/UPI), and allocate across one or many open invoices. Enforces allocated <= received.
Pharma sample#/#/payment/new
Purchase bills
Vendor bills with input GST captured separately. Consulting has zero purchases — proof that the sample data is shape-correct.
Pharma sample#/#/purchases
New purchase bill
TDS section selector (194J / 194C / 194I / 194H), tax-aware totals, and a preview of the resulting vendor ledger and TDS payable postings.
Pharma sample#/#/purchase/new
Pay a vendor (with TDS)
Pay a vendor bill, deduct TDS under the applicable section, and post to TDS Payable in one step. The section header and certificate metadata travel with the deduction.
Pharma sample#/#/vendor-payment/new
Record TCS collection
For sellers liable under 206C(1H). Bahi computes and posts the TCS payable liability alongside the customer receipt.
Pharma sample#/#/tcs-collection/new
Weekly
Housekeeping tasks. Review masters, reconcile bank, add new items and series.
Customer master
Complete customer ledger with GSTIN, state, payment terms, current outstanding and aging. Clicking a row drills through to their invoice history.
Pharma sample#/#/customers
Vendor master
Vendors with PAN, GSTIN, default TDS section and current dues. Used for purchase and vendor-payment workflows.
Pharma sample#/#/vendors
Items & services
Unified master for HSN goods and SAC services. Pharma has both: tablet strips, surgical consumables, lab services. Manufacturing has steel products only. Consulting has only SACs.
Pharma sample#/#/items
Invoice series
FY-scoped numbering series (INV/25-26, CN/25-26, PUR/25-26 …). Each .khata file carries its own series and resets them automatically at year-end rollover.
Pharma sample#/#/series
Bank reconciliation
Pick a bank account, paste the bank statement rows, and match them against ledger entries. Unmatched items stay highlighted until resolved.
Pharma sample#/#/bank-reconcile
Credit notes
Sales returns with a back-link to the original invoice. Pharma has 4-5 credit notes in the sample against expired stock returns.
Pharma sample#/#/credit-notes
New credit note
Pick parent invoice, adjust lines, auto-reverses the proportional tax, and produces a balanced journal entry.
Pharma sample#/#/credit-note/new
Debit notes
Purchase returns, symmetric to credit notes. Rare in the sample but the route renders correctly with the empty-state panel for companies that have none.
Pharma sample#/#/debit-notes
New debit note
Adjust the parent purchase bill, reverse the proportional input GST, and post the balanced ledger entry.
Pharma sample#/#/debit-note/new
Advances
Customer advances received before an invoice exists. Tracked separately and auto-adjusted against the first matching invoice.
Pharma sample#/#/advances
New advance receipt
Capture the advance, its GST treatment (taxable on receipt or on adjustment), and the PAN/GSTIN for statutory reporting.
Pharma sample#/#/advance/new
Monthly
Period close and statutory filings. Dashboard review, aging, GST returns and TDS returns.
Dashboard
KPIs for the current month: cashflow vs last month, total outstanding receivables, GST liability, receivables aging and top customers. This is the first thing the accountant sees every morning.
Pharma sample#/#/dashboard
GSTR-1
Outward supplies summary auto-assembled from the invoice table. B2B, B2CL, B2CS, exports, CDNR, HSN summary — all tabs.
Pharma sample#/#/gstr1
GSTR-3B
Monthly return summary: 3.1 outward, 3.2 inter-state supplies, 4 ITC, 5 exempt, 6.1 payment. Numbers reconcile to the sales and purchase registers.
Pharma sample#/#/gstr3b
Form 26Q
Quarterly TDS return for non-salary deductions. Lists every deduction with section, deductee PAN, amount, rate, date of deduction and date of deposit.
Pharma sample#/#/form-26q
Form 27EQ
Quarterly TCS return — counterpart to 26Q on the collection side. Renders the quarter selector and the (empty) deductee table for sample data.
Pharma sample#/#/form-27eq
Form 27D certificates
TCS certificate generator — one printable certificate per collectee per quarter.
Pharma sample#/#/form-27d
Tax challan templates
ITNS 280 / 281 challan printable templates pre-filled from the period's liability. No bank integration — just print and take to the bank portal.
Pharma sample#/#/tax-challans
CMP-08
Composition scheme quarterly statement. Renders empty for the sample files since none are composition dealers — but the route is healthy.
Pharma sample#/#/cmp08
Inventory (goods companies)
Every inventory route in sequence. Pharma has the full story — dashboard, stock on hand, register, valuation, batches, aging, godowns, DCs, e-way bills and transfers.
Inventory dashboard
Stock value on hand, count of items below reorder level, count of batches expiring soon, and a top-10 by value strip. Only goods companies see this populated.
Pharma sample#/#/inventory
Stock on hand
Per-item current balance across godowns with WAC (weighted average cost) valuation. Used for monthly closing and the balance-sheet stock figure.
Pharma sample#/#/stock-on-hand
Stock movement log
Every in/out movement — sale, purchase, transfer, adjustment, return — with source document reference. This is the source of truth the register is built from.
Pharma sample#/#/stock-movements
Stock register (per item)
Walk-through of a single item's movements with running balance and running WAC. Auditor workflow: pick an item, verify opening + movements = closing.
Pharma sample#/#/stock-register
Batch list
Batch-tracked items with manufacture and expiry dates. Critical for pharma — expired batches block sale at the item-picker.
Pharma sample#/#/batches
Valuation summary
Stock value by godown and by item class. Ties directly to the inventory line on the balance sheet.
Pharma sample#/#/valuation-summary
Reorder alerts
Items below reorder level. The accountant runs this weekly to trigger purchase indents.
Pharma sample#/#/reorder-alerts
Stock aging (batch)
Batch-tracked stock bucketed by age (0-30 / 31-60 / 61-90 / 90+ days). Pharma's sample data doesn't cross the 0-30 day threshold so the route renders its empty-state panel — a valid result.
Pharma sample#/#/stock-aging
Godown master
Named storage locations — factory, warehouse-1, consignment — with per-location stock roll-ups.
Pharma sample#/#/godowns
Delivery challans
DCs for goods dispatched without an immediate invoice (job-work, consignment, returnable).
Pharma sample#/#/delivery-challans
New delivery challan
Item picker, transport details, and the 'convert to invoice' button that reuses the DC lines on a new tax invoice.
Pharma sample#/#/delivery-challan/new
E-way bills
E-way bill register for invoices crossing the INR 50k / inter-state threshold. Each row links back to its parent invoice.
Pharma sample#/#/eway-bills
New e-way bill
Transporter details, distance, vehicle number and validity. Bahi pre-fills from the selected invoice so there's no retyping.
Pharma sample#/#/eway-bill/new
Stock transfers
Inter-godown transfer register — one side of the 'out' matches the other side's 'in'.
Pharma sample#/#/stock-transfers
New stock transfer (outward)
Pick source godown, destination godown, items, quantities. Produces the 'out' movement and a printable transfer slip for the receiving side.
Pharma sample#/#/stock-transfer/out/new
Stock transfer (inbound import)
Import the paired 'in' side of a transfer from a sister godown .khata file. Keeps both sides reconciled without network sync.
Free-form double-entry voucher for anything the dedicated forms don't cover — depreciation, provisions, expense accruals, CA adjustments.
Pharma sample#/#/journal/new
Day book
Chronological voucher tape — every entry in date order with narration, ref and running totals. The auditor's first scan of the period.
Pharma sample#/#/day-book
Account ledger
Ledger view for any account — sundry debtors, vendor subledger, bank, TDS payable — with opening, movements and closing balance.
Pharma sample#/#/account-ledger
Sales register
GST-compliant sales register: invoice no, customer, GSTIN, taxable value, CGST, SGST, IGST. Used for filing GSTR-1 and also as a standalone printout for CAs.
Pharma sample#/#/sales-register
Purchase register
Symmetric register on the input side. Drives the ITC figures in GSTR-3B Table 4.
Pharma sample#/#/purchase-register
Yearly & governance
Trial balance, financials, period locks and year-end rollover.
Trial balance
Opening + debits + credits + closing for every account grouped by type (asset / liability / income / expense / equity). Grand totals must tie — enforced by a data-integrity test.
Pharma sample#/#/trial-balance
Balance sheet
Schedule-III compliant balance sheet assembled from the trial balance in-browser. No cloud, no spreadsheet.
Pharma sample#/#/balance-sheet
Profit & loss
P&L summary with income categories, direct expenses, and indirect expenses. Drilldown to account ledger from each line.
Pharma sample#/#/pnl
Period locks
Lock a completed fiscal period so no backdated entries can be made. Attempted writes are blocked with a visible banner.
Pharma sample#/#/period-locks
FY rollover wizard
Close the current fiscal year and carry forward balances as opening entries in the new year. Creates a snapshot before committing.
Pharma sample#/#/fy-rollover
Annotations
Sticky notes the CA leaves on specific entries, customers or accounts. Visible in-line and in the annotations register.
Pharma sample#/#/annotations
Manufacturing highlights
High-value B2B invoices, heavy stock movement, WAC valuation. Goods-only workflow — no SACs, no credit notes in the sample.
Dashboard
KPIs for the current month: cashflow vs last month, total outstanding receivables, GST liability, receivables aging and top customers. This is the first thing the accountant sees every morning.
Manufacturing sample#/#/dashboard
Sales invoices
Every invoice with status badge (paid / partial / unpaid / cancelled), customer, date, amount and tax split. Filterable by series, customer, date range, and status.
Manufacturing sample#/#/invoices
Customer master
Complete customer ledger with GSTIN, state, payment terms, current outstanding and aging. Clicking a row drills through to their invoice history.
Manufacturing sample#/#/customers
Purchase bills
Vendor bills with input GST captured separately. Consulting has zero purchases — proof that the sample data is shape-correct.
Manufacturing sample#/#/purchases
Inventory
Manufacturing sample#/#/inventory
Stock on hand
Per-item current balance across godowns with WAC (weighted average cost) valuation. Used for monthly closing and the balance-sheet stock figure.
Manufacturing sample#/#/stock-on-hand
Stock movement log
Every in/out movement — sale, purchase, transfer, adjustment, return — with source document reference. This is the source of truth the register is built from.
Manufacturing sample#/#/stock-movements
Valuation summary
Stock value by godown and by item class. Ties directly to the inventory line on the balance sheet.
Manufacturing sample#/#/valuation-summary
Stock aging (batch)
Batch-tracked stock bucketed by age (0-30 / 31-60 / 61-90 / 90+ days). Pharma's sample data doesn't cross the 0-30 day threshold so the route renders its empty-state panel — a valid result.
Manufacturing sample#/#/stock-aging
Stock register (per item)
Walk-through of a single item's movements with running balance and running WAC. Auditor workflow: pick an item, verify opening + movements = closing.
Manufacturing sample#/#/stock-register
Delivery challans
DCs for goods dispatched without an immediate invoice (job-work, consignment, returnable).
Manufacturing sample#/#/delivery-challans
E-way bills
E-way bill register for invoices crossing the INR 50k / inter-state threshold. Each row links back to its parent invoice.
Manufacturing sample#/#/eway-bills
Stock transfers
Inter-godown transfer register — one side of the 'out' matches the other side's 'in'.
Manufacturing sample#/#/stock-transfers
Godown master
Named storage locations — factory, warehouse-1, consignment — with per-location stock roll-ups.
Manufacturing sample#/#/godowns
Trial balance
Opening + debits + credits + closing for every account grouped by type (asset / liability / income / expense / equity). Grand totals must tie — enforced by a data-integrity test.
Manufacturing sample#/#/trial-balance
Balance sheet
Schedule-III compliant balance sheet assembled from the trial balance in-browser. No cloud, no spreadsheet.
Manufacturing sample#/#/balance-sheet
Profit & loss
P&L summary with income categories, direct expenses, and indirect expenses. Drilldown to account ledger from each line.
Manufacturing sample#/#/pnl
GSTR-1
Outward supplies summary auto-assembled from the invoice table. B2B, B2CL, B2CS, exports, CDNR, HSN summary — all tabs.
Manufacturing sample#/#/gstr1
GSTR-3B
Monthly return summary: 3.1 outward, 3.2 inter-state supplies, 4 ITC, 5 exempt, 6.1 payment. Numbers reconcile to the sales and purchase registers.
Manufacturing sample#/#/gstr3b
Consulting highlights
Services-only LLP. No inventory, no purchases, simpler dashboard. Proof that Bahi's layout scales down as well as up.
Dashboard
KPIs for the current month: cashflow vs last month, total outstanding receivables, GST liability, receivables aging and top customers. This is the first thing the accountant sees every morning.
Consulting sample#/#/dashboard
Sales invoices
Every invoice with status badge (paid / partial / unpaid / cancelled), customer, date, amount and tax split. Filterable by series, customer, date range, and status.
Consulting sample#/#/invoices
Customer master
Complete customer ledger with GSTIN, state, payment terms, current outstanding and aging. Clicking a row drills through to their invoice history.
Consulting sample#/#/customers
Items & services
Unified master for HSN goods and SAC services. Pharma has both: tablet strips, surgical consumables, lab services. Manufacturing has steel products only. Consulting has only SACs.
Consulting sample#/#/items
Credit notes
Sales returns with a back-link to the original invoice. Pharma has 4-5 credit notes in the sample against expired stock returns.
Consulting sample#/#/credit-notes
Receipts & payments list
All customer receipts and vendor payments in one register. Clicking a row shows the allocation breakdown and the underlying ledger entry.
Consulting sample#/#/payments
Advances
Customer advances received before an invoice exists. Tracked separately and auto-adjusted against the first matching invoice.
Consulting sample#/#/advances
Journal voucher
Free-form double-entry voucher for anything the dedicated forms don't cover — depreciation, provisions, expense accruals, CA adjustments.
Consulting sample#/#/journal/new
Day book
Chronological voucher tape — every entry in date order with narration, ref and running totals. The auditor's first scan of the period.
Consulting sample#/#/day-book
Trial balance
Opening + debits + credits + closing for every account grouped by type (asset / liability / income / expense / equity). Grand totals must tie — enforced by a data-integrity test.
Consulting sample#/#/trial-balance
Balance sheet
Schedule-III compliant balance sheet assembled from the trial balance in-browser. No cloud, no spreadsheet.
Consulting sample#/#/balance-sheet
Profit & loss
P&L summary with income categories, direct expenses, and indirect expenses. Drilldown to account ledger from each line.
Consulting sample#/#/pnl
Sales register
GST-compliant sales register: invoice no, customer, GSTIN, taxable value, CGST, SGST, IGST. Used for filing GSTR-1 and also as a standalone printout for CAs.
Consulting sample#/#/sales-register
GSTR-1
Outward supplies summary auto-assembled from the invoice table. B2B, B2CL, B2CS, exports, CDNR, HSN summary — all tabs.
Consulting sample#/#/gstr1
GSTR-3B
Monthly return summary: 3.1 outward, 3.2 inter-state supplies, 4 ITC, 5 exempt, 6.1 payment. Numbers reconcile to the sales and purchase registers.
Consulting sample#/#/gstr3b
Form 26Q
Quarterly TDS return for non-salary deductions. Lists every deduction with section, deductee PAN, amount, rate, date of deduction and date of deposit.
Consulting sample#/#/form-26q
CA audit walkthrough
One CA profile, three client files, one review workflow. The CA opens each .khata in sequence, runs trial balance / balance sheet / P&L, uses the review panel to annotate and sign off, and exports a printable report — all without leaving the browser.
Client 1 — Pharma (Vaidya Life Sciences)
CA opens pharma.khata. Mode badge turns into the CA tile. Review workflow begins.
Client 1 — Dashboard
CA opens pharma.khata. Mode badge flips to 'CA · CS'. Dashboard greets them with the client's outstanding receivables and aging.
CA audit walkthrough#/#/dashboard
Client 1 — Trial balance
First scan of completeness — grand totals tied, every entry balanced, suspense account empty.
CA audit walkthrough#/#/trial-balance
Client 1 — Balance sheet
Schedule-III grouping. Reconciles directly to the trial balance so there's no 'spreadsheet step' to audit.
CA audit walkthrough#/#/balance-sheet
Client 1 — Profit & loss
P&L summary. Drilldown is one click — from any line to the underlying ledger.
CA audit walkthrough#/#/pnl
Client 1 — Day book review
Chronological voucher tape. The auditor clicks through suspicious entries and drops annotations as they go.
CA audit walkthrough#/#/day-book
Client 1 — CA review panel
Every voucher gets a 'Reviewed' checkbox and an inline 'Note' button. The header counts tell the CA how much is left to sign off.
CA audit walkthrough#/#/ca/review
Client 1 — Annotations
Running list of all notes the CA left on this file. Export to the review report with one click.
CA audit walkthrough#/#/annotations
Client 1 — Review report
Final PDF-ready report combining client identity, review checkpoints, annotations and sign-off.
CA audit walkthrough#/#/ca/report
Client 2 — Manufacturing (Shree Krishna Steel)
Close client 1, open client 2. Same keystrokes, different client.
Client 2 — Dashboard
CA closes pharma.khata, opens manufacturing.khata. The mode badge persists, the dashboard refreshes to the new client.
CA audit walkthrough#/#/dashboard
Client 2 — Trial balance
Manufacturing's trial balance. Same layout, different numbers — no context switching cost.
CA audit walkthrough#/#/trial-balance
Client 2 — Balance sheet
Heavy on fixed assets and inventory, as you'd expect for a steel products company.
CA audit walkthrough#/#/balance-sheet
Client 2 — Profit & loss
High cost of goods sold relative to sales — consistent with the manufacturing margin profile.
CA audit walkthrough#/#/pnl
Client 2 — CA review panel
Same review workflow applied to the second client. Nothing to install or configure between files.
CA audit walkthrough#/#/ca/review
Client 3 — Consulting (Arjun Rao Advisory)
Close client 2, open client 3. Services-only balance sheet, and a CA adjustment voucher example.
Client 3 — Dashboard
Consulting LLP — smaller scale, services only, no inventory panel.
CA audit walkthrough#/#/dashboard
Client 3 — Trial balance
Fewer accounts, simpler structure — typical for a services LLP.
CA audit walkthrough#/#/trial-balance
Client 3 — Balance sheet
Receivables-heavy, no inventory line. The balance sheet layout adapts to the data present.
CA audit walkthrough#/#/balance-sheet
Client 3 — Profit & loss
Services revenue and professional expenses. TDS under 194J is auto-accumulated from the vendor payments.
CA audit walkthrough#/#/pnl
Client 3 — CA adjustment voucher
CA-authored adjustment entry — depreciation provision, year-end expense accrual, or any reclassification. Signed with the CA's identity from the profile.
CA audit walkthrough#/#/ca/adjustment/new
Capture summary
Every screenshot on this page is generated by capture.py — a Playwright script that drives a local Bahi dev server, loads each sample file via Bahi's in-page globals, navigates to each route, and records a 1400×900 PNG. The script doubles as a regression test: any route that fails to render or throws a console error is flagged in CAPTURE-LOG.md.