Section 11

Feature Catalogue

What the product looks like from the user's side of the screen — for individual advocates and for agencies.

How features are named

Users think in cases and hearings, not matters and connectors. The interface uses their vocabulary; the internal model keeps ours.

InternalUser-facingNever say
MATTERCaseMatter, record
CONNECTOR_RUNChecked with the courtPoll, scrape, sync job
CAUSELIST_ENTRYListed for hearingEntry, row
CHANGE_EVENTUpdateEvent, diff
StaleCouldn't reach the courtStale, degraded, circuit open
ORGANISATIONFirm / Team (hidden for solo users)Tenant, org
MEMBERSHIPTeam memberMembership, seat (except in billing)

One rule matters more than the rest: never show a solo advocate the word "organisation". The tenancy model makes everyone an organisation for sound engineering reasons. That is our concern, not theirs.

Navigation map

flowchart TB
    LOGIN[Sign in with phone] --> TODAY

    TODAY[Today
hearings + updates] CASES[My Cases] SEARCH[Add a Case] ALERTS[Updates] MORE[More] TODAY --- CASES --- SEARCH --- ALERTS --- MORE CASES --> CASEDET[Case detail] CASEDET --> HIST[Hearing history] CASEDET --> ORDERS[Orders and judgments] CASEDET --> DOCS["Personal documents (v2.0)"] CASEDET --> NOTES[Notes] CASEDET --> ASSIGN[Assign to colleague] CASEDET --> CLIENTLINK["Assign to client (v2.0)"] CASEDET --> CSETTINGS[Case settings] TODAY --> CAUSEPDF[Tentative + final
cause list PDF] MORE --> TEAM[Team
agency only] MORE --> MYCOURTS[My courts & tribunals] MORE --> BILLING[Plan and billing] MORE --> CLIENTS["Clients (v2.0)"] MORE --> INVOICES["Invoices (v2.0)"] MORE --> PREFS[Alert preferences] MORE --> ACCOUNT[Account and security] TEAM --> MEMBERS[Members and roles] TEAM --> WORKLOAD[Workload view] TEAM --> BOARD["Live display board (v2.0)"]

Fig 11.1 — Primary navigation

Items marked v2.0 are specified now but ship after the v1 MVP — see Roadmap. My courts & tribunals ships in v1: it is the practice-scope list (ORG_COURT in the Domain Model) that onboarding, the cause-list report, and the v2.0 board all read from — a user is never limited to one court.

Five tabs, fixed. Today is the default because the question users open the app to answer is "what do I need to know right now" — not "show me my case list". The old system led with a case list, which makes the user do the filtering the product should have done.

Feature catalogue

Core — every plan

FeatureWhat the user seesWhere
Add a casePick court, enter case number, we confirm it existsAdd a Case
Add by CNROne field, we find everything elseAdd a Case
Daily tracking"Last checked 4:12 am" on every caseCase detail
Next hearing dateProminent, with days remaining and its source (from court / your date / AI, unconfirmed)Today, Case detail
Override hearing dateAdvocate types or confirms a date; it takes priority everywhere over the court's own field, without erasing itCase detail
My courts & tribunalsThe list of courts you practise in — drives onboarding defaults and the combined cause-list reportMore
Tomorrow's listings"You're listed in 3 cases tomorrow"Today
Personalised cause listTentative report the evening before, final report the morning of — one PDF spanning every court you practise inToday, WhatsApp, Email
Hearing historyEvery date and stage, oldest to newestCase detail
Orders and judgmentsDownloadable, with the date receivedCase detail
WhatsApp alertsMessage when something changesPreferences
Push and email alertsSame, other channelsPreferences
Refresh nowManual re-check, with live statusCase detail
Case notesPrivate notes against a caseCase detail
Case settingsPer-case alert overrides, tags, archive/closeCase detail
Search and filterBy court, date, party, statusMy Cases
Calendar exportHearings to Google or Apple CalendarPreferences

Agency

FeatureWhat the user seesRole
Invite team membersInvite by phone number, choose a roleowner, admin
Assign casesSet who is responsible; bulk assign by court or clientowner, admin
WatchersColleagues who get alerts without owning the caseowner, admin
Workload viewCases and hearings per person this weekowner, admin
Tomorrow's boardEvery listed case across the firm, grouped by personowner, admin
Live display board v2.0Same board, on an office screen, refreshing on its own — see Live Display Boardowner, admin
TeamsGroup members; assign cases to a teamowner
Departure handoverRemoving someone forces reassignment of their casesowner, admin
Activity logWho changed what, and whenowner, admin
Seat managementSeats used and remaining, upgrade in placeowner

AI-assisted

FeatureWhat the user seesNote
Order summaryPlain-language summary of a new orderAlways labelled as AI-generated
Key directionsExtracted directions and compliance deadlinesShown beside the source text
Suggested next dateDate found in the order textNever overrides the court's own field

AI output is always visibly AI output

Every model-derived element carries a badge, links to the source passage, and can be dismissed. A suggested date is presented as a suggestion needing confirmation — never written into the case as fact. An advocate acting on a wrong date is the worst outcome this product can produce, and it is worse than showing no date at all.

Practice tools v2.0

Specified now, shipped after the v1 MVP — see Overview & Scope and Roadmap.

FeatureWhat the user seesWhere
Personal documentsUpload briefs, evidence, correspondence against a case — separate from the court's own ordersCase detail
Client managementAdd clients, see every matter for one client across courts and staffClients
Assign case to clientLink a matter to the client it's for, independent of which staff member works itCase detail
Invoice generationDraft an invoice against a client, itemise by matter or hours, export PDFInvoices
Live display boardOffice-screen view of hearings, no login on the screen itself — see Live Display BoardTeam

Key screens

Today

┌──────────────────────────────────────────────┐
│  Today            Wed, 12 Aug        [avatar] │
├──────────────────────────────────────────────┤
│                                              │
│  ⚖  IN COURT TOMORROW          Tentative     │
│  ┌────────────────────────────────────────┐  │
│  │ 3 cases listed, across 2 courts        │  │
│  │ Patna HC · Court 12 · Item 4, 17, 31   │  │
│  │                                        │  │
│  │ [ View cause list PDF ]                │  │
│  └────────────────────────────────────────┘  │
│                                              │
│  NEW UPDATES  (2)                            │
│  ┌────────────────────────────────────────┐  │
│  │ CWJC/12345/2024                        │  │
│  │ Next date changed                      │  │
│  │ 22 Aug  →  4 Sep            2 hrs ago  │  │
│  ├────────────────────────────────────────┤  │
│  │ CRWJC/889/2023                         │  │
│  │ New order uploaded          6 hrs ago  │  │
│  │ [AI] Summary ready                     │  │
│  └────────────────────────────────────────┘  │
│                                              │
│  THIS WEEK                                   │
│  Thu 13  ·  1 hearing                        │
│  Mon 17  ·  4 hearings                       │
│                                              │
├──────────────────────────────────────────────┤
│  Today   Cases   +Add   Updates   More       │
└──────────────────────────────────────────────┘

Tomorrow's listings sit above everything, because that is the only genuinely time-critical information in the product. Changes show before → after, not just the new value — the old system sent "your case was updated", which tells the user nothing and forces them to open the app to find out what.

Case detail

┌──────────────────────────────────────────────┐
│  ←   CWJC/12345/2024                    ⋮    │
├──────────────────────────────────────────────┤
│  Patna High Court                            │
│  Kumar & Ors. vs State of Bihar              │
│                                              │
│  ┌────────────────────────────────────────┐  │
│  │  NEXT HEARING             [Set my date] │  │
│  │  4 September 2026        in 23 days    │  │
│  │  Stage: For Admission                  │  │
│  │  Source: from court                    │  │
│  └────────────────────────────────────────┘  │
│                                              │
│  Assigned to   Priya Sharma        [Change]  │
│  Client        Kumar & Ors.        [Change]  │  ← v2.0
│  Last checked  today, 4:12 am     [Refresh]  │
│                                              │
│  ── History ──────────────────────────────   │
│  4 Sep 2026    For Admission       upcoming  │
│  22 Aug 2026   Adjourned                     │
│  1 Aug 2026    For Admission                 │
│                                              │
│  ── Orders (2) ───────────────────────────   │
│  22 Aug 2026   Order sheet          [PDF]    │
│                [AI] Summary                  │
│  1 Aug 2026    Notice issued        [PDF]    │
│                                              │
│  ── Documents (0) ─────────────────  v2.0    │
│  [ Upload a document ]                       │
│                                              │
│  ── Notes ────────────────────────────────   │
│  [ Add a note ]                              │
│                                              │
│  ── Settings ──────────────────────────────  │
│  Alerts: default   Tags: none   [Archive]    │
└──────────────────────────────────────────────┘

"Last checked" is shown on every case, always. It is the honest answer to the question underneath the entire product — is this information current? — and it is what makes the Stale state legible when something goes wrong.

"Source" under the hearing date is not optional chrome — it is the visible half of the hearing date precedence rule. Set my date writes to next_hearing_override, never to the court's own field, and the label changes to "your date" the moment it is set.

Workload — agency only

┌────────────────────────────────────────────────────┐
│  Team workload                    This week  ▾     │
├────────────────────────────────────────────────────┤
│  Member          Cases   Hearings   Tomorrow       │
│  ─────────────────────────────────────────────     │
│  Priya Sharma      48        6          2          │
│  Rahul Verma       61        9          3          │
│  Anita Desai       33        2          –          │
│  Unassigned        12        1          1   ⚠      │
│                                                    │
│  [ Assign unassigned cases ]                       │
└────────────────────────────────────────────────────┘

The unassigned row carries a warning marker whenever it has a hearing. An unassigned case listed tomorrow is precisely the failure an agency buys this product to prevent.

User journeys

New individual advocate

flowchart LR
    A[Lands on site] --> B[Enter phone]
    B --> C[OTP]
    C --> D["Pick your courts & tribunals
(one or several)"] D --> E[Add first case] E --> F[We verify with the court] F --> G{Found?} G -->|yes| H[Confirmed — we're watching it] G -->|no| I[Check the details] I --> E H --> J[Add more, or finish] J --> K[Turn on WhatsApp alerts] K --> L[Today screen]

Fig 11.2 — Individual onboarding

Time to value is the first verified case — the moment the product says "found it, we're watching this now". Everything else in onboarding is deferred until after that moment, including payment.

New agency

flowchart LR
    A[Owner signs up] --> B[Create firm]
    B --> C[Choose plan]
    C --> D[Bulk import cases
CSV or one by one] D --> E[Invite members by phone] E --> F[Assign cases
bulk by court or client] F --> G[Members accept and
see only their cases] G --> H[Owner sees
workload view]

Fig 11.3 — Agency onboarding

Bulk import is the make-or-break step. A firm arriving with 400 existing cases will not enter them individually, and no amount of polish elsewhere compensates. CSV import with column mapping, a preview, and per-row verification against the court is a v1 requirement for the agency segment — not a later convenience.

Interface states

Every list and detail view specifies all four states. Undefined states are where products feel broken.

ScreenEmptyLoadingError
Today"Nothing listed tomorrow. We'll tell you as soon as something changes."Skeleton cardsCached data + "Showing your last update"
My Cases"No cases yet" + Add a CaseSkeleton rowsRetry, offline notice
Add a CaseRecent courts as shortcuts"Checking with the court…" with a court-side note"That court isn't responding. We'll keep trying and tell you."
Case detailNo orders yet — expected, not an errorSkeletonLast-known data with a staleness banner
Workload"Invite your team to get started"Skeleton tableRetry

Telling the truth when a court is unreachable

The state that defines the product's honesty

When a court site is down or a connector has broken, the user must be told — on the case, in plain language: "We haven't been able to reach Patna High Court since Tuesday. This information may be out of date."

The alternative is showing stale data as though it were current, which is how a user misses a hearing while believing they are covered. Silence is the failure mode. A product whose whole promise is reliability has to be visibly honest about the moments it cannot deliver — and users forgive an outage they were told about far more readily than one they discovered.

Design and accessibility

  • Mobile first. Advocates use this standing in a corridor. The website mirrors the app rather than being a richer separate product.
  • Dates always absolute. "4 September 2026", never "in 3 weeks" alone. A relative date can accompany an absolute one; it can never replace it.
  • Large tap targets, high contrast. WCAG 2.2 AA minimum. The user base skews older than a typical consumer app and often reads in poor light.
  • Hindi and English from v1, with the language list extending by user concentration. Court data itself may be in either script — never force it through a single font stack.
  • Offline reading. Cases and the cause list PDF cached on device. Court complexes have poor signal, which is exactly where the cause list is needed.
  • No colour-only meaning. Status carries an icon and a label as well as a colour.