diff --git a/public/.htaccess b/public/.htaccess
index e9cc24c..60ef108 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -47,9 +47,10 @@ RewriteRule ^licenses/?$ /index.php?action=licenses [L,QSA]
RewriteRule ^contact/?$ /index.php?action=contact [L,QSA]
# Flux RSS — /feed est canonique, /rss et /rss.xml redirigent en 301
-RewriteRule ^rss/?$ /feed [R=301,L]
-RewriteRule ^rss\.xml$ /feed [R=301,L]
-RewriteRule ^feed/?$ /feed.php [L,QSA]
+RewriteRule ^rss/?$ /feed [R=301,L]
+RewriteRule ^rss\.xml$ /feed [R=301,L]
+RewriteRule ^feed/([0-9a-f-]{36})/?$ /feed.php?after=$1 [L,QSA]
+RewriteRule ^feed/?$ /feed.php [L,QSA]
# Sitemap
RewriteRule ^sitemap\.xml$ /sitemap.php [L]
diff --git a/public/feed.php b/public/feed.php
index 0b3696a..317ed10 100644
--- a/public/feed.php
+++ b/public/feed.php
@@ -29,13 +29,27 @@ $all = array_values(array_filter(
}
));
-$total = count($all);
-$lastPage = max(1, (int)ceil($total / FEED_PAGE_SIZE));
-$page = max(1, min($lastPage, (int)($_GET['page'] ?? 1)));
-$items = array_slice($all, ($page - 1) * FEED_PAGE_SIZE, FEED_PAGE_SIZE);
+// ─── Pagination curseur ──────────────────────────────────────────────────────
+$after = trim($_GET['after'] ?? '');
+$offset = 0;
+if ($after !== '') {
+ foreach ($all as $i => $a) {
+ if ($a['uuid'] === $after) {
+ $offset = $i + 1;
+ break;
+ }
+ }
+}
-$feedUrl = static fn (int $p): string => $base . '/feed' . ($p > 1 ? '?page=' . $p : '');
+$items = array_slice($all, $offset, FEED_PAGE_SIZE);
+$nextCursor = (count($all) > $offset + FEED_PAGE_SIZE)
+ ? ($all[$offset + FEED_PAGE_SIZE - 1]['uuid'] ?? null)
+ : null;
+$feedUrl = $base . '/feed';
+$feedNextUrl = $nextCursor !== null ? $base . '/feed/' . $nextCursor : null;
+
+// ─── lastBuildDate ───────────────────────────────────────────────────────────
$lastBuild = '';
foreach ($all as $a) {
$ts = (int)strtotime((string)($a['updated_at'] ?? $a['published_at'] ?? ''));
@@ -62,21 +76,16 @@ echo '' . "\n";
fr
= htmlspecialchars($lastBuild) ?>
-
-
+
- 1): ?>
-
-
-
+ 0): ?>
+
-
-
-
+
+
- 1): ?>
-
+ 0): ?>