Skip to content

Commit 53fad18

Browse files
docs: funnel through quickstart and consolidate (#1147)
* docs: simplify getting started around url-to-rss * docs: align with quickstart * docs: reorganize web-application flow and remove duplication * docs: refine root index funnel and document user journey in AGENTS.md * docs: rename how-to to guides and normalize internal links * docs: consolidate Get Involved section and fix broken internal links * docs: unify Feed Directory terminology * style: prettier * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Gil Desmarais <gildesmarais@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent 14309b8 commit 53fad18

44 files changed

Lines changed: 362 additions & 579 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

AGENTS.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,21 @@ Preferred verification flow for docs/content changes:
6767

6868
## Docs Authoring Rules
6969

70+
### User Journey Funnel
71+
72+
Maintain a directed "funnel" for documentation to maximize user success and conversion:
73+
74+
1. **Phase 1: Quickstart (Local Demo)** — The primary entry point. Run `html2rss-web` with Docker and generate a feed from a page URL in minutes.
75+
2. **Phase 2: Production (Deployment)** — The goal for invested users. Move to a stable, production-ready instance.
76+
3. **Phase 3: Refinement (Custom Configs)** — Secondary optimization. Author custom YAML configs only when automatic generation needs precise control.
77+
78+
**Rules for Funnel Maintenance:**
79+
80+
- Avoid branching paths in introductory pages; always point toward the next phase in the funnel.
81+
- Define "html2rss-web" as the primary interface and "page-to-RSS" as the primary workflow.
82+
- Use "Feed Directory" consistently to refer to the pre-built feed catalog; avoid terms like "catalog", "included feeds", or "packaged configs" in user-facing docs.
83+
- Do not introduce new terminology (e.g., "toolkit") or unrelated infrastructure concepts (e.g., "custom domains") unless they are essential to a specific guide.
84+
7085
### Code Snippets
7186

7287
In docs content (`src/content/docs/**`) and docs-supporting components:

astro.config.mjs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ export default defineConfig({
1313
"/components/html2rss": "/ruby-gem/",
1414
"/components/html2rss-configs": "/creating-custom-feeds/",
1515
"/components": "/",
16+
"/web-application/how-to/deployment": "/web-application/deployment/",
17+
"/web-application/how-to/automatic-updates": "/web-application/deployment/#auto-update-with-watchtower",
18+
"/web-application/how-to/use-automatic-feed-generation":
19+
"/web-application/guides/use-the-feed-directory/",
20+
"/web-application/how-to/use-automatic-feed-generation/":
21+
"/web-application/guides/use-the-feed-directory/",
22+
"/web-application/how-to": "/web-application/guides/",
23+
"/ruby-gem/how-to/dynamic-parameters": "/ruby-gem/guides/dynamic-parameters/",
24+
"/ruby-gem/how-to/dynamic-parameters/": "/ruby-gem/guides/dynamic-parameters/",
25+
"/ruby-gem/how-to": "/ruby-gem/guides/",
26+
"/ruby-gem/tutorials": "/ruby-gem/guides/",
27+
"/ruby-gem/tutorials/": "/ruby-gem/guides/",
28+
"/web-application/guides/use-included-configs": "/web-application/guides/use-the-feed-directory/",
1629
},
1730
build: {
1831
inlineStylesheets: "auto",
@@ -249,34 +262,31 @@ export default defineConfig({
249262
sidebar: [
250263
{
251264
label: "Getting Started",
252-
link: "/getting-started",
265+
link: "/getting-started/",
253266
},
254267
{
255268
label: "Feed Directory",
256269
link: "/feed-directory/",
257270
},
258271
{
259272
label: "Create Custom Feeds",
260-
link: "/creating-custom-feeds",
273+
link: "/creating-custom-feeds/",
261274
},
262275
{
263276
label: "Web Application",
264277
collapsed: true,
265278
items: [
266279
"web-application",
267280
"web-application/getting-started",
281+
"web-application/deployment",
268282
{
269-
label: "How-to",
270-
autogenerate: { directory: "web-application/how-to" },
283+
label: "Guides",
284+
autogenerate: { directory: "web-application/guides" },
271285
},
272286
{
273287
label: "Reference",
274288
autogenerate: { directory: "web-application/reference" },
275289
},
276-
{
277-
label: "Tutorials",
278-
autogenerate: { directory: "web-application/tutorials" },
279-
},
280290
],
281291
},
282292
{
@@ -286,22 +296,22 @@ export default defineConfig({
286296
"ruby-gem",
287297
"ruby-gem/installation",
288298
{
289-
label: "How-to",
290-
autogenerate: { directory: "ruby-gem/how-to" },
291-
},
292-
{
293-
label: "Reference",
294-
autogenerate: { directory: "ruby-gem/reference" },
299+
label: "Guides",
300+
autogenerate: { directory: "ruby-gem/guides" },
295301
},
296302
{
297303
label: "Tutorials",
298304
autogenerate: { directory: "ruby-gem/tutorials" },
299305
},
306+
{
307+
label: "Reference",
308+
autogenerate: { directory: "ruby-gem/reference" },
309+
},
300310
],
301311
},
302312
{
303313
label: "About",
304-
link: "/about",
314+
link: "/about/",
305315
},
306316
{
307317
label: "Get Involved",

examples/deployment/.env

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
1-
# Domain & routing
2-
CADDY_HOST=example.com
3-
4-
# Core runtime
5-
RACK_ENV=production
6-
7-
# Security
1+
# Production secrets
82
# Generate with: openssl rand -hex 32
93
HTML2RSS_SECRET_KEY=replace-with-64-hex-characters-generated-by-openssl-rand-hex-32
104

11-
# Authenticated health endpoint token
12-
# Required by the documented Compose stack.
13-
# If you build a custom stack and probe only /api/v1/health/live and /api/v1/health/ready,
14-
# you can omit this value.
15-
HEALTH_CHECK_TOKEN=replace-with-strong-health-token
16-
17-
# Auto source (optional; keep false unless you need automatic feed generation)
18-
AUTO_SOURCE_ENABLED=false
5+
# Web UI / feed creation token
6+
# Paste this into the web app when it asks for an access token.
7+
HTML2RSS_ACCESS_TOKEN=replace-with-strong-access-token
198

20-
# Observability (optional)
21-
#SENTRY_DSN=
9+
# Optional authenticated health token
10+
# Set this only if you plan to use GET /api/v1/health instead of /api/v1/health/ready.
11+
# HEALTH_CHECK_TOKEN=replace-with-strong-health-token
2212

23-
# Performance tuning (override defaults only when needed)
24-
WEB_CONCURRENCY=2
25-
WEB_MAX_THREADS=5
26-
RACK_TIMEOUT_SERVICE_TIMEOUT=15
13+
# `AUTO_SOURCE_ENABLED=true` and `BOTASAURUS_SCRAPER_URL=http://botasaurus:4010`
14+
# come from docker-compose.yml in this example.

examples/deployment/docker-compose.yml

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,13 @@ services:
66
- path: .env
77
required: false
88
environment:
9+
RACK_ENV: production
910
PORT: 4000
11+
HTML2RSS_SECRET_KEY: ${HTML2RSS_SECRET_KEY:?set HTML2RSS_SECRET_KEY}
12+
HTML2RSS_ACCESS_TOKEN: ${HTML2RSS_ACCESS_TOKEN:?set HTML2RSS_ACCESS_TOKEN}
13+
AUTO_SOURCE_ENABLED: "true"
1014
BOTASAURUS_SCRAPER_URL: http://botasaurus:4010
1115

1216
botasaurus:
1317
image: html2rss/botasaurus-scrape-api:latest
1418
restart: unless-stopped
15-
16-
caddy:
17-
image: caddy:2-alpine
18-
depends_on:
19-
- html2rss-web
20-
command:
21-
- caddy
22-
- reverse-proxy
23-
- --from
24-
- ${CADDY_HOST}
25-
- --to
26-
- html2rss-web:4000
27-
ports:
28-
- "80:80"
29-
- "443:443"
30-
volumes:
31-
- caddy_data:/data
32-
33-
watchtower:
34-
image: containrrr/watchtower
35-
depends_on:
36-
- html2rss-web
37-
- caddy
38-
- botasaurus
39-
command:
40-
- --cleanup
41-
- --interval
42-
- "7200"
43-
volumes:
44-
- /var/run/docker.sock:/var/run/docker.sock:ro
45-
restart: unless-stopped
46-
47-
volumes:
48-
caddy_data:

src/components/docs/AutoGenerationOptional.astro

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Aside } from "@astrojs/starlight/components";
33
---
44

55
<Aside type="note" title="Automatic generation may be disabled">
6-
The direct `Create a feed` workflow is not enabled on every deployment. If you want that path, continue with
7-
<a href="/web-application/how-to/use-automatic-feed-generation/">Use automatic feed generation</a>.
6+
The Feed Directory is the fallback path when it already covers your site. If you want the primary page-URL
7+
flow on your own instance, continue with
8+
<a href="/web-application/guides/use-automatic-feed-generation/">Use automatic feed generation</a>.
89
</Aside>

src/components/docs/DockerComposeSnippet.astro

Lines changed: 10 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
import { Code } from "@astrojs/starlight/components";
3-
import { botasaurusImage, browserlessImage, caddyImage, watchtowerImage, webImage } from "../../data/docker";
3+
import { botasaurusImage, caddyImage, watchtowerImage, webImage } from "../../data/docker";
44
55
interface Props {
66
variant: "minimal" | "productionCaddy" | "secure" | "watchtower" | "resourceGuardrails";
@@ -12,35 +12,15 @@ const snippets: Record<Props["variant"], string> = {
1212
minimal: `services:
1313
html2rss-web:
1414
image: ${webImage}
15-
restart: unless-stopped
1615
ports:
1716
- "127.0.0.1:4000:4000"
18-
env_file:
19-
- path: .env
20-
required: false
2117
environment:
22-
RACK_ENV: production
23-
PORT: 4000
24-
HTML2RSS_SECRET_KEY: \${HTML2RSS_SECRET_KEY:?set HTML2RSS_SECRET_KEY}
25-
HEALTH_CHECK_TOKEN: \${HEALTH_CHECK_TOKEN:?set HEALTH_CHECK_TOKEN}
26-
SENTRY_DSN: \${SENTRY_DSN:-}
27-
BROWSERLESS_IO_WEBSOCKET_URL: ws://browserless:4002
28-
BROWSERLESS_IO_API_TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}
18+
RACK_ENV: development
19+
HTML2RSS_ACCESS_TOKEN: CHANGE_ME_ADMIN_TOKEN
2920
BOTASAURUS_SCRAPER_URL: http://botasaurus:4010
3021
3122
botasaurus:
32-
image: ${botasaurusImage}
33-
restart: unless-stopped
34-
35-
browserless:
36-
image: "${browserlessImage}"
37-
restart: unless-stopped
38-
ports:
39-
- "127.0.0.1:4002:4002"
40-
environment:
41-
PORT: 4002
42-
CONCURRENT: 10
43-
TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}`,
23+
image: ${botasaurusImage}`,
4424
productionCaddy: `services:
4525
caddy:
4626
image: ${caddyImage}
@@ -68,24 +48,15 @@ const snippets: Record<Props["variant"], string> = {
6848
RACK_ENV: production
6949
PORT: 4000
7050
HTML2RSS_SECRET_KEY: \${HTML2RSS_SECRET_KEY:?set HTML2RSS_SECRET_KEY}
71-
HEALTH_CHECK_TOKEN: \${HEALTH_CHECK_TOKEN:?set HEALTH_CHECK_TOKEN}
51+
HTML2RSS_ACCESS_TOKEN: \${HTML2RSS_ACCESS_TOKEN:?set HTML2RSS_ACCESS_TOKEN}
52+
AUTO_SOURCE_ENABLED: "true"
7253
SENTRY_DSN: \${SENTRY_DSN:-}
73-
BROWSERLESS_IO_WEBSOCKET_URL: ws://browserless:4002
74-
BROWSERLESS_IO_API_TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}
7554
BOTASAURUS_SCRAPER_URL: http://botasaurus:4010
7655
7756
botasaurus:
7857
image: ${botasaurusImage}
7958
restart: unless-stopped
8059
81-
browserless:
82-
image: "${browserlessImage}"
83-
restart: unless-stopped
84-
environment:
85-
PORT: 4002
86-
CONCURRENT: 10
87-
TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}
88-
8960
volumes:
9061
caddy_data:`,
9162
secure: `services:
@@ -99,23 +70,14 @@ volumes:
9970
RACK_ENV: production
10071
PORT: 4000
10172
HTML2RSS_SECRET_KEY: \${HTML2RSS_SECRET_KEY:?set HTML2RSS_SECRET_KEY}
102-
HEALTH_CHECK_TOKEN: \${HEALTH_CHECK_TOKEN:?set HEALTH_CHECK_TOKEN}
73+
HTML2RSS_ACCESS_TOKEN: \${HTML2RSS_ACCESS_TOKEN:?set HTML2RSS_ACCESS_TOKEN}
74+
AUTO_SOURCE_ENABLED: "true"
10375
SENTRY_DSN: \${SENTRY_DSN:-}
104-
BROWSERLESS_IO_WEBSOCKET_URL: ws://browserless:4002
105-
BROWSERLESS_IO_API_TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}
10676
BOTASAURUS_SCRAPER_URL: http://botasaurus:4010
10777
10878
botasaurus:
10979
image: ${botasaurusImage}
110-
restart: unless-stopped
111-
112-
browserless:
113-
image: "${browserlessImage}"
114-
restart: unless-stopped
115-
environment:
116-
PORT: 4002
117-
CONCURRENT: 10
118-
TOKEN: \${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}`,
80+
restart: unless-stopped`,
11981
watchtower: `services:
12082
watchtower:
12183
image: ${watchtowerImage}
@@ -124,7 +86,7 @@ volumes:
12486
- /var/run/docker.sock:/var/run/docker.sock:ro
12587
# Optional for private registries only:
12688
# - "\${HOME}/.docker/config.json:/config.json:ro"
127-
command: --cleanup --interval 7200 html2rss-web botasaurus browserless caddy`,
89+
command: --cleanup --interval 7200 html2rss-web botasaurus caddy`,
12890
resourceGuardrails: `services:
12991
html2rss-web:
13092
image: ${webImage}

src/content/docs/common-use-cases.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,6 @@ Follow multiple open source projects and their updates.
9191

9292
## Next Steps
9393

94-
- **[Run html2rss-web with Docker](/web-application/getting-started)** to verify your own instance.
95-
- **[Use automatic feed generation](/web-application/how-to/use-automatic-feed-generation/)** when you want direct page-URL conversion.
94+
- **[Run html2rss-web with Docker](/web-application/getting-started/)** to verify your own instance.
95+
- **[Use automatic feed generation](/web-application/guides/use-automatic-feed-generation/)** when you want direct page-URL conversion.
9696
- **[Create custom feeds](/creating-custom-feeds/)** when you need stable, reviewable extraction rules.

src/content/docs/creating-custom-feeds.mdx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Aside, Code } from "@astrojs/starlight/components";
99

1010
When existing feeds or auto-sourcing are not enough, write a YAML config for the site you want to follow.
1111

12-
**Prerequisites:** You should be familiar with the [Getting Started](/getting-started) guide before diving into custom configurations.
12+
**Prerequisites:** You should be familiar with the [Getting Started](/getting-started/) guide before diving into custom configurations.
1313

1414
<Aside type="tip" title="Use this guide when you need more control">
1515
Reach for a custom config when you need stable, reviewable extraction rules or generated output misses
@@ -117,9 +117,9 @@ This says: "Find each article, get the title from the h2 anchor, and get the lin
117117
lang="yaml"
118118
/>
119119

120-
**Step 3:** Test it with your html2rss-web instance or the [Ruby gem](/ruby-gem/installation).
120+
**Step 3:** Test it with your html2rss-web instance or the [Ruby gem](/ruby-gem/installation/).
121121

122-
**Need help?** See our [troubleshooting guide](/troubleshooting/troubleshooting) for common issues.
122+
**Need help?** See our [troubleshooting guide](/troubleshooting/troubleshooting/) for common issues.
123123

124124
---
125125

@@ -186,7 +186,7 @@ there.
186186
2. Click "Fork" → "Add file" → Create `domain.com.yml`
187187
3. Paste your config → "Commit new file" → "Open pull request"
188188

189-
**Need help?** See our [contribution guide](/get-involved/contributing) for detailed instructions.
189+
**Need help?** See our [contribution guide](/get-involved/contributing/) for detailed instructions.
190190

191191
---
192192

@@ -200,7 +200,7 @@ there.
200200
- **Missing content?** Try a browser-based rendering strategy during troubleshooting
201201
- **Wrong data extracted?** Verify your selectors are pointing to the right elements
202202

203-
**Need more help?** See our [comprehensive troubleshooting guide](/troubleshooting/troubleshooting) or ask in [GitHub Discussions](https://github.com/orgs/html2rss/discussions).
203+
**Need more help?** See our [comprehensive troubleshooting guide](/troubleshooting/troubleshooting/) or ask in [GitHub Discussions](https://github.com/orgs/html2rss/discussions).
204204

205205
---
206206

@@ -212,7 +212,7 @@ there.
212212

213213
**For Beginners:**
214214

215-
- **[Run html2rss-web with Docker](/web-application/getting-started)** - Use the newest integrated behavior
215+
- **[Run html2rss-web with Docker](/web-application/getting-started/)** - Use the newest integrated behavior
216216
- **[Learn more about selectors](/ruby-gem/reference/selectors/)** - Master CSS selectors
217217
- **[Submit your config via GitHub Web](https://github.com/html2rss/html2rss-configs)** - No Git knowledge required!
218218

@@ -221,4 +221,4 @@ there.
221221
- **[Browse existing configs](https://github.com/html2rss/html2rss-configs/tree/master/lib/html2rss/configs)** - See real examples
222222
- **[Join discussions](https://github.com/orgs/html2rss/discussions)** - Connect with other users
223223
- **[Learn about strategies](/ruby-gem/reference/strategy/)** - Decide when to use static vs JavaScript/browser-based extraction
224-
- **[Learn advanced features](/ruby-gem/how-to/advanced-features/)** - Take your configs to the next level
224+
- **[Learn advanced features](/ruby-gem/guides/advanced-features/)** - Take your configs to the next level

src/content/docs/feed-directory/index.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ import FeedDirectory from "../../../components/FeedDirectory.astro";
1414

1515
---
1616

17+
Need the main onboarding path first? Start with [Getting Started](/web-application/getting-started/) and create a feed from your own page URL. The directory below is the packaged fallback/catalog path for fast demos, known sample sources, or cases where the catalog already covers your site.
18+
1719
Need a different instance? You can use the built-in default, self-host your own, or find more options on the [community-run wiki](https://github.com/html2rss/html2rss-web/wiki/Instances).
1820

19-
[🚀 Host Your Own Instance (and share it!)](/web-application/how-to/deployment)
21+
[🚀 Host Your Own Instance (and share it!)](/web-application/deployment/)
2022

2123
---
2224

0 commit comments

Comments
 (0)