Record: is ology.com a cover? — 2026-09-12

What was asked

The owner put the probability at about 90% ordinary, 10% cover, and asked for suggestions on uncovering a hidden purpose:

“A nefarious site would want to look innocent in exactly this manner. The misplaced address block, the geographic dispersion of servers, and continued existence of an apparently long-failed site — these could all be coincidence, but they would also fit a hidden purpose (say 10% likely). It is possible that examining the client-side HTML and Javascript would show some irregularity, but I do not think this is likely. More likely the key to unlocking hidden behaviors is user input (and/or cookies stored in the client based on a past user-supplied key). I do believe it is possible to construct a web service that gives no clue to its real purpose.”

The first thing to say is the limit. A service that answers every unkeyed request exactly like an ordinary empty service is not detectable from outside, and no amount of probing changes that. What can be done is to discover what the operator intended, and then check whether the live system does more than that, less than that, or something else. That is what this pass did.

The second thing to say is that the client-side examination was worth doing after all, because the client turned out to be published source code.

The operator published the whole stack

The GitHub organization public-square holds the components, and one of them names our target explicitly. The README of psqr-web says:

“The PSQR web app delivers content to readers using browsers and mobile phones… An instance of the progressive web app can be seen at ology.com.”

So this is not a mystery application to be reverse engineered. It is an open-source Progressive Web App, and the deployment at ology.com can be compared against the source it claims to be.

Artifact What it documents
public-square/psqr-web The SPA served at ology.com: Vue 3, vue-router, localforage, jose-browser-runtime, bencode, register-service-worker; views for feed, named feed, article, search, settings, list, publisher, an “algorithm checker”, and 404
psqr-web/.env.production The deployed endpoints, exact: VUE_APP_API_ENDPOINT=https://broadcast.ology.com, VUE_APP_ID_ENDPOINT=https://id.ology.com, VUE_APP_BEACON_ENDPOINT=https://beacon.ology.com, VUE_APP_CONFIG_VERSION=3
public-square/psqr-api The server: Symfony controllers for feed, article, broadcast, identity, list, permission, publisher, search, embed, link
public-square/psqr The CLI that creates did:psqr identities, signs posts, and crawls RSS, sitemaps, Twitter and Webhose
public-square/psqr-did-resolver The DID method resolver
public-square.github.io Project documentation, including the widget that embeds a feed or list in an iframe, and the id, list and broadcast hostnames
psqr-api/feed-json-templates/ The feeds we saw live: politics-mainstream, politics-left-leaning, politics-right-leaning, politics-senators, widget-1

The documented API surface is twelve routes: GET /api/feed/{name}, PUT /api/feed, GET|POST /api/search, GET /api/search/{hash}, GET|DELETE /api/article/{infoHash}, PUT /api/broadcast/{infoHash}, PUT|DELETE /api/identity/{did}, PUT|DELETE /api/list/{listName}, GET /api/permission, GET /api/publisher/{did}, GET /embed/, and GET /link/{infoHash}/{inlineLinkNumber}.

Every hostname we had discovered independently is in that list. There is no undocumented name to explain.

What the live system does now

Each request below is a single well-formed GET, made at the rate of roughly one every two seconds. Nothing was submitted, authenticated, or guessed.

Target Result Reading
https://ology.com/ and every path tried (/settings, /check, /feed, /sitemap.xml, /.well-known/did.json) 200, 4,848 bytes, one digest The SPA shell is served by the catch-all route. There is no DID document and no sitemap at the domain root
https://ology.com/robots.txt 200, 24 bytes: User-agent: * Disallow: Allow everything
https://ology.com/.well-known/security.txt 200 — the SPA shell, not a security.txt No file exists
https://beacon.ology.com/ and /<64-hex-hash>?r=... and a random path 403, 146 bytes, byte-identical in all three cases, a stock nginx error page A blanket deny, not an authorisation check. The client’s own beacon call is as refused as a random path
https://link.ology.com/ 400, stock nginx No application behind it
https://archive.ology.com/ 500, stock nginx No application behind it
https://feed.ology.com/ and https://list.ology.com/list/example-list/index.jsonl (the URL in the operator’s own widget documentation) Connection accepted, then no response until the 30-second timeout The upstream behind those vhosts is gone, and nginx waits for it
https://id.ology.com/ and https://broadcast.ology.com/ (both 3.239.102.116, AWS) Connection timed out on ports 80 and 443, repeatedly The live API and identity services are not answering at all

A covert relay would need a backend. There is no live backend on any name we know: the four service vhosts on the block answer 403, 400, 500 and a hang, and the two cloud services do not accept a connection.

The client, checked against its own source

The service worker is the shortcut to a complete client audit: its Workbox precache manifest lists every asset the app installs, so the question “did we miss a chunk?” is answerable without guessing. Thirty-two assets were fetched; four initial failures were transient and all succeeded on retry.

That last point answers the owner’s hypothesis directly. The “user-supplied key stored in the client” is not a hidden mechanism: it is the documented identity model. A publisher creates an identity, the private key stays in their browser, and the server only ever sees a signature. We cannot see another user’s browser storage, so a keyed interaction between a publisher and the service would be invisible to us — but there is nothing hidden about where it lives.

The structural find: the DNS moved, the old zone did not

This is the most informative result of the pass, and it explains several loose ends at once.

So the operation migrated its DNS to Route 53 around May 2024 and its API and identity service to AWS, and left the old nameservers — and the whole web fleet — running inside the reserved block.

Certificates: issuance is current, deployment is not

Certificate Transparency shows a live, automated issuance pipeline, and this is where the “abandoned” reading needs qualification.

When issued Names Issuer
2026-02-18 ology.com, feed.ology.com Amazon (ACM)
2026-06-27 list.ology.com, ology.com Let’s Encrypt
2026-06-29 feed.ology.com Let’s Encrypt
2026-07-04, 2026-07-05 beacon.ology.com, link.ology.com Let’s Encrypt
2026-07-30, 2026-08-01 ns1, api, archive, ns2 Let’s Encrypt
2026-08-26, 2026-08-28 list, ology.com, feed (renewed again) Let’s Encrypt
2026-09-03 beacon.ology.com, link.ology.com Let’s Encrypt

Certificates were issued for the whole fleet nine days before this record. What the hosts present, however, is uneven:

Host Certificate presented State
23.191.144.8, .9 and every other sampled address in the eight announced /24s ology.com, issued 2025-03-02, expired 2025-05-31 frozen
23.191.145.2 (ns1) ns1.ology.com, issued 2026-07-30, valid to 2026-10-28 current
23.191.147.3 (ns2) ns2.ology.com, issued 2026-06-01, expired 2026-08-30 one renewal behind

Per-name certificates were confirmed on the stale hosts too (feed expired 2025-06-02, beacon expired 2025-06-06), so this is a per-vhost deployment frozen in March 2025, not a single default certificate.

The reconciliation is mundane but worth stating precisely: an automated ACME client is still obtaining certificates, the authoritative DNS pair inside the block is still running, and the web tier that would use those certificates has not been updated since March 2025. Issuance current, deployment stale.

The content was recovered, and it is ordinary

The Internet Archive holds responses from the feed service itself, including one from 2025-07-09. Decompressed, politics-mainstream/latest.jsonl is a 500-record window spanning 2025-01-30 to 2025-02-05, and it shows what the service actually did:

Publisher identity Records
did:psqr:id.ology.com/msnbc 339
did:psqr:id.ology.com/the-economist 87
did:psqr:id.ology.com/upi 71
did:psqr:id.ology.com/the-new-yorker 3

Each record is a signed news item: title, description, canonicalUrl back to the publisher, an infoHash in the style of a torrent, engagement counters (contentLike, contentReply, contentAmplify), a geo field, and a metainfo.provenance block holding an EC P-384 JWK and an ES384 signature over the package. An earlier capture, from 2022-01-07, uses did:web:id.ology.com:thomas-massie — the pre-did:psqr form of the same idea.

That is a mainstream-news aggregator with cryptographic provenance. It is the kind of output the published code predicts, item for item, and the last item was broadcast at 2025-02-05T15:33:48Z — the same season the certificates stopped being deployed.

Third-party sightings

Source Result
Shodan InternetDB (free, no key) for 23.191.144.8 and .9 Ports 80 and 443 only, hostname ology.com, CPE nginx, no tags, no known vulnerabilities. A third party’s scan found no hidden listener
Certificate Transparency (certspotter) The nine names above and nothing else: no admin, vpn, dev, staging or other undisclosed host
urlscan.io Eight historical scans exist, including ology.com in 2022-11 and 2024-03 and vpsqr.com on 23.191.144.9 in 2024-11 — but the result and DOM APIs now require an account, and we did not create one, so the stored cookies and requests were not retrieved
AlienVault OTX passive DNS No records for ology.com, newpress.co or vpsqr.com
Wayback, ology.com Captures continue through 2026-02-11, all 200

What this does to the 10%

Six independent checks came back the way the ordinary reading predicts, and each one had a chance to come back the other way:

What remains, and cannot be removed by any of the above: a service that ignores unkeyed input is invisible to us, and the identity model means the interesting traffic is between a publisher’s browser and the API. There is no evidence of a hidden purpose, and there is also no way to prove its absence. The honest statement is not “clean” but “no hidden behaviour found across these checks, on a system whose published design already explains everything observed”.

One observation does deserve a second look, and it is not about concealment: the stale in-block nameservers still answer authoritatively for a zone that is no longer the public one. They are, in effect, a forgotten authoritative copy of a live domain inside unassigned ARIN space — reachable by anyone who asks them directly. That is a security curiosity in its own right, and it is worth recording separately from the cover question.

The falsifiers

Evidence that would raise the cover reading: an undisclosed hostname in a certificate; a port other than 80/443 answering on the block hosts; a response that differs for a well-formed versus malformed request to the same route; the identity or API services returning to life with behaviour the published code does not explain; published content that does not match the publisher DIDs; or traffic to these hosts from parties other than crawlers and us.

Evidence that would lower it further: the operator’s own statement; a successful retrieval of the urlscan archive showing only the landing page; the web tier’s configuration files; or the observation, over a longer period, that the certificate renewals stop.

The intrusion ledger

Every request this pass made to the operator’s infrastructure, all of it read-only:

Activity Count Notes
Asset fetches from ology.com (the SPA, its chunks, CSS, icons, service worker, manifest, robots) 32, plus 21 retries What a browser loads on a first visit
Route and well-known GETs (/api/permission, /api/feed/..., /api/search, /api/publisher/..., /embed/, /link, /archive, .well-known/..., robots.txt, sitemap.xml, the documented widget URL) 17, plus a few retries No parameters guessed, no authentication attempted
TLS handshakes to sample the certificate fleet about 70 Handshake only; no HTTP request
DNS queries, including to the in-block nameservers about 40 Ordinary queries; no zone transfer was attempted
Feed retrieval from the Internet Archive 3 Not to the operator at all

No credentials were guessed, no paths were brute-forced beyond the standard .well-known files, no redirects were followed into third parties, and nothing was submitted. The urlscan account that would have unlocked historical cookie data was deliberately not created.

What this leaves

The cover hypothesis is now substantially weaker on evidence, while remaining unfalsifiable in principle. The venture’s own published design — a signed-article network with per-publisher keys, aggregating mainstream news, deployed on a domain whose operator is named — accounts for every observable, including the ones that looked most like concealment: the unassigned address space, the spread of hosts, and the dead services.

The two genuinely new facts are architectural rather than conspiratorial:

  1. The public DNS is at AWS Route 53, and a stale authoritative copy of the zone is still answering from ns1/ns2 inside ARIN-reserved space.
  2. Certificate issuance is current (2026-09-03) while the web tier’s deployment has been frozen since March 2025.

Both belong in the site A record, and both are ordinary consequences of a migration that was never finished.

Commits