diff --git a/bruno/bruno.json b/bruno/bruno.json
new file mode 100644
index 0000000..565cc3e
--- /dev/null
+++ b/bruno/bruno.json
@@ -0,0 +1,6 @@
+{
+ "version": "1",
+ "name": "bruno",
+ "type": "collection",
+ "ignore": ["node_modules", ".git"]
+}
diff --git a/bruno/collection.bru b/bruno/collection.bru
new file mode 100644
index 0000000..e3e7518
--- /dev/null
+++ b/bruno/collection.bru
@@ -0,0 +1,4 @@
+meta {
+ name: bruno
+ type: collection
+}
diff --git a/bruno/query-posts.bru b/bruno/query-posts.bru
new file mode 100644
index 0000000..d0361ff
--- /dev/null
+++ b/bruno/query-posts.bru
@@ -0,0 +1,27 @@
+meta {
+ name: Query Posts
+ type: http
+ seq: 1
+}
+
+post {
+ url: http://localhost:4321/api/posts
+ body: json
+ auth: none
+}
+
+body:json {
+ {
+ "filter": {
+ "keyword": "scouting"
+ },
+ "sort": {
+ "mode": "date",
+ "direction": "desc"
+ },
+ "paginate": {
+ "page": 1,
+ "pageSize": 20
+ }
+ }
+}
diff --git a/package.json b/package.json
index 3895ac8..b6cc25b 100644
--- a/package.json
+++ b/package.json
@@ -30,11 +30,13 @@
"@fortawesome/free-brands-svg-icons": "^7.2.0",
"@fortawesome/free-solid-svg-icons": "^7.2.0",
"@fortawesome/react-fontawesome": "^0.2.0",
+ "@nanostores/persistent": "^1.3.3",
"@tailwindcss/vite": "^4.2.1",
"@upstash/redis": "^1.36.4",
"astro": "^6.0.3",
"feedsmith": "2.9.0",
"he": "^1.2.0",
+ "nanostores": "^1.1.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"tailwindcss": "^4.2.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 05ed576..754a0d7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,6 +32,9 @@ importers:
'@fortawesome/react-fontawesome':
specifier: ^0.2.0
version: 0.2.6(@fortawesome/fontawesome-svg-core@7.2.0)(react@19.2.4)
+ '@nanostores/persistent':
+ specifier: ^1.3.3
+ version: 1.3.3(nanostores@1.1.1)
'@tailwindcss/vite':
specifier: ^4.2.1
version: 4.2.1(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))
@@ -47,6 +50,9 @@ importers:
he:
specifier: ^1.2.0
version: 1.2.0
+ nanostores:
+ specifier: ^1.1.1
+ version: 1.1.1
react:
specifier: ^19.2.4
version: 19.2.4
@@ -688,6 +694,12 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ '@nanostores/persistent@1.3.3':
+ resolution: {integrity: sha512-+b4I8xrmjhKE3hQ9V7/b4Xa+MBMkM2P4Ulv33zFEF/+2Hucsb24vTjYiWR8R97y8YdRptmRKlL5Qwy0q1Jj5nQ==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+ peerDependencies:
+ nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0
+
'@napi-rs/wasm-runtime@1.1.1':
resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
@@ -2218,6 +2230,10 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanostores@1.1.1:
+ resolution: {integrity: sha512-EYJqS25r2iBeTtGQCHidXl1VfZ1jXM7Q04zXJOrMlxVVmD0ptxJaNux92n1mJ7c5lN3zTq12MhH/8x59nP+qmg==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@@ -3683,6 +3699,10 @@ snapshots:
- encoding
- supports-color
+ '@nanostores/persistent@1.3.3(nanostores@1.1.1)':
+ dependencies:
+ nanostores: 1.1.1
+
'@napi-rs/wasm-runtime@1.1.1':
dependencies:
'@emnapi/core': 1.8.1
@@ -5454,6 +5474,8 @@ snapshots:
nanoid@3.3.11: {}
+ nanostores@1.1.1: {}
+
natural-compare@1.4.0: {}
neotraverse@0.6.18: {}
diff --git a/public/xslt/opml.xslt b/public/xslt/opml.xslt
index 59bd3a7..23eeb63 100644
--- a/public/xslt/opml.xslt
+++ b/public/xslt/opml.xslt
@@ -9,11 +9,26 @@
+
+
+
+