Skip to content

About

A curated list of resources for Salerno, the Amalfi Coast and the Cilento

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Awesome Salerno



Awesome License: CC0-1.0 POIs: 5529 MCP Ready CI Status

Awesome Salerno

The curated list of tourism data for Salerno, Amalfi Coast and Cilento.

English list below · Leggi in italiano · the map UI has an EN/IT switch.

Contents

In italiano

Guida aperta, verificabile e mantenuta ai luoghi e agli eventi di Salerno, Costiera Amalfitana e Cilento.

5529 POI (sentieri, monumenti, spiagge, panorami, parchi, eventi) con coordinate GPS, fonte e data di verifica. Dati in JSON, GeoJSON, KML/KMZ, RSS e dataset RAG.

Licenze: non sono uniformi. Le voci source: osm contengono dati © OpenStreetMap contributors, sotto ODbL 1.0 (attribuzione obbligatoria); Wikipedia, Wikidata e le fonti degli eventi hanno condizioni proprie. Il dettaglio per fonte e' in DATA-LICENSES.md; la licenza del dataset composto la conferma il titolare.

Documento Contenuto
docs/criteria.md Criteri editoriali: cosa entra e cosa no
CONTRIBUTING.md Come proporre una voce o una correzione
DATA-LICENSES.md Licenza di ogni fonte dei dati (link nel paragrafo sopra)
docs/CONTRACT.md Chi legge i dati e cosa non si deve rompere
CODE_OF_CONDUCT.md Codice di condotta

La mappa interattiva (sezione Map) ha un selettore IT/EN. Le voci della lista qui sotto sono in inglese; dati e documentazione per i contributor sono in italiano.

Stats

Metric Value
Total POI 5529
In declared scope (Salerno, Amalfi Coast, Cilento) 3785
Outside declared scope, flagged not removed 1744
Cities mapped 102
Salerno districts (quartieri) 14
Unique descriptions 5411 (97.9%)
Luci d'Artista 36

On scope, honestly. Every POI now carries provincia, sigla_provincia, regione (from the official ISTAT comuni list) and in_ambito. The collection grew past its declared area: 1744 POI sit outside it — 1557 in provincia di Napoli (Pompei, Sorrento, Castellammare, the Vesuvio side), 95 Cosenza, 70 Avellino, 47 Latina, 4 Potenza. Their coordinates are correct; they are simply not Salerno, the Amalfi Coast or Cilento. Two exceptions are kept in scope on purpose, because the territory does not follow provincial borders: Agerola (NA, Amalfi Coast) and Maratea (PZ, southern end of the Cilento coast).

Nothing was deleted — it is flagged, and you can filter:

curl "http://localhost:8080/api/all?ambito=1"        # declared scope only
curl "http://localhost:8080/api/all?provincia=SA"    # by province

Sentieri

1658 hiking trails with GPS coordinates, difficulty and elevation.

Monumenti

3479 churches, castles, museums, archaeological sites and light installations.

Salerno

Amalfi Coast

Cilento

Spiagge

78 beaches on the Amalfi Coast and Cilento.

Panorami

201 viewpoints, peaks and panoramas.

Parchi

12 natural parks and reserves.

Eventi

49 annual festivals, feste patronali, sagre and cultural events with dates and recurrence.

Salerno

Costiera Amalfitana

Cilento

Sagre (Cilento)

Luci d'Artista

36 light installations for the XX edition (2025-2026). Free entry, November 14 - February 1.

The most important Christmas event in Southern Italy. Since 2006, Salerno transforms into an open-air light museum with works by contemporary artists.

Main Installations

# Name Location Artist
1 Giardino Preistorico Villa Comunale Luca Pannoli / Ondesign
2 Percorso Fiorito Centro Storico —
3 Noi siamo Natura Via Mercanti Luca Pannoli
4 La danza delle meduse Piazza Sedile del Campo Luca Pannoli / Ondesign
5 …e le stelle stanno a guardare Piazza Flavio Gioia Luca Pannoli / Ondesign
6 Albero di Natale Piazza Portanova —
7 Angeli Via Duomo —
8 Colorare Salerno Piazza Sant'Agostino Luca Pannoli
9 Il mare d'inverno Corso Vittorio Emanuele Luca Pannoli
10 Locomotiva dei fiori Piazza Vittorio Veneto —
11 Giochi di biglie Piazza Caduti di Brescia —
12 Paesaggio Polare Piazza Gian Camillo Gloriosi —
13 Albero natalizio con sfere Piazza Monsignor Grasso —
14 Palme Dorate Arenile Santa Teresa —
15 I Fiori del Mare Piazza della Libertà Luca Pannoli / Ondesign
16 Partitura d'aMARE Sottopiazza della Libertà Luca Pannoli / Ondesign
17 Alberi Magici Piazza San Francesco —
18 La fata delle farfalle Largo Dogana Regia —
19 Madonna con Bambino Complesso di Santa Sofia Eduardo Giannattasio
20 Rami Dorati Via del Carmine —
21 Foglie d'Argento Via Trento —
22 Alberi Innevati Corso Garibaldi —
23 Metamorphosis Via Volpe Eliana Petrizzi
24 Il Mito Via Nizza Nello Ferrigno
25 Sfere-Mondi Via Ventimiglia —
26 Giochi d'Acqua Via Santa Margherita —
27 Vele Via Cocchia —
28 Onde e Vele Via Diaz —
29 Circus Via Memoli Luca Pannoli
30 Accendi il tuo futuro Via Arce Cooperativa Fili d'Erba
31 Sei Tu il Regalo Più Bello Piazza Dante Luca Pannoli
32 Le Parole dei Bambini Via Settimio Mobilio Roberto Castaldo
33 Natività Chiesa SS. Crocifisso Eduardo Giannattasio
34 Moonlight Piazza Dante Luca Pannoli
35 Don Chisciotte Piazza Vittorio Veneto Eduardo Giannattasio
36 Annunciazione Chiesa del Sacro Cuore Eduardo Giannattasio

Related Events During Luci d'Artista

Related events include MeraviglioSA Christmas city in the Mirabile complex (December 5 - January 6), Fiabe d'artista theater for children at Teatro Augusteo, and gospel and jazz street concerts throughout the period.

Map

Interactive map with filters for zona, tipo, and search: Open Map

Autonomous Ingestion Pipeline

Events are ingested every morning by a systemd timer on the project's own server (scripts/soliso_ingest.sh), which runs the headless browser, writes the events, and pushes them to the dati/eventi-automatici branch for review.

Autonomous Ingestion Pipeline: Events are refreshed daily by a dedicated systemd timer on the project's infrastructure (scripts/soliso_ingest.sh) using obscura stealth fetch. Scraped records are strictly quarantined in data/eventi_scraped.json with full source provenance, keeping curated datasets immutably verified.

API

JSON API with fuzzy search, filters, and GeoJSON export.

python3 api/server.py
Endpoint Description
GET /api/sentieri All trails (1658)
GET /api/monumenti All monuments (3479)
GET /api/spiagge All beaches (78)
GET /api/panorami All viewpoints (253)
GET /api/parchi All parks (12)
GET /api/eventi All events (49)
GET /api/all All data (5529)
GET /api/geojson GeoJSON format for GIS
GET /api/cities List of all 103 cities
GET /api/search?q=<query> Fuzzy search
GET /api/oggi?giorni=<n> What's on now — curated + scraped, counted separately
GET /api/sources The source registry, with measured status and licence
GET /api/health Status, event counts, last ingest timestamp

Live events (/api/oggi). Events are refreshed daily by scripts/ingest_events.py, which reads the source registry in data/sources.json and collects only from sources measured as reachable. Every scraped record carries curated: false, its source, license, retrieved_at and provenance — and is kept in data/eventi_scraped.json, never mixed into the curated data/eventi.json. If an ingest returns nothing, the previous file is kept: an empty result is never published as success.

curl "http://localhost:8080/api/oggi?giorni=14&citta=Salerno"
python3 scripts/ingest_events.py --self-check   # verifies the parsers, no network

Filter by zone:

curl "http://localhost:8080/api/sentieri?zona=costiera"
curl "http://localhost:8080/api/monumenti?zona=cilento"

Filter by type:

curl "http://localhost:8080/api/monumenti?tipo=chiesa"
curl "http://localhost:8080/api/monumenti?tipo=castello"

Filter by city:

curl "http://localhost:8080/api/all?citta=Salerno"
curl "http://localhost:8080/api/all?citta=Amalfi&tipo=chiesa"

Filter by quartiere (Salerno only):

curl "http://localhost:8080/api/all?citta=Salerno&quartiere=Centro Storico"

Search (fuzzy matching):

curl "http://localhost:8080/api/search?q=paestum"
curl "http://localhost:8080/api/search?q=ravello"
curl "http://localhost:8080/api/search?q=chiesa+salerno"

GeoJSON export:

curl "http://localhost:8080/api/geojson" > awesome-salerno.geojson

KML/KMZ download:

Voice assistant:

  • Voice skill - FindPOI, NextEvent and POIDetails intents in data/voice-assistant.json.

RSS feed for events:

https://autcir.github.io/awesome-salerno/data/events.xml

Ask Salerno

Ask a question in Italian and get answers that cite the dataset: Ask Salerno

Retrieval (BM25 with a crude Italian stemmer) runs in the browser over chunks.jsonl - no API key, no server, nothing generated. Every answer is a real list entry with its source and verification date. For LLM-written answers, point an MCP client at mcp/server.py or index the chunks in Qdrant.

node scripts/test_ask.js runs the page's own retrieval under node against the real data.

Monthly digest

Upcoming events, dataset changes and link health, one page per month: digest

python3 scripts/build_digest.py            # current month
python3 scripts/build_digest.py 2026-01    # a specific one

.github/workflows/digest.yml builds it on the 1st of each month. The "what changed" section is read from Git history, so it cannot drift from the repo.

Data quality

Every POI carries a last_verified date (YYYY-MM-DD).

.github/workflows/link-check.yml runs every Monday and does three things: verify_links.py --fix checks every external link, stamps the reachable ones and swaps a dead one for the OpenStreetMap link built from the POI coordinates (the original stays in link_rotto); relink_wikipedia.py --apply then puts a Wikipedia article back wherever one exists whose own coordinates land near the POI; whatever is left is reported in data/broken_links.json and in an issue labelled needs-verification. OpenStreetMap links are generated from the coordinates, so they are not requested and not stamped: they carry link_type: osm_generated. last_verified moves only when a real request to an external link succeeded; last_checked and last_status record every attempt. The map shows a "to be verified" badge for anything older than 180 days.

An official source beats both fallbacks, so the issue is worth reading: the automation keeps entries usable, it does not make them good.

python3 scripts/verify_links.py --stale-days 30

Inclusion and exclusion rules: see docs/criteria.md.

RAG dataset

One chunk per POI, ready to embed - data/rag/chunks.jsonl, 5529 lines. It derives from the dataset, so the per-source licences in DATA-LICENSES.md apply (OpenStreetMap data is ODbL).

python3 scripts/build_rag.py            # rebuild the JSONL
python3 scripts/build_rag.py --qdrant   # embed + upsert into Qdrant

Each line carries the searchable text plus id, categoria, tipo, zona, citta, quartiere, lat, lng, link and last_verified as payload, so a retriever can filter before it ranks. The Qdrant upload needs pip install "qdrant-client[fastembed]", embeds locally with paraphrase-multilingual-MiniLM-L12-v2 (384 dims, cosine - the POI text is Italian) and creates keyword indexes on categoria, tipo, zona, citta and quartiere. Reads QDRANT_URL, QDRANT_API_KEY, QDRANT_COLLECTION and QDRANT_MODEL. Point ids are a stable hash of the POI id, so re-running overwrites instead of duplicating.

Hosted copy: https://autcir.github.io/awesome-salerno/data/rag/chunks.jsonl

MCP server

Query the dataset from any MCP client (Claude Code, Claude Desktop). Stdlib only, no dependencies.

{
  "mcpServers": {
    "awesome-salerno": {
      "command": "python3",
      "args": ["/path/to/awesome-salerno/mcp/server.py"]
    }
  }
}
Tool Description
search_poi Fuzzy search with categoria, zona, tipo, citta filters
get_poi Full record by id
nearby_poi POI within a radius in km of a GPS point, nearest first
list_events Events in a date window, optionally by city (curated + scraped)
search_rag Semantic / keyword search over the 5529 RAG dataset chunks
get_sources_status Live status, coverage and licenses of monitored sources

Architecture & Data Pipeline

The project connects open source geospatial data, automated ingestion, and AI consumer surfaces:

  [OpenStreetMap / Overpass] ──┐
  [PA Comuni / Istituzionali]  ──┼──> [scripts/ingest_events.py] ──> [data/*.json] ──┬──> [Interactive Web Map]
  [SalernoToday & Testate]    ──┤     (obscura stealth fetch)       (5529 POI)      ├──> [REST API server.py]
  [Luci d'Artista Ufficiale]  ──┘                                                   ├──> [MCP Server stdlib]
                                                                                    └──> [SalernOS Civic Core]

Ingest & Freshness: Daily headless fetch runs on a dedicated systemd timer via obscura, strictly isolating scraped records (curated: false) from curated records.
Quality & Contracts: Every update enforces JSON Schema validation and bit-exact parity with the SalernOS sovereign catalog.
Distribution: Data is served via static GeoJSON/KML on GitHub Pages, JSON REST endpoints, and stdlib Model Context Protocol (MCP).

Quickstart

Python & Data Science (Pandas / GeoPandas)

import json
import pandas as pd

# Load monuments
with open("data/monumenti.json") as f:
    df = pd.DataFrame(json.load(f))

# Filter in-scope Salerno points
salerno_df = df[(df["citta"] == "Salerno") & (df["in_ambito"] == True)]
print(f"Loaded {len(salerno_df)} verified monuments in Salerno")

QGIS / GIS Visualization

Import data/awesome-salerno.geojson directly into QGIS as a vector layer or open data/awesome-salerno.kml in Google Earth.

Run Local API & MCP Server

# Start JSON API
python3 api/server.py

# Run MCP Demo / Test Suite
npm test

Citation

If you use this dataset, API, or tooling in research, publications, or public services, please cite:

@software{awesome_salerno_2026,
  author = {Autuori, Ciro and contributors},
  title = {Awesome Salerno: The Curated Open Tourism Dataset for Salerno, Amalfi Coast and Cilento},
  year = {2026},
  url = {https://github.com/autcir/awesome-salerno},
  version = {1.0.0}
}

See CITATION.cff for the machine-readable citation metadata conforming to CFF 1.2.0.

Contributing

Contributions are welcome! Please read CONTRIBUTING.md and docs/criteria.md before submitting a Pull Request.

Rules:

  1. Only verifiable data from public sources (no invented data, no spam)
  2. Accurate GPS coordinates required (lat 39–42, lng 14–16)
  3. Links to official sources, OpenStreetMap or Wikipedia
  4. Consistent JSON format matching schema/ definitions
  5. Every contribution must pass npm test (awesome-lint, ask tests, MCP demo, er0s contract)

About

A curated list of resources for Salerno, the Amalfi Coast and the Cilento

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages