On the record · 2025 to now · Huridocs

Uwazi, pushing the limits of research

A prototype that turns Uwazi's Library into a research and OSINT tool. Every fact says who said it, and a researcher's questions get answered on one screen.

When
November 2025 to now
For
Huridocs
Status
Prototype, mock data, not shipped

Twenty questions

Uwazi stores evidence well. It is less good at answering questions about it. A researcher working on a protest, a court case or a shooting does not want a list of records. They want to know which sources support a claim and which dispute it, who held an office on a given day, what happened in one district over thirty hours, and what connects two people who were never in the same room.

So I started with the questions instead of the screens. Twenty of them, the way a researcher would ask, tested against a real corpus. The Library as it stood could answer five on one screen, nine by hand, and six not at all. The reasons repeated: a link's status and dates were stored and then thrown away, a place or a person could not be used as a filter, events had no place on the map, there was no path query, and nothing could be saved or cited at the end.

The answer was not more filters. It was to treat every link and every field as a claim with sources behind it, and build the Library around that.

Who says so

Every field now shows how many sources stand behind it. Open one and it says which publishers, what each of them wrote, and whether the value is confirmed, single-source or disputed. On a timed event the popover lists six sources and says the start time is contested.

A claim opens on its evidence: publishers in rows, Supports and Disputes in columns, the quote in the cell with its date and status. Wire copies of the same story count once. A claim that counts the same thing as another says so, with the other figure next to it.

The Library has an Evidence view for the same idea across a whole collection: the figure in the left column, the claims it disagrees with, and a strength bar of supporting against disputing publishers. Footage that fact-checkers have traced elsewhere opens with a Misattributed note and keeps the distressing part covered until you choose to see it.

A claim's Relationships tab: publishers in rows, Supports and Disputes in columns, each cell a quote with its date and statusA claim's Relationships tab in dark mode: publishers in rows, Supports and Disputes in columns
A claim's evidence. Two publishers support it, two dispute it, and the quotes say why.
The Why we believe this popover on an event's When field, listing six sources and marking the value DisputedThe Why we believe this popover in dark modeA media item marked Misattributed, with the fact-check link and the footage covered as distressingA misattributed media item in dark mode
Why we believe this, on a contested start time. A clip shared as the wrong protest.
The Library's Evidence view: claims with their figure, their disagreements and a strength barThe Library's Evidence view in dark mode
The Evidence view. Figures you can compare, and the publishers behind each.

Where, who, when

Filters used to be a flat set of checkboxes on the record's own fields. Now a filter can reach through a link: Event, then Where, then Kathmandu District returns the events that happened there or at any place inside it, and Who narrows the same set by the people and organisations involved. Each facet has a Match mode, any, all, none or missing, ranges where the data is numeric, and OR and NOT groups for the questions that need them.

Time and place are one view. The strip under the Library, the map and the list read the same filter, down to the hour where the data has it. Events take their place on the map from the location they happened at, so a district query draws as a district. A view can be saved and shared as a link.

The Library map filtered to events in Kathmandu District, with the Where and Who chain filters open in the rail and the time strip under the mapThe filtered Library map in dark mode
Event, then Where, then Kathmandu District: 85 events, 82 of them on the map.

What connects them

The old Relationships panel spent its controls on arranging rows. None of them said whether a link was confirmed, when it held or who reported it, and the data had all three on every reference. So every link now carries its status and its dates, the panel can be filtered by them, and an As of date answers who held what on a given day.

Connect to finds the shortest paths between two records and shows each hop with its status, so a path through a single-source link reads as weaker than one through confirmed ones. Sources and places are skipped as hops by default, because every path runs through Kathmandu otherwise. Shared neighbours is the second tab, and any path can be drawn over the graph.

The whole collection is a Network: every record a dot, hover lifts its neighbours, an edge answers with its quotes and status, and a search flies to the best match and steps through the rest.

The Connect to dialog: shortest paths between two people, each link labelled with its relation and its verification statusThe Connect to dialog in dark modeThe Network view with a search for Kathmandu, the matching node lifted and the results drawer openThe Network view in dark mode
Four shortest paths, two hops, each link with its status. The Network, with a search stepping through 741 matches.

One clock

Some research is many recordings of the same minutes. The Sync view puts every recording of an event on one wall clock: phone videos, body cameras, dashcams and 911 calls as lanes, the bursts they share as the ticks that line them up. Click the clock and it lists what was running at that instant, and opens each recording at that second.

It also says how well a recording fits. An annotation that sits off the consensus time is an outlier, a lane whose clock wanders shows its drift, and a title time that does not match the first event is flagged rather than trusted.

The Sync view: recordings as lanes on one clock, the twelve volleys as numbered ticks, the playhead set and the recordings running at that instant listed belowThe Sync view in dark mode
The playhead at 22:09:02. Forty-⁠nine recordings run at this instant.

The notebook

An investigation has to leave the tool. The Notebook pins records, holds notes, and builds a citation list from the pinned evidence: the quote, the publisher, the date, the URL, the status and the page. It exports as text, Markdown or CSV.

The sources are there too. Government documents sit in the collection as PDFs with their OCR text, marked unreviewed, with the issuer and the source under the header. A reference that cites page seven scrolls the document to page seven.

The Notebook's Citations tab beside a pinned claim: quotes with publisher, date, status and URL, and export buttonsThe Notebook's Citations tab in dark modeA Government of Nepal PDF open in the document viewer, with its OCR text marked unreviewed and the record's metadata beside itThe document viewer in dark mode
Citations from three pinned claims. A cabinet decision, as the government published it.

Not shipped

This is a prototype on mock data, with no backend, kept on a branch of its own. None of it is in the Uwazi that organisations run today, and whether any of it gets there is a decision for Huridocs, not for me.

It was tested on three collections built from public material. The Nepal protests of 2024 to 2026: 2,124 records, each fact with a verification status, 23 government PDFs and the claims, events and casualty records behind the September 2025 days. Las Vegas, 1 October 2017: 582 records, among them 132 phone videos and the 911 calls, timed to the second on one clock. And CEJIL's archive of the Inter-American human rights system, 4,398 records from 1986 to 2021, which is where the Network and the chain filters were first built.

The next questions are already on the list: annotating at the playhead, camera view cones on the map, a queue of contradictions to work through. They are not built, and I am not showing them as if they were.