{"id":20438517,"url":"https://github.com/vdhamer/swiftlee-aggregator","last_synced_at":"2026-06-01T08:32:39.013Z","repository":{"id":36993022,"uuid":"499901973","full_name":"vdhamer/SwiftLee-Aggregator","owner":"vdhamer","description":"This iOS/SwiftUI app collects blog postings by SwiftLee on Swift and related topics. Note that the app is only a SwiftLee aggregator and not an app developed by SwiftLee.","archived":false,"fork":false,"pushed_at":"2025-07-26T23:06:50.000Z","size":8248,"stargazers_count":2,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-27T02:23:01.349Z","etag":null,"topics":["aggregator","coredata","ios","swift","swift-ui","swiftlee","xcode"],"latest_commit_sha":null,"homepage":"","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/vdhamer.png","metadata":{"files":{"readme":".github/README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2022-06-04T18:08:01.000Z","updated_at":"2025-07-26T23:06:54.000Z","dependencies_parsed_at":"2023-10-15T15:00:21.437Z","dependency_job_id":null,"html_url":"https://github.com/vdhamer/SwiftLee-Aggregator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vdhamer/SwiftLee-Aggregator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vdhamer%2FSwiftLee-Aggregator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vdhamer%2FSwiftLee-Aggregator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vdhamer%2FSwiftLee-Aggregator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vdhamer%2FSwiftLee-Aggregator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vdhamer","download_url":"https://codeload.github.com/vdhamer/SwiftLee-Aggregator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vdhamer%2FSwiftLee-Aggregator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33767435,"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-06-01T02:00:06.963Z","response_time":115,"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":["aggregator","coredata","ios","swift","swift-ui","swiftlee","xcode"],"created_at":"2024-11-15T09:12:00.233Z","updated_at":"2026-06-01T08:32:39.007Z","avatar_url":"https://github.com/vdhamer.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv id=\"top\"\u003e\u003c/div\u003e\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#distribution\"\u003eDistribution\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage and Features\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#acknowledgments\"\u003eAcknowledgments\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n## About The Project\n[![Product Name Screen Shot][product-screenshot]](https://github.com/vdhamer/SwiftLeeAggregator)\n\nThis iOS app aggregates blog posts written by [SwiftLee](https://www.avanderlee.com) (Antoine van der Lee). SwiftLee has a weekly blog about Swift and iOS software development. \n\nNote that this app is only a **SwiftLee aggregator** and ***not* an app developed by SwiftLee**.\nThe author of the blog posts (SwiftLee) has no responsibility for this aggregator app.\nAnd the developer of the app (vdHamer) has no control over the aggregated blog postings. \nIn case you are wondering, both parties did align :slightly_smiling_face:. \n\nThe aggregator uses a small database containing the metadata (title, date, URLs) of the postings on the SwiftLee site.\nIt does not contain the blog posts themselves.\nWhen the app launches, the database is updated in background by fetching the SwiftLee website's RSS feed, \npassing the RSS through an online RSS-to-JSON convertor, decoding the JSON to memory, and merging the in-memory data with existing data in the database.\nThe database (Apple's Core Data framework) improves app startup time, and furthermore tracks which posts have been viewed or labelled with a :star: by the user.\n\nThe minimum required iOS version is 17.6.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Built With\n* [Swift](https://www.swift.org)\n* [Core Data](https://developer.apple.com/documentation/coredata)\n* [SwiftUI](https://developer.apple.com/xcode/swiftui/)\n* [RSS to JSON convertor](https://rss2json.com/)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Distribution\nThe app is available via GitHub.\nIt is deliberately *not* distributed via the Apple App Store to avoid confusion.\nAnd, frankly, the app doesn’t provide provide that much functionality compared to the\nSwiftLee's own website: the app is partly used as a lightweight testbed to try out some \nprogramming techniques (like JSON decoding, concurrency and Core Data).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Getting Started\nTo get a local copy up and running, use GitHub’s `Open with Xcode` feature, \ncompile and run on a simulator or physical device. \nThose who prefer running git from the command line will probably manage on their own.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Installation\n1. Get your personal API key at [rss2json.com](https://rss2json.com/docs). This involves signing up for an account with rss2json. The free `rss2json` plan should have more than enough quota to view the feed as often as you like. Please carefully save the API key code.\nIt allows you to generate a fair amount of traffic via `rss2json.com` without having to worry about traffic generated by others.\n2. Clone the repository to your development environment: `Code`,  `Code`,  `Open with Xcode`, allow GitHub to launch Xcode, select a location for the directory, and press `Clone`.\n3. Enter your personal API key in the file `Utilities`/`ApiKey.swift`\nDon’t forget to uncomment the `let apiKey` line of code. By default it reads:\n```\n// insert your rss2json.com API key and uncomment\n// let apiKey = \"thisisthespotwhereyouinsertyourownapikey\" \n```\nThe line is commented out because I have a second file containing my own `let apiKey` line. That second file is not on GitHub.\n4. You can now compile the project to install it on an actual device (you may need to deploy it again after half a year) or run the code on a device simulator in the usual way.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Usage and features\nWhen you launch the app, it will list all posts on SwiftLee's site. The first time may take a few seconds.\n\nThe Search field allows you to filter the list of posts. It searches the title fields only; it does not search the post's full text or keywords.\n\nIf you click on an post's entry on the list, it will load the actual post in a browser tab. It will also mark the entry as \"read\" (using Core Data).\n\nYou can toggle the read/unread status by swiping the entry to the left and tapping the opened/closed envelope button.\n\nYou can mark interesting items with a star (swipe to the left). And you can remove the star rating at any time in a similar way.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Roadmap\n- [x] Complete the readme\n- [x] Automatically fetch older posts via extra fetch requests (at 10 posts per request)\n\t- [x] Add a search bar to filter the list (needed if there are hundreds of posts)\n- [x] Minor bug fixing and cleanup\n- [x] Store the posts on-device\n- [x] Keep track of which posts have been clicked on, and visualize this using the `mail` icon to the left of the title\n    - [x] Unread functionality: it is easy to open a post, but takes time to seriously read it.\n    - [ ] Button to clear the database without uninstall/install\n- [x] Ability to mark a posting with a Star (locally). For whatever reason.\n- [ ] Clean up the loose ends of Core Data (various warnings in the log)\n\nSee the [open issues](https://github.com/vdhamer/SwiftLeeAggregator/issues) for a full list of proposed features (and known issues).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Contributing\nContributions are appreciated. If you have an idea for an improvement, you can fork the repo and create a pull request.  The command line `git` commands to do this (but the Xcode IDE has equivalent commands under `Source Control`):\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\nYou can alternatively submit an `issue` with a tag like ”enhancement\" or “bug”\nwithout having to do the code changes yourself.\nDon't forget to give the project a star in GitHub!\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## License\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n## Contact\nPeter van den Hamer - github@vdhamer.com\n\nProject Link: [https://github.com/vdhamer/SwiftLeeAggregator](https://github.com/vdhamer/SwiftLeeAggregator)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Acknowledgments\n\n* [A weekly Swift Blog on Xcode and iOS Development - SwiftLee](https://www.avanderlee.com)\n* [\"JSON Parsing in Swift explained with code examples\" - SwiftLee](https://www.avanderlee.com/swift/json-parsing-decoding/)\n* [RSS to JSON Converter online - rss2json.com](https://rss2json.com/#rss_url=https%3A%2F%2Fwww.avanderlee.com%2Ffeed)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/vdhamer/SwiftLeeAggregator.svg?style=for-the-badge\n[contributors-url]: https://github.com/vdhamer/SwiftLeeAggregator/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/vdhamer/SwiftLeeAggregator.svg?style=for-the-badge\n[forks-url]: https://github.com/vdhamer/SwiftLeeAggregator/network/members\n[stars-shield]: https://img.shields.io/github/stars/vdhamer/SwiftLeeAggregator.svg?style=for-the-badge\n[stars-url]: https://github.com/vdhamer/SwiftLeeAggregator/stargazers\n[issues-shield]: https://img.shields.io/github/issues/vdhamer/SwiftLeeAggregator.svg?style=for-the-badge\n[issues-url]: https://github.com/vdhamer/SwiftLeeAggregator/issues\n[license-shield]: https://img.shields.io/github/license/vdhamer/SwiftLeeAggregator.svg?style=for-the-badge\n[license-url]: https://github.com/vdhamer/SwiftLeeAggregator/blob/main/.github/LICENSE.txt\n[product-screenshot]: images/screenshot.png\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvdhamer%2Fswiftlee-aggregator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvdhamer%2Fswiftlee-aggregator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvdhamer%2Fswiftlee-aggregator/lists"}