How to search, read and navigate the Proximal Origin record.
1. Getting started
The app is a folder of static files. It needs a local web server — opening
index.html from the file system will not work, because the browser blocks the
data fetches.
cd ~/Work/Reports/PO_Slack/page_based python3 -m http.server 8080
First paint takes a few seconds: the app loads four data files and then
draws the first source PDF (52 MB) into the reading area.
2. What is in the record
Four releases, each from a different archive. They are merged into one
timeline, but each keeps its own provenance, and the colour of a document always tells you
which medium it came from.
Release
Medium
Entries
Period
Colour
Rand Paul — Slack Part 1 (screenshots)
Slack
1,256
1 Feb – 30 Apr 2020
blue, lighter shade
Rand Paul — Slack Part 2 (export)
Slack
11,351
30 Apr 2020 – 28 Jun 2023
blue, darker shade
FOIA — Proximal_Origin_Emails.pdf
Email
100
31 Jan – 27 Jul 2020
green
FOIA — SSCP-Drafts-of-Proximal-Origin.pdf
Manuscript drafts
20
1 Feb – 5 Mar 2020
amber
That is 12,727 entries in total, spanning January 2020 to June 2023.
Read the shades this way: the hue is the medium (blue = Slack,
green = email, amber = manuscript draft) and the shade is the release. Rand Paul's two
Slack tranches are therefore two shades of the same blue. The FOIA productions are all green,
and each new FOIA release joins as another shade of green rather than a new colour.
Seven entries are release notes (grey) —
Slack's own "channel created / joined" furniture. They are publisher metadata about the release,
not documents in it, so they are kept separate and can be filtered out.
3. The screen and its three rails
Left to right (landscape) there are three collapsible rails and three work areas:
Area
What it does
📖 P.O. guide
The sections of the article, and the documents each one rests on.
🔖 Bookmarks
Your own saved pointers into the record.
📊 Timeline
Entries and search hits over time.
Results
The matched boxes.
PDF panel
One of four tabs — see §8 — following the box you opened.
Collapsing and resizing
Every rail and panel collapses by clicking its header (the chevron flips to point back).
A collapsed rail stays a thin 36 px strip with its title turned sideways, so it can
always be opened again — there is no state you can get stuck in. All three rails and both
timelines are open by default.
Two drag handles resize the work areas: the one between the results and the PDF panel
(width in landscape, height in portrait), and the one under the timeline.
Landscape and portrait
The Switch to… button in the toolbar flips the whole arrangement. The time
axis turns with it: vertical in landscape, horizontal in portrait. The bookmarks rail follows
the same convention — a vertical list down the left in landscape, a horizontal strip across
the top in portrait, with its scroll arrows turning from ▲▼ to ◀▶ to match.
4. Searching
One box searches everything at once — Slack, the FOI'd emails and the manuscript drafts
together.
Type
Means
"blue car"
exact phrase (double or single quotes)
blue green
both words, any order (same as blue AND green)
blue OR green
either word (same as blue|green)
(a OR b) AND c
grouping with parentheses
bun*
wildcard inside a term
The Aa case sensitive checkbox switches from "any capitalisation" (the default) to
exact capitalisation. Press ? in the search box for the short search help.
Narrowing by medium
The Sources button filters by medium — Slack, Email, Manuscript draft, Release note.
The filter applies to the results, to the counts on the timeline, and to the totals line at
once. It is remembered between visits.
Jumping to a date
Jump to date: opens the entries nearest that day (the nearest previous entry when
the exact day has none). Useful for moving through the record without a search term.
5. Reading a box
Each result is a card: a header line (date, sender, time, source badge, medium badge,
hit count), any chips, the hit navigation bar, and the text itself.
Click anywhere in a box to make it active and jump the PDF to its page.
◀ Prev / Next ▶ step through the individual matches inside one box, moving the
highlight and the PDF page together — so you can see each hit in the source, not
just in the text.
📄 p.N opens the PDF at that page directly.
⤢ Full text lifts the height cap so you can read a long box end to end without
scrolling inside it.
🔖 bookmarks the box (see §9).
Chips under the header are live: a thread chip opens the message being replied
to, a 📎 chip opens the attachment a message carried.
Clicking an email or a manuscript draft loads that release's PDF into
the reading area automatically, at the cited page — you never have to pick the source
yourself.
6. Scrolling inside a box
A long message is capped in height, and the box scrolls internally. Because the results
list itself also scrolls, two scrollbars on screen at once is confusing — so every box has
its own always-visible draggable scrollbar down its right edge.
Drag the bar, or use the wheel, to move within one box.
A small ↕ scroll inside this box for more text hint appears when a box is clipped.
Clicking the box's scrollbar never jumps the PDF.
PageUp/PageDown page the box under the pointer; the
↑/↓ keys walk the list of matches instead.
7. The timeline
Two charts sharing one time axis. On the left (bottom in portrait):
all entries per day. On the right (top): search hits per day.
Reading the entries side
Each day's bar is stacked, one segment per box kind (Slack message, Email,
Manuscript draft, Release note) in a single flat colour — no per-release shading on the bars
themselves, so a glance tells you the kind, not which FOIA production it came from. A kind
absent from a day simply has no segment there.
The legend
Below the chart, one bordered group per box kind, each with its own checkbox, swatch, name
and total. Tick a group's own checkbox to show or hide that whole kind everywhere —
search, browse and the chart together, the same thing the Sources dropdown does. Nested
under each group is a row of smaller checkboxes, one per release that kind came from (e.g.
Slack Part 1 / Part 2) — tick one to show or hide just that release, leaving the rest of the
kind in place.
Zooming and selecting
Drag across the chart to draw a box and zoom straight to that stretch (Plotly-style).
The entries axis rescales to whatever is actually in view, with a real labelled scale, so the
tallest bar on screen reaches close to the top instead of staying sized for the single busiest
day across the whole three-and-a-half years.
Scroll over the chart to zoom at the cursor; double-click, or the
↺ button by the panel header, resets.
Click a hit bar on the right to jump to that day's matches.
Click an entry bar to open that day's entries (and clear any search) — clicking
specifically within one kind's coloured band centres the window on an entry of that kind,
not just whichever entry happens to sit first in the merged record for that date.
Zoom is never carried across a layout switch, because the axis turns 90°.
8. Main Docs / Linked Docs / Tragicomedy / Thread
The PDF panel on the right always shows one of these four. The result list on
the left sits in its own panel too, under a single tab labelled Content. "Timeline" used
to be the name of one of these tabs too — it now only means the chart in §7, to stop one word
meaning two different things.
Tab
Shows
Main Docs
the five ingested, searchable sources (Slack, email,
manuscript drafts), following whichever box you opened
Linked Docs
other documents the article cites that are not one
of the five above, trimmed to just their cited pages — no search, no entries, a page number
is all a citation ever names here
P.O. — A Tragicomedy
the article itself, each page already opening on
the heading a guide section points to
🧵 Thread
a message's full reply/forward chain, upstream and
downstream, Gmail-style — each message carries an Open in Main Docs link to its
scanned page and an Open in Content link that instead recentres the left-hand
Content list on it
A box with a reply/forward link shows a 🧵 Thread button; clicking it opens that
conversation. Clicking another message's card in the Thread tab re-centres the conversation on
it. Each message also carries two jump links: Open in Main Docs jumps straight to that
message's scanned page without losing your place in the thread, and Open in Content
instead recentres the left-hand Content list on that exact message.
9. The P.O. guide rail
The left rail is the index of the article itself — its 214 dated sections —
so any message can be read against the claim it supports.
Click a section and the detail box below lists what that section rests on: one line per
citation, in alphabetical order by document, each showing the medium (in that medium's
colour), the page, and the date.
Click a document name — where the app holds that PDF, it opens in the reading
area at the cited page. Where it does not, the line stays a label with a
Drive ↗ link to the public copy.
show that day jumps the results to that date.
read this section in the piece ↗ opens your article at that section.
The little badges on each section (e.g. slack 12, email 3) count its
citations by medium, in the same colours as the timeline — so the guide and the charts are
read the same way.
10. Bookmarks
Your own pointers into the record. Click 🔖 on any box to add one;
click again to remove it. The rail lists them with the date and the medium.
Click a bookmark to jump back to that box, with the PDF at the same page.
✕ removes it.
▲▼ (or ◀▶ in portrait) scroll the list; an arrow greys out at the end.
The list is kept in the browser, so it survives a reload with no file involved.
Saving and loading
💾 Save writes the whole list to a named JSON file
(po-slack-bookmarks-YYYY-MM-DD.json). 📂 Load reads such a file back and
replaces the current list — it asks first, and it refuses a file that is not a
bookmark file rather than silently emptying the rail.
Across the other DRASTIC apps. The file format is deliberately generic:
every bookmark records which app it belongs to (po-slack, fauci-diary,
daszak-calendar) and the URL to reach it, alongside the P.O.-specific fields. So one
bookmarks file can hold pointers into the Fauci Diary and the Daszak calendar as well as into
this app. This app jumps directly to entries it holds; for a pointer to a sibling app it opens
that app's URL. The format is versioned, so a later app can add fields without breaking an
older file.
11. Keyboard
Enter in the search box — searchEnter in Jump-to-date — go↑↓ — walk the matchesPageUpPageDown — page the box under the pointer←→ — previous / next PDF page
The split is deliberate: vertical keys belong to the match list, because that is what you
navigate most; paging inside a long box is on PageUp/PageDown; and the
horizontal keys are left to the PDF.
12. Known limits
Stated plainly, because they affect what the record can be asked.
Time zones are assumptions. The emails are stamped without a zone. Each message's
zone is inferred from the sender's own institution (Wellcome → London, NIH → New York,
Scripps → Los Angeles, Tulane → Chicago, Sydney → Sydney, Pasteur → Paris) and the assumption
is printed on the card — never applied silently. An explicit UTC offset in a stamp always wins.
The scans are OCR. The email release ships as page images. Text is recovered at
300 dpi and cleaned, but names and punctuation carry OCR damage. Nothing is invented:
where a word could not be recovered it is left as the OCR read it.
Slack Part 1 is a screenshot release, so its text is OCR too; Part 2 is a clean
export. Messages with no recoverable text are flagged redacted on the card.
51 documents are cited by the article; only 3 are held here as PDFs
(Proximal_Origin_Emails.pdf, SSCP-Drafts-of-Proximal-Origin.pdf,
and the two Slack parts). The rest carry a Drive link to the public copy and are queued for
ingestion.
145 citations are classified "other" (grey) because the classifier does not yet
recognise them — many are plainly FOIA email releases. The colour is a gap in the
classifier, not a claim about the document.
13. Release notes
v1.4 — Main Docs / Linked Docs renaming, Content panel, Open in Content
Reading panel tabs renamed again: the PDF-viewer tab is now Main Docs (was
"Content" in v1.3); the cited-documents tab is now Linked Docs (was "Reference
Sources"). Nothing about what either tab does changed, only the label.
Result list becomes a panel of its own: the left-hand search/browse list now sits
under a single tab labelled Content — the name freed up by the PDF-viewer tab's
rename.
Thread tab's jump button renamed and split in two: the old Open in Content
button (which jumped to a message's scanned page) is now Open in Main Docs; a new
Open in Content button sits beside it, with a different job — it recentres the
left-hand Content list on that exact message instead.
🧵 Thread tab: a Gmail-style view of a message's full reply/forward chain, upstream
and downstream; an Open in Content button on every message jumps to its page without
losing the thread's own focus.
Reference Sources tab (renamed from Complementary — see below): unchanged in what
it does, cited documents trimmed to their cited pages.
Timeline legend rebuilt: one coloured group per box kind (no more per-release
shading on the bars) with a row of release sub-checkboxes nested under it, replacing the flat
per-(source, kind) swatch list.
Drag-to-zoom: draw a box on the chart to zoom straight to it; the entries axis
rescales to whatever stretch is actually in view, with a real labelled scale, instead of
staying sized for the single busiest day across the whole record. A day with zero entries no
longer draws a stub bar.
Resizable timeline panel and brighter grid lines.
Reading panel tabs renamed: the PDF-viewer tab is now Content (it used to
share the name "Timeline" with the chart, which was confusing); the cited-documents tab is
now Reference Sources (was "Complementary"). Nothing about what either tab does
changed, only the label.
Long email bodies with no natural paragraph break in the source are now split one
sentence per line for on-screen readability; the stored text and search are unaffected.
v1.2 — bookmarks, guide, provenance
🔖 Bookmarks rail: a third collapsible sidebar (vertical in landscape, horizontal in
portrait), with ▲▼ scroll arrows, a 🔖 toggle on every box, and Save/Load to a named JSON file
that travels between the DRASTIC apps.
📖 The P.O. guide is now a collapsible rail like the timeline, and its citations are
sorted alphabetically by document. Documents the app holds open in the reading area at the
cited page; the rest link to the public copy.
📊 Timeline stacked by media × release: colour is the medium, shade is the release,
with a clickable legend and hover help. Rand Paul's two Slack tranches are two shades of blue.
✉ Email headers repaired. The OCR read "Cc:" as "Ce:", and a glyph fragment between
fields was closing the header early — which stranded Subject: lines in the message
body. Subjects are now recovered on 95 of the 100 messages.
✉ Signatures separated. A title block is no longer read as message prose: it is cut
off the text and shown as a signature, with its own line returns preserved.
✉ Line returns repaired. Breaks that were an artefact of the scan column width are
rejoined; returns the author actually made are kept.
v1.1 — mixed sources, scrolling, the guide
Added the FOI'd email release (100 messages, one entry each) and the 20 dated manuscript
drafts, merged into the Slack timeline as first-class entries.
Every box got an always-visible draggable scrollbar and a ⤢ Full text expander;
macOS overlay scrollbars are invisible at rest, which made long boxes look unscrollable.
Fixed the keyboard model: ↑/↓ walk matches, PageUp/PageDown
page the box, ←/→ page the PDF.
Clicking an email or draft result now loads the correct source PDF automatically.
Added a Sources filter (Slack / email / draft / note) across search, browse,
timeline counts and totals.
v1.0 — the P.O. Slack record
12,607 Slack messages from the two Rand Paul releases, searchable with the timeline
and a page-accurate PDF viewer.