Work / Chitragupt / Wiki / Entities
pillar-inbox
Entitycanonicalverified 2026-08-10
PILLAR.INBOXInbox pillar
Summary
The upload + parse + triage hub. Only writer in the system. Two-column layout: sidebar (Shelves + view toggle + Folders + Storage) → main (Dropzone → "Needs your action" shelf → All documents). No charts. See inbox-pillar for invariants.
Canonical values
| Key | Value | Last changed |
|---|---|---|
PILLAR.INBOX.ROLE |
only writer in the system — every parsed entry traces back to a document uploaded here | 2026-06-26 |
PILLAR.INBOX.STATES |
empty · populated · upgrade (Free tier at storage cap) |
2026-07-10 |
PILLAR.INBOX.LAYOUT |
2-column desktop grid `[240px sidebar | main]` |
PILLAR.INBOX.SIDEBAR.SECTIONS |
Shelves · View toggle (By type / By year) · Folders · Storage meter | 2026-07-10 |
PILLAR.INBOX.MAIN.SECTIONS |
Dropzone → "Needs your action" shelf → All documents list | 2026-07-10 |
PILLAR.INBOX.SHELVES |
⚡ Needs your action · ⏳ Expiring in 90 days · 🧾 This year's tax pack · 🕒 Recently added |
2026-07-10 |
PILLAR.INBOX.NEEDS-ACTION.ARCHETYPES |
4 real archetypes render: Locked PDFs (password) · Uncategorised batch · Expiring policy (renewal, temporal.valid_until within 90 days) · OCR failure (re-upload). isNeedsAction/isExpiringSoon live in one place (_bucket-helpers.ts) so the main-panel shelf, sidebar "Expiring in 90 days" shelf, and ?shelf=needs_action filter all agree — before 2026-08-10 the main panel silently dropped the expiring-policy archetype (data existed, no renderer). AIS/26AS mismatch is not built — no backend job diffs AIS against 26AS per TAN/section (_lib/reconcile-income-sources.ts is unrelated: it dedupes evidence-doc income against AIS, not AIS-vs-26AS). Scoped out, not faked — NeedsActionShelf.tsx omits it entirely rather than rendering a fake mismatch banner. See 2026-08-10-inbox-wireframe-alignment. |
2026-08-10 |
PILLAR.INBOX.RECEIPT-LINKAGE |
linkEvidenceToLedger (apps/functions/src/inbox/link-evidence-to-ledger.ts) stamps a real linked_ledger_entry_id on evidence-only docs (travel-receipt, utility-bill, motor-insurance-policy, generic-receipt) that matched a bank_debit/bank_credit row — this existed server-side but was never surfaced in the UI until 2026-08-10: store/documents.ts + a useLedgerEntry hook (store/ledger.ts) + a LinkedTransactionNote component now render the real matched amount/date/merchant inside DocConfirmedView's "Used by" section. |
2026-08-10 |
PILLAR.INBOX.UPLOAD-PROGRESS |
Real per-file progress via uploadBytesResumable + state_changed callback (api/upload.ts → uploadFiles). Before 2026-08-10, DocumentUploader.tsx showed a fabricated ~${n*12}s remaining countdown and a static "—%" because the non-resumable uploadBytes call had no progress events to read. |
2026-08-10 |
PILLAR.INBOX.VIEW-ONLY.ACTIONS |
Free-tier single-doc page (DocViewOnlyView.tsx) — Download and Delete buttons now wired to fetchDocumentDownloadUrl/deleteDocument (api/documents.ts), matching DocConfirmedView.tsx. Before 2026-08-10 both buttons had no onClick handler. |
2026-08-10 |
PILLAR.INBOX.UPLOAD.ACCEPTED-TYPES |
PDF · XLSX · ZIP (ZIP auto-expanded) |
2026-07-10 |
PILLAR.INBOX.UPLOAD.MAX-PER-DOC |
25 MB | 2026-07-10 |
PILLAR.INBOX.UPLOAD.DROPZONE-COPY |
"Drop files here, or click to upload" / "PDF · XLSX · ZIP · drop a ZIP and we expand it · 25 MB per document" |
2026-07-10 |
PILLAR.INBOX.STORAGE.FREE-CAP |
200 MB — see tier-free · 2026-05-31-free-tier-storage-cap | 2026-05-31 |
PILLAR.INBOX.STORAGE.PAID-CAP |
5 GB — see tier-self | 2026-05-31 |
PILLAR.INBOX.STORAGE-CAP-BEHAVIOUR |
Dual enforcement: server rejects upload signed-URL request when cap would be exceeded and client-side dropzone disables with "Uploads paused — storage full" |
2026-07-10 |
PILLAR.INBOX.FREE-TIER.PARSING |
view-only hold; every doc row carries a Parses on upgrade pill; rows link to review-document-view-only instead of review-document |
2026-06-26 |
PILLAR.INBOX.FREE-TIER.UPGRADE-BACKFILL |
On upgrade, backfillFreeUploads fan-outs the held backlog with ETA — e.g. "18 documents auto-parse · ~4 min" |
2026-07-10 |
PILLAR.INBOX.DOC-TYPES.COUNT |
43 (enumerated in inbox-document-types — SUPPORTED_FORM_TYPES in packages/shared/src/schemas/document.ts). Was 28 as of 2026-07-10; grew via 2026-08-07-broker-holdings-statement (+1) and several earlier additions never re-synced here. Website copy no longer hardcodes this: InboxFreeUpgradeBanner.tsx / DocViewOnlyView.tsx / DocumentList.tsx all derive it from Object.keys(DOCUMENT_TYPES).length (2026-08-10 fix — was hardcoded "23 more types" = a stale 28-total). |
2026-08-10 |
PILLAR.INBOX.DOC-TYPES.FEATURED |
Empty-state names "Form 16 · Form 26AS · AIS · bank statements · broker P&L · deduction proofs" + a 2026-08-10-added hint line "… 43 document types supported" (previously missing from the live empty state entirely); upgrade banner names "Form 16 · Form 26AS · AIS · TIS · ITR-V · <N> more types", <N> now dynamically derived (38 as of this count) instead of the stale hardcoded 23. |
2026-08-10 |
PILLAR.INBOX.DOC-STATUSES |
closed set — see inbox-document-status (Confirmed · Needs category · Locked · OCR failed · Expiring · Mismatch · Parses-on-upgrade · Uncategorised) | 2026-07-10 |
PILLAR.INBOX.FOLDERS.L1 |
12 buckets: Tax · Banks · Employer · Investments · Loans · Insurance · Health · Assets · Retirement · Business · Identity documents · Other + virtual ⚠ Needs your attention bucket pinned at bottom — see identity-buckets |
2026-07-11 |
PILLAR.INBOX.FOLDERS.TREE-DEPTH |
Fixed 4 levels: Bucket → Identity → Year → Document. Year axis skipped for Identity documents + Other (period_key = none). See identity-buckets. |
2026-07-11 |
PILLAR.INBOX.FOLDERS.MISC-BUCKET |
Other — amber badge, holds any doc whose identity_type maps to other |
2026-07-11 |
PILLAR.INBOX.CHARTS |
none — Inbox surfaces work (shelves) and inventory (folder tree + list); charts live on the pillars that consume its output | 2026-07-10 |
PILLAR.INBOX.DOC-ROW.ANATOMY |
Type-tag square (F16 / 26AS / AIS / BANK / EPF / ?) → filename → meta line (type · source · date) → trailing status glyph |
2026-07-10 |
PILLAR.INBOX.LIST-HEADER |
"All documents · <folder> · <sub-folder> · <count>" + search input "Search documents…" + pager "Show N more ↓" |
2026-07-10 |
PILLAR.INBOX.UPGRADE-BANNER.CTA |
"Upgrade · Self ₹249" + "+ AI Q&A on documents · ₹499" (purple) |
2026-07-10 |
PILLAR.INBOX.UPGRADE-BANNER.FINE-PRINT |
"One-time per AY · refundable 14 days. Cancel anytime. Past AYs are always free." |
2026-07-10 |
Related
- inbox-pillar (concept) — invariants + only-writer role
- upload-only · no-manual-entry — the principles Inbox enforces
- user-identity-entry — the User → Identity → Document → Entry chain
- identity-buckets — the 12 L1 buckets + tree structure (supersedes inbox-folder-taxonomy)
- identity-types — the ~31 identity_type variants
- ledger-entry-types — strict enum of ledger entry_type values
- inbox-document-status — canonical status set
- inbox-document-types — the 43 parsers
- 2026-07-11-user-identity-entry-model — the ADR establishing the 12-bucket model
- tier-free — 200 MB view-only cap
- tier-self — 5 GB + parsing unlocks
- pricing-upgrade-topups — parse-on-upgrade + storage-cap rules
- copy-strings — free-tier badge + storage-cap warning copy
- 2026-05-31-free-tier-storage-cap — the ADR
- 2026-08-10-inbox-wireframe-alignment — receipt-linkage surfaced, real upload progress, expiring-policy archetype fix, dead buttons wired, dynamic doc-type counts
- inbox-empty · inbox-folders-default · inbox-free · inbox-uploading · inbox-transfers · inbox-zip-expanding
- upload-modal — the global upload surface Inbox opens
Sources
- .context/designs/web/inbox/inbox-empty.html
- .context/designs/web/inbox/inbox.html
- .context/designs/web/inbox/inbox-locked.html
Every project of mine is written down like this.
Read the résumé