{
  "cards": [
    {
      "desk": "airports",
      "label": "Airports",
      "summary": "One document, read through a relay on this origin. The FAA's file is keyless and open but sends no Access-Control-Allow-Origin header, so a browser on labs.llc may not read it: faa-proxy.php has one hardcoded upstream, takes no parameters at all, parses the XML with SimpleXML and hands the page JSON. The register of 119 airports is a hand-compiled list with published reference coordinates rounded to 0.01 degrees; the FILE is the authority, and a code it names that is off the register still gets a tile.",
      "paper": "airports/?m=l",
      "dark": "airports/indexdark.html?m=d",
      "sources": [
        {
          "host": "nasstatus.faa.gov",
          "publisher": "Federal Aviation Administration",
          "reads": "the National Airspace System status document — one XML file of ground stops, ground delay programmes, arrival and departure delays and airport closures, republished about once a minute",
          "url": "https://nasstatus.faa.gov/api/airport-status-information",
          "path": "",
          "mode": "relay",
          "via": [
            "faa-proxy.php",
            "share.php"
          ],
          "cache": "120 s file cache (FAA_TTL in faa-proxy.php); the last good copy is served marked stale:true when the FAA is unreachable",
          "files": [
            "faa-proxy.php",
            "share.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "POLL_MS = 120000 in assets/js/app.js — every two minutes, only while the tab is visible, and on return to the tab if the last read is older than that",
      "section": "#about",
      "sectionTitle": "A board, not a forecast.",
      "licence": "public-data",
      "clauses": [
        "not-a-safety-service"
      ]
    },
    {
      "desk": "asteroids",
      "label": "Asteroids",
      "summary": "Both feeds arrive through jpl-proxy.php, which offers exactly two routes and validates every parameter — a distance in au inside (0, 0.2], a whole number of days 1–365, a limit 1–100 — before it builds a URL. The world map under the board is a vendored Natural Earth outline in assets/js/world.js, not a fetch. Nothing is ranked or scored: the rows are JPL's, in JPL's order.",
      "paper": "asteroids/?m=l",
      "dark": "asteroids/indexdark.html?m=d",
      "sources": [
        {
          "host": "ssd-api.jpl.nasa.gov",
          "publisher": "NASA Jet Propulsion Laboratory, Solar System Dynamics",
          "reads": "two APIs: cad.api for close approaches inside 0.05 au over the chosen window, and fireball.api for reported atmospheric impacts",
          "url": "https://ssd-api.jpl.nasa.gov/cad.api",
          "path": "",
          "mode": "relay",
          "via": [
            "jpl-proxy.php",
            "share.php"
          ],
          "cache": "600 s on the approach route and 1800 s on the fireball route (the $ttl values in jpl-proxy.php), keyed by the rounded parameters so two asks that share a cache file asked the same sky",
          "files": [
            "jpl-proxy.php",
            "share.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "not declared as a named constant — assets/js/app.js:508 re-reads both feeds every 60000 ms while the tab is visible, and the relay's own 10- and 30-minute caches are what set the real cadence",
      "section": "#about",
      "sectionTitle": "A desk, not an observatory.",
      "licence": "public-data",
      "clauses": []
    },
    {
      "desk": "bikes",
      "label": "Bikes",
      "summary": "There is no server component: the browser reads GBFS from the operator. The two hosts above are the ones NAMED in the code — the default system and the register — but they are not the whole list, and this is the honest part: where the CityBikes register carries an operator's own gbfs_href the board follows it, so the third host on any given visit is whichever one the register named, and the line under the system's name always says which host drew the board.",
      "paper": "bikes/?m=l",
      "dark": "bikes/indexdark.html?m=d",
      "sources": [
        {
          "host": "gbfs.lyft.com",
          "publisher": "Lyft, for Citi Bike",
          "reads": "the GBFS discovery file, and through it station_information (where each dock is and how big) and station_status (what is on it this minute)",
          "url": "https://gbfs.lyft.com/gbfs/2.3/bkn/",
          "path": "",
          "mode": "both",
          "via": [
            "share.php"
          ],
          "cache": "No cache stands between you and the operator: the read is direct, with cache:'no-cache', so the browser revalidates on the file's own Last-Modified and ETag and an unchanged file costs nothing",
          "files": [
            "assets/js/app.js",
            "share.php"
          ],
          "licence": "public-data"
        },
        {
          "host": "api.citybik.es",
          "publisher": "CityBikes",
          "reads": "the register of bike-share systems, once per visit, for the picker; and, only where an operator's own host will not answer a browser, that system's station list instead",
          "url": "https://api.citybik.es/v2/networks",
          "path": "",
          "mode": "direct",
          "via": [],
          "cache": "",
          "files": [
            "assets/js/app.js"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "POLL_MS = 150000 in assets/js/app.js — two and a half minutes, only while the tab is visible, because Citi Bike's status file is about a megabyte",
      "section": "#about",
      "sectionTitle": "A board, not an app.",
      "licence": "public-data",
      "clauses": []
    },
    {
      "desk": "dina",
      "label": "Logo Lab",
      "summary": "Nothing is read from anywhere. Every mark is drawn by one seeded generator in the browser, and the three numbers under the artboard — ink, balance and the standard deviation of a real 16-pixel render — are measured from a render made for the purpose and thrown away. The only request this property makes is the contact form's POST to its own contact.php.",
      "paper": "dina/?m=l",
      "dark": "dina/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — there is no feed to re-read; a seed and a set of controls always draw the same mark",
      "section": "#notes",
      "sectionTitle": "What is measured, and what is not.",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "drums",
      "label": "Drums",
      "summary": "No data and no samples. All eight voices are synthesised in the browser from oscillators and noise — the kick a sine swept 160 Hz to 48 Hz under a four-millisecond attack, the snare a noise band at 1.8 kHz over two triangle tones, the clap four bursts eleven milliseconds apart — and the three dials on each voice multiply frequency, time constant and gain. Nothing is fetched and nothing is uploaded.",
      "paper": "drums/?m=l",
      "dark": "drums/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the only clocks are the sequencer's own (js/clock.js posts every 25 ms; the recorder ticks at 250 ms)",
      "section": "#about",
      "sectionTitle": "How each voice is built.",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "figures",
      "label": "Figures",
      "summary": "The page reads no upstream of its own. Its table is rendered into the markup by tools/mkfigures.py from assets/js/figures.js, so a reader with JavaScript off gets every figure, every command and every source. --check executes all 141 commands against the tree in a subprocess, compares each answer to the figure the register carries, and re-renders both editions to memory to catch a page that was not regenerated. Five figures carry no command because none is possible — a valuation, an ownership claim, the Library of Congress's own page total and the national debt — and each of those prints the reason on the page instead.",
      "paper": "figures/?m=l",
      "dark": "figures/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the table is static markup; the only script on the page is a filter and a clipboard button, and neither of them changes a number",
      "section": "#about",
      "sectionTitle": "Why a figure carries its own arithmetic.",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "hurricane",
      "label": "Hurricane",
      "summary": "Three Center files through one relay with a fixed route table — the key is all a caller may choose, and the host, the path and the content type are the relay's decision. The coastline is a vendored Natural Earth outline in assets/js/coast.js. The other NHC addresses in assets/js/app.js are outbound links, not reads: they are where to go if this desk cannot read the product. Push alerts go out through alerts.php to whatever endpoint the subscriber's own browser issued, which is not an upstream and is named in no code here.",
      "paper": "hurricane/?m=l",
      "dark": "hurricane/indexdark.html?m=d",
      "sources": [
        {
          "host": "www.nhc.noaa.gov",
          "publisher": "NOAA National Hurricane Center",
          "reads": "three files: CurrentStorms.json for the active systems, and TWOAT.xml / TWOEP.xml for the Atlantic and eastern Pacific tropical weather outlooks",
          "url": "https://www.nhc.noaa.gov/CurrentStorms.json",
          "path": "",
          "mode": "relay",
          "via": [
            "nhc-proxy.php"
          ],
          "cache": "300 s file cache per feed ($ttl in nhc-proxy.php)",
          "files": [
            "nhc-proxy.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "STORMS_MS = 300000 and OUTLOOK_MS = 900000 in assets/js/app.js — five minutes for the active-storm file, fifteen for the outlooks, both only while the tab is visible",
      "section": "#about",
      "sectionTitle": "A reading desk, not a warning service.",
      "licence": "public-data",
      "clauses": [
        "not-a-safety-service"
      ]
    },
    {
      "desk": "in-house",
      "label": "In-House",
      "summary": "The roster reads one file on this origin — assets/js/portfolio-data.js, the site's own register — and counts every figure on the page from it at the moment it draws. That is the same file the homepage counts from, so the two cannot disagree; if they ever do, the fault is in the register and both pages are wrong together. No upstream host is involved at all.",
      "paper": "in-house/?m=l",
      "dark": "in-house/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the register is a script the page loads once",
      "section": "#about",
      "sectionTitle": "What in-house means.",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "jewelry",
      "label": "47th Street",
      "summary": "One fetch of register.json, a file beside the page on this origin, and every number is counted from it — the total, the department counts, the doors on the block. No upstream is read at load. The register itself was compiled off-line against more than one source per entry, and where two sources disagreed the entry waited; the audited edition re-checks the same file and accounts for what was dropped. The many jeweller domains in assets/js/businesses.js are outbound links to the listed businesses, not feeds.",
      "paper": "jewelry/?m=l",
      "dark": "jewelry/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the register is a static file, replaced by a new drop rather than polled",
      "section": "#method",
      "sectionTitle": "Three rules.",
      "licence": "names-and-marks",
      "clauses": [
        "a-directory"
      ]
    },
    {
      "desk": "laband",
      "label": "Laband",
      "summary": "The deck loads three MP3s from this site and its own scripts, and that is the whole of its network traffic. Every figure it prints is measured off the decoded audio — durations from the buffer, the waveform from the samples, the platter reading from the rate the deck reports rather than the rate the interface last asked for. made.php, which lists what has been made, is on this origin too.",
      "paper": "laband/",
      "dark": "laband/indexdark.html",
      "sources": [],
      "refresh": "not declared — there is no feed; the deck reads what it is playing",
      "section": "#about",
      "sectionTitle": "The band, the engine, and what this is not.",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "legal",
      "label": "Legal",
      "summary": "The legal page reads nothing and sends nothing: assets/js/app.js contains no fetch, no XMLHttpRequest and no beacon, which is the same claim the page makes about the site's own tools and would be a poor claim to make while doing otherwise. It is also the page every other card on /method/ cites for its licence group.",
      "paper": "legal/?m=l",
      "dark": "legal/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — there is nothing to re-read",
      "section": "not yet written",
      "sectionTitle": "",
      "licence": "own-work",
      "clauses": []
    },
    {
      "desk": "omnifile",
      "label": "OmniFile",
      "summary": "This is the one card where the upstream sends code rather than data. No file the reader picks is ever uploaded — the property has no upload endpoint — and images and text are converted by the browser itself. Audio and video need FFmpeg, which is not part of the page: pressing the button downloads about ten megabytes from unpkg.com and it then runs here, on files that never leave. The page names the exact packages and sizes above the button rather than after it.",
      "paper": "omnifile/?m=l",
      "dark": "omnifile/indexdark.html?m=d",
      "sources": [
        {
          "host": "unpkg.com",
          "publisher": "unpkg, serving the @ffmpeg npm packages",
          "reads": "the FFmpeg WebAssembly build — @ffmpeg/ffmpeg 0.12.10 and @ffmpeg/core 0.12.6 — fetched only when the reader presses the button that needs it, and run in a worker in the tab",
          "url": "https://unpkg.com/@ffmpeg/ffmpeg@0.12.10",
          "path": "",
          "mode": "direct",
          "via": [],
          "cache": "",
          "files": [
            "assets/js/app.js"
          ],
          "licence": "third-party-library"
        }
      ],
      "refresh": "not declared — the engine is fetched once per tab, on the reader's press, and never polled",
      "section": "#about",
      "sectionTitle": "What runs where, and what this desk will not do.",
      "licence": "own-work",
      "clauses": [
        "nothing-leaves"
      ]
    },
    {
      "desk": "rates",
      "label": "Rates",
      "summary": "Two of the three are read straight from the browser; only the mortgage survey needs a relay, and the desk still works without PHP — the mortgage panel then says why it is empty. One figure on this desk is NOT read from anywhere: the prime rate is derived, as the upper bound of the FOMC target range plus PRIME_OVER_TARGET_BP = 300 basis points, which is a banking convention rather than a published rate, and the panel says so. Every yield is turned into whole basis points by string surgery before anything is subtracted from anything.",
      "paper": "rates/?m=l",
      "dark": "rates/indexdark.html?m=d",
      "sources": [
        {
          "host": "markets.newyorkfed.org",
          "publisher": "Federal Reserve Bank of New York",
          "reads": "the five overnight reference rates — EFFR, OBFR, SOFR, TGCR, BGCR — with their percentile bands and volumes, the SOFR Averages and Index, and the EFFR history the policy ladder is built from",
          "url": "https://markets.newyorkfed.org/api/rates/",
          "path": "",
          "mode": "direct",
          "via": [],
          "cache": "",
          "files": [
            "assets/js/app.js"
          ],
          "licence": "public-data"
        },
        {
          "host": "home.treasury.gov",
          "publisher": "U.S. Department of the Treasury",
          "reads": "the daily par yield curve as CSV, one calendar year per request, back to 1990 — earlier years answer 200 with a zero-byte body, so the walk stops there",
          "url": "https://home.treasury.gov/resource-center/data-chart-center/",
          "path": "interest-rates/daily-treasury-rates.csv/",
          "mode": "direct",
          "via": [],
          "cache": "",
          "files": [
            "assets/js/app.js"
          ],
          "licence": "public-data"
        },
        {
          "host": "www.freddiemac.com",
          "publisher": "Freddie Mac",
          "reads": "the Primary Mortgage Market Survey history CSV — the weekly 30- and 15-year fixed rates",
          "url": "https://www.freddiemac.com/pmms/docs/PMMS_history.csv",
          "path": "",
          "mode": "relay",
          "via": [
            "pmms-relay.php"
          ],
          "cache": "CACHE_TTL 21600 s; a stale copy is served for up to GRACE_TTL 604800 s marked stale, a failing upstream is negative-cached for FAIL_TTL 300 s, and past the week it answers 502 with no figures",
          "files": [
            "pmms-relay.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "REFRESH_MS = 1800000 in assets/js/app.js — every half hour while the tab is watched, with REFOCUS_MIN_MS = 300000 so returning to the tab does not re-read a read that is still young",
      "section": "#about",
      "sectionTitle": "A reading room, not a terminal.",
      "licence": "public-data",
      "clauses": [
        "not-advice"
      ]
    },
    {
      "desk": "rules",
      "label": "Rules",
      "summary": "One keyless API, read straight from the browser, with no server component at all. Two of the numbers this desk shows are limits of the API rather than of the data and are labelled as such: it stops paging at 50 (API_PAGE_CAP) and stops counting at 10,000 (API_COUNT_CAP), both measured against the live service rather than read out of its documentation.",
      "paper": "rules/?m=l",
      "dark": "rules/indexdark.html?m=d",
      "sources": [
        {
          "host": "www.federalregister.gov",
          "publisher": "Office of the Federal Register, National Archives and Records Administration",
          "reads": "the public API — documents by type, agency and date, and a whole issue at a time; every request names the fields it wants with fields[], so the parser and the request are the same list",
          "url": "https://www.federalregister.gov/api/v1",
          "path": "",
          "mode": "direct",
          "via": [],
          "cache": "",
          "files": [
            "assets/js/app.js"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "not declared — there is no timer in assets/js/app.js. The desk reads when the reader asks it to: a filter, a page, an issue",
      "section": "#about",
      "sectionTitle": "A reader, not the record.",
      "licence": "public-data",
      "clauses": []
    },
    {
      "desk": "tides",
      "label": "Tides",
      "summary": "One host, read directly. The twelve quick-pick stations were each fetched from the metadata endpoint and checked to answer both a prediction and a water-level read; every one is a type-R reference station, where NOAA measures. A subordinate station's figure is an offset applied to a reference gauge some distance away, not a measurement taken where you are standing, and the page says so.",
      "paper": "tides/?m=l",
      "dark": "tides/indexdark.html?m=d",
      "sources": [
        {
          "host": "api.tidesandcurrents.noaa.gov",
          "publisher": "NOAA CO-OPS (Center for Operational Oceanographic Products and Services)",
          "reads": "two APIs on one host: datagetter for predictions and observed water level, and the mdapi station metadata used to find and describe a gauge. Every height is measured from MLLW and the caller identifies itself as labs.llc, which is what CO-OPS asks",
          "url": "https://api.tidesandcurrents.noaa.gov/api/prod/datagetter",
          "path": "",
          "mode": "both",
          "via": [
            "share.php"
          ],
          "cache": "",
          "files": [
            "assets/js/app.js",
            "share.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "OBS_MS = 360000 in assets/js/app.js — the gauge reports every six minutes and the observed line is re-read on the same beat; the prediction is astronomy and is re-read only when the station's own date rolls over",
      "section": "#about",
      "sectionTitle": "A prediction is not a forecast.",
      "licence": "public-data",
      "clauses": [
        "not-a-safety-service"
      ]
    },
    {
      "desk": "treasury",
      "label": "Treasury",
      "summary": "One keyless API, read straight from the browser; share.php reads the same host again only to draw the desk's own share plate. Nothing is modelled, projected or annualised — a figure on this desk is a row the Fiscal Service published, with the date it published it.",
      "paper": "treasury/?m=l",
      "dark": "treasury/indexdark.html?m=d",
      "sources": [
        {
          "host": "api.fiscaldata.treasury.gov",
          "publisher": "U.S. Department of the Treasury, Bureau of the Fiscal Service",
          "reads": "the Fiscal Data API — the debt to the penny, the Daily Treasury Statement's operating cash balance and its deposits and withdrawals, and the monthly statement series behind them",
          "url": "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/",
          "path": "",
          "mode": "both",
          "via": [
            "share.php"
          ],
          "cache": "",
          "files": [
            "assets/js/app.js",
            "share.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "REFRESH_MS = 1800000 in assets/js/app.js — every half hour while the tab is watched, with REFOCUS_MIN_MS = 300000 on return; the series move once a business day at most",
      "section": "#about",
      "sectionTitle": "A reading room, not a terminal.",
      "licence": "public-data",
      "clauses": [
        "not-advice"
      ]
    },
    {
      "desk": "tuner",
      "label": "Tuner",
      "summary": "The only input is the microphone, and it never leaves the tab. The note is arrived at by autocorrelation rather than a spectrum peak — McLeod's normalised square difference — because at 44.1 kHz a 2,048-point transform has bins 21.5 Hz apart while a semitone at the guitar's low E is 4.9 Hz, and because a plucked low E has a weak fundamental under a much stronger second harmonic, so the loudest bin routinely reads the octave. Nothing is fetched and no audio is sent anywhere.",
      "paper": "tuner/?m=l",
      "dark": "tuner/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the analyser runs off the audio clock, not a poll",
      "section": "#method",
      "sectionTitle": "How the note is arrived at.",
      "licence": "own-work",
      "clauses": [
        "nothing-leaves"
      ]
    },
    {
      "desk": "volcano",
      "label": "Volcano",
      "summary": "Two publishers, joined on one key. HANS says WHICH volcano is elevated and carries no coordinates on that list, so the map takes the notice's position if it has one and otherwise a vendored lookup — assets/js/volcanoes.js, 161 US volcanoes read once from the survey's volcanoesUS endpoint on 6 September 2026 and carried in the file, with the page saying so when a Smithsonian number is not in it. Where neither has a position the card says it has none rather than drawing a dot.",
      "paper": "volcano/?m=l",
      "dark": "volcano/indexdark.html?m=d",
      "sources": [
        {
          "host": "volcanoes.usgs.gov",
          "publisher": "U.S. Geological Survey, Volcano Hazards Program",
          "reads": "the HANS public API — getElevatedVolcanoes for volcanoes above normal, getMonitoredVolcanoes for the monitored list",
          "url": "https://volcanoes.usgs.gov/",
          "path": "/hans-public/api/volcano/getElevatedVolcanoes",
          "mode": "both",
          "via": [
            "share.php"
          ],
          "cache": "",
          "files": [
            "assets/js/app.js",
            "share.php"
          ],
          "licence": "public-data"
        },
        {
          "host": "volcano.si.edu",
          "publisher": "Smithsonian Institution, Global Volcanism Program",
          "reads": "the Weekly Volcanic Activity Report as RSS",
          "url": "https://volcano.si.edu/news/WeeklyVolcanoRSS.xml",
          "path": "",
          "mode": "relay",
          "via": [
            "gvp-proxy.php"
          ],
          "cache": "1800 s file cache ($ttl in gvp-proxy.php)",
          "files": [
            "gvp-proxy.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "REFRESH_MS = 300000 for the USGS read and GVP_MS = 1800000 for the weekly report, both in assets/js/app.js and both only while the tab is visible",
      "section": "#about",
      "sectionTitle": "A desk, not an observatory.",
      "licence": "public-data",
      "clauses": [
        "not-a-safety-service"
      ]
    },
    {
      "desk": "watermark",
      "label": "Watermark",
      "summary": "The text you paste is the only input and it never leaves the tab: assets/js/app.js contains no fetch, no XMLHttpRequest and no beacon. The desk reports what is in the text in front of it — these code points, at these offsets, this many times — and stops there. It produces no score and no probability, and it will not be extended to, because there is no reliable path from a non-breaking space to a conclusion about a person.",
      "paper": "watermark/?m=l",
      "dark": "watermark/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the inspection runs on what you paste",
      "section": "#about",
      "sectionTitle": "An inspector, not an accusation.",
      "licence": "own-work",
      "clauses": [
        "nothing-leaves"
      ]
    },
    {
      "desk": "wildfire",
      "label": "Wildfire",
      "summary": "One read serves the list, the map and the count — three renderings of one fetched layer, never three fetches. The layer is keyless and CORS-open, so the browser asks it directly; share.php asks the same layer again only to draw the desk's own plate. An ArcGIS error arrives as HTTP 200 with an error object and is treated as the failure it is. A small incident is often logged with a name, a point and a time and nothing else, so a null size is an empty cell and never a 0, and every sum and rank uses only the values actually reported. The coastline is a vendored Natural Earth outline in assets/js/coast.js.",
      "paper": "wildfire/?m=l",
      "dark": "wildfire/indexdark.html?m=d",
      "sources": [
        {
          "host": "services3.arcgis.com",
          "publisher": "National Interagency Fire Center, on Esri's public feature service",
          "reads": "the WFIGS Incident Locations (Current) layer, asked for every current incident as GeoJSON with sixteen named fields — outFields=* is 1.25 MB for the same rows",
          "url": "https://services3.arcgis.com",
          "path": "/T4QMspbfLg3qTGWY/arcgis/rest/services/WFIGS_Incident_Locations_Current/FeatureServer/0/query",
          "mode": "both",
          "via": [
            "share.php"
          ],
          "cache": "",
          "files": [
            "assets/js/app.js",
            "share.php"
          ],
          "licence": "public-data"
        }
      ],
      "refresh": "REFRESH_MS = 300000 in assets/js/app.js — every five minutes while the tab is visible",
      "section": "#about",
      "sectionTitle": "A desk, not a lookout.",
      "licence": "public-data",
      "clauses": [
        "not-a-safety-service"
      ]
    },
    {
      "desk": "wires",
      "label": "The Wires",
      "summary": "The wires desk reads no upstream of its own. Its board is assets/js/wires.js, generated by tools/mkwires.py out of a grep of every .js and .php file in the tree, and the figures at the top are counted off that list when the page loads. On one press it PROBES: one request from your browser to each listed host's root, no cache, a twelve-second limit, results kept for the session so the board does not itself lean on hosts that count requests. A probe measures the path from you to a host at that minute — it is not the desk's own read and not the host's uptime.",
      "paper": "wires/?m=l",
      "dark": "wires/indexdark.html?m=d",
      "sources": [],
      "refresh": "not declared — the board is static until the reader presses Probe, and that is offered once per session (TIMEOUT = 12000 in assets/js/app.js is the per-probe limit, not a cadence)",
      "section": "#about",
      "sectionTitle": "A list that cannot drift.",
      "licence": "own-work",
      "clauses": []
    }
  ],
  "hosts": [
    {
      "host": "api.citybik.es",
      "publisher": "CityBikes",
      "licence": "public-data",
      "desks": [
        "bikes"
      ],
      "modes": [
        "direct"
      ]
    },
    {
      "host": "api.fiscaldata.treasury.gov",
      "publisher": "U.S. Department of the Treasury, Bureau of the Fiscal Service",
      "licence": "public-data",
      "desks": [
        "treasury"
      ],
      "modes": [
        "both"
      ]
    },
    {
      "host": "api.tidesandcurrents.noaa.gov",
      "publisher": "NOAA CO-OPS (Center for Operational Oceanographic Products and Services)",
      "licence": "public-data",
      "desks": [
        "tides"
      ],
      "modes": [
        "both"
      ]
    },
    {
      "host": "gbfs.lyft.com",
      "publisher": "Lyft, for Citi Bike",
      "licence": "public-data",
      "desks": [
        "bikes"
      ],
      "modes": [
        "both"
      ]
    },
    {
      "host": "home.treasury.gov",
      "publisher": "U.S. Department of the Treasury",
      "licence": "public-data",
      "desks": [
        "rates"
      ],
      "modes": [
        "direct"
      ]
    },
    {
      "host": "markets.newyorkfed.org",
      "publisher": "Federal Reserve Bank of New York",
      "licence": "public-data",
      "desks": [
        "rates"
      ],
      "modes": [
        "direct"
      ]
    },
    {
      "host": "nasstatus.faa.gov",
      "publisher": "Federal Aviation Administration",
      "licence": "public-data",
      "desks": [
        "airports"
      ],
      "modes": [
        "relay"
      ]
    },
    {
      "host": "services3.arcgis.com",
      "publisher": "National Interagency Fire Center, on Esri's public feature service",
      "licence": "public-data",
      "desks": [
        "wildfire"
      ],
      "modes": [
        "both"
      ]
    },
    {
      "host": "ssd-api.jpl.nasa.gov",
      "publisher": "NASA Jet Propulsion Laboratory, Solar System Dynamics",
      "licence": "public-data",
      "desks": [
        "asteroids"
      ],
      "modes": [
        "relay"
      ]
    },
    {
      "host": "unpkg.com",
      "publisher": "unpkg, serving the @ffmpeg npm packages",
      "licence": "third-party-library",
      "desks": [
        "omnifile"
      ],
      "modes": [
        "direct"
      ]
    },
    {
      "host": "volcano.si.edu",
      "publisher": "Smithsonian Institution, Global Volcanism Program",
      "licence": "public-data",
      "desks": [
        "volcano"
      ],
      "modes": [
        "relay"
      ]
    },
    {
      "host": "volcanoes.usgs.gov",
      "publisher": "U.S. Geological Survey, Volcano Hazards Program",
      "licence": "public-data",
      "desks": [
        "volcano"
      ],
      "modes": [
        "both"
      ]
    },
    {
      "host": "www.federalregister.gov",
      "publisher": "Office of the Federal Register, National Archives and Records Administration",
      "licence": "public-data",
      "desks": [
        "rules"
      ],
      "modes": [
        "direct"
      ]
    },
    {
      "host": "www.freddiemac.com",
      "publisher": "Freddie Mac",
      "licence": "public-data",
      "desks": [
        "rates"
      ],
      "modes": [
        "relay"
      ]
    },
    {
      "host": "www.nhc.noaa.gov",
      "publisher": "NOAA National Hurricane Center",
      "licence": "public-data",
      "desks": [
        "hurricane"
      ],
      "modes": [
        "relay"
      ]
    }
  ],
  "groups": {
    "public-data": {
      "label": "Public data, no copyright claimed",
      "anchor": "legal/#copyright",
      "phrase": "The public data the live desks report",
      "gist": "The figures belong to the body that published them, and reporting a number does not create a right in it."
    },
    "names-and-marks": {
      "label": "Other people's names and marks",
      "anchor": "legal/#trademarks",
      "phrase": "Other people&rsquo;s names and marks",
      "gist": "A business named in a directory owns its own name; the listing is a reference to it, not a claim on it."
    },
    "licensed-material": {
      "label": "Material under someone else's licence",
      "anchor": "legal/#copyright",
      "phrase": "Material carried under someone else&rsquo;s licence",
      "gist": "Terms arrive with the data and travel with it; those terms govern that material, not the clause."
    },
    "third-party-library": {
      "label": "A third-party library",
      "anchor": "legal/#copyright",
      "phrase": "Third-party libraries",
      "gist": "Code fetched from somebody else’s server stays under its own licence while it runs in your tab."
    },
    "own-work": {
      "label": "The estate's own work",
      "anchor": "legal/#copyright",
      "phrase": "What is left after all of that",
      "gist": "Nothing is read from anybody: the writing, the code and the design are what this clause covers."
    }
  },
  "clauses": {
    "not-a-safety-service": {
      "anchor": "legal/#data-storm",
      "label": "Not a safety service"
    },
    "not-advice": {
      "anchor": "legal/#data-markets",
      "label": "Not investment advice"
    },
    "a-directory": {
      "anchor": "legal/#data-directories",
      "label": "A directory, not an endorsement"
    },
    "nothing-leaves": {
      "anchor": "legal/#privacy-in-the-tab",
      "label": "Your file never leaves the tab"
    }
  },
  "counts": {
    "desks": 21,
    "wired": 11,
    "unwired": 10,
    "hosts": 15,
    "direct": 10,
    "relayOnly": 5,
    "sections": 20,
    "unwritten": 1,
    "declared": 8,
    "undeclared": 13
  }
}
