The data, queryable
Every place, organisation, story, source and connection of PrompTugal.news as tables and a graph: run SQL and graph traversals in your browser, or take the JSON.
PrompTugal.news is data first. Every place, every organisation on an AI map, every story, every source and every edge between them is a row you can query. Write SQL in the box below, or start from an example; graph traversals are table functions inside the same SQL. Nothing leaves your browser: the tables are this site's own JSON files, and the engine is a small script of ours with no outside library.
| Tables | 17: places, news, map, events, sources, gaps, companies, articles, nodes, edges, merges, connections, captures, nr_articles, nr_links, nr_nodes, nr_edges |
| The graph | 1565 nodes, 3550 edges |
| The places | 19, with 105 local AI stories and 160 map entries |
| As JSON | api/v1/data/index.json; one file per place, as api/v1/data/places/loule.json |
| The engine | sql.js, graph.js |
| Built | 2026-11-15, vv0.1.1512 |
Each place's database
Every place has its own page, with its own questions already asked and answered. Loulé and Faro are the case studies.
- Portugal
- The Algarve
- Faro
- Loulé
- Quarteira
- Silves
- Tavira
- Vila Real de Santo António
- Portimão
- Lagos
- Olhão
- Albufeira
- Lagoa
- Monchique
- Aljezur
- Vila do Bispo
- Castro Marim
- Alcoutim
- São Brás de Alportel
Decks
Slides made from the same data, every figure a query you can run: for meetings, and one per place.
- Algarve Evolution, connected: for Dinis's meeting with Algarve Evolution, 16 November 2026
- Every deck, one per place
Ask
The query box runs in your browser and needs JavaScript. Every example below shows its query and the answer the build got from today's data.
Examples
Each example shows the query and the answer the build got from today's data. Press "Run this in the box" to change it.
The AI map of the Algarve, by town and kind
How many organisations each place's agent has mapped, by kind.
SELECT p.name AS place, m.kind, count(*) AS entries
FROM map m JOIN places p ON p.id = m.place
GROUP BY p.name, m.kind
ORDER BY entries DESC, place
LIMIT 20
| place | kind | entries |
|---|---|---|
| Portugal | public body | 8 |
| Portugal | institution | 8 |
| Portugal | company | 7 |
| Portugal | startup | 6 |
| Portimão | organisation | 5 |
| The Algarve | organisation | 5 |
| The Algarve | institution | 5 |
| Faro | institution | 4 |
| Faro | company | 4 |
| Lagos | organisation | 4 |
| Portimão | institution | 4 |
| The Algarve | community | 4 |
20 rows, the first 12 shown.
Who is on more than one town's AI map
Connecting the dots: the organisations that several place agents found on their own, merged by name.
SELECT n.label AS organisation, n.kind, count(DISTINCT e.dst) AS towns,
group_concat(DISTINCT replace(e.dst, 'place:', '')) AS places
FROM edges e JOIN nodes n ON n.id = e.src
WHERE e.verb = 'on_ai_map_of'
GROUP BY n.id
HAVING towns > 1
ORDER BY towns DESC, organisation
| organisation | kind | towns | places |
|---|---|---|---|
| Algarve Evolution | 4 | algarve,faro,portimao,lagos | |
| Universidade do Algarve | institution | 4 | algarve,faro,loule,portimao |
| Algarve 6.0 Smart Territorial Hub | public body | 3 | algarve,alcoutim,sao-bras-de-alportel |
| Algarve AI Agents | community | 2 | algarve,loule |
| Algarve STP | 2 | algarve,faro | |
| AuroraMed | company | 2 | algarve,faro |
| CEOT | institution | 2 | algarve,faro |
| Câmara Municipal de Loulé | public body | 2 | loule,quarteira |
| Eurocidade do Guadiana | public body | 2 | vila-real-de-santo-antonio,castro-marim |
| Flow Productions | company | 2 | algarve,faro |
| GDG Faro | community | 2 | algarve,faro |
| ICArEHB | institution | 2 | algarve,faro |
14 rows, the first 12 shown.
What the detectives connected, and how sure they are
detective.places@'s links, each end resolved to a node of the graph; 'read' means the page itself was opened, 'search_extract' only a search result.
SELECT a.label AS from_node, c.verb, b.label AS to_node, c.verified, c.places
FROM connections c
JOIN nodes a ON a.id = c.src
JOIN nodes b ON b.id = c.dst
ORDER BY c.verified, a.label
| from_node | verb | to_node | verified | places |
|---|---|---|---|---|
| ALGAR, Valorização e Tratamento de Resíduos Sólidos | builds_with | NILG.AI | read | algarve,lagoa,sao-bras-de-alportel |
| Algarve Tech Hub Summit | hosted_at | NERA | read | faro,loule,algarve |
| Câmara Municipal de Portimão | builds_with | ePaper urban management platform, with an AI online-service module | read | portimao |
| Dengun | organises | Dengun Founders Program | read | albufeira,faro |
| EcoRouteAI | piloted_in | Lagoa and Sao Bras de Alportel | read | lagoa,sao-bras-de-alportel |
| EcoRouteAI | funded_by | Re-Source 3.0 | read | algarve,lagoa |
| OmniSinal | organises | XXXV International Seminar on Municipal Communication, 'Challenges in the Age of AI' | read | portimao |
| Universidade de Vigo | participates_in | XXXV International Seminar on Municipal Communication, 'Challenges in the Age of AI' | read | portimao |
| Universidade do Algarve | builds_with | Dengun Founders Program | read | faro,albufeira |
| Dengun | part_of | Dengun AI Hub | search_extract | faro |
| Dengun | hosted_at | UALG TEC Campus | search_extract | faro |
| Witflow | founded_with | Flow Productions | search_extract | faro,algarve |
13 rows, the first 12 shown.
Every company and organisation within two steps of the Universidade do Algarve, through the stories
A graph traversal inside SQL: neighbours(start, depth, verbs) walks the edges both ways. Through mentions, two steps is "named in the same story": the university, a story that names it, and who else that story names.
SELECT n.depth, n.label, n.type, n.path
FROM neighbours((SELECT id FROM nodes WHERE label LIKE 'Universidade do Algarve%' ORDER BY id LIMIT 1), 2, 'mentions') n
WHERE n.type IN ('company', 'organisation') AND n.depth > 0
ORDER BY n.depth, n.label
LIMIT 40
| depth | label | type | path |
|---|---|---|---|
| 2 | Algarve Evolution | organisation | Universidade do Algarve > Vibathon Algarve 2026: a sold-out day of building with AI at the University of the Algarve, and Algarve Evoluti... |
| 2 | Algarve STP | organisation | Universidade do Algarve > Faro panel asks how AI decides which companies to recommend > Algarve STP |
| 2 | AuroraMed | company | Universidade do Algarve > AuroraMed and UAlg launch an executive course on AI in healthcare > AuroraMed |
| 2 | CRIA | organisation | Universidade do Algarve > NERA Lunch & Learn on AI tools for analysis (held 10 November 2026 at CRIA, University of the Algarve, Faro) > ... |
| 2 | Flow Productions | company | Universidade do Algarve > Faro panel asks how AI decides which companies to recommend > Flow Productions |
| 2 | ICArEHB | organisation | Universidade do Algarve > UAlg wins 31.5 million euros for an AI-first European heritage centre > ICArEHB |
| 2 | Lovable | organisation | Universidade do Algarve > Vibathon Algarve 2026: a sold-out day of building with AI at the University of the Algarve, and Algarve Evoluti... |
| 2 | NERA | organisation | Universidade do Algarve > NERA Lunch & Learn on AI tools for analysis (held 10 November 2026 at CRIA, University of the Algarve, Faro) > ... |
| 2 | SPIC | company | Universidade do Algarve > A Loulé studio put a band's late member back on stage with an AI hologram > SPIC |
| 2 | UALG TEC Campus | organisation | Universidade do Algarve > Faro panel asks how AI decides which companies to recommend > UALG TEC Campus |
10 rows.
How Loulé connects to Faro, not counting the region
paths(from, to, max_depth, verbs) finds the shortest paths; '-located_in' skips the trivial path through the Algarve.
SELECT hops, path, verbs
FROM paths('place:loule', 'place:faro', 4, '-located_in')
LIMIT 10
| hops | path | verbs |
|---|---|---|
| 2 | Loulé > Universidade do Algarve > Faro | on_ai_map_of (inverse), on_ai_map_of |
| 2 | Loulé > Loulé and Faro tender a technology centre at the Estádio Algarve that lists AI among its themes > Faro | reported_in (inverse), mentions |
| 2 | Loulé > A Faro software firm tested its smart irrigation in Loulé, with an AI module planned > Faro | reported_in (inverse), mentions |
3 rows.
The newest local AI stories, and how far each is from AI
Every story carries its source, the day it was read and its path to AI (steps 0 is about AI directly).
SELECT date, place, title, publisher, steps, ai_path
FROM news
ORDER BY date DESC
LIMIT 15
| date | place | title | publisher | steps | ai_path |
|---|---|---|---|---|---|
| 2026-11-11 | algarve | NERA hosts a Lunch & Learn on AI tools for customer analysis, at the University of Algarve | NERA | 0 | The session is about using AI tools to analyse customer opinions. |
| 2026-11-10 | portimao | Portimão hosts its first tourism-and-computing conference, with AI on the programme | Barlavento | 1 | A tourism-technology conference whose sessions are partly about AI, with Algarve Evolution among the stakeholders it engaged. |
| 2026-11-06 | algarve | DevFest Faro gives two days to building AI agents in practice | Barlavento | 0 | The conference is about building and securing AI-powered applications and agents. |
| 2026-11-06 | faro | DevFest in Faro spends two days on agentic AI | Barlavento | 0 | A developer conference on building AI applications, held in Faro: directly about AI. |
| 2026-11-03 | portugal | Granter raises 1.6 million euros to take its AI funding platform across Europe | Tech.eu | 0 | A company that sells an AI product, so directly AI. |
| 2026-10-31 | faro | Vibathon Algarve 2026 fills UALG TEC Campus with people building apps with AI | SGit Newsroom | 0 | A hands-on AI app-building day held in Faro: directly about AI. The article's author, Dinis Cruz, spoke at the event and is PrompTugal's ... |
| 2026-10-22 | faro | Faro's Cáritas asks who benefits from AI | Barlavento | 0 | A public conference in Faro on the social effects of AI: directly about AI. |
| 2026-10-19 | portimao | Municipal communication seminar in Portimão is all about AI | Barlavento | 0 | The seminar's theme is AI and its effect on local government communication. |
| 2026-10-12 | algarve | Algarve Evolution opens a survey on how local companies adopt AI | Algarve Evolution | 0 | The survey measures AI adoption by regional businesses. |
| 2026-10-08 | faro | A book on starting a company in 30 days with AI prompts is presented at UALG TEC Campus | Barlavento | 0 | A Faro launch of a startup method built on AI prompts: directly about AI. |
| 2026-10-06 | faro | Open science meets AI at the University of Algarve's ConfOA 2026 | Universidade do Algarve | 0 | A national research conference on science in the age of AI, hosted by Faro's university: directly about AI. The date is the conference st... |
| 2026-09-25 | portugal | Prime Minister signs an international call for safer advanced AI | Portugal.gov.pt | 0 | National government policy on AI governance, so directly AI. |
15 rows, the first 12 shown.
Which stories name an organisation on the map
The mentions edges join a story to the organisations whose names are in its headline or summary.
SELECT s.label AS story, o.label AS names, group_concat(DISTINCT replace(r.dst, 'place:', '')) AS reported_in
FROM edges m
JOIN nodes s ON s.id = m.src AND s.type = 'news'
JOIN nodes o ON o.id = m.dst
JOIN edges r ON r.src = s.id AND r.verb = 'reported_in'
WHERE m.verb = 'mentions'
GROUP BY s.id, o.id
ORDER BY o.label
LIMIT 25
| story | names | reported_in |
|---|---|---|
| ALGAR and NILG.AI win an award for an AI tool that picks sites for recycling points | ALGAR, Valorização e Tratamento de Resíduos Sólidos | loule |
| Lagoa hosts the pilot of an AI tool that picks sites for recycling points | ALGAR, Valorização e Tratamento de Resíduos Sólidos | lagoa |
| AMALIA, the open language model for European Portuguese, is launched | AMALIA | portugal |
| AP Hotels & Resorts, a group with Albufeira resorts, adopts AI revenue management | AP Hotels & Resorts | albufeira |
| Tavira is one of six municipalities in the Algarve 6.0 urban data platform | Alcoutim | tavira |
| Council joins the Algarve 6.0 smart territory project | Alcoutim | sao-bras-de-alportel |
| DevFest Faro gives two days to building AI agents in practice | Algarve Evolution | algarve,faro |
| Algarve Evolution opens a survey on how local companies adopt AI | Algarve Evolution | algarve |
| European funds to bring AI and robotics to 15 Algarve tourism firms, and a warning on agentic AI | Algarve Evolution | algarve |
| Algarve Evolution opens applications for its AI and robotics pilot for tourism SMEs | Algarve Evolution | algarve |
| Vibathon Algarve 2026 fills UALG TEC Campus with people building apps with AI | Algarve Evolution | faro |
| European funds to bring AI and robotics to 15 Algarve tourism firms | Algarve Evolution | faro,aljezur |
25 rows, the first 12 shown.
What the places rest on: the sources by web host
Every story and map entry by the host of its source: a newsroom's dependency on a few outlets, in one query.
SELECT host, count(*) AS items, count(DISTINCT place) AS places
FROM (SELECT place, host FROM news UNION ALL SELECT place, host FROM map) x
WHERE host IS NOT NULL
GROUP BY host
ORDER BY items DESC
LIMIT 15
| host | items | places |
|---|---|---|
| barlavento.pt | 124 | 18 |
| ualg.pt | 8 | 3 |
| algarveevolution.pt | 7 | 4 |
| dinheirovivo.dn.pt | 6 | 1 |
| gdg.community.dev | 6 | 3 |
| inesc-id.pt | 5 | 1 |
| dealroom.co | 5 | 1 |
| algarveprimeiro.com | 5 | 2 |
| bealgarve.pt | 5 | 2 |
| transparencia.gov.pt | 5 | 4 |
| tech.eu | 4 | 1 |
| essential-business.pt | 4 | 2 |
15 rows, the first 12 shown.
How fresh each place is
When each place's items were read, and its status.
SELECT p.name, p.status, p.updated, p.news, p.map, p.gaps,
(SELECT max(read_on) FROM map WHERE place = p.id) AS map_read
FROM places p
ORDER BY p.news + p.map DESC
| name | status | updated | news | map | gaps | map_read |
|---|---|---|---|---|---|---|
| Portugal | researching | 2026-11-15 | 16 | 32 | 7 | 2026-11-15 |
| The Algarve | researching | 2026-11-15 | 15 | 22 | 11 | 2026-11-15 |
| Faro | live | 2026-11-15 | 14 | 16 | 7 | 2026-11-15 |
| Portimão | live | 2026-11-15 | 9 | 15 | 7 | 2026-11-15 |
| Loulé | live | 2026-11-15 | 7 | 10 | 10 | 2026-11-15 |
| Lagos | live | 2026-11-15 | 3 | 9 | 6 | 2026-11-15 |
| Olhão | researching | 2026-11-15 | 5 | 7 | 8 | 2026-11-15 |
| São Brás de Alportel | researching | 2026-11-15 | 5 | 7 | 6 | 2026-11-15 |
| Quarteira | researching | 2026-11-15 | 4 | 5 | 6 | 2026-11-15 |
| Lagoa | researching | 2026-11-15 | 4 | 5 | 7 | 2026-11-15 |
| Aljezur | researching | 2026-11-15 | 4 | 5 | 9 | 2026-11-15 |
| Castro Marim | researching | 2026-11-15 | 4 | 4 | 8 | 2026-11-15 |
19 rows, the first 12 shown.
The shape of the whole graph
Nodes by type and layer: the shared graph and the by-place layer in one id space.
SELECT layer, type, count(*) AS nodes
FROM nodes
GROUP BY layer, type
ORDER BY layer, nodes DESC
| layer | type | nodes |
|---|---|---|
| by-place | news | 95 |
| by-place | organisation | 85 |
| by-place | company | 37 |
| by-place | event | 21 |
| by-place | place | 12 |
| connections | product | 3 |
| connections | organisation | 3 |
| connections | programme | 2 |
| connections | event | 2 |
| connections | company | 1 |
| graph | source | 173 |
| graph | company | 115 |
23 rows, the first 12 shown.
Which sources are captured, and their hashes
Every cited page and its capture: join the stories to the captures by URL to see what each story rests on, and the SHA-256 that proves what the page said when it was read.
SELECT n.place, n.title, c.host, c.captured_at, substr(c.image_sha256, 1, 16) AS image_sha256
FROM news n JOIN captures c ON c.url = n.url
WHERE c.ok = 1
ORDER BY n.place, n.date DESC
| place | title | host | captured_at | image_sha256 |
|---|---|---|---|---|
| algarve | DevFest Faro gives two days to building AI agents in practice | barlavento.pt | 2026-11-15T23:21:25Z | 08aab7de1a8879da |
| algarve | University of Algarve launches its AI use policy | ualg.pt | 2026-11-15T23:21:43Z | a620c36758469339 |
| algarve | ULS Algarve holds a webinar on AI in the national health service | barlavento.pt | 2026-11-15T23:21:46Z | 6e767ae392b017fe |
| algarve | Faro panel asks how AI decides which companies to recommend | barlavento.pt | 2026-11-15T23:21:49Z | b46fee7c60d66225 |
| algarve | UAlg wins 31.5 million euros for an AI-first European heritage centre | barlavento.pt | 2026-11-15T23:22:01Z | ec972f18abcd0a55 |
| algarve | Turismo do Algarve runs free AI bootcamp for tourism professionals | barlavento.pt | 2026-11-15T23:22:04Z | c0ab7d39eee9afb4 |
| algarve | AuroraMed and UAlg launch an executive course on AI in healthcare | barlavento.pt | 2026-11-15T23:22:11Z | 397dd3baea450769 |
| aljezur | Algarve tourism firms get a state-backed route to AI and robotics, Aljezur's trade included | barlavento.pt | 2026-11-15T23:22:07Z | 7508c9e497184419 |
| faro | DevFest in Faro spends two days on agentic AI | barlavento.pt | 2026-11-15T23:21:25Z | 08aab7de1a8879da |
| faro | Vibathon Algarve 2026 fills UALG TEC Campus with people building apps with AI | newsroom.sgit.ai | 2026-11-15T23:21:28Z | 70a1f019b06e5d64 |
| faro | Faro's Cáritas asks who benefits from AI | barlavento.pt | 2026-11-15T23:21:32Z | e292c55dd559d2dc |
| faro | A book on starting a company in 30 days with AI prompts is presented at UALG TEC Campus | barlavento.pt | 2026-11-15T23:21:34Z | 3e8473de402c9e42 |
30 rows, the first 12 shown.
The AgentiCCells cluster on newsroom.sgit.ai, and what links into it
newsroom.sgit.ai's article graph is a layer of this one: the articles tagged agenticcells, how many of the newsroom's articles link to each, and each one's core idea.
SELECT a.slug, a.date, (SELECT count(*) FROM nr_links l WHERE l.dst = a.slug) AS linked_from, a.core_idea
FROM nr_articles a
WHERE a.tags LIKE '%agenticcells%'
ORDER BY linked_from DESC, a.date DESC
| slug | date | linked_from | core_idea |
|---|---|---|---|
| starting-agenticcells | 2026-11-15 | 6 | AgentiCCells, started on 15 November 2026, sets up small agentic teams (cells) in the customer's own environment with a control centre, r... |
| atomic-cells-end-to-end | 2026-11-15 | 4 | AgentiCCells' first offering is a public website as an atomic cell for a one-off price anchored at £500: an order on a queue, an agentic ... |
| from-a-commit-to-a-live-website | 2026-11-15 | 2 | Every new site needs a GitHub repository, a DNS record and an sgit vault. Instead of clicks or scripts, a public CI site factory takes a ... |
| stop-copying-and-pasting-between-your-agents | 2026-11-15 | 2 | People who copy and paste between AI sessions become the wire between their agents and the bottleneck, and reading everything does not sc... |
| reading-your-way-into-an-agentic-team | 2026-11-15 | 2 | A new agentic team starting from nothing is best bootstrapped with a reading list, not a long prompt: eight public sites built for agents... |
| a-hub-for-agentic-sites | 2026-11-15 | 1 | AgentiCCells will list every agentic site it builds on hub.agenticcells.site, a code host for agentic sites: each site in a public reposi... |
| spend-fewer-tokens | 2026-11-15 | 0 | Most of an agentic team's token cost is design. From our runs: files as memory with hand-overs (106 on Storm Charles), caching repeated r... |
7 rows.
Where Dinis's newsroom meets the Algarve's AI map
newsroom.sgit.ai articles whose title or core idea names an organisation on a place's AI map: two corpora, one graph.
SELECT o.label AS organisation, o.places, a.title AS newsroom_article, a.date
FROM edges m
JOIN nr_articles a ON a.node = m.src
JOIN nodes o ON o.id = m.dst
WHERE m.verb = 'mentions' AND m.layer = 'newsroom'
ORDER BY o.label, a.date DESC
| organisation | places | newsroom_article | date |
|---|---|---|---|
| Algarve Evolution | algarve,faro,portimao,lagos | Spreadsheet to App: a session programme for Algarve Evolution, with five example spreadsheets, five prompts, a mock event and a public va... | 2026-10-31 |
| Algarve Evolution | algarve,faro,portimao,lagos | Sell to the companies that already have the problem: how Algarve Evolution can match businesses adopting AI with the region's service pro... | 2026-10-31 |
| Algarve Evolution | algarve,faro,portimao,lagos | An Algarve talent map: how Algarve Evolution can turn its mapping of services, mentors and investors into a public matchmaking site, buil... | 2026-10-31 |
| Algarve Evolution | algarve,faro,portimao,lagos | Joining Algarve Evolution: The Cyber Boardroom takes the startup membership, and what we can share with the region, our workflows and our... | 2026-10-31 |
| Algarve Evolution | algarve,faro,portimao,lagos | Vibathon Algarve 2026: a sold-out day of building with AI at the University of the Algarve, and Algarve Evolution, the movement that want... | 2026-10-31 |
| Lovable | algarve | RiskMandate and Lovable: mapping an Agent Behaviour Policy onto an app builder whose agent writes the code, changes the live database, co... | 2026-11-09 |
| Lovable | algarve | From Lovable to your own newsroom: a brief for José Bota and his agent, to put every app on GitHub Pages under his own domain, and publis... | 2026-10-31 |
| Lovable | algarve | Vibathon Algarve 2026: a sold-out day of building with AI at the University of the Algarve, and Algarve Evolution, the movement that want... | 2026-10-31 |
| Lovable | algarve | Lovable with SHarness, and the trojanised Claude Code extension: how to keep an app builder's code and an editor's extensions inside a po... | 2026-10-31 |
| Universidade do Algarve | algarve,faro,loule,portimao | Vibathon Algarve 2026: a sold-out day of building with AI at the University of the Algarve, and Algarve Evolution, the movement that want... | 2026-10-31 |
10 rows.
The language
A subset of SQLite's SQL: SELECT, DISTINCT, FROM with JOIN, LEFT JOIN and subqueries, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, UNION [ALL], WITH, CASE, IN, EXISTS and LIKE (case-insensitive). The aggregates are count, sum, avg, min, max and group_concat; the functions lower, upper, length, substr, instr, replace, trim, coalesce, ifnull, round, abs, unaccent, year and host.
The graph is two table functions:
neighbours(start, depth [, verbs]): every node withindepthsteps ofstart(up to 6), edges taken both ways. Its columns areid, type, label, depth, verb, via, path, path_ids.paths(from, to [, max_depth [, verbs]]): the shortest paths between two nodes (up to 25). Its columns aren, hops, path, path_ids, verbs.verbsis a comma list of the verbs to follow ('reported_in,mentions') or to skip ('-located_in'). By default every verb is followed buton_day, since a day joins everything that happened on it.
A node's id is <type>:<slug>, such as place:loule. To find one: SELECT id, label FROM nodes WHERE label LIKE '%name%'.
The tables
Two layers share one id space. graph is the shared graph the whole site is built on, in ontologist@PrompTugal.dinis's grammar (data/ontology.json). by-place is derived at each build from the place agents' files: the places, the organisations on each AI map (merged across towns by name, or matched to a company or organisation of the graph; the merges table shows how each was resolved, so a wrong merge can be seen and refused), the local stories and events, and what each story names. A mentions edge is found by machine, by a name in a headline or a summary, and its note says so.
places
One row per place of PrompTugal.news by place (data/by-place/places.json and each place's file): the country, the Algarve and its towns. 19 rows: api/v1/data/tables/places.json.
| column | type | what it holds |
|---|---|---|
id | text | the place's id, as in data/by-place/<id>.json |
name | text | its name |
kind | text | country, region or municipality |
parent | text | the id of the place it is in |
node | text | its node in the graph (place:<id>) |
page | text | its page on the site |
agent | text | the agent that keeps its file |
status | text | stub, researching or live |
updated | text | when its agent last changed it |
lon | real | longitude of its seat |
lat | real | latitude of its seat |
key_id | text | the site's own key in board/keys.json |
news | integer | local AI stories |
map | integer | organisations on its AI map |
events | integer | events |
sources | integer | sources read |
gaps | integer | gaps written down |
mandate | text | its mandate, in its agent's words |
gravity | text | its centre of gravity, in its agent's words |
news
Every local AI story on a place's page (ai_news), with its source, when it was read and its path to AI. 105 rows: api/v1/data/tables/news.json.
| column | type | what it holds |
|---|---|---|
place | text | the place's id |
n | integer | its position in the place's file |
node | text | its node in the graph (news:<hash of its URL>) |
title | text | the headline, in the agent's words |
date | text | the story's date |
publisher | text | who published it |
url | text | the source |
host | text | the source's web host |
read_on | text | when it was read |
steps | integer | steps from AI (0: about AI directly) |
ai_path | text | the path to AI, written down |
summary | text | the summary |
map
Every entry of a place's AI map (ai_map): companies, startups, institutions, communities and public bodies, with the source that supports it. 160 rows: api/v1/data/tables/map.json.
| column | type | what it holds |
|---|---|---|
place | text | the place's id |
n | integer | its position in the place's file |
node | text | the node it resolves to: a company:, organisation: of the graph, or local:<slug> |
name | text | the name, as the agent wrote it |
kind | text | company, startup, institution, organisation, public body, community or investor |
url | text | its own site, where given |
source_url | text | the source that supports the entry |
host | text | the source's web host |
read_on | text | when the source was read |
steps | integer | steps from AI |
ai_path | text | the path to AI |
what | text | what it is and does |
events
Events on the places' pages (the place files' events) and the summit's agenda in the graph, one table. 55 rows: api/v1/data/tables/events.json.
| column | type | what it holds |
|---|---|---|
place | text | the place's id (null for an agenda item of the graph) |
node | text | its node in the graph |
title | text | its title |
date | text | its date |
url | text | the organiser's page |
read_on | text | when it was read |
ai_path | text | the path to AI (place events) |
layer | text | by-place or graph |
sources
The sources and feeds each place's agent reads (sources), and how many of the place's items rest on each host. 150 rows: api/v1/data/tables/sources.json.
| column | type | what it holds |
|---|---|---|
place | text | the place's id |
n | integer | its position |
name | text | its name |
url | text | its address |
host | text | its web host |
kind | text | council, news, university, feed and so on |
feed | text | its feed, where it has one |
items | integer | stories and map entries of this place whose source is on this host |
gaps
What each place's agent says it has not found or could not check (gaps): the honest edge of the data. 140 rows: api/v1/data/tables/gaps.json.
| column | type | what it holds |
|---|---|---|
place | text | the place's id |
n | integer | its position |
text | text | the gap, in the agent's words |
companies
The companies of the graph (data/companies/), public fields only, after the websummit-only pass. 115 rows: api/v1/data/tables/companies.json.
| column | type | what it holds |
|---|---|---|
id | text | its id |
node | text | company:<id> |
name | text | its name |
category | text | its field |
country | text | its country |
website | text | its site |
attending | integer | 1 if it is listed at Web Summit 2026 |
what | text | what it does |
sources | integer | how many sources support it |
page | text | its page |
articles
PrompTugal.news articles (content/articles/), with the region and town they are tagged with. 63 rows: api/v1/data/tables/articles.json.
| column | type | what it holds |
|---|---|---|
slug | text | its slug |
node | text | article:<slug> |
title | text | its title |
date | text | its date |
author | text | its byline |
region | text | the region it is tagged with |
town | text | the town it is tagged with |
page | text | its page |
nodes
Every node of the graph: the shared graph and the by-place layer, one id space (<type>:<slug>). 1565 rows: api/v1/data/tables/nodes.json.
| column | type | what it holds |
|---|---|---|
id | text | the node's id |
type | text | company, organisation, place, event, news, article, topic, product, source, fact, evidence, story, day, track |
kind | text | a finer kind (a place's kind, a map entry's kind, an event's kind) |
label | text | its name or title |
page | text | its page on the site, where it has one |
source | text | the URL or repository file it comes from |
read | text | when its source was read, where known |
layer | text | graph, by-place or connections |
places | text | the places whose files name it (by-place layer), comma-separated |
edges
Every edge of the graph: a verb from one node to another, with its source and when it was read. 3550 rows: api/v1/data/tables/edges.json.
| column | type | what it holds |
|---|---|---|
id | text | verb:src:dst |
src | text | the node it goes from |
verb | text | the relation: the ontology's verbs, and on_ai_map_of, reported_in, mentions, held_in, about_place (by-place layer) |
dst | text | the node it goes to |
source | text | the URL or file that supports it |
read | text | when that source was read |
layer | text | graph, by-place or connections |
note | text | the path to AI, or how the edge was derived |
merges
How the by-place layer resolved each map entry to a node: matched to the graph, merged with another town's entry, or new. So a merge can be checked, and refused. 141 rows: api/v1/data/tables/merges.json.
| column | type | what it holds |
|---|---|---|
node | text | the node |
how | text | graph-name (matched to a company or organisation of the graph by name), graph-site (by its home page), same-name (the same name in severa... |
names | text | the names it was written as, / separated |
places | text | the places that list it |
entries | integer | how many map entries |
connections
Links between companies, institutions, events and programmes across the places, found by detective.places@PrompTugal.dinis (data/by-place/connections/connections.json), each with its source and whether the page itself was read. 13 rows: api/v1/data/tables/connections.json.
| column | type | what it holds |
|---|---|---|
id | text | its id |
src | text | from (a node id, resolved by name as a map entry is) |
verb | text | the relation: builds_with, funded_by, piloted_in, hosted_at, part_of, incubated_by, founded_with, holds_role_at, organises, participates_... |
dst | text | to (a node id) |
source | text | its source |
read_on | text | when it was read |
verified | text | read (the page itself was opened) or search_extract (seen only in a search result) |
steps | integer | steps from AI |
what | text | what the source says |
ai_path | text | the path to AI |
places | text | the places it concerns, comma-separated |
captures
Captures of the third-party pages the place files cite: a screenshot and the visible text of each, hashed (SHA-256), kept in the sgit vault promptugal-captures (board/team/data.places/tools/capture.mjs). 47 rows: api/v1/data/tables/captures.json.
| column | type | what it holds |
|---|---|---|
url | text | the page cited |
host | text | its web host |
captured_at | text | when it was captured (UTC) |
ok | integer | 1 if the page was captured as a reader sees it |
status | integer | the HTTP status |
title | text | the page's title |
note | text | why it was not captured, where it was not |
image_sha256 | text | the screenshot's SHA-256 |
image_path | text | the screenshot's path in the vault |
text_sha256 | text | the text's SHA-256 |
text_path | text | the text's path in the vault |
cited_by | integer | how many items of the places cite it |
places | text | the places whose items cite it |
nr_articles {#t-nr_articles}
newsroom.sgit.ai's articles (a snapshot of its article graph, CC BY 4.0, assets/query/newsroom-graphs.json): Dinis's newsroom, the AgentiCCells cluster among them; each is a node nr:<slug> of the graph. 419 rows: api/v1/data/tables/nr_articles.json.
| column | type | what it holds |
|---|---|---|
slug | text | its slug on newsroom.sgit.ai |
node | text | nr:<slug> |
title | text | its title |
date | text | its date |
url | text | its page |
topics | text | its topics, comma-separated |
tags | text | its tags, comma-separated |
core_idea | text | its core idea, in the newsroom's words |
nr_links {#t-nr_links}
Which newsroom.sgit.ai article links to which (links_to edges in the graph). 2038 rows: api/v1/data/tables/nr_links.json.
| column | type | what it holds |
|---|---|---|
src | text | the linking article's slug |
dst | text | the linked article's slug |
nr_nodes {#t-nr_nodes}
The entities inside each newsroom.sgit.ai article's own graph: artefacts, claims, concepts, examples, methods, questions. 4415 rows: api/v1/data/tables/nr_nodes.json.
| column | type | what it holds |
|---|---|---|
article | text | the article's slug |
id | text | the node's id inside the article |
label | text | its label |
kind | text | artefact, claim, concept, example, method or question |
summary | text | what it is, in one line |
nr_edges {#t-nr_edges}
The typed links inside each newsroom.sgit.ai article's graph: answers, compared-with, contrasts, depends-on, example-of, extends, leads-to, produces. 4235 rows: api/v1/data/tables/nr_edges.json.
| column | type | what it holds |
|---|---|---|
article | text | the article's slug |
src | text | from (a node id inside the article) |
rel | text | the relation |
dst | text | to (a node id inside the article) |
Where this comes from
Every row keeps the source its agent cited and the day it was read. The place files are kept by the place agents (data/by-place/<id>.json, each signed with its site's key); the graph by the build, from data/; this page, its tables and its engine by data.places@PrompTugal.dinis (newsroom/build/features/data-places.mjs, assets/query/). Public facts only, and no contact details.