{"id":27135617,"url":"https://github.com/kamusis/my-opml-subscriptions","last_synced_at":"2026-04-27T20:32:14.030Z","repository":{"id":286639338,"uuid":"961725158","full_name":"kamusis/my-opml-subscriptions","owner":"kamusis","description":"A Deno-based OPML feed validator and analyzer that helps clean up RSS subscriptions by identifying dead, inactive, and incompatible feeds while organizing active feeds by update frequency.","archived":false,"fork":false,"pushed_at":"2025-04-18T10:44:05.000Z","size":280,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-18T17:36:23.054Z","etag":null,"topics":["deno","rss-feed","typescript"],"latest_commit_sha":null,"homepage":"https://kamusis-my-opml-sub.deno.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kamusis.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}},"created_at":"2025-04-07T04:16:11.000Z","updated_at":"2025-04-18T10:44:08.000Z","dependencies_parsed_at":"2025-04-10T00:12:23.509Z","dependency_job_id":null,"html_url":"https://github.com/kamusis/my-opml-subscriptions","commit_stats":null,"previous_names":["kamusis/my-opml-subscriptions"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kamusis/my-opml-subscriptions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamusis%2Fmy-opml-subscriptions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamusis%2Fmy-opml-subscriptions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamusis%2Fmy-opml-subscriptions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamusis%2Fmy-opml-subscriptions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kamusis","download_url":"https://codeload.github.com/kamusis/my-opml-subscriptions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamusis%2Fmy-opml-subscriptions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32354566,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"ssl_error","status_checked_at":"2026-04-27T20:07:00.910Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["deno","rss-feed","typescript"],"created_at":"2025-04-08T01:48:58.059Z","updated_at":"2026-04-27T20:32:14.014Z","avatar_url":"https://github.com/kamusis.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OPML Feed Validator and Analyzer\n\nA Deno-based tool for validating and analyzing OPML feed subscriptions. This tool helps you clean up your RSS feed subscriptions by identifying dead feeds, inactive feeds, incompatible feeds, and sorting active feeds based on their update frequency.\n\n## Frontend Usage\n\n- Visit [https://kamusis-my-opml-sub.deno.dev/](https://kamusis-my-opml-sub.deno.dev/)\n- Upload -\u003e Validate -\u003e Export\n![58560](https://s2.loli.net/2025/04/18/dBHu38on64Xlc1F.png)\n\n## Frontend Features\n\n- No sign-up or login required\n- Each user is automatically assigned a unique ID (UUID), which is stored in your browser's local storage\n- If you use a new browser or clear your browser data, you will need to re-upload your OPML file\n- Your feeds are securely and persistently stored in a Deno KV database\n- Your feeds are private—other users cannot view them\n\n## Backend Features\n\n- **Feed Validation**: Checks each feed's accessibility, compatibility, and update status\n- **Feed Classification**:\n  - Active: Feeds updated within the last 2 years\n  - Inactive: Feeds not updated in the last 2 years\n  - Dead: Feeds that are inaccessible\n  - Incompatible: Feeds that are accessible but have format issues (e.g., wrong Content-Type, empty feeds)\n- **Update Frequency Analysis**: Tracks the number of updates in the last 3 months\n- **Category-based Organization**: Maintains feed organization by categories\n- **Statistical Analysis**: Generates detailed statistics in markdown format\n- **Multiple Output Formats**: Generates separate OPML files for active, inactive, dead, and incompatible feeds\n\n## Prerequisites (Backend)\n\n- [Deno](https://deno.land/) 2.x or higher\n- macOS, Linux, or Windows\n\n## Installation\n\n1. Clone this repository:\n```bash\ngit clone https://github.com/yourusername/my-opml-subscriptions.git\ncd my-opml-subscriptions\n```\n\n## Pure Backend Usage (without Web UI)\n\n1. Place your OPML file in the `feeds` directory\n\n2. Run the validator:\n```bash\ndeno run --allow-read --allow-write --allow-net src/backend/main.ts feeds/your-file.opml\n```\n\nOr use the predefined task in deno.json:\n```bash\ndeno task backend:start feeds/your-file.opml\n```\n\n### Output Files\n\nThe tool generates several files in the `feeds` directory:\n- `*-active.opml`: Contains only active feeds, sorted by update frequency\n- `*-inactive.opml`: Contains inactive feeds\n- `*-dead.opml`: Contains inaccessible feeds\n- `*-incompatible.opml`: Contains feeds with format issues\n- `processing_statistics_*.md`: Statistical analysis report with detailed breakdown of feed statuses and error categories\n\n## Project Structure (Backend main modules only)\n\n```\n├── design/\n│   └── design-backend.md           # Project design documentation\n├── feeds/                          # Input and output OPML files\n├── src/backend/                    # Backend source code\n│   ├── main.ts                     # Main entry point\n│   ├── parseOPML.ts                # OPML parsing logic\n│   ├── checkFeedAccessibility.ts   # Feed accessibility checker\n│   ├── checkFeedCompatibility.ts   # Feed format compatibility checker\n│   ├── getFeedUpdateFrequency.ts   # Feed update frequency analyzer\n│   ├── generateNewOPML.ts          # OPML generation logic\n│   └── writeStatistics.ts          # Statistics generation\n├── deno.json                       # Deno configuration\n└── README.md                       # This file\n```\n\n## Statistics Generated\n\nThe tool generates comprehensive statistics including:\n- Total number of feeds processed\n- Distribution of feed statuses (active/inactive/dead/incompatible)\n- Top categories with the most active feeds\n- Most frequently updated feeds\n- Detailed analysis of incompatible feeds with error categories and affected URLs\n\n## Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Acknowledgments\n\n- Built with [Deno](https://deno.land/)\n- Uses XML parsing from Deno standard library","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamusis%2Fmy-opml-subscriptions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkamusis%2Fmy-opml-subscriptions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamusis%2Fmy-opml-subscriptions/lists"}