1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{{mark "contacts"}}
account: {{account}}
{{if .ShowHidden}}hidden contacts{{else}}contacts{{end}} — {{.Paging.Total}} addresses
{{- with .Paging.Range (len .Contacts)}}, showing {{.}}{{end}}
{{mark "addresses"}}
{{nameLegend}}

{{range .Contacts}}{{if .Important}}*{{else}} {{end}} {{pad 19 (date .LastSeen)}} {{name .Name}}
   /contact/{{.AddrEscaped}} ({{.Count}} message{{if ne .Count 1}}s{{end}})
{{end}}
{{- if .Paging.Next}}
next page: {{.Paging.Next}} ({{.Paging.NextCount}} more)
{{- end}}
{{- if .Paging.Prev}}
previous page: {{.Paging.Prev}}
{{- end}}
{{if and (not .ShowHidden) (gt .HiddenCount 0)}}
{{.HiddenCount}} hidden contact(s): /contacts?show=hidden
{{- end}}

{{mark "routes"}}
Columns: `*` marks an important contact, then last interaction, name and
address. The count on each link is how many messages that page will list, and
includes every header the address appears in.

  /contact/{addr}/petname       POST (application/x-www-form-urlencoded)
                                fields: petname  required, empty clears it
                                Assigns the name this account calls an address.
                                Yours, local, never sent: it is the only name
                                here that is not a claim by a stranger.
                                A name already naming another address is
                                allowed; /contact/{addr}/settings says so.

HTML version: {{.HTMLViewURL}}

All routes accept `Accept: text/llm`, or append `?view=llm` to the URL:
  /                     most recent messages
  /contact/{addr}       the full conversation with one address
  /contacts?limit=N     page size (default 50); combine with &offset=N
  /forge                forge notifications, which are not listed here
  /drafts               replies being written, none of them sent