{"id":19233706,"url":"https://github.com/brightdigit/syndikit","last_synced_at":"2025-10-30T13:19:58.951Z","repository":{"id":45869909,"uuid":"378938312","full_name":"brightdigit/SyndiKit","owner":"brightdigit","description":"Swift Package for Decoding RSS Feeds.","archived":false,"fork":false,"pushed_at":"2025-08-22T14:54:06.000Z","size":7225,"stargazers_count":61,"open_issues_count":3,"forks_count":5,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-24T04:28:38.978Z","etag":null,"topics":["rss","swift","swiftpackagemanager"],"latest_commit_sha":null,"homepage":"https://syndikit.work","language":"Swift","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/brightdigit.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}},"created_at":"2021-06-21T13:22:49.000Z","updated_at":"2025-08-22T14:53:13.000Z","dependencies_parsed_at":"2022-09-14T12:01:24.114Z","dependency_job_id":"6199bc89-a357-4d37-ad09-8e3886fed1c4","html_url":"https://github.com/brightdigit/SyndiKit","commit_stats":{"total_commits":88,"total_committers":1,"mean_commits":88.0,"dds":0.0,"last_synced_commit":"3777765645a0ca25a2cdd53df5a901a492315800"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/brightdigit/SyndiKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brightdigit%2FSyndiKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brightdigit%2FSyndiKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brightdigit%2FSyndiKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brightdigit%2FSyndiKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brightdigit","download_url":"https://codeload.github.com/brightdigit/SyndiKit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brightdigit%2FSyndiKit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278722770,"owners_count":26034461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"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":["rss","swift","swiftpackagemanager"],"created_at":"2024-11-09T16:11:37.277Z","updated_at":"2025-10-07T04:50:41.948Z","avatar_url":"https://github.com/brightdigit.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"SyndiKit\" title=\"SyndiKit\" src=\"Assets/logo.svg\" height=\"200\"\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e \u003ca href=\"https://syndikit.dev/\"\u003eSyndiKit\u003c/a\u003e \u003c/h1\u003e\n\nSwift Package built on top of [XMLCoder](https://github.com/CoreOffice/XMLCoder) for Decoding RSS Feeds. Check out the [DocC-Built Site!](https://syndikit.dev/)\n\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fbrightdigit%2FSyndiKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/brightdigit/SyndiKit)\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fbrightdigit%2FSyndiKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/brightdigit/SyndiKit)\n\n[![Static Badge](https://img.shields.io/badge/-Source_Compatibility-white?logo=swift\u0026link=https%3A%2F%2Fwww.swift.org%2Fdocumentation%2Fsource-compatibility%2F)](https://www.swift.org/documentation/source-compatibility/)\n[![DocC](https://img.shields.io/badge/DocC-read-success?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjE0IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTQiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxNCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTQiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249Ijk2LjAiCiAgIHRpZmY6WVJlc29sdXRpb249Ijk2LjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjMiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDgtMDRUMTU6MzA6MjUtMDQ6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmJ/d+MAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRzytEURTHP/NDJkaEhYXFpBmrIT9qYqPMpKEmTWOUwWbmmR9qfrzem0mTrbKdosTGrwV/AVtlrRSRkp2yJjboOc+okcy5nXs+93vvOd17LlijWSWn2wcgly9qkaDfNRebdzU+4sBOOx7ccUVXx8PhEHXt7QaLGa/6zFr1z/1rzUtJXQGLQ3hMUbWi8KRwaKWomrwp3Klk4kvCx8JeTS4ofG3qiSo/mZyu8ofJWjQSAGubsCv9ixO/WMloOWF5Oe5ctqT83Md8iTOZn52R2CPejU6EIH5cTDFBAB+DjMrso48h+mVFnfyB7/xpCpKryKxSRmOZNBmKeEUtSfWkxJToSRlZymb///ZVTw0PVas7/dDwYBgvHmjcgM+KYbzvG8bnAdju4Sxfyy/swcir6JWa5t6F1jU4Oa9piS04XYeuOzWuxb8lm7g1lYLnI2iJQcclNC1Ue/azz+EtRFflqy5gewd65Xzr4hdYDGff+AQ5OQAAADBQTFRFDGnVkeT/Arf8AAAADUa77vr/DZX9Y9X/A8P/Nc//0vH/DWfWBKj1C4zwnN3/JkXJIU7IDQAAABB0Uk5T////////////////////AOAjXRkAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABkSURBVAiZY/gPAQz////o6AfTs9Z1gOj2cKnwjv8MP7rini8V6mf4MXFp6aqgHoZPnfOiVmmcZ/h2oqmuqNef4VuOhpISC5BOu9RxwMWf4f+3uxdY/EHm3L3AADbvL+9+MA0GABhFRINKb0NBAAAAAElFTkSuQmCC)](https://syndikit.dev/)\n[![Twitter](https://img.shields.io/badge/twitter-@brightdigit-blue.svg?style=flat)](http://twitter.com/brightdigit)\n![GitHub](https://img.shields.io/github/license/brightdigit/SyndiKit)\n[![SyndiKit](https://github.com/brightdigit/SyndiKit/actions/workflows/syndikit.yml/badge.svg)](https://github.com/brightdigit/SyndiKit/actions/workflows/syndikit.yml)\n![GitHub issues](https://img.shields.io/github/issues/brightdigit/SyndiKit)\n\n\n[![Codecov](https://img.shields.io/codecov/c/github/brightdigit/SyndiKit)](https://codecov.io/gh/brightdigit/SyndiKit)\n[![CodeFactor](https://www.codefactor.io/repository/github/brightdigit/syndikit/badge)](https://www.codefactor.io/repository/github/brightdigit/syndikit)\n[![codebeat badge](https://codebeat.co/badges/4990904e-9513-451f-a842-fb52c7ae0971)](https://codebeat.co/projects/github-com-brightdigit-syndikit-main)\n[![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/brightdigit/SyndiKit)](https://codeclimate.com/github/brightdigit/SyndiKit)\n[![Code Climate technical debt](https://img.shields.io/codeclimate/tech-debt/brightdigit/SyndiKit?label=debt)](https://codeclimate.com/github/brightdigit/SyndiKit)\n[![Code Climate issues](https://img.shields.io/codeclimate/issues/brightdigit/SyndiKit)](https://codeclimate.com/github/brightdigit/SyndiKit)\n[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)\n\n## Table of Contents\n\n\n* [Introduction](#introduction)\n* [Features](#features)\n* [Installation](#installation)\n  * [Requirements](#requirements)\n  * [Swift Package Manager](#swift-package-manager)\n* [Usage](#usage)\n  * [Decoding Your First Feed](#decoding-your-first-feed)\n  * [Working with Abstractions](#working-with-abstractions)\n  * [Specifying Formats](#specifying-formats)\n  * [Accessing Extensions](#accessing-extensions)\n* [Documentation](#documentation)\n  * [DocC](https://syndikit.dev)\n  * [GitHub SourceDocs](/Documentation/Reference/SyndiKit/README.md)\n* [Roadmap](#roadmap)\n* [License](#license)\n\n## Introduction\n\nBuilt on top of [XMLCoder](https://github.com/CoreOffice/XMLCoder), SyndiKit can be used to import and read site data whether from a WordPress site, RSS feeds, YouTube channel or podcast.\n\n## Features\n\n* Import of RSS 2.0, Atom, and JSONFeed formats\n* Extensions for iTunes-compatabile podcasts, YouTube channels, as well as WordPress export data\n* User-friendly errors \n* Abstractions for format-agnostic parsing \n\n## Installation\n\n### Requirements \n\n**Apple Platforms**\n\n- Xcode 13.3 or later\n- Swift 5.5.2 or later\n- iOS 15.4 / watchOS 8.5 / tvOS 15.4 / macOS 12.3 or later deployment targets\n\n**Linux**\n\n- Ubuntu 18.04 or later\n- Swift 5.5.2 or later\n\n### Swift Package Manager\n\nSwift Package Manager is Apple's decentralized dependency manager to integrate libraries to your Swift projects. It is now fully integrated with Xcode 11.\n\nTo integrate **SyndiKit** into your project using SPM, specify it in your Package.swift file:\n\n```swift    \nlet package = Package(\n  ...\n  dependencies: [\n    .package(url: \"https://github.com/brightdigit/SyndiKit\", from: \"0.3.0\")\n  ],\n  targets: [\n      .target(\n          name: \"YourTarget\",\n          dependencies: [\"SyndiKit\", ...]),\n      ...\n  ]\n)\n```\n\nIf this is for an Xcode project simply import the repo at:\n\n```\nhttps://github.com/brightdigit/SyndiKit\n```\n    \n## Usage\n\nSyndiKit provides models and utilities for decoding RSS feeds of various formats and extensions.\n\n### Decoding Your First Feed\n\nYou can get started decoding your feed by creating your first ``SynDecoder``. Once you've created you decoder you can decode using ``SynDecoder/decode(_:)``:\n\n```swift\nlet decoder = SynDecoder()\nlet empowerAppsData = Data(contentsOf: \"empowerapps-show.xml\")!\nlet empowerAppsRSSFeed = try decoder.decode(empowerAppsData)\n```\n\n### Working with Abstractions\n\nRather than working directly with the various formats, **SyndiKit** abstracts many of the common properties of the various formats. This enables developers to be agnostic regarding the specific format.\n\n```swift\nlet decoder = SynDecoder()\n\n// decoding a RSS 2.0 feed\nlet empowerAppsData = Data(contentsOf: \"empowerapps-show.xml\")!\nlet empowerAppsRSSFeed = try decoder.decode(empowerAppsData)\nprint(empowerAppsRSSFeed.title) // Prints \"Empower Apps\"\n\n// decoding a Atom feed from YouTube\nlet kiloLocoData = Data(contentsOf: \"kilo.youtube.xml\")!\nlet kiloLocoAtomFeed = try decoder.decode(kiloLocoData)\nprint(kiloLocoAtomFeed.title) // Prints \"Kilo Loco\"\n```\n\n### Specifying Formats \n\nIf you wish to access properties of specific formats, you can attempt to cast the objects to see if they match:\n\n```swift\nlet empowerAppsRSSFeed = try decoder.decode(empowerAppsData)\nif let rssFeed = empowerAppsRSSFeed as? RSSFeed {\n  print(rssFeed.channel.title) // Prints \"Empower Apps\"\n}\n\nlet kiloLocoAtomFeed = try decoder.decode(kiloLocoData)\nif let atomFeed = kiloLocoAtomFeed as? AtomFeed {\n  print(atomFeed.title) // Prints \"Empower Apps\"\n}\n```\n\n### Accessing Extensions\n\nIn addition to supporting RSS, Atom, and JSONFeed, **SyndiKit** also supports various RSS extensions for specific media including: YouTube, iTunes, and WordPress.\n\nYou can access these properties via their specific feed formats or via the ``Entryable/media`` property on ``Entryable``. \n\n```swift\nlet empowerAppsRSSFeed = try decoder.decode(empowerAppsData)\nswitch empowerAppsRSSFeed.children.last?.media {\n  case .podcast(let podcast):\n    print(podcast.title) // print \"WWDC 2018 - What Does It Mean For Businesses?\"\n  default:\n    print(\"Not a Podcast! 🤷‍♂️\")\n}\n\nlet kiloLocoAtomFeed = try decoder.decode(kiloLocoData)\nswitch kiloLocoAtomFeed.children.last?.media {\n  case .video(.youtube(let youtube):\n    print(youtube.videoID) // print \"SBJFl-3wqx8\"\n    print(youtube.channelID) // print \"UCv75sKQFFIenWHrprnrR9aA\"\n  default:\n    print(\"Not a Youtube Video! 🤷‍♂️\")\n}\n```\n\n## Documentation\n\nThere are two formats for the source documentation:\n\n### [DocC](https://syndikit.dev)\n\n[The **DocC** official web site is at syndikit.dev.](https://syndikit.dev) This includes tutorials, articles, code documentation and more.  \n\n### [GitHub SourceDocs](/Documentation/Reference/SyndiKit/README.md)\n\nFor just markdown formatted documentation on GitHub using [SourceDocs](https://github.com/eneko/SourceDocs), you can read see [the list of types here.](/Documentation/Reference/SyndiKit/README.md)\n\n## Roadmap\n\n## 1.0.0 \n\n- [ ] OPML Support\n- [ ] WordPress DocC Tutorial\n- [ ] RSS Import Tutorial (i.e. [OrchardNest](https://orchardnest.com))\n\n## License \n\nThis code is distributed under the MIT license. See the [LICENSE](LICENSE) file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrightdigit%2Fsyndikit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrightdigit%2Fsyndikit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrightdigit%2Fsyndikit/lists"}