New Delhi · September 2026
Preceda

13 Letters

Letters

Letters from Chambers: the email letterhead and every letter Preceda posts, each rendered as a mail client shows it, in Paper and Lamp, beside its plain-text twin.

  1. Letterhead
  2. Sign-in code
  3. Acknowledgement of a request
  4. Acknowledgement of a report
  5. Letter of invitation
  6. Team notice

§ The post

Every letter, at the width a mail client gives it.

Each letter is its own HTML document, rendered here in a frame as a mail client would show it: Paper, and Lamp as a client in dark mode applies the letter’s own rule. The entries below show the same letters in half-width frames, where they take their phone layout, beside the plain-text twin posted with each.

Letter of invitation · Paper

Letter of invitation · Lamp

Sign-in code · Paper

Sign-in code · Lamp

Acknowledgement of a request · Paper

Acknowledgement of a request · Lamp

Acknowledgement of a report · Paper

Acknowledgement of a report · Lamp

Team notice · Paper

Team notice · Lamp

01

Letterhead

One letterhead for everything Preceda posts: the seal and PRECEDA, Chambers at the right, a rule in ink, the body in the reading serif, a signature, and a colophon that says how the letter was posted and how to write back. Mail clients are not browsers: a 600px table, inline styles generated from the tokens, and one <style> block that only adds the phone layout and the Lamp look.

Anatomy

renderLetter(spec)
The shell. Returns { subject, html, text }; every string in the spec is escaped, every link must be absolute https.
masthead
Seal (a PNG: clients strip inline SVG), PRECEDA in live type tracked like the wordmark, and the sender at right in folio size.
rule
One ink rule under the masthead. Hairlines elsewhere.
particulars
Optional one-line facts under the rule (invitation number in gilt ink, introducer, validity). Stacks on a phone.
body
Paragraphs in the reading role (17/1.55), a code slip in mono, a ledger or a verbatim excerpt for team notices.
signature
“Chambers, Preceda”, with an optional closing (“Yours faithfully,”).
colophon
How the letter was posted, how to write back, and the legal line. Never promises a reply the sender cannot read.
correspondent
`unattended` (today’s no-reply address) or `chambers` (a read mailbox, only after SPF, DKIM and DMARC pass). It changes the masthead and the colophon, nothing else.

Variants

Sender: unattended (today)

Posted from a no-reply address. The masthead names Chambers without an address; the colophon says replies are not read and points to Report issue.

Paper

Lamp

Sender: Chambers (after the BA-3 gate)

Posted from chambers@preceda.ai. The address joins the masthead and the colophon invites letters to it.

Paper

Lamp

At 390 px

At or below 480 px the sheet runs edge to edge with 24 px gutters, the sender drops under the wordmark, and the particulars stack one to a line.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.
  • Colour is never the only signal: the code sits in a bordered slip, the invitation number is named in words beside its gilt.
  • The HTML declares lang="en-GB", uses role="presentation" on every layout table and gives the decorative seal an empty alt, so a screen reader reads the letter, not the tables.
  • The wordmark is live type, so a client that blocks images still shows who wrote.

Do

  • Build every email with a letters builder; deliver it in the product.
  • Say “Chambers”; write as Chambers writes to counsel: precise, declarative, no hype.
  • Serve the seal PNGs from the product’s own https domain (default https://app.preceda.ai/letters/).

Don’t

  • Hand-type a colour, a font or a size in a template; every value comes from themeTokens and typeRoles.
  • Put an emoji, “AI”, or an exclamation mark in a subject or a letter.
  • Claim that replies are read while the sender is a no-reply address.

Usage

React
import { renderLetter } from '@luvkapur/preceda-design-system/letters';

const { subject, html, text } = renderLetter({
  subject: 'Your code to sign in',
  preheader: 'Your code is 483917.',
  audience: 'member',
  correspondent: { kind: 'unattended' },
  blocks: [
    { kind: 'paragraph', runs: ['Your code to sign in to Preceda:'] },
    { kind: 'slip', groups: ['483', '917'] },
  ],
  signature: {},
});
await transporter.sendMail({ from, to, subject, html, text });

02

Sign-in code

A one-line note on the letterhead. The code sits in a bordered mono slip, grouped for reading but copied as one string; the expiry is written in words from the same minutes authentication enforces; and it says plainly that nothing has been opened.

Variants

The letter

Paper

Lamp

Plain-text twin

Posted alongside the HTML as the text/plain part.

Paper

Subject: Your code to sign in
PRECEDA
Chambers
────────────────────────────────────────────────

Your code to sign in to Preceda:

    483917

It is good for ten minutes. If you did not ask for it, no action is needed; nothing has been opened.

Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. To write to us, use Report issue inside Preceda. Preceda provides legal information, not legal advice.

Lamp

Subject: Your code to sign in
PRECEDA
Chambers
────────────────────────────────────────────────

Your code to sign in to Preceda:

    483917

It is good for ten minutes. If you did not ask for it, no action is needed; nothing has been opened.

Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. To write to us, use Report issue inside Preceda. Preceda provides legal information, not legal advice.

At 390 px

The slip keeps the code on one line; the paragraph wraps at the reading measure of the phone.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.
  • The code is also in the preheader and the text twin, so a notification or a text-only client shows it.

Do

  • Pass the same expiresInMinutes that authentication uses.
  • Subject: “Your code to sign in”.

Don’t

  • Set the code in a coloured button or a tinted box.
  • Add a space inside the code that would be copied with it.

Usage

React
import { buildSignInCodeLetter } from '@luvkapur/preceda-design-system/letters';

const letter = buildSignInCodeLetter({ code, expiresInMinutes: 10, correspondent });

03

Acknowledgement of a request

The answer to someone who asked for an introduction. It gives the request its real, sequential number (the one gilt element), says what happens next and that nothing more is needed. It admits no one, names no price and promises nothing the current flow does not do.

Variants

The letter

Paper

Lamp

Plain-text twin

Posted alongside the HTML as the text/plain part.

Paper

Subject: We have your request
PRECEDA
Chambers
────────────────────────────────────────────────

Request No. 0017 · Received 22 September 2026 · Practice: Delhi High Court · criminal

We have entered your request for an introduction to Preceda. It is Request No. 0017, received on 22 September 2026.

Admission to Edition I, the first hundred members, is by request and introduction. Requests are read in the order they are entered, and we will write to you at this address when an introduction can be made.

There is nothing more you need to do.

Yours faithfully,
Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. Preceda provides legal information, not legal advice.

Lamp

Subject: We have your request
PRECEDA
Chambers
────────────────────────────────────────────────

Request No. 0017 · Received 22 September 2026 · Practice: Delhi High Court · criminal

We have entered your request for an introduction to Preceda. It is Request No. 0017, received on 22 September 2026.

Admission to Edition I, the first hundred members, is by request and introduction. Requests are read in the order they are entered, and we will write to you at this address when an introduction can be made.

There is nothing more you need to do.

Yours faithfully,
Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. Preceda provides legal information, not legal advice.

At 390 px

A short letter; it fits the first screen of a phone.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.

Do

  • Subject: “We have your request”.
  • Date the request in India time.
  • Pass the number the product stored, as stored.

Don’t

  • Promise admission, a date, or a reply to this address while it is not read.
  • Offset, round or inflate the request number.
  • Echo the name of an introducer back to the requester.

Usage

React
import { buildRequestAcknowledgementLetter } from '@luvkapur/preceda-design-system/letters';

const letter = buildRequestAcknowledgementLetter({ receivedAt, requestNumber, practice, correspondent });

04

Acknowledgement of a report

The receipt for Report issue: thanks, and where the report went. Two sentences; no ticket numbers, no promises of timing.

Variants

The letter

Paper

Lamp

Plain-text twin

Posted alongside the HTML as the text/plain part.

Paper

Subject: We have your report
PRECEDA
Chambers
────────────────────────────────────────────────

Thank you for your feedback. Your report has been received and is now with the developers who build Preceda; they will look into it.

Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. To write to us, use Report issue inside Preceda. Preceda provides legal information, not legal advice.

Lamp

Subject: We have your report
PRECEDA
Chambers
────────────────────────────────────────────────

Thank you for your feedback. Your report has been received and is now with the developers who build Preceda; they will look into it.

Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers from an address that is not read. To write to us, use Report issue inside Preceda. Preceda provides legal information, not legal advice.

At 390 px

A short letter; it fits the first screen of a phone.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.

Do

  • Subject: “We have your report”.

Don’t

  • Quote the report back to the member; the team notice carries it.

Usage

React
import { buildReportAcknowledgementLetter } from '@luvkapur/preceda-design-system/letters';

const letter = buildReportAcknowledgementLetter({ correspondent });

05

Letter of invitation

The most important letter Preceda posts. The particulars line carries the invitation number in gilt ink (the one gilt element), the introducer and the validity; the body introduces Preceda in one paragraph, sets the number and code in the slip, names the gate, and states the allotment. The product does not send it until the gate ships.

Variants

The letter

Paper

Lamp

Plain-text twin

Posted alongside the HTML as the text/plain part.

Paper

Subject: Your invitation to Preceda
PRECEDA
Chambers · chambers@preceda.ai
────────────────────────────────────────────────

Invitation No. 0142 · Introduced by Adv. Rhea Mehra · Valid until 20 October 2026

Dear Mr. Bansal,

Rhea Mehra has introduced you to Preceda. Preceda is a reporter that drafts: it reads the corpus, verifies every authority it relies on, and prepares the instrument a matter needs, with its working shown in the margin. It is admitted by introduction only.

To take up the invitation, present this number at the gate:

    0142 · 7HXK

The gate is at https://app.preceda.ai/gate. The invitation is good until 20 October 2026.

You will hold two introductions of your own once you have been a member for a month. They are not for sale and cannot be bought; they are yours to give.

Yours faithfully,
Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers. Letters to this address are read. Preceda provides legal information, not legal advice.

Lamp

Subject: Your invitation to Preceda
PRECEDA
Chambers · chambers@preceda.ai
────────────────────────────────────────────────

Invitation No. 0142 · Introduced by Adv. Rhea Mehra · Valid until 20 October 2026

Dear Mr. Bansal,

Rhea Mehra has introduced you to Preceda. Preceda is a reporter that drafts: it reads the corpus, verifies every authority it relies on, and prepares the instrument a matter needs, with its working shown in the margin. It is admitted by introduction only.

To take up the invitation, present this number at the gate:

    0142 · 7HXK

The gate is at https://app.preceda.ai/gate. The invitation is good until 20 October 2026.

You will hold two introductions of your own once you have been a member for a month. They are not for sale and cannot be bought; they are yours to give.

Yours faithfully,
Chambers, Preceda

────────────────────────────────────────────────
This letter was posted by Chambers. Letters to this address are read. Preceda provides legal information, not legal advice.

At 390 px

The particulars stack one to a line; the slip and the link stay whole.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.
  • “Invitation No. 0142” is written out; the gilt is emphasis, not the only signal.

Do

  • Take the number, code, introducer and validity from the gate’s data contract.
  • Subject: “Your invitation to Preceda”.

Don’t

  • Use gilt for anything but the invitation number.
  • Send it before the gate can redeem it.

Usage

React
import { buildInvitationLetter } from '@luvkapur/preceda-design-system/letters';

const letter = buildInvitationLetter({
  number, code, introducer, introducerShort, salutation,
  validUntil, gateUrl: 'https://app.preceda.ai/gate',
  allotment: { count: 2, after: 'a month' }, correspondent,
});

06

Team notice

Notices to the team (an issue report, a request to join) are not a brand surface, but they share the letterhead so everything Preceda sends reads alike. No seal, no signature, no promise: a heading, a ledger, and what the person typed, verbatim.

Variants

The letter

Paper

Lamp

Plain-text twin

Posted alongside the HTML as the text/plain part.

Paper

Subject: New issue report from counsel@example.com
PRECEDA
Internal notice
────────────────────────────────────────────────

New issue report

Report ID     5d2f0e8c-6a1b-4c1e-9f7a-0c3b2d1e4f5a
User          counsel@example.com
Category      Bug
Page context  matter

Description:
The draft panel stopped updating after the second turn.
I refreshed and it came back.

────────────────────────────────────────────────
Posted to the Preceda team by the application. This notice is not sent to members.

Lamp

Subject: New issue report from counsel@example.com
PRECEDA
Internal notice
────────────────────────────────────────────────

New issue report

Report ID     5d2f0e8c-6a1b-4c1e-9f7a-0c3b2d1e4f5a
User          counsel@example.com
Category      Bug
Page context  matter

Description:
The draft panel stopped updating after the second turn.
I refreshed and it came back.

────────────────────────────────────────────────
Posted to the Preceda team by the application. This notice is not sent to members.

At 390 px

Ledger labels sit above their values on a phone.

390 px

Accessibility

  • Every letter is posted with a plain-text twin that says everything the HTML says, in the same order.
  • What the person typed is escaped and shown with its line breaks; a URL they sent is text, never a link.

Do

  • Keep the subjects the team’s mail rules key on.
  • Mark a development runtime with dev: true.

Don’t

  • Send a team notice to a member.

Usage

React
import { buildTeamNotice } from '@luvkapur/preceda-design-system/letters';

const notice = buildTeamNotice({ subject, heading: 'New issue report', rows, excerpt, dev });