diff --git a/demo/README.md b/demo/README.md
index 0daa7bc..7a2d23d 100644
--- a/demo/README.md
+++ b/demo/README.md
@@ -15,3 +15,20 @@ Because `out_dir` in [`demo/repub.toml`](/home/abel/src/guardianproject/anynews/
## Files
- `repub.toml`: example runtime config with feed definitions and Scrapy overrides
+- `fixtures/local-feed.rss`: simple local RSS fixture for `file://` feed testing
+
+## Local File Feed
+
+`repub` already accepts absolute `file://` feed URIs. To point it at the demo fixture, generate an absolute URI like this from the repo root:
+
+```shell
+python3 -c 'from pathlib import Path; print(Path("demo/fixtures/local-feed.rss").resolve().as_uri())'
+```
+
+Then use that value in a config entry:
+
+```toml
+[[feeds]]
+name = "local-demo"
+url = "file:///absolute/path/to/demo/fixtures/local-feed.rss"
+```
diff --git a/demo/fixtures/local-feed.rss b/demo/fixtures/local-feed.rss
new file mode 100644
index 0000000..993e1c4
--- /dev/null
+++ b/demo/fixtures/local-feed.rss
@@ -0,0 +1,16 @@
+
+
+
+ Local Demo Feed
+ https://example.com/
+ Simple local RSS fixture for file:// testing
+ en
+ -
+ Local Demo Entry
+ https://example.com/local-demo-entry
+ Hello from a local file feed.
+ https://example.com/local-demo-entry
+ Sat, 29 Mar 2026 12:00:00 GMT
+
+
+
diff --git a/tests/test_file_feeds.py b/tests/test_file_feeds.py
new file mode 100644
index 0000000..584562a
--- /dev/null
+++ b/tests/test_file_feeds.py
@@ -0,0 +1,36 @@
+from pathlib import Path
+
+from repub import entrypoint as entrypoint_module
+
+
+def test_entrypoint_supports_file_feed_urls(tmp_path: Path, monkeypatch) -> None:
+ fixture_path = (
+ Path(__file__).resolve().parents[1] / "demo" / "fixtures" / "local-feed.rss"
+ ).resolve()
+ config_path = tmp_path / "repub.toml"
+ config_path.write_text(
+ f"""
+out_dir = "out"
+
+[[feeds]]
+name = "local-file"
+url = "{fixture_path.as_uri()}"
+
+[scrapy.settings]
+LOG_LEVEL = "ERROR"
+DOWNLOAD_TIMEOUT = 5
+""".strip()
+ + "\n",
+ encoding="utf-8",
+ )
+
+ monkeypatch.setattr(entrypoint_module, "check_runtime", lambda *_: True)
+
+ exit_code = entrypoint_module.entrypoint(["--config", str(config_path)])
+
+ output_path = tmp_path / "out" / "local-file.rss"
+ assert exit_code == 0
+ assert output_path.exists()
+ output = output_path.read_text(encoding="utf-8")
+ assert "
Local Demo Feed" in output
+ assert "Local Demo Entry" in output