尚未检测到更新。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.