{"id":50897733,"url":"https://github.com/mratmeyer/rsslookup","last_synced_at":"2026-07-03T16:01:21.721Z","repository":{"id":167796224,"uuid":"494566816","full_name":"mratmeyer/rsslookup","owner":"mratmeyer","description":"A free tool to find the RSS feed for any URL","archived":false,"fork":false,"pushed_at":"2026-05-24T02:14:38.000Z","size":2714,"stargazers_count":114,"open_issues_count":3,"forks_count":13,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-24T02:24:42.669Z","etag":null,"topics":["automation","feed","rss","scraper"],"latest_commit_sha":null,"homepage":"https://www.rsslookup.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mratmeyer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-05-20T18:19:01.000Z","updated_at":"2026-05-24T02:14:41.000Z","dependencies_parsed_at":"2026-01-12T10:01:03.733Z","dependency_job_id":null,"html_url":"https://github.com/mratmeyer/rsslookup","commit_stats":null,"previous_names":["mratmeyer/rsslookup"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mratmeyer/rsslookup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mratmeyer%2Frsslookup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mratmeyer%2Frsslookup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mratmeyer%2Frsslookup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mratmeyer%2Frsslookup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mratmeyer","download_url":"https://codeload.github.com/mratmeyer/rsslookup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mratmeyer%2Frsslookup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35092185,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","feed","rss","scraper"],"created_at":"2026-06-16T01:31:30.077Z","updated_at":"2026-07-03T16:01:21.707Z","avatar_url":"https://github.com/mratmeyer.png","language":"TypeScript","funding_links":[],"categories":["automation"],"sub_categories":[],"readme":"# 🔎 RSS Lookup\n\n[![GitHub Repo stars](https://img.shields.io/github/stars/mratmeyer/rsslookup?style=social)](https://github.com/mratmeyer/rsslookup/stargazers)\n\nRSS Lookup is a free, open-source tool designed to find the RSS feed associated with any URL. Simply paste the website's address, and RSS Lookup will scan the site's HTML and check common feed path conventions to give you the best chance at finding feeds on the site.\n\n**Check out the live tool:** [**www.rsslookup.com**](https://www.rsslookup.com/)\n\n## Features\n\n- **Simple Interface:** Clean, easy-to-use single-page application.\n- **HTML Meta Tag Detection:** Finds feeds specified using standard `\u003clink rel=\"alternate\" type=\"application/rss+xml\"\u003e` (and Atom) tags.\n- **Common Path Fallback:** Checks conventional paths like `/feed`, `/rss.xml`, `/atom.xml` if no tags are found.\n- **Popular Site Rules:** Rules to natively supports popular sites like YouTube, StackExchange, and Reddit.\n- **Abuse Prevention:** Rate limiting via Upstash Redis to prevent abuse (per-IP and per-domain limits).\n- **User-Friendly Results:** Displays found feed URLs clearly and easily copiable.\n- **Modern Tech:** Built with TanStack Start, Vite, and Cloudflare Workers for a seamless full-stack experience at the edge.\n\n## Project Structure\n\nThis repository contains a full-stack application built with TanStack Start:\n\n- `src/routes/`: File-based routing (frontend \u0026 API)\n- `src/components/`: React components\n- `src/lib/`: Shared utilities and server functions\n- `src/styles/`: CSS and Tailwind styles\n- `public/`: Static assets\n- `worker/`: Cloudflare Worker entry point\n\n## Getting Started\n\nFollow these instructions to set up and run the project locally or deploy your own instance.\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) (LTS version recommended, e.g., \u003e= 18)\n- [npm](https://www.npmjs.com/) (usually included with Node.js)\n- An [Upstash Redis](https://upstash.com/) database (for rate limiting - free tier available)\n\n### Setup\n\n1.  **Clone the repository:**\n\n    ```bash\n    git clone https://github.com/mratmeyer/rsslookup.git\n    cd rsslookup\n    ```\n\n2.  **Environment Variables:**\n\n    Create a file named `.env` in the **root** directory. Add the following variables:\n\n    ```dotenv\n    # .env\n\n    # Upstash Redis (for rate limiting)\n    UPSTASH_REDIS_REST_URL=https://your-redis.upstash.io\n    UPSTASH_REDIS_REST_TOKEN=your-token\n    ```\n\n    \u003e **Note:** Rate limiting is optional for local development. If these variables are not set, rate limiting will be disabled.\n\n3.  **Install Dependencies:**\n\n    ```bash\n    npm ci\n    ```\n\n### Running Locally\n\n**Run the Development Server:**\n\n```bash\nnpm run dev\n```\n\nThe application will be available at `http://localhost:3000` (or another port if 3000 is busy).\n\n**Preview with Wrangler (Cloudflare Worker environment):**\n\n```bash\nnpm run dev:wrangler\n```\n\n### Building \u0026 Deploying\n\n**Build the Application:**\n\n```bash\nnpm run build\n```\n\n**Deployment:**\n\nThis application is configured for Cloudflare Workers.\n\nTo deploy to Cloudflare:\n\n```bash\nnpm run deploy\n```\n\nMake sure to set the `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN` environment variables in your Cloudflare dashboard/settings.\n\n## Adding Custom Site Rules\n\nSome websites have RSS feeds but don't advertise them via standard HTML `\u003clink\u003e` tags. Site-specific rules allow RSS Lookup to discover these \"hidden\" feeds by recognizing URL patterns and constructing feed URLs programmatically.\n\nFor example, YouTube doesn't expose channel feeds in page metadata, but every channel has a feed at `youtube.com/feeds/videos.xml?channel_id=...`. The YouTube rule extracts the channel ID from the URL and builds the feed URL.\n\n### Creating a New Rule\n\nRules live in `src/lib/rules/`. Each rule implements the `SiteRule` interface:\n\n```typescript\ninterface SiteRule {\n  name: string;\n  matchesHostname(hostname: string): boolean;\n  extractFeeds(context: RuleContext): void;\n}\n```\n\nFeeds are accessed via `context.feedsMap`. When adding feeds, always set `isFromRule: true`:\n\n```typescript\ncontext.feedsMap.set(feedUrl, { title: \"Feed Title\", isFromRule: true });\n```\n\nThe `isFromRule: true` flag indicates the feed was discovered by a community rule, which displays a special icon in the UI to inform users.\n\n**To add a new rule:**\n\nFor sites with a static list of feeds, use the `StaticFeedRule` base class:\n\n```typescript\nimport { StaticFeedRule } from \"./StaticFeedRule\";\n\nexport const EXAMPLE_FEEDS = [\n  { url: \"https://example.com/feed.xml\", title: \"Example Feed\" },\n] as const;\n\nexport const ExampleRule = new StaticFeedRule(\n  \"Example\",\n  [\"example.com\", \"www.example.com\"],\n  EXAMPLE_FEEDS,\n);\n```\n\nFor sites that need dynamic feed URL construction, implement `SiteRule` directly:\n\n1. Create `src/lib/rules/YourSiteRule.ts`:\n\n   ```typescript\n   import type { SiteRule, RuleContext } from \"./SiteRule\";\n\n   export class YourSiteRule implements SiteRule {\n     readonly name = \"Your Site\";\n\n     matchesHostname(hostname: string): boolean {\n       return hostname === \"example.com\" || hostname === \"www.example.com\";\n     }\n\n     extractFeeds(context: RuleContext): void {\n       context.feedsMap.set(`${context.origin}/feed.xml`, {\n         title: \"Example Feed\",\n         isFromRule: true,\n       });\n     }\n   }\n   ```\n\n2. Register it in `src/lib/rules/index.ts`:\n\n   ```typescript\n   import { YourSiteRule } from \"./YourSiteRule\";\n\n   const rules: SiteRule[] = [\n     // ... existing rules\n     new YourSiteRule(), // or just YourSiteRule for StaticFeedRule instances\n   ];\n   ```\n\n3. Add tests in `tests/lib/rules.test.ts`.\n\n## Available Scripts\n\n- `npm run dev`: Starts the Vite development server.\n- `npm run dev:wrangler`: Builds and starts the development server with Wrangler.\n- `npm run build`: Builds the application for production.\n- `npm run preview`: Locally preview the production build.\n- `npm run deploy`: Builds and deploys the application to Cloudflare Workers.\n- `npm run lint`: Runs ESLint to check for code style issues.\n- `npm run format`: Runs Prettier to format the code.\n\n## License\n\nThis project is open source under the Apache 2.0 License. Please see the `LICENSE` file for details.\n\n---\n\nCreated by **Max Ratmeyer** - [Personal Site](https://www.maxratmeyer.com/?utm_source=rsslookup-github)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmratmeyer%2Frsslookup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmratmeyer%2Frsslookup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmratmeyer%2Frsslookup/lists"}