# The library: app (162)

> Kept by incident.librarian@web-summit.dinis. Built by [`tools/library-index.mjs`](../../tools/library-index.mjs) on every push; nobody writes it by hand. What runs in the browser. Back to [the library](../README.md) · every kind as data: [index.json](../index.json).

*By* is who the file itself says wrote or keeps it (the agents in its commits follow when they differ); *Changed* is the last commit (UTC) when known, else the file's own date; *Made from* is the sources its header names.

| File | What it is | By | Changed | Made from |
|---|---|---|---|---|
| [`account/account.md`](../../account/account.md) | **Account: the operator's login, and how it works.** Kept by incident.identity@web-summit.dinis, 11 November 2026, 02:30 UTC | incident.identity@ | 11-11 02:14 | [`SECURITY.md`](../../SECURITY.md), [`account/index.html`](../../account/index.html) |
| [`account/inbox.json`](../../account/inbox.json) | Replies to Dinis Cruz, each sealed to his public key (ciphertext: sgit's hybrid v2 envelope as an m1 code). Written by tools/lane-seal.mjs --inbox; opened at /account/ with his key. Never a vault … | incident.identity@ | 11-10 23:53 | [`tools/lane-seal.mjs`](../../tools/lane-seal.mjs), [`SECURITY.md`](../../SECURITY.md) |
| [`account/index.html`](../../account/index.html) |  | *not said in the file*; commits: incident.identity@ | 11-11 03:23 |  |
| [`app/agents/about.md`](../../app/agents/about.md) | **The agents page: how it works.** Kept by incident.observability@web-summit.dinis, 11 November 2026, 09:53 UTC | incident.observability@ | 11-11 09:54 | [`agents/README.md`](../../agents/README.md) |
| [`app/agents/agents.css`](../../app/agents/agents.css) | /app/agents/: the team console (incident.observability@web-summit.dinis). Uses app/site.css's tokens; adds nothing global. | incident.observability@ | 11-11 10:22 |  |
| [`app/agents/agents.js`](../../app/agents/agents.js) | The team console (incident.observability@web-summit.dinis): every agent, what it is doing, what it asks, its last push. Mounts into <div id="agents-live" data-base="<path to the site root". Reads … | incident.observability@ | 11-11 10:22 |  |
| [`app/agents/commit.md`](../../app/agents/commit.md) | **One push, or one file's history.** Kept by incident.observability@web-summit.dinis, 11 November 2026, 02:17 UTC | incident.observability@ | 11-11 02:19 | [`agents/README.md`](../../agents/README.md), [`data/agents/commits.json`](../../data/agents/commits.json), [`data/agents/sessions.json`](../../data/agents/sessions.json) |
| [`app/agents/index.html`](../../app/agents/index.html) |  | *not said in the file*; commits: incident.observability@ | 11-11 00:05 |  |
| [`app/agents/jobs.md`](../../app/agents/jobs.md) | **The jobs, drawn: who owns what, doing what, blocked on whom.** Kept by incident.observability@web-summit.dinis, 11 November 2026, 02:20 UTC | incident.observability@ | 11-11 02:21 | [`agents/JOBS.md`](../../agents/JOBS.md), [`agents/policy.json`](../../agents/policy.json), [`data/agents/index.json`](../../data/agents/index.json) |
| [`app/agents/live-adapter.js`](../../app/agents/live-adapter.js) | The adapter between this repository's commits and Angelo's live map (incident.observability@web-summit.dinis). The engine is an unchanged, pinned copy: vendor/live-map@57636ac/ (live.js, live3d.js by … | incident.observability@ | 11-11 03:14 |  |
| [`app/agents/now.css`](../../app/agents/now.css) | The team at work, now (kept by incident.observability@web-summit.dinis, 11 November 2026). Tokens only (design/README.md): | incident.observability@ | 2026-11-11 |  |
| [`app/agents/now.js`](../../app/agents/now.js) | The team at work, now (kept by incident.observability@web-summit.dinis, 11 November 2026, WS-214). Mounts into <div id="team-at-work" data-base="<path to the site root"</div (or any element with … | incident.observability@ | 2026-11-11 |  |
| [`app/agents/now.md`](../../app/agents/now.md) | **The team at work, now.** Kept by incident.observability@web-summit.dinis, 11 November 2026, 11:52 UTC | incident.observability@ | 11-11 11:52 | [`data/agents/commits.json`](../../data/agents/commits.json), [`data/ci/index.json`](../../data/ci/index.json), [`tools/agents-now.mjs`](../../tools/agents-now.mjs), [ipma.pt](https://www.ipma.pt/), [prociv.gov.pt](https://www.prociv.gov.pt/) |
| [`app/agents/obs.js`](../../app/agents/obs.js) | Page views and reads for storm-charles.promptugal.news (incident.observability@web-summit.dinis, 10 November 2026; the city and country added 11 November 2026 at Dinis Cruz's word of ~09:47 UTC, … | incident.observability@ | 11-11 09:54 |  |
| [`app/agents/universe-adapter.js`](../../app/agents/universe-adapter.js) | The adapter between this repository's team and Silvio's Universe (incident.observability@web-summit.dinis). The engine is an unchanged, pinned copy: vendor/universe@57636ac/ (brain.js, brain.css by … | incident.observability@ | 11-11 00:17 |  |
| [`app/agents/vendor/live-map@57636ac/live.js`](../../app/agents/vendor/live-map@57636ac/live.js) | The live map: Team and the machine's graph as a small always-on view, lines and dots only, in a hexagon (dev.map@PrompTugal.angelo, 7 November 2026, at Angelo's go; spec: … | dev.map@PrompTugal.angelo (commits: incident.observability@) | 11-10 23:47 |  |
| [`app/agents/vendor/live-map@57636ac/live3d.js`](../../app/agents/vendor/live-map@57636ac/live3d.js) | The live graph in 3D (backlog 0c; Angelo, 8 November: "interacting with the mouse is very slow, it lags heavily, and more importantly, dots and lines don't light up, so it's cool static graph but not … | dev.map@PrompTugal.angelo (commits: incident.observability@) | 11-10 23:47 |  |
| [`app/agents/vendor/live-map@57636ac/pin.json`](../../app/agents/vendor/live-map@57636ac/pin.json) | Unchanged copies, pinned so the authors' daily changes never break this site. Not forked: our side is one adapter in app/agents/. To update: run tools/agents-pin.mjs on a newer checkout (a new … | incident.observability@ | 11-10 23:54 | [`tools/agents-pin.mjs`](../../tools/agents-pin.mjs) |
| [`app/agents/vendor/universe@57636ac/brain.css`](../../app/agents/vendor/universe@57636ac/brain.css) | Silvio's brain, the 3D map (Lab only), premium: the sky is drawn by the 3D engine (stars, nebulae, glow); | *not said in the file*; commits: incident.observability@ | 11-10 23:51 |  |
| [`app/agents/vendor/universe@57636ac/brain.js`](../../app/agents/vendor/universe@57636ac/brain.js) | The Universe, read live (dashboard@web-summit.silvio, 10 November 2026; Silvio: "everything must be in live data"). Every time the map opens it reads, from their sources, at that moment: - the team … | dashboard@web-summit.silvio (commits: incident.observability@) | 11-10 23:51 |  |
| [`app/agents/vendor/universe@57636ac/pin.json`](../../app/agents/vendor/universe@57636ac/pin.json) | Unchanged copies, pinned so the authors' daily changes never break this site. Not forked: our side is one adapter in app/agents/. To update: run tools/agents-pin.mjs on a newer checkout (a new … | incident.observability@ | 11-10 23:54 | [`tools/agents-pin.mjs`](../../tools/agents-pin.mjs) |
| [`app/board/board.css`](../../app/board/board.css) | The board (incident.board@web-summit.dinis). Tokens from app/site.css only: no hex colour here (design/README.md, rule 7). | incident.board@ | 11-11 02:23 |  |
| [`app/board/board.js`](../../app/board/board.js) | The board (incident.board@web-summit.dinis): board/index.json drawn as columns by state, filtered by kind, owner and "waiting on Dinis"; a card opens with its evidence, its history and what would … | incident.board@ | 11-11 02:32 |  |
| [`app/broadcast/broadcast.css`](../../app/broadcast/broadcast.css) | incident.broadcast@web-summit.dinis: /broadcast/, the news-channel wall. Tokens only (design/README.md): no hex colour here. | *not said* |  |  |
| [`app/broadcast/broadcast.js`](../../app/broadcast/broadcast.js) | incident.broadcast@web-summit.dinis: /broadcast/, Storm Charles as a live news channel would show it. Reads only this site's own files (the data room's JSON and broadcast/data/); makes no outside … | *not said* |  |  |
| [`app/ci/ci.css`](../../app/ci/ci.css) | The CI pages (incident.ci@web-summit.dinis). Tokens only (design/README.md): states of things we run wear --ok, --bad, --warn, | incident.ci@ | 11-11 02:28 |  |
| [`app/ci/ci.js`](../../app/ci/ci.js) | The pipeline and the repository, drawn (incident.ci@web-summit.dinis). One script for the five pages under /ci/: the mount element's data-view says which (pipeline, commits, collaboration, … | incident.ci@ | 11-11 05:48 |  |
| [`app/desk/desk.css`](../../app/desk/desk.css) | the Contact us form (incident.desk@web-summit.dinis): the site's tokens only (design/README.md) | incident.desk@ |  |  |
| [`app/desk/desk.js`](../../app/desk/desk.js) | desk.js: the Contact us form of storm-charles.promptugal.news (incident.desk@web-summit.dinis, 11 November 2026, at Dinis Cruz's word of ~11:45 UTC: BRIEF.md, last section; CLAUDE.md, "Contact … | incident.desk@ | 2026-11-11 |  |
| [`app/desk/index.md`](../../app/desk/index.md) | **Contact us.** Kept by incident.desk@web-summit.dinis, 11 November 2026, 11:50 UTC | incident.desk@ | 11-11 11:50 | [prociv.gov.pt](https://prociv.gov.pt/), [ipma.pt](https://www.ipma.pt/) |
| [`app/evidence/evidence.css`](../../app/evidence/evidence.css) | The evidence pages (incident.archivist@). Tokens only: design/README.md. evidence { margin: 0 0 24px } | *not said in the file*; commits: incident.archivist@ | 11-11 02:22 |  |
| [`app/evidence/evidence.js`](../../app/evidence/evidence.js) | The evidence page: our capture of an outside page, Wayback-style. Reads the record (evidence/<id.json), the index (earlier and later captures of the same address) and, where the source may be shown, … | incident.archivist@ | 11-11 04:28 |  |
| [`app/evidence/vault-reader.js`](../../app/evidence/vault-reader.js) | The read-only vault reader of the evidence pages. The derivations are sgit.ai's house reader (https://sgit.ai/assets/vault-embed.js, SGVaultEmbed.Reader, read 11 November 2026), copied here as its … | incident.archivist@ | 11-11 02:22 |  |
| [`app/flows/core.js`](../../app/flows/core.js) | Flows: the core (incident.motion@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~10:10 UTC, BRIEF.md). One small format for a flow of the team's work (data/flows/schema.json, flows/README.md), … | incident.motion@ | 2026-11-11 |  |
| [`app/flows/embed.html`](../../app/flows/embed.html) |  | *not said* |  |  |
| [`app/flows/flows.css`](../../app/flows/flows.css) | Flows: the player's look (incident.motion@web-summit.dinis, 11 November 2026). The site's tokens (design/README.md), with | incident.motion@ | 11-11 10:33 |  |
| [`app/flows/gallery.js`](../../app/flows/gallery.js) | Flows: the gallery at /flows/ (incident.motion@web-summit.dinis, 11 November 2026). Reads data/flows/index.json and puts a player for each flow in the page's mount, with the one line that embeds it. … | incident.motion@ | 2026-11-11 |  |
| [`app/flows/player.js`](../../app/flows/player.js) | Flows: the player (incident.motion@web-summit.dinis, 11 November 2026, WS-214). An experiment. Draws one flow (data/flows/schema.json) as lanes, one per actor, and plays it step by step; every step … | incident.motion@ | 2026-11-11 |  |
| [`app/graph/README.md`](../../app/graph/README.md) | **The graph of the storm.** One graph of Storm Charles: actors, decisions, warnings, signals, sources, places, datasets and agents, each node and link with its label, its source and the time read. Built from the incident's JSON. | incident.graph@ | 11-11 02:16 | [`data/graph/storm.json`](../../data/graph/storm.json) |
| [`app/graph/common.js`](../../app/graph/common.js) | What the graph's pages share (incident.graph@web-summit.dinis): reading the graph's files, the look of a node (shape = kind; colour by the design rules), small DOM helpers. Text from data is always … | incident.graph@ | 11-11 07:55 |  |
| [`app/graph/engine.js`](../../app/graph/engine.js) | A small adapter onto Silvio's graph engine (incident.graph@web-summit.dinis). The engine is the bundle behind web-summit.sgit.ai's Universe (assets/cc/brain.js): brain-libs.js, which holds … | incident.graph@ | 11-11 02:16 |  |
| [`app/graph/graph.css`](../../app/graph/graph.css) | The query page and the graph page (incident.graph@web-summit.dinis). Every colour is one of app/site.css's tokens | incident.graph@ | 11-11 02:33 |  |
| [`app/graph/graph.js`](../../app/graph/graph.js) | The graph page (/app/graph/). It never draws the whole graph first: it starts from a QUESTION, and what is drawn is that question's answer (after graphs.sgit.ai: "never render the whole graph, render … | *not said in the file*; commits: incident.graph@ | 11-11 03:54 |  |
| [`app/graph/lead-times.js`](../../app/graph/lead-times.js) | Lead times (/app/graph/lead-times/): one line of time, every warning and decision with a time known to the minute, with the time between each and the next and how long before the first red warning … | *not said in the file*; commits: incident.graph@ | 11-11 02:16 |  |
| [`app/graph/lead-times/README.md`](../../app/graph/lead-times/README.md) | **Lead times.** How far ahead could we have known? Every warning and decision of Storm Charles with a time known to the minute, on one line of time, with the hours between them and before the red warnings start. … | incident.graph@ | 11-11 02:16 | [`data/graph/tables/timeline.json`](../../data/graph/tables/timeline.json), [`tools/graph-build.mjs`](../../tools/graph-build.mjs), [prociv.gov.pt](https://prociv.gov.pt/), [ipma.pt](https://www.ipma.pt/) |
| [`app/graph/ontology.js`](../../app/graph/ontology.js) | The ontology, drawn (/app/graph/ontology/): the kinds of thing as shapes, the verbs as arrows between them, each verb with its inverse. Press a kind or a verb to read what it means, how many there … | *not said in the file*; commits: incident.graph@ | 11-11 03:41 |  |
| [`app/graph/ontology/README.md`](../../app/graph/ontology/README.md) | **The ontology, drawn.** The kinds of thing in the graph of Storm Charles and the verbs between them, each verb with its inverse, drawn from the ontology file and the graph itself. Press any of them to read it and open … | incident.graph@ | 11-11 02:16 | [`data/graph/ontology.json`](../../data/graph/ontology.json), [graphs.sgit.ai](https://graphs.sgit.ai/) |
| [`app/graph/query.js`](../../app/graph/query.js) | The query page (/data/query/): SQLite in the reader's browser over the tables of the storm's graph. incident.graph@web-summit.dinis. The engine is sql.js 1.14.2 (SQLite compiled to WebAssembly), the … | *not said in the file*; commits: incident.graph@ | 11-11 07:55 |  |
| [`app/guide/guide.css`](../../app/guide/guide.css) | incident.sherpa@web-summit.dinis: /guide/. Tokens only (design/README.md); phone first (390 px). | *not said* |  |  |
| [`app/guide/guide.js`](../../app/guide/guide.js) | incident.sherpa@web-summit.dinis: /guide/, "Are you in Lisbon right now?": the use cases as guided paths. Reads only this site's own files (the data room's JSON); makes no outside request. Not a … | *not said* |  |  |
| [`app/journal/journal.css`](../../app/journal/journal.css) | The journal's pictures and article (incident.journalist@web-summit.dinis). Tokens only (design/README.md): ink and greys for our own | incident.journalist@ | 11-11 04:18 |  |
| [`app/journal/journal.js`](../../app/journal/journal.js) | The journal: each picture arrives above the text (the frame's mount) and is moved under the heading it belongs to. Without this script the pictures stay at the top, and their tables are at the foot … | *not said in the file*; commits: incident.journalist@ | 11-11 02:59 |  |
| [`app/labs/decisions.js`](../../app/labs/decisions.js) | Labs, decisions (incident.labs@web-summit.dinis): flow, lead-times, days, state. Data: decisions/graph.json, weather/analysis.json. Never the whole graph: each view is the result of a question (what … | incident.labs@ | 11-11 06:46 |  |
| [`app/labs/labs.css`](../../app/labs/labs.css) | The Labs (incident.labs@web-summit.dinis). Tokens only (design/README.md): warning colours for IPMA's levels alone, with the level | incident.labs@ | 11-11 06:46 |  |
| [`app/labs/labs.js`](../../app/labs/labs.js) | The Labs core (incident.labs@web-summit.dinis). Every experiment is a function registered with Labs.exp(name, fn) and mounted on <div class="lab" data-lab="<area/<name" data-root="../../". It reads … | incident.labs@ |  |  |
| [`app/labs/timelines.js`](../../app/labs/timelines.js) | Labs, timelines (incident.labs@web-summit.dinis): lanes, known-when, story. Data: signals.json, decisions/graph.json, weather/cap.json. | incident.labs@ |  |  |
| [`app/labs/weather.js`](../../app/labs/weather.js) | Labs, weather (incident.labs@web-summit.dinis): stations, day-bands, models. Data: weather/.json and decisions/graph.json. Not a warning service: every forecast drawn here is somebody else's (IPMA, … | incident.labs@ |  |  |
| [`app/lens/hop.css`](../../app/lens/hop.css) | The one-hop drawing on a node page (incident.entities@web-summit.dinis; drawn by app/lens/hop.js). Tokens only (design/README.md). | incident.entities@ | 11-11 08:50 |  |
| [`app/lens/hop.js`](../../app/lens/hop.js) | The one-hop drawing on a node page (incident.entities@web-summit.dinis). tools/entities-build.mjs mounts <figure class="ent-hop" data-base data-node; this fills it from entities/index.json (names, … | incident.entities@ | 11-11 08:50 |  |
| [`app/lens/lens.css`](../../app/lens/lens.css) | The lens's marks for linked names (incident.entities@web-summit.dinis). Tokens only (design/README.md rule 7). | incident.entities@ | 11-11 02:23 |  |
| [`app/lens/lens.js`](../../app/lens/lens.js) | The lens's content (incident.entities@web-summit.dinis). The panel, its switches and its slots are incident.designer@'s (app/design/panel.js: window.stormPanel). This script: - fills the "Lens" slot … | incident.entities@ | 11-11 03:25 |  |
| [`app/login/README.md`](../../app/login/README.md) | **The login's code.** Kept by incident.identity@web-summit.dinis, 11 November 2026, 03:35 UTC | incident.identity@ | 11-11 03:23 | [`SECURITY.md`](../../SECURITY.md), [`account/account.md`](../../account/account.md), [`account/index.html`](../../account/index.html), [`app/login/account.js`](../../app/login/account.js), [`app/login/dom.js`](../../app/login/dom.js), [`app/login/feedback.js`](../../app/login/feedback.js), and 5 more |
| [`app/login/account.js`](../../app/login/account.js) | account.js: the page at /account/ (incident.identity@; the design is /SECURITY.md). A log-in first: one action (make the key, or unlock it), the explanation below. Three states: no key in this … | *not said in the file*; commits: incident.identity@ | 11-11 03:23 |  |
| [`app/login/dom.js`](../../app/login/dom.js) | dom.js: the few DOM helpers the login pages share. Text only, never markup: nothing read from a message is parsed as HTML. | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`app/login/feedback.js`](../../app/login/feedback.js) | feedback.js: the feedback box, on any page that loads it (incident.identity@; the design is /SECURITY.md, section b). <script type="module" src="<root/app/login/feedback.js"</script It draws nothing … | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`app/login/id.js`](../../app/login/id.js) | id.js: Dinis's key in this browser (incident.identity@web-summit.dinis; the design is /SECURITY.md, section a). passkey ──PRF──▶ door seed (pki/door.js) ──▶ AES-256-GCM ──▶ localStorage … | incident.identity@ | 11-10 23:47 |  |
| [`app/login/lane.js`](../../app/login/lane.js) | lane.js: what travels between Dinis's browser and the conductor (the design is /SECURITY.md, sections b and c). feedback pki/message.js compose (signed by his key; to = the conductor's signing … | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`app/login/login.css`](../../app/login/login.css) | The login and the feedback box (incident.identity@). Tokens from app/site.css only (design/README.md): no colour is | *not said in the file*; commits: incident.identity@ | 11-11 02:14 |  |
| [`app/login/package.json`](../../app/login/package.json) |  | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`app/login/pki/PIN.json`](../../app/login/pki/PIN.json) | Copies of pki.sgit.ai's modules, byte for byte, read on 10 November 2026 (23:30 UTC) by incident.identity@web-summit.dinis. Not edited here: to change one, change it at its source and pin the new … | incident.identity@ | 11-10 23:53 | [`tools/lane-test.mjs`](../../tools/lane-test.mjs) |
| [`app/login/pki/door.js`](../../app/login/pki/door.js) | door.js: from a passkey's PRF bytes (or a recovery code) to a door vault's key, the way the article says. Moved out of passkey/lab.js so that the vault pane (assets/vault-pane/) and the lab derive … | *not said in the file*; commits: incident.identity@ | 11-10 23:41 |  |
| [`app/login/pki/keys.js`](../../app/login/pki/keys.js) | keys.js: the key material of the directory of people, in the browser and in Node, byte-compatible with sgit pki. Everything here is Web Crypto and nothing else. Each construction was checked against … | *not said in the file*; commits: incident.identity@ | 11-10 23:41 |  |
| [`app/login/pki/local.js`](../../app/login/pki/local.js) | local.js: an account kept in this browser only, opened by the passkey alone. No access key, no vault, no passphrase. The passkey's PRF bytes already give a door (door.js). When no vault answers at … | *not said in the file*; commits: incident.identity@ | 11-10 23:41 |  |
| [`app/login/pki/message.js`](../../app/login/pki/message.js) | message.js: a message to someone in the register, as a link and a QR code, or into their inbox; and an invitation. A message is JSON, signed by the sender when the sender has a key, then sealed in … | *not said in the file*; commits: incident.identity@ | 11-10 23:41 |  |
| [`app/meteorology/map.js`](../../app/meteorology/map.js) | incident.meteorology@web-summit.dinis: the lineage map. The SVG is drawn at build time from meteorology/graph.json and works without this script (every box is a link). This only lights a node's own … | *not said in the file*; commits: incident.meteorology@ | 11-11 02:37 |  |
| [`app/models/models.css`](../../app/models/models.css) | Other models, measured (incident.models@web-summit.dinis). Tokens only; never IPMA's warning colours: nothing here is a warning. | incident.models@ | 11-11 02:36 |  |
| [`app/models/models.js`](../../app/models/models.js) | Other models, measured (incident.models@web-summit.dinis): draws the charts of models/ from models/results.json and models/ledger-summary.json, both made by tools/models-report.mjs. Reads nothing … | incident.models@ | 11-11 03:00 |  |
| [`app/perplexity/perplexity.css`](../../app/perplexity/perplexity.css) | Perplexity as a research tool (incident.perplexity@web-summit.dinis). Tokens only. The marks are states of a check we ran | incident.perplexity@ | 11-11 03:01 |  |
| [`app/perplexity/perplexity.js`](../../app/perplexity/perplexity.js) | Perplexity as a research tool: the scorecard as small charts (incident.perplexity@web-summit.dinis, WS-214). Reads research/perplexity/scorecard.json only; the same figures are in the page's tables. … | incident.perplexity@ | 11-11 03:01 |  |
| [`app/site.css`](../../app/site.css) | storm-charles.promptugal.news: one stylesheet, no dependencies. Tokens first; the dashboard (app/storm.js) uses the same names. | *not said* |  |  |
| [`app/social/social.css`](../../app/social/social.css) | Bluesky as a section (incident.social@web-summit.dinis). Tokens only (design/README.md): no hex colours here. social { margin: 0 0 28px; } social .card { margin-top: 16px; } social .wx-tile b { font: … | incident.social@ | 11-11 02:30 |  |
| [`app/social/social.js`](../../app/social/social.js) | Bluesky as a section: draws research/social/.json (incident.social@web-summit.dinis). No dependencies; reads only this site's own files. | incident.social@ | 11-11 02:30 |  |
| [`app/sources/ipma/ipma-more.js`](../../app/sources/ipma/ipma-more.js) | The IPMA section, two more views: the sea (data-view="sea") and the cities' forecasts beside what was observed (data-view="cities"). Registered for app/sources/ipma/ipma.js, which mounts them and … | incident.ipma@ | 11-11 02:32 |  |
| [`app/sources/ipma/ipma.css`](../../app/sources/ipma/ipma.css) | The IPMA section (sources/ipma/). Tokens only (design/README.md): IPMA's warning colours for IPMA's levels, with the | incident.ipma@ | 11-11 02:32 |  |
| [`app/sources/ipma/ipma.js`](../../app/sources/ipma/ipma.js) | The IPMA section (sources/ipma/): every view is drawn here from the small JSON files that tools/ipma-views.mjs writes from IPMA's open data. No dependency, no outside request: the page reads this … | incident.ipma@ | 11-11 02:32 |  |
| [`app/sources/meteoalarm/browser.css`](../../app/sources/meteoalarm/browser.css) | The MeteoAlarm feed browser (sources/meteoalarm/portugal). Tokens only; IPMA's warning colours only on IPMA's levels. incident.sources@ | *not said in the file*; commits: incident.sources@ | 11-11 02:21 |  |
| [`app/sources/meteoalarm/browser.js`](../../app/sources/meteoalarm/browser.js) | The MeteoAlarm feed browser: our dated copy of a country's feed as a readable table, with its schema, what changed between our reads, and the raw files one click away. Reads only this site's JSON … | incident.sources@ | 11-11 07:28 |  |
| [`app/stories/channels.js`](../../app/stories/channels.js) | The warnings box of a Lisbon story, by the front page's rule (incident.stories@web-summit.dinis, 11 November 2026, WS-214). IPMA speaks on two channels: its open-data feed (warnings.json) and its CAP … | incident.stories@ | 11-11 07:59 |  |
| [`app/stories/story.css`](../../app/stories/story.css) | Stories (incident.stories@web-summit.dinis): a story is a list of labelled sentences, each opening its support. Tokens only (design/README.md): | incident.stories@ | 11-11 07:59 |  |
| [`app/stories/story.js`](../../app/stories/story.js) | Stories (incident.stories@web-summit.dinis). The page is already complete HTML (tools/stories-build.mjs): this file only (1) works the switches, (2) opens every support at once, (3) reads IPMA's … | incident.stories@ | 11-11 07:59 |  |
| [`app/storm.js`](../../app/storm.js) | The incident dashboard (incident.dev@web-summit.dinis, 10 November 2026, WS-214, at Dinis's word: "a full-blown new dashboard" that leverages Silvio's and Angelo's work). It reads the incident's data … | incident.dev@ (commits: incident.conductor@, incident.designer@) | 11-11 09:26 |  |
| [`app/studio/agents.mjs`](../../app/studio/agents.mjs) | The cast: a small character for every agent of this site (incident.studio@web-summit.dinis), at Dinis Cruz's word (BRIEF.md, 11 November 2026, ~02:20 UTC: "a little identity ... start to sprinkle … | incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/accountant.mark.svg`](../../app/studio/agents/accountant.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/accountant.svg`](../../app/studio/agents/accountant.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/archivist.mark.svg`](../../app/studio/agents/archivist.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/archivist.svg`](../../app/studio/agents/archivist.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/board.mark.svg`](../../app/studio/agents/board.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/board.svg`](../../app/studio/agents/board.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/ci.mark.svg`](../../app/studio/agents/ci.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/ci.svg`](../../app/studio/agents/ci.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/conductor.mark.svg`](../../app/studio/agents/conductor.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/conductor.svg`](../../app/studio/agents/conductor.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/designer.mark.svg`](../../app/studio/agents/designer.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/designer.svg`](../../app/studio/agents/designer.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/dev.mark.svg`](../../app/studio/agents/dev.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/dev.svg`](../../app/studio/agents/dev.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/entities.mark.svg`](../../app/studio/agents/entities.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/entities.svg`](../../app/studio/agents/entities.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/graph.mark.svg`](../../app/studio/agents/graph.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/graph.svg`](../../app/studio/agents/graph.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/identity.mark.svg`](../../app/studio/agents/identity.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/identity.svg`](../../app/studio/agents/identity.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/index.json`](../../app/studio/agents/index.json) | The cast: a small character for every agent of this site, one family (the same head and shoulders, one thing worn or held that says the job). Two files each: the figure for the agent's home and the … | incident.studio@ | 11-11 02:59 | [`BRIEF.md`](../../BRIEF.md) |
| [`app/studio/agents/ipma.mark.svg`](../../app/studio/agents/ipma.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/ipma.svg`](../../app/studio/agents/ipma.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/journalist.mark.svg`](../../app/studio/agents/journalist.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/journalist.svg`](../../app/studio/agents/journalist.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/labs.mark.svg`](../../app/studio/agents/labs.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/labs.svg`](../../app/studio/agents/labs.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/librarian.mark.svg`](../../app/studio/agents/librarian.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/librarian.svg`](../../app/studio/agents/librarian.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/media.mark.svg`](../../app/studio/agents/media.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/media.svg`](../../app/studio/agents/media.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/meteorologist.mark.svg`](../../app/studio/agents/meteorologist.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/meteorologist.svg`](../../app/studio/agents/meteorologist.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/meteorology.mark.svg`](../../app/studio/agents/meteorology.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/meteorology.svg`](../../app/studio/agents/meteorology.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/models.mark.svg`](../../app/studio/agents/models.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/models.svg`](../../app/studio/agents/models.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/observability.mark.svg`](../../app/studio/agents/observability.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/observability.svg`](../../app/studio/agents/observability.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/perplexity.mark.svg`](../../app/studio/agents/perplexity.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/perplexity.svg`](../../app/studio/agents/perplexity.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/reporter.mark.svg`](../../app/studio/agents/reporter.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/reporter.svg`](../../app/studio/agents/reporter.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:59 |  |
| [`app/studio/agents/researcher.mark.svg`](../../app/studio/agents/researcher.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/researcher.svg`](../../app/studio/agents/researcher.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/shadow.mark.svg`](../../app/studio/agents/shadow.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/shadow.svg`](../../app/studio/agents/shadow.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/social.mark.svg`](../../app/studio/agents/social.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/social.svg`](../../app/studio/agents/social.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/sources.mark.svg`](../../app/studio/agents/sources.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/sources.svg`](../../app/studio/agents/sources.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/stories.mark.svg`](../../app/studio/agents/stories.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/stories.svg`](../../app/studio/agents/stories.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/studio.mark.svg`](../../app/studio/agents/studio.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/studio.svg`](../../app/studio/agents/studio.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/weather.mark.svg`](../../app/studio/agents/weather.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/weather.svg`](../../app/studio/agents/weather.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:23 |  |
| [`app/studio/agents/weatherwatch.mark.svg`](../../app/studio/agents/weatherwatch.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/weatherwatch.svg`](../../app/studio/agents/weatherwatch.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/wikipedia.mark.svg`](../../app/studio/agents/wikipedia.mark.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/agents/wikipedia.svg`](../../app/studio/agents/wikipedia.svg) |  | *not said in the file*; commits: incident.studio@ | 11-11 02:36 |  |
| [`app/studio/characters.js`](../../app/studio/characters.js) | The Studio's characters (incident.studio@web-summit.dinis): small inline SVG, drawn here, coloured only by the site's tokens (currentColor and var(--token); never a hex colour, never IPMA's warning … | incident.studio@ | 11-11 02:27 |  |
| [`app/studio/index.js`](../../app/studio/index.js) | The Studio's index (incident.studio@web-summit.dinis): draws each card's characters, and sends an older link (/studio/#<name/<chapter/<scene, from before each explanation had its own page) to that … | incident.studio@ | 11-11 02:15 |  |
| [`app/studio/player.js`](../../app/studio/player.js) | The Studio's storyboard player (incident.studio@web-summit.dinis). It plays animations that are data: studio/animations/index.json lists them; each studio/animations/<id.json holds chapters of … | incident.studio@ | 11-11 03:54 |  |
| [`app/studio/studio.css`](../../app/studio/studio.css) | The Studio's storyboard player (incident.studio@web-summit.dinis). Tokens only (design/README.md): no hex colour here; | incident.studio@ | 11-11 03:54 |  |
| [`app/studio/twin.mjs`](../../app/studio/twin.mjs) | The Studio's pages, written from its data (incident.studio@web-summit.dinis): studio/README.md (the index: a card per explanation) and studio/<id/README.md (one page per explanation: the player … | incident.studio@ | 11-11 03:54 |  |
| [`app/transport/transport.css`](../../app/transport/transport.css) | incident.transport@web-summit.dinis: /transport/. Tokens only (design/README.md). Works at 390 px. | *not said in the file*; commits: incident.transport@ | 11-11 11:39 |  |
| [`app/transport/transport.js`](../../app/transport/transport.js) | incident.transport@web-summit.dinis: /transport/, flights and public transport during Storm Charles. Reads only this site's own files (the data room's JSON); makes no outside request. Not a warning … | *not said* |  |  |
| [`app/weather/weather.css`](../../app/weather/weather.css) | The Weather face (incident.weather@web-summit.dinis). Tokens only (design/README.md): no hex colour here. | incident.weather@ |  |  |
| [`app/weather/weather.js`](../../app/weather/weather.js) | The Weather face (incident.weather@web-summit.dinis): Storm Charles as a weather channel would show it. It reads ONLY what the data room publishes (api/v1/<incident/..., incident.json), fetches … | incident.weather@ |  |  |
