Skip to content

KhataOS interaction spec (v0.1)

How KhataOS behaves from the keyboard, so people moving from TallyPrime keep their muscle memory. These rules describe behaviour. Visual design, wording and branding are KhataOS's own.

This is the target behaviour, not a list of what is built. Some rules describe features that don't exist yet (for example optional and post-dated vouchers, report filters, saved views and IFSC look-up). What works today is in the user guide and the roadmap.

The rules come from: - a hands-on behavioural study of TallyPrime 7.2 (Educational mode, 2026-10-19). Notes are kept privately, outside this repo; - ../research/tally-shortcuts.md, which has the full key table; - ../research/tally-pain-points.md, which records the problems Tally users report.

Each rule is tagged KEEP (match the behaviour), FIX (match the behaviour but remove a known pain point) or NEW (not seen in the TallyPrime study). Statements below about how TallyPrime behaved come from that hands-on study of release 7.2, unless a source is linked.

The key bindings themselves are implemented in crates/khata-keymap.


1. Screen layout

# Rule Tag
L1 Four fixed zones: top bar (global search on Alt+F, then the action menu), title strip (screen name on the left, company in the centre), work area, and two button bars (right side and bottom). KEEP
L2 Every button and menu item is labelled <Key>: <Label>. On menu items, the hotkey letter is highlighted inside the word (BaNking). KEEP
L3 Each F-key has a fixed slot in the right bar on every screen. Unused slots stay visible but greyed, so positions never move. KEEP
L4 On the voucher screen, the current voucher type's button is greyed. The bar doubles as a "you are here" marker. KEEP
L5 Each voucher type has its own background tint (Payment, Sales, Receipt…), so users can see at a glance what they are entering. KEEP
L6 When a window is inactive the whole UI dims. KEEP
L7 A parent screen stays visible, faded, behind a child screen (sub-forms, inline creation). KEEP

2. Moving between fields

# Rule Tag
F1 Enter accepts the field and moves to the next one. Forms flow down the left column, then down the right column. KEEP
F2 Fields whose value is already decided are skipped (choosing a State fills and skips Country). Empty optional fields pass straight through. KEEP
F3 Shift+Tab goes to exactly the previous field, including the alias field. Up on the first field does nothing. KEEP
F4 Esc in a field with text clears the text first. A second Esc leaves the screen. KEEP
F5 Ctrl+A saves the whole form from any field without asking. Pressing Enter past the last field asks "Accept? Yes / No", answered with Y or N. Answering N returns to the first field with every value kept. KEEP
F6 Esc on a form with unsaved changes asks "Quit? Yes / No". On the home screen, Esc asks to quit the app; this prompt is centred, while form prompts sit at the bottom right. KEEP
F7 After a master or voucher is saved, a new blank one of the same type opens straight away, with the last-used group or ledger carried over. KEEP
F8 Keys typed while a screen is opening are buffered, not lost. FIX: Tally appeared to drop them (not yet confirmed)

3. List picker (one component, used everywhere)

# Rule Tag
P1 A list field opens a panel with a header, optional column titles, action rows pinned at the top ("Create", "New State"…) and grouped items. Counts of hidden rows show at each end ("5 ▲", "15 ▼"). KEEP
P2 The panel sits on the right of the screen, or drops down from the field when that fits better. KEEP
P3 Typing filters on every keystroke and matches anywhere in the text, not only at the start. Matched characters are highlighted, and the cursor jumps to the first match. KEEP
P4 Inside a list, Up and Down move through the rows and wrap from the last row to the first. Enter selects. KEEP
P5 Yes/No fields are two-row lists. Typing Y or N selects. KEEP
P6 Text that matches nothing never creates a record silently. Enter on unmatched text shows a Create "<text>"… row that needs confirming. In Tally, a typo like "YMaha" became a permanent State with no prompt. FIX
P7 Alt+C creates a master from inside the field, with the voucher still visible behind it. When it is saved, the new value fills the field and the cursor moves on. The group list is filtered to what fits the context: a Payment's particulars line offers expense, party and liability groups, not bank groups. FIX: Tally defaulted to the last-used group
P8 Ctrl+Enter alters the selected master in place, then returns to the field. KEEP

4. Messages

# Rule Tag
M1 Errors appear in red-bordered panels and warnings in orange-bordered ones, at the bottom right. They don't block: any key dismisses them. KEEP
M2 An invalid tax ID (GSTIN, TRN, VAT number) is a blocking error, not a warning. Overriding it needs a role permission and a reason, and the override is written to the audit trail. Tally warned but still saved a GSTIN with a wrong check digit. FIX
M3 No warnings that don't apply. For example, never ask for a GSTIN on the company's own bank account. Noisy warnings train people to dismiss everything. FIX

5. Masters

# Rule Tag
Ma1 The ledger form's sections depend on the nature of the chosen group: bank fields (account number, IFSC, SWIFT, branch); party fields (bill-by-bill tracking, credit period, PAN, tax registration); or expense fields (tax applicability, HSN/SAC, rate). Sections change instantly when the group changes. KEEP
Ma2 The parent group's nature appears in italics under the group name ("(Current Assets)"). KEEP
Ma3 Tax attributes are inherited from company → group → ledger, and the form shows where each value comes from. KEEP
Ma4 Typing an IFSC code fills in the bank and branch from the public RBI IFSC dataset, offline. NEW
Ma5 Tally users expect these default groups in KhataOS's default chart: Bank Accounts, Bank OCC A/c, Bank OD A/c, Branch / Divisions, Capital Account, Cash-in-Hand, Current Assets, Current Liabilities, Deposits (Asset), Direct/Indirect Expenses and Incomes, Duties & Taxes, Fixed Assets, Investments, Loans & Advances (Asset), Loans (Liability), Misc. Expenses (Asset), Provisions, Purchase Accounts, Reserves & Surplus, Sales Accounts, Secured Loans, Stock-in-Hand, Sundry Creditors, Sundry Debtors, Suspense A/c, Unsecured Loans. Group aliases are searchable ("Expenses (Direct)" finds Direct Expenses). KEEP
Ma6 Amounts are right-aligned and shown in the locale's grouping: 2,50,000.00 for India, 250,000.00 elsewhere. Dr/Cr is a separate sub-field; its default follows the group's nature, and typing D or C sets it. KEEP
Ma7 While opening balances are being entered, a panel shows the company-wide opening total and how far it is from balancing. KEEP

6. Vouchers

# Rule Tag
V1 The voucher screen shows the type badge, an automatic number (one series per type), and the date and weekday on the right. KEEP
V2 The F4–F10 keys (and the Alt and Ctrl variants listed in the keymap) switch voucher type in place. KEEP
V3 Balances are projected live before saving. The header account shows its balance as it will be after this voucher, each line shows its ledger's balance, and the running total sits at the bottom right. KEEP
V4 A bank ledger on a voucher always opens a bank-details sub-screen, which can't be skipped. It records the instrument type, cheque range, instrument number and instrument date, for bank reconciliation. KhataOS adds UPI, NEFT, RTGS and IMPS reference numbers. KEEP + NEW
V5 In a sub-screen, Backspace in the first field closes it and returns to the parent. KEEP
V6 Optional (memo) vouchers, post-dated vouchers, "fill an unused number" and changing the entry mode (single entry, double entry or invoice) are all first-class. KEEP
V7 Cancelling a voucher keeps its number and zeroes its values (GST invoice serials must have no gaps). Deleting a voucher is logged with a full snapshot. KEEP
V8 The party picker on Sales or Purchase only offers eligible ledgers: cash, bank and party groups. KEEP

7. Reports

# Rule Tag
R1 Every report row drills down with Enter, and the last level opens the voucher. KEEP
R2 Users can act on report rows directly: alter, add after, insert before, duplicate, delete, cancel, hide or restore a line, and select one or many rows with Space or Shift+arrows. KEEP
R3 The right bar holds the report keys: F2 date, F4 context (such as voucher type), F5/F6 alternate views, Basis of Values, Change View, Exception Reports, Filter and Save View. KEEP
R4 Saved views are stored per user and appear in Go To (Alt+G). KEEP
R5 Day Book columns: date, particulars (the other ledger, in bold), voucher type, voucher number, then debit over inwards quantity and credit over outwards quantity. KEEP

8. Compliance built into the UX

# Rule Tag
C1 One build. The audit trail is always on and can't be switched off. Tally ships separate builds with and without its edit log (Edit Log FAQ). KhataOS doesn't: India requires the edit log for companies (Companies Act Rule 3(1)) and for all GST registrants (GST Rule 56(8)). FIX
C2 On first run, the user picks the country pack, which sets the financial-year start, currency, phone prefix, state list and the tax regimes that must be on (GST for India). Advanced switches sit behind "show more" / "show all". KEEP
C3 A company can hold several tax registrations, one per state. KEEP

Still to study

Keep this open list in step with the private study log:

  • The Balance Sheet, P&L, Trial Balance and ledger-vouchers reports, including drill-down depth and the effect of each F-key.
  • GSTR-1, GSTR-3B and the GSTR-2B reconciliation screens, with e-invoice and e-way bill generation.
  • Sales item invoices: item lines, batches, GST tax analysis (Alt+A) and invoice printing.
  • Banking: bank reconciliation, cheque printing and bank statement import.
  • The Go To launcher (Alt+G) ranking, and global search (Alt+F).
  • Backup, restore and repair under Alt+Y, together with the data-corruption pain points.
  • Whether keys typed during screen transitions are buffered (rule F8).
  • How button labels distinguish Ctrl from Alt chords visually (for example "A: Accept" is Ctrl+A, while "D: Delete" is Alt+D).