尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Attàccate — mezzi di Roma in tempo reale Webapp mobile-first per il trasporto pubblico di Roma: ricerca linee, arrivi in fermata (tempo reale + orario programmato), fermate vicine e mappa live dei mezzi. Dati: Roma Servizi per la Mobilità (ATAC, Roma TPL) — GTFS + GTFS-Realtime, licenza CC-BY-SA. Stack: Next.js (Vercel) + Supabase (Postgres/PostGIS).檢視完整 README ↗
Webapp mobile-first per il trasporto pubblico di Roma: ricerca linee, arrivi in fermata (tempo reale + orario programmato), fermate vicine e mappa live dei mezzi.
Dati: Roma Servizi per la Mobilità (ATAC, Roma TPL) — GTFS + GTFS-Realtime, licenza CC-BY-SA. Stack: Next.js (Vercel) + Supabase (Postgres/PostGIS).
romamobilita.it (.pb + .zip)
│
├── GTFS statico (zip) ── Vercel Cron giornaliero ─┐
│ /api/cron/ingest-static │ streaming + staging
│ ▼
└── GTFS-RT (.pb) ── Supabase Edge Function ──► Supabase Postgres (PostGIS)
ogni 60s ingest-rt (pg_cron) │ rebuild_static_from_staging()
│
RPC ◄───────┘
│
Next.js (App Router) — mobile-first, PWA
stg_* a batch e
delega l'aggregazione pesante (stop_times → stop_schedule, opzione C) a
Postgres. Riutilizzabile come pnpm ingest:static (vedi sotto).pnpm install
cp .env.example .env.local # poi compila i valori
supabase/migrations/:
0001_schema.sql, 0002_rebuild_static.sql, 0003_rpc.sql.
(0004_realtime_cron.sql dopo aver fatto il deploy della Edge Function.)URL, anon key, service_role key in .env.local.DATABASE_URL.pnpm ingest:static
Scarica il GTFS, popola le staging e ricostruisce le tabelle. Verifica la dimensione del DB (deve stare nel free tier ~500 MB):
select pg_size_pretty(pg_database_size(current_database()));
supabase login
supabase link --project-ref <PROJECT_REF>
supabase functions deploy ingest-rt
Poi, nel Vault di Supabase (Database → Vault), salva i due segreti:
project_url = https://<PROJECT_REF>.supabase.co e service_role_key.
Infine esegui supabase/migrations/0004_realtime_cron.sql per schedulare il
polling ogni minuto. Test manuale:
curl -X POST https://<PROJECT_REF>.supabase.co/functions/v1/ingest-rt \
-H "Authorization: Bearer <SERVICE_ROLE_KEY>"
Crea una chiave gratuita su MapTiler e mettila in
NEXT_PUBLIC_MAPTILER_KEY. Senza chiave si usa un raster OpenStreetMap di
ripiego (ok solo per sviluppo).
pnpm dev # http://localhost:3000
.env.local nelle Environment Variables.vercel.json) chiama /api/cron/ingest-static
(protetto da CRON_SECRET, iniettato automaticamente da Vercel).
Se la funzione supera i limiti del piano Hobby, esegui l'ETL in locale con
pnpm ingest:static.| Percorso | Ruolo |
|---|---|
app/ | pagine (home, /line/[id], /stop/[id], /trip/[tripId]) e route API |
components/ | UI: ricerca, mappa (MapLibre), arrivi, fermate vicine |
lib/ | client Supabase, helper GTFS, ETL statico, stile mappa |
supabase/migrations/ | schema, aggregazione, RPC, cron |
supabase/functions/ingest-rt/ | Edge Function polling GTFS-RT |
scripts/ingest-static.ts | entrypoint locale dell'ETL |
Nota — rotta
/mapdeprecata. La mappa live a tutto schermo (/map) è stata deprecata e rimossa dall'app: la visualizzazione dei mezzi su mappa resta disponibile nel dettaglio linea (/line/[id]) e corsa (/trip/[tripId]) tramite il componenteRouteMap+ endpoint/api/vehicles. L'infrastruttura lato API (vehicles_in_bbox,/api/vehicles) è mantenuta in caso si voglia reintrodurre la pagina in futuro.
Il codice è sotto licenza MIT (LICENSE).
Non tutto il contenuto è nostro, e il resto conserva la sua licenza:
next/font;L'app Android che consuma queste API sta in gorecodes/busroma-android, anche lei sotto licenza MIT.