diff --git a/docs/features.md b/docs/features.md
index efb256b..1ccf077 100644
--- a/docs/features.md
+++ b/docs/features.md
@@ -22,9 +22,17 @@
- **Panoramas only**: non-panoramic images are filtered out when the index is
built, so every indexed point is a panorama. The flag itself is not stored
- **Thumbnail display**: `thumb_2048_url`, falling back to `thumb_original_url`
+- **Attribution overlay**: every panorama shows the Mapillary logo (linking to
+ the Mapillary homepage, never the per-image page — the image id is the
+ round's answer) and a CC BY-SA 4.0 link, as the Mapillary Terms of Use
+ require. `/credits` lists all data sources and licenses; the home page
+ footer links to it
## Interactive Maps
-- **Leaflet Integration**: OpenStreetMap-based interactive mapping
+- **Leaflet Integration**: OpenStreetMap-based interactive mapping. Tiles come
+ from Geoapify when `NEXT_PUBLIC_GEOAPIFY_KEY` is set at build time (free
+ tier allows commercial use), falling back to the OSM public server
+ otherwise; the choice is centralized in `src/lib/map-tiles.js`
- **Click-to-Place**: Intuitive guess marker placement
- **Map Search**: search box on the guess map finds districts (offline,
diacritic- and alias-aware: `quận 7`, `q7`, `hoàn kiếm`) and streets/places
diff --git a/public/mapillary-logo.svg b/public/mapillary-logo.svg
new file mode 100644
index 0000000..431ec8b
--- /dev/null
+++ b/public/mapillary-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/components/PanoramaViewer.js b/src/app/components/PanoramaViewer.js
index ba1e23e..6a6e0da 100644
--- a/src/app/components/PanoramaViewer.js
+++ b/src/app/components/PanoramaViewer.js
@@ -1,6 +1,7 @@
"use client";
import { useEffect, useRef, memo } from 'react';
+import Image from 'next/image';
import { Viewer } from '@photo-sphere-viewer/core';
import '@photo-sphere-viewer/core/index.css';
@@ -97,10 +98,32 @@ function PanoramaViewer({ imageUrl, onReady, onError }) {
}, [imageUrl]);
return (
-
+
+
+ {/* Imagery attribution required by the Mapillary Terms of Use: the logo,
+ visibly displayed, linking to the Mapillary homepage. Deliberately
+ NOT the per-image page — the image id resolves the round's answer,
+ and the server keeps it secret. Top-left: the navbar owns the bottom
+ edge and the floating guess map owns the bottom-right. */}
+
+ All 360° panoramas are contributed by the{' '}
+ Mapillary{' '}
+ community and licensed under{' '}
+ CC BY-SA 4.0.
+ Thank you to everyone who mapped the streets of Vietnam.
+