A Atlas
{{ g.title }}
Nothing matches “{{ globalQuery }}”.
{{ dateText }}
{{ timeText }}
{{ initials }} {{ userName }}
{{ statusLabel }}
Atlas{{ crumb }}

{{ headline }}

{{ jarvisTag }}
{{ subhead }}

Today's briefing

Refreshed {{ refreshed }}
{{ b.tag }} {{ b.text }}

Inbox

This mailbox isn't authorised on the backend yet.
{{ m.initials }}
{{ m.from }} {{ m.when }}
{{ m.subject }}
{{ m.snippet }}

Holdings

{{ pnlText }}
₹{{ current }} invested ₹{{ invested }}
Zerodha expired today's session. Numbers below are the last snapshot.
{{ h.symbol }} ×{{ h.qty }} {{ h.pnlText }} {{ h.dayText }}
{{ contactCount }}
{{ syncResult }}
{{ g.letter }}
{{ contactsEmptyText }}
No match

Nobody selected

{{ contactsEmptyText }}

{{ selected.initials }}

{{ selected.name }}

{{ selected.role }}
{{ selected.source }} {{ selected.group }}

Demo record — Save won't persist until the backend is connected in Settings.

Contact details

{{ f.label }} {{ f.value }}

Recent activity

{{ a.date }} {{ a.text }}
{{ dupeCountText }}
Queue clear — nothing left to review.
{{ dupe.initials }}

{{ dupe.name }}

{{ dupe.reason }}
{{ dupe.confidence }} match

Field comparison

{{ dupe.mergeNote }}

{{ dupe.labelA }} {{ dupe.labelB }}
This pair came back without field-level records — the deployed Worker predates the field comparison. Redeploy the Worker and refresh.
{{ r.label }}
{{ dupe.pickSummary }}
All clear

Nothing to review

Every pair has been merged or kept. Atlas re-checks for duplicates after each contacts sync.

Period {{ periodRange }}
{{ s.label }}
{{ s.value }}
{{ s.delta }}

Insights

Computed against the same days of the last three months.

{{ i.text }}

Advisory

{{ advisoryAt }}

Generated once a day, never on the request path.

{{ a.title }}
{{ t }}

Upcoming known debits

{{ u.name }} {{ u.due }} ₹{{ u.amount }}

Expense by category

{{ c.name }} ₹{{ c.amount }}{{ c.share }}

Income vs expense

Last 12 months.

{{ m.label }}
Income Expense

Top merchants

Ranked by average spend over the last three months, same days each month.

MerchantThis periodPrev3-mo avgTrend
{{ m.name }} ₹{{ m.now }} ₹{{ m.prev }} ₹{{ m.avg }}
{{ txnSummary }}
Date Merchant Category Account Amount
{{ t.date }} {{ t.merchant }} {{ t.category }} {{ t.account }} {{ t.amount }}

Public profile watch

Atlas checks at 8:00 AM every day, ten contacts at a time, reading only what a person has made public — LinkedIn, Instagram, X, a company site — and proposes a change where it disagrees with your record. Nothing is saved without your accept.

{{ scanLabel }}
{{ scanMeta }} {{ scanNext }}
{{ u.initials }} {{ u.name }} {{ u.foundOn }} {{ u.confidence }} match
{{ c.label }} {{ c.from }} {{ c.to }}

{{ u.evidence }}

Open source
All clear

Nothing to review

Every suggestion has been accepted or dismissed. Atlas checks the public profiles again at 8:00 AM.

These four are examples, not your accounts. Add your real ones — alert emails are matched to an account by its last four digits, so imported spending lands in the wrong place until they exist.
{{ a.mark }} {{ a.name }} {{ a.meta }}

{{ accountFormTitle }}

The last four digits are how Atlas routes alert emails to this account. Get them right and imports land correctly.

Type
{{ accountNote }}

Gmail ingestion

Atlas reads transaction alert emails from your banks and cards and writes them straight to the ledger. It runs on the same schedule as everything else; you can also push it along here.

{{ ingestMeta }}
{{ m.account }}
{{ m.detail }}

Statements Atlas can't open ({{ lockedCount }})

These arrived as password-protected PDFs. Encrypted PDFs can't be decrypted on the server, so their monthly totals aren't in the ledger — the alert emails for the same spending are, so your day-to-day numbers are still complete.

{{ l.file }}{{ l.meta }} Locked

Import history

FileAccountFormatStatusImported
{{ st.file }}{{ st.when }} {{ st.account }} {{ st.format }} {{ st.status }} {{ st.counts }}

Categories

Type controls whether a category's transactions count as income, expense, transfer or investment on the dashboard.

{{ g.title }}
{{ c.name }} {{ c.type }} {{ c.owner }}

Categorization rules

Changing a system rule's category creates your own override at a higher priority — the original stays in the list, but yours wins.

PrioPatternMatchCategoryDirection
{{ r.priority }} {{ r.pattern }} {{ r.match }} {{ r.category }} {{ r.direction }}

{{ budgetMonth }}

CategoryBudgetSpentProjectedStatus
{{ b.name }} {{ b.budget }} {{ b.spent }} {{ b.projected }} {{ b.state }}

Matched pairs ({{ matchedCount }})

PaidAmountStatementPeriodTotal dueDiff
{{ m.date }} {{ m.paid }} {{ m.file }} {{ m.period }} {{ m.due }} {{ m.diff }}

Unmatched bill payments ({{ unmatchedPaymentsCount }})

No card statement within ₹1 of the payment, dated before it.

{{ u.date }} {{ u.amount }}

Unmatched card statements ({{ unmatchedStatementsCount }})

These have a total due, but no bill payment claimed them.

{{ u.file }} {{ u.amount }}

Statement total discrepancies ({{ flaggedCount }})

Opening balance plus parsed lines against the statement's own printed total, off by more than ₹1 — usually a missed or misparsed line item.

{{ d.file }} {{ d.detail }}

Not verifiable

Statements the parser couldn't read a total from — re-upload once the format is supported.

{{ u.file }} {{ u.reason }}

Connected services

Atlas only reads. Nothing is sent or deleted on your behalf.

{{ c.initials }}
{{ c.name }}
{{ c.detail }}

Appearance

Dark is the default. The choice is remembered on this device.

Backend

Atlas reads from your local assistant server. Status: {{ apiTag }} · last sync {{ lastSyncText }}.

Stored on this device only. Deploy steps are in cloud/README.md.

Assistant

Jarvis mode arms the wake word and speaks replies aloud. Turn it off on shared machines.