CANCRIDOCS · v0.4
DOCS --:--:-- ET

Usage

cancri is read-only — it shows positions and live prices. No orders, no trading. You describe your book once, confirm what the machine proposes, and then leave the terminal open.

The flow

primary path
boot ─▶ auth ─▶ onboard ─▶ confirm ─▶ dash
       sign in   describe /    the machine    the terminal
                 drop a file   proposes —     you leave open
                               you dispose

Nothing streams until you confirm. Gemini only proposes a structured inventory; the dashboard goes live only after you explicitly lock it in.

1 · Sign in

cancri is access-gated. You land on a “secure shell” card and authenticate with Firebase Auth — email + passphrase, or continue with Google. Each user sees only their own book; isolation is enforced by the datastore's security rules, not just the UI.

  • Enter user@ and your passphrase, then press ↵ connect.
  • Or use continue with Google → firebase.
  • The footer's live pulse confirms the session is secured by firebase auth.

2 · Feed the terminal

Onboarding has two routes that converge on the same normalisation step. Messy input is fine — the machine reconciles tickers, quantities, and names.

describe it

Type your holdings into the Gemini chat in plain language, then parse ↵.

gemini · portfolio intake
> 12 AAPL, 0.5 BTC, 100 msft, ~30 nvidia

drop a file

Drop a .csv, .xlsx, or paste text into the dropzone.

  • Accepted: .csv · .xlsx · .xls · pasted text
  • Column order and exact names don't matter — Gemini reconciles them.

Both routes hand off to the same step: Gemini normalises your input into a structured inventory keyed on ISIN/symbol. The machine proposes — you dispose.

3 · Confirm the inventory

You land on an editable terminal table of what Gemini parsed. The header reads, e.g., “gemini parsed 7 instruments · 2 flagged for your eye.” Each row carries a confidence signal — and low-confidence rows are flagged for review, never silently trusted.

confidencemeaningtreatment
≥ 0.9high — clean matchmint bar, accepted as-is
0.7 – 0.9mediumviolet bar, double-check
< 0.7low — ambiguousamber bar + review flag + tinted row
  • Edit any quantity inline; fix anything the machine got wrong.
  • Press ✓ lock inventory & go live to start streaming.
  • Or ‹ back to intake to add more. Nothing streams until you confirm.

4 · Read the dashboard

This is the terminal you leave open. The header shows your portfolio value, the day change (arrow + signed absolute + percent), the connection master (LIVE/DELAYED with a pulsing dot), and the market clock in ET. Each row is one instrument.

dashboard · row anatomy
LOGO  INSTRUMENT      QTY   LAST      DAY Δ      DAY %    5M TREND   POSITION    FEED
     AAPL Apple Inc   12   227.41  ▲ +1.83   +0.81%   ╱╲╱‾    2,728.92   ● LIVE
     BTC  Bitcoin    0.5   61,204  ▼ −742   −1.20%   ‾╲╱╲    30,602    ◐ DELAYED
LAST
the live price. On each tick the cell flashes — mint up, rose down — and the number rolls (odometer feel), never snapping.
DAY Δ / DAY %
change since previous close, always with an arrow and a sign — direction is never colour-only.
5M TREND
a live sparkline that appends a point and redraws on every tick; coloured by the day's direction.
POSITION
quantity × last price.
FEED
per-instrument freshness — LIVE or DELAYED, by dot, rhythm, and text.

The footer keeps a running tally: N live · M delayed · P positions · ticks · latency(ms).

Freshness: live vs delayed

The single most important thing cancri tells you is whether what you're looking at is real-time. It is shown three ways at once, so it survives colour-blindness, glances, and muted displays:

LIVE

primary source · realtime. Mint dot with a calm breathing pulse (1.8s) + the word LIVE.

DELAYED

fallback · ~15 min lag. Amber dot with a slower, off-beat pulse (2.6s) + the word DELAYED, always visible.

honesty over blackout. If the primary feed dies, the dashboard doesn't go dark — it stays warm, flips every row to DELAYED, slides in a degraded banner, and lets the latency climb. It never pretends a stale number is live.

States the terminal can be in

statewhat you see
liveNormal operation. Mint master dot, ticks flowing, sparklines drawing.
degradedPrimary lost. Amber banner: “showing DELAYED quotes · values may lag ~15 min.” Dashboard stays warm.
reconnectA blurred overlay over the still-visible dashboard: “reconnecting to primary feed… attempt n/5 · holding last quotes.”
closedMarket closed. Last close shown; live ticks resume at the next open (09:30 ET).
emptyNo instruments yet: “the terminal is hungry.”+ feed the terminal.
errorCouldn't reach the primary source. A technical sub-line (socket code, last-good age) + ↻ retry handshake.

Accessibility & motion

  • Direction is never colour-only — every gain/loss carries ▲/▼ and a signed value.
  • Freshness is never colour-only — LIVE/DELAYED is text + a distinct pulse rhythm, not just hue.
  • Reduced motion is honouredprefers-reduced-motion (and an in-app MOTION toggle) calm every animation while preserving the information. Numbers snap instead of rolling; pulses go static but keep their colour and label.
  • Keyboard-operable — auth submit, intake + parse, quantity edits + lock, and every CTA are real, focusable controls with a visible focus ring.
  • Tabular numerals everywhere, so rolling values never reflow.

FAQ

Can I place trades?

No. cancri is strictly read-only — it displays positions and live prices. There are no orders.

Who can see my portfolio?

Only you. Each user's book is isolated by the datastore's security rules; the client only ever subscribes to your own normalised ticks.

Where do prices come from?

A real-time primary source with a delayed fallback that doubles as a sanity oracle. The terminal always marks which one you're seeing. The mechanics live on the maintaining page.

Why did a row flip to DELAYED?

The primary feed for that instrument (or the whole engine) lost liveness, so cancri degraded to the fallback rather than show you a stale price as if it were live.