A case is a matter’s documents, the people they came from, and what the reviewers have decided about them. Everything below happens in the browser tab, in workers of its own, so the page stays usable while ten thousand documents go through.
Loading
Drop files, folders or zips on the Load screen, or choose them, and say whose they are. Each document is given a control number with your prefix (NGB-000001), a family, its custodian, its path and its file’s hashes. A zip inside a zip is opened too. A file that cannot be read is still listed, with the reason, so nothing goes missing quietly.
Email
EML and MBOX are read by the site’s MAILBOX and POSTBAG readers, MSG and winmail.dat by SATCHEL’s, and Outlook PST and OST by CABINET’s, which is checked against libpst on real Outlook files. From, to, cc, bcc, date, subject and the message ids are kept; pictures shown inside a message are not made documents of their own.
Documents
PDF text and document information through pdf.js; Word, Excel and PowerPoint text, comments, speaker notes and hidden sheets, with the author and dates each file records, from the current formats and from the 1997 to 2003 ones (.doc, .xls, .ppt), whose streams are read as Microsoft publishes them; text, CSV, RTF and web pages. A scanned PDF or a picture is set aside for OCR, which is slow and so is a step of its own.
Duplicates
Only the top of a family is compared; its attachments go with it. A file’s key is its SHA-256; an email’s is the SHA-256 of its sender, recipients, date, subject, body and attachments, because the same email saved from two mailboxes is two different files. The first copy loaded is kept; the rest point at it, across the case and within each custodian, and the kept copy lists every custodian who holds it.
Near-duplicates
Drafts, versions and the same letter sent to two people are grouped around the largest of them, the pivot, when their text is at least 80% alike, or whatever share you set. Each document’s text is boiled down to a MinHash signature as it is read, so fifty thousand documents are grouped in seconds, not compared pair by pair. Review shows a near-duplicate against its pivot word by word, with what only one of them says marked, and gives the similarity.
Threads and inclusive emails
Every message id a message names is joined to its own, so replies to a message that was never loaded still land in one thread. Each thread is ordered by date, with how deep each reply is, and shown beside the message. A message whose words are all quoted in a later one is marked as held in it; the rest are inclusive, and Review can show only those, so a thread is read once, not once a reply. A message whose attachment the reply dropped stays inclusive.
The index
A real inverted index, with the position of every word, built in a worker and kept with the case so it opens in a second or two. Words are matched without regard to case or accents (Café finds cafe), and a search runs in milliseconds.
Search
steel w/5 delay, notice pre/3 programme, "site meeting", negligen*, (crane OR steel) AND NOT tag:none, from:hollis-law.example, custodian:"Dana Okafor" date:2024-03..2024-04, near:pivot, inclusive:yes, recieve~ for a word within one letter, /\d{3}-\d{2}-\d{4}/ for a regular expression over the text, lang:fr, cluster:3. The filters above the list do the same without typing. A search that cannot be read says where.
Analytics
Worked out in the tab from the case’s own index, with nothing sent anywhere. Prioritised review ranks what is not coded by how likely it is to be Responsive, by logistic regression on the documents’ words trained from the coding (as Cormack and Grossman’s baseline model implementation for continuous active learning does), and ranks again as coding goes on; its precision, recall and AUC come from five-fold cross-validation. An elusion sample of what is not coded gives the recall, with its interval, and a stopping report says how. Clusters, More like this and related words come from latent semantic analysis of the same vectors; categories suggest the rest of the documents to tags from the ones coded with them, each accepted by a person; each document’s language is found from its words. Highlighting marks sets of words in every document as it is read.
Locked files and Outlook items
A PDF or a zip with a password is kept, and Review asks for the password where its text would be; given, the PDF is read and the zip’s contents come in as its family. Zips encrypted with ZipCrypto or WinZip’s AES are both read. The password stays in the tab’s memory to try on the next locked file, and is never saved. A .pst’s calendar entries, contacts, tasks and notes are documents of their own kinds, each with its fields as its text and an .ics or .vcf made from them.
Review
J and K move through the list, 1 to 9 tag, N finds the next document not coded, H the next hit, O shows the original. Responsive and Not responsive are one answer. Notes are kept as you type. Every change is written to the browser’s database at once.
Batches
The documents not yet coded, or whatever a search found, split into batches of the size you choose for a named reviewer, without splitting a family, each with its progress.
Working as a team, without a server
Save the case, or a review set of some of it, as one file. Another reviewer opens it in their own browser, codes, and sends back a coding file. Merging it takes what only they changed, keeps what you agree on, and shows every document you both changed, to keep yours, theirs or both.
The case file
A zip anyone can open: the case, a line of JSON for each document, the coding, the redactions, the productions and bundles made, the chronology, the audit trail, each document’s text, each original once by its SHA-256, and a manifest with the SHA-256 of every part. Opening one checks every part before anything is kept; a file changed by one byte is refused.
Redaction
On a PDF or a picture, drag a box over what is to go, on the page itself; on an email, a Word file or anything else, select the words in its text. Redact every hit covers every hit of the search at once. Each redaction has a reason (privileged, personal data, confidential, not relevant) and is kept as data beside the document: the original is never changed, and a redaction taken away is gone.
Productions
Choose the documents by tag or by search, with their families, without duplicates, and with privileged documents withheld behind a slip sheet. Each page gets a Bates number (your prefix, first number, digits, and where on the page) and any endorsement. Every page is a picture, with the redactions painted in solid black before it is written, so there is nothing under them. Each page is looked at: one with colour on it goes out as a colour JPEG, and one without as a black and white Group 4 TIFF at 300 or 200 dpi, as the usual protocols ask; or every page one way, if you choose. Spreadsheets can go out native.
Load files
A Concordance DAT (the usual delimiters: ASCII 20, þ and ®) with Bates ranges, attachment ranges, custodians, email fields, dates, hashes and links to the text, natives and PDFs, and an Opticon OPT for the images, each page’s TIFF or JPEG named line by line, as Relativity, Everlaw and Concordance import them; the DAT says how many of each document’s pages are in colour. A word that was redacted is taken out of the text files, and a load file value that contains one is written [REDACTED].
Productions received
Choose the other side’s volume on Load, zipped or as a folder. Its DAT and OPT are checked first against what the formats require: every row the header’s width, the Bates numbers without a gap or an overlap, family ranges that hold their documents, each document’s images matching its range, every linked file there, each problem listed by line. Each row becomes a document numbered by its own Bates number, in its family, with its metadata; its page images (Group 4 or LZW TIFF, JPEG, PNG) are put together as one PDF, each image’s SHA-256 kept, and a native is checked against the MD5 the DAT gives. Case reads its own load files back the same way before it writes them.
Quality control
On Batches, a random sample of the documents with any tag, of those not coded (an elusion test) or of one reviewer’s coding, sized from a confidence and margin of error, and drawn as the documents ranked lowest by the SHA-256 of a seed and their control number, so anyone can draw it again. Y and X answer it on Review; the error rate comes with its Wilson interval, carried to the whole set.
Tag groups and tag sets
Tags in groups, shown under their headings in the coding panel; a group can take one answer only, so Confidential and Highly confidential, say, cannot both be on. Six sets to start a matter from, and a case’s own set saved as a file another case opens.
Privilege log
Every document withheld, or redacted as privileged, with its date, author and recipients, the privilege claimed and a description you write, saved as CSV and as PDF, on its own or in the production with its Bates numbers.
The production’s seal
The volume is one zip with a manifest listing the SHA-256 of every file in it and the manifest’s own SHA-256 beside it; the case keeps each production’s manifest SHA-256, its Bates range and each document’s numbers. A PDF of each document, when asked for, is opened again as it is made and checked to have no text at all.
Chronology
Case suggests events from what it already knows: each email by when it was sent, each file by when it says it was made and last saved, and every date written in a document’s text, with the words around it. Nothing goes in until you pin it. A pinned event keeps its documents by control number, and its date, words and basis (documented, reported, inferred, disputed) can all be changed. It saves as TIMELINE’s file, as a CASEMAP matter that shows the gaps, or as CSV.
People
A map of who wrote to whom, from the From, To and Cc of the kept copy of each email (Bcc if you ask): one person to an address, whatever names they used, a line as heavy as the messages between two people. The arithmetic is LINK’s: betweenness by Brandes’ method, which finds the person who sits between two groups with few messages of their own, and the people and links the correspondence would fall apart without. Filter it by custodian, dates and copies; press a person to review their emails; save it as SVG or CSV, which LINK opens.
Exhibits
The documents with a tag, or a search’s results, bound into one PDF by the site’s EXHIBIT: an index at the front whose entries link to each exhibit, a sticker on each one’s first page, and a number on every page. A PDF or a picture goes in as it is; an email or an Office file goes in as its text laid out on pages; anything redacted goes in as pages drawn with the redactions painted out, and is described without its subject.
The audit trail
Every load, coding change, redaction, merge, export, production and bundle is written down as it happens, with who and when. Each entry holds the SHA-256 of the one before it, so changing, removing or reordering any entry breaks every one after. The trail goes into the case file; opening the file checks it link by link and refuses a file whose trail does not check, even one whose manifest was remade to match. It can be saved as CSV or JSON lines and checked with a few lines of code of your own.
Organisations and pace
Every domain in the case’s email with its people and the messages it sent and received, which organisations wrote to which, and the privilege screen’s domains and webmail marked. The Overview draws the documents coded each day and by whom, from the audit trail, and how long what is left takes at that pace.
Chain of custody
For each file the case was loaded from: who it was received from and by, when and how, and every hand-over since, each written to the audit trail; saved as CSV and as a PDF to sign, with the file’s SHA-256 and the trail’s last.
Coding in, and plug-ins
Coding from another platform or a spreadsheet comes in by control or Bates number, shown before it changes anything. Reports and load files of your own are a few lines of JavaScript, run in a worker that can reach no address and sees the case’s metadata and coding, never a document’s text.
The matter file
The review, its coding, tags and productions, in the matter’s one encrypted file beside Practice’s matter, PDF Studio’s working files and the invoices in Books. Case opens its own part and leaves the others sealed; coding coming back is reviewed one change at a time and lands only on a document with the same control number and SHA-256. How it works
Lists out
The document list, with control numbers, families, custodians, metadata, hashes, duplicates, threads, tags and notes, and the search term report, each as CSV for a spreadsheet.