Copies & originals
Compare indexed URLs, distinct hashes and duplicate share over time. Separate improved crawl coverage from changes in the underlying community.
Read 90-day world histories →Your view, your pace. Changes save here.
OPEN INSTRUMENTS / VERSION 1
Bring a question. Borrow an instrument. Take the observations home.
The public observatory API returns measured histories, server details, title-word samples, sampled connections, safety inventory, local AI work and collection quality for Gemini, Gopher, Spartan and Nex. No account or API key is needed.
A record of what came into view. Never a census of people.
01 / OPEN THE NOTEBOOK
Send a GET request to https://braigetori.org/api/observatory. The default is seven days of hourly observations for all four worlds. The archive began September 12, 2026; choosing a longer window does not create earlier measurements.
curl --fail --get 'https://braigetori.org/api/observatory' \
--data-urlencode 'view=worlds' \
--data-urlencode 'world=all' \
--data-urlencode 'days=7'
Choose a dataset and world. The button sends one public GET request; the response below is real data.
Ready when you are.
Choose “Take a reading” to query the public archive.Preview shows at most three records. Open the JSON link for the entire bounded report.
02 / PICK AN INSTRUMENT
| view | What it answers | Returned records |
|---|---|---|
worlds | How did observed coverage and freshness change? | Hourly or daily world measurements; up to 9,000. |
places | Which servers are in the latest measured directory? | 50 per page; total and page_size included. |
history | What is one server’s recorded trail? | Choose one world and exact host; up to 91 daily points. |
topics | Which title words appear in the sample? | Without word: latest top 100/world. With it: daily history, up to 1,000 records. |
links | Which sampled paths join servers? | At most 250 edges/world on the selected or latest recorded day. |
demand | Which reviewed search words have publishable cells? | Completed-day cells with ≥5 received events; up to 12,000. |
safety | How do stored warnings and blocks change? | Hourly/daily tracked-URL counts and shares, grouped by label, reason, source, review status or scan age; up to 12,000 rows. |
pipeline | What is assessed, stale or waiting? | World snapshots of tracked/reviewed URLs and bounded waiting fingerprints; up to 9,000. |
models | What work do the local models perform? | Daily run/outcome measurements, installed-model catalogue, definitions and collection state; up to 9,000. |
actions | What safety actions were recorded? | Daily distinct-subject counts per action/reason, with no subjects or private notes; up to 9,000. |
quality | When did collection succeed or fail? | Most recent 500 attempts, including validation and read duration. |
Always inspect truncated. A limit is a limit, not evidence that the underlying world has no more records. Directory paging is the way to retrieve the full latest server directory.
03 / TURN THE DIALS
Supply each parameter once. Unknown parameters, invalid values and repeated parameters return HTTP 400. URL-encode values. All dates and archive windows use UTC.
| Parameter | Allowed values / default | Meaning |
|---|---|---|
view | Eleven names above; worlds | Select the dataset. |
world | all, gemini, gopher, spartan, nex; all | One world or all four. Demand selects groups containing this world. |
days | 1, 7, 30, 90, 180, 365, 730; 7 | Lookback window. Daily world/safety snapshots and action history extend to 730 days. Text usage is at most 180 days; image usage and demand 30. |
resolution | hour, day; hour | World, safety and pipeline history. Windows above 90 days force day. |
host | Lowercase letters, digits, dots, hyphens; ≤253 characters; empty | Substring in directory; exact server for history. Links match source or a protocol-qualified target. |
word | Lowercase ASCII letters; ≤24 characters; empty | Exact sampled word history or published-demand word filter. |
page | Integer 0…999; 0 | Zero-based directory page; 50 records per page. |
order | indexed, changed_24h, fetched_24h, errors, host; indexed | Directory-wide descending metric sort or ascending host name. |
day | Valid YYYY-MM-DD; empty | One link-sample day. Empty selects the latest recorded day in the window. |
Parameters outside their dataset’s scope have no effect. For example, resolution does not turn daily server history into hourly history. A history request requires both an exact host and a single world.
04 / READ THE MARKINGS
{
"version": 1,
"generated": 1789225200,
"filters": {"view": "worlds", "world": "all", "days": 7, "…": "…"},
"status": {"last_success": 1789224900, "failed_worlds": [], "…": "…"},
"metrics": {"indexed": ["Indexed URLs", "Definition…"], "…": "…"},
"rows": [{"at": 1789224900, "world": "gemini", "indexed": 1234, "…": "…"}],
"count": 1,
"truncated": false,
"retention": {"hourly_days": 90, "daily_world_days": 730, "…": "…"},
"notes": ["Dataset-specific methods and limitations…"]
}Illustrative, abbreviated structure above; 1,234 is an example, not a live count. The live reader shows actual values.
generated vs. atat for analysis.statusindexed, distinct, duplicates, unknown_hashesdestinations, known, queuefetched_24h, changed_24h, errorsduplicate_pct, hash_coverage_pct, error_pct, fresh_pctat, world, group, method_version plus defined metrics. Older method 1 observations precede the added reconciliation checks; method 2 records validated collection.at, world, host, group and available count metrics. The JSON metric dictionary defines measures; a field may be absent or null when unavailable.at, day, world, word, n, sample, rate, group. Count n is title-document occurrences; sample is the sampled title denominator; rate is 100 × n/sample.at, day, world, source, target, n, group. Source is a host; target includes the destination protocol. Count n is sampled links, not traffic.day, selection, channel, word, outcome, n, at, group. Selections can overlap. Bots and repeats can contribute; do not sum cells into people.at, world, ok, seconds, reason. Failed rounds retain previous measurements. Reasons are bounded public categories.05 / SMALL EXPEDITIONS
Compare indexed URLs, distinct hashes and duplicate share over time. Separate improved crawl coverage from changes in the underlying community.
Read 90-day world histories →Open a directory, choose a host, then request its daily history. Missing observations mean unknown, not disappearance.
Follow gopher.club →Try a title word and compare sample shares with their denominators. Keep the nonrandom sample and English bias in view.
Look for music →Join source and target server addresses to draw a graph. Label it a sample; rotating windows cannot establish network growth.
Trace observed connections →This standard-library example reads all pages and checks their collection round and keys. If collection changes during paging, start again after the round completes.
import json
from urllib.parse import urlencode
from urllib.request import urlopen
base = "https://braigetori.org/api/observatory?"
rows, rounds, totals = [], set(), set()
for page in range(1000):
query = urlencode(dict(view="places", order="host", page=page))
with urlopen(base + query, timeout=20) as response:
report = json.load(response)
rows.extend(report["rows"])
rounds.add(report["status"]["last_success"])
totals.add(report["total"])
if len(rows) >= report["total"]:
break
assert len(rounds) == len(totals) == 1, "Collection changed; retry"
assert len({(r["world"], r["host"]) for r in rows}) == len(rows)
assert len(rows) == totals.pop(), "Directory incomplete"
with open("braigetori-servers.json", "w") as output:
json.dump(rows, output, indent=2)For analysis, join on world and observation time, preserve missing values, and inspect collection gaps before calculating differences. The observatory laboratory offers regression, Pearson/Spearman correlation, smoothing and exports. Fits describe the observations; they do not establish causation or predict community growth.
07 / A CLEARER VIEW OF SCREENING
These instruments measure the screening system without publishing flagged documents. No flagged URLs, hosts, snippets, hashes, images, private notes, prompts or visitor identifiers appear in these four datasets. Labels are estimates and policy decisions, not findings of illegality.
curl --fail --get 'https://braigetori.org/api/observatory' \
--data-urlencode 'view=safety' \
--data-urlencode 'world=gemini' \
--data-urlencode 'level=warn' \
--data-urlencode 'group_by=reason' \
--data-urlencode 'days=30' \
--data-urlencode 'resolution=day' > warnings.json
curl --fail 'https://braigetori.org/api/observatory?view=pipeline&days=7' > review-queue.json
curl --fail 'https://braigetori.org/api/observatory?view=models&model=qwen35&days=30' > local-ai.json
curl --fail 'https://braigetori.org/api/observatory?view=models&model=mobilenet&days=30' > image-review.json
curl --fail 'https://braigetori.org/api/observatory?view=actions&days=90' > safety-actions.json
# Text model by the hour, its verdicts by day, and its daily exam (site-wide; world=all)
curl --fail 'https://braigetori.org/api/observatory?view=cadence&days=7' > model-hours.json
curl --fail 'https://braigetori.org/api/observatory?view=verdicts&days=30' > model-verdicts.json
curl --fail 'https://braigetori.org/api/observatory?view=exams&days=90' > model-exams.jsoncadence has one row per UTC hour with a measured worker run (90 days). verdicts counts what the text model concluded about documents it newly judged each UTC day: safety label before rules and precedence, usefulness, library shelf and time per document (180 days). exams gives each day's score on six authored, non-graphic cases graded as search would label them, with per-case results in exam_cases (730 days). These views contain labels and counts only: no addresses, titles or text.
| Extra filter | Accepted values | Scope |
|---|---|---|
level | all, clear, warn, block | Safety inventory |
reason | all, none, unknown or a reason code returned in filter_values.reason | Safety inventory and actions |
source | all, rules, local_ai, operator, archive_image | Safety inventory |
review | all, unreviewed, uncertain, reviewed | Current text-model review of the stored fingerprint |
age | all, under_1d, 1_to_7d, 7_to_30d, over_30d | Time since the scanner last observed the URL |
group_by | level, reason, source, review, age, world; default level | Safety series |
model | all, qwen35, mobilenet | Daily model measurements |
outcome | all or an outcome returned in filter_values.outcome | Worker run or image-review outcome |
Safety n and share_pct describe matching retained URL records; population is all tracked safety URLs in that world. It is not a count of people, a census of the index, internet prevalence or model accuracy. Hourly and daily points are the last observed snapshots, not sums. A zero category is meaningful only within a successfully observed population; missing snapshots stay unknown.
Pipeline fields include review_coverage_pct, model_uncertain_urls, stale_urls, review_queue, queue_oldest_hours and queued_characters. The queue is bounded to 2,000 waiting fingerprints, excludes in-flight batches and expires old entries; its size is not the full review backlog.
Text model rows contain additive daily run, document, error, inference and reported-token totals, plus elapsed/CPU time. Take the maximum of peak_model_mib across outcomes, never its sum. token_coverage_pct reports how many attempted calls supplied token accounting; absent accounting is null, not invented tokens. models describes installed models, runtime, role, version, licence, schedule, configured resource limits and known limitations. Usage and action rows are site-wide and require world=all; protocol attribution is not inferred.
Image counts cover only server review operations. Completed UTC outcome cells are frozen once and published only at five or more operations, without totals exposing hidden remainders. There is no private-browser telemetry. Empty image reports can mean suppressed, opted-out, unavailable or not-yet-collected data. New text usage instrumentation does not reconstruct earlier work.
Every response includes metric definitions, filter values, notes and collection status. Preserve those beside exported rows. Use the Safety & AI workspace to chart, transform, compare and export the same records. The repository also includes a dependency-free deploy/observatory-cli.py wrapper for JSON or CSV:
python3 deploy/observatory-cli.py --view safety --level warn --group-by reason --resolution day --days 30
python3 deploy/observatory-cli.py --view models --model qwen35 --days 30 --format csv > model-work.csv06 / KNOW YOUR INSTRUMENT
| Status | Meaning | Next step |
|---|---|---|
| 200 | Report, possibly empty or truncated | Inspect status, notes, count and truncation. |
| 400 | Invalid filter or oversized report | Correct parameters or narrow the window/world. |
| 503 | Archive busy or temporarily unavailable | Wait and retry with backoff; never treat failure as zero. |
The endpoint supports public GET reports, not arbitrary SQL or administrative commands. Browser access is same-origin; no cross-origin browser permission is promised. Scripts and notebooks can use ordinary HTTPS. Save the returned filters, metric definitions and notes alongside your rows so the evidence stays interpretable.
Privacy policy · Return to the instruments · Questions / corrections