diff --git a/README.md b/README.md
index 19d4f22..e87e62a 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ RF4DB/RF4-STAT/RF4MAP/RF4 Posts сначала принимаются в изо
Базовый SEO-контур готов для `rf4spotter.ru`: страницы имеют уникальные метаданные, canonical, Open Graph/Twitter Card, фирменное изображение 1200×630 и JSON-LD; доступны динамические `/robots.txt` и `/sitemap.xml`, административные и ошибочные страницы закрыты от индексации, добавлена собственная страница 404. Индексируемые каталоги рыб и водоёмов, detail-страницы и сочетания водоём + рыба строятся из актуального разрешённого справочника и включаются в sitemap. Подключены фирменные favicon/app icons, web manifest и production-кэширование статических ресурсов. Карточки активности показывают единый паспорт данных: источники, свежесть, полноту и уровень доверия. На `/status` опубликована легенда цветов всех источников и статусов качества.
-Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. На странице точки координаты дополнительно показаны фирменным радаром, который не имитирует отсутствующую географию водоёма.
+Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. На странице точки координаты дополнительно показаны фирменным радаром, который не имитирует отсутствующую географию водоёма, а уловы за 72 часа — шкалой-леской с 12-часовым шагом.
Все пять community-парсеров подключены к отдельному scheduler-процессу. Состояние запусков и ошибок хранится в PostgreSQL, параллельный запуск одного источника блокируется, минимальный интервал жёстко ограничен 1800 секундами. Локально процесс включается профилем `docker compose --profile scheduler up -d`; detail-URL RF4MAP/RF4 Posts задаются переменными окружения.
diff --git a/apps/web/src/components/ActivityTimeline.astro b/apps/web/src/components/ActivityTimeline.astro
new file mode 100644
index 0000000..2f3d4aa
--- /dev/null
+++ b/apps/web/src/components/ActivityTimeline.astro
@@ -0,0 +1,19 @@
+---
+import type { Catch } from "../lib/api";
+const { catches } = Astro.props as { catches: Catch[] };
+const now = Date.now();
+const step = 12 * 60 * 60 * 1000;
+const buckets = Array.from({ length: 6 }, (_, index) => ({ index, count: 0 }));
+for (const item of catches) {
+ const timestamp = new Date(item.caught_at ?? item.reported_at).getTime();
+ const age = Math.floor((now - timestamp) / step);
+ if (age >= 0 && age < buckets.length) buckets[buckets.length - 1 - age].count += 1;
+}
+const max = Math.max(1, ...buckets.map(bucket => bucket.count));
+---
+
+