{"id":13505680,"url":"https://github.com/mlafeldt/dilbert-feed","last_synced_at":"2025-03-30T00:31:21.262Z","repository":{"id":39167796,"uuid":"105390097","full_name":"mlafeldt/dilbert-feed","owner":"mlafeldt","description":" Enjoy Dilbert in your RSS feed reader without any ads","archived":true,"fork":false,"pushed_at":"2023-05-01T13:28:37.000Z","size":2373,"stargazers_count":29,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-01-07T16:03:45.797Z","etag":null,"topics":["aws","cdk","dilbert","recreational","rss","rust","serverless","typescript"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/mlafeldt.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":"2017-09-30T18:08:57.000Z","updated_at":"2023-06-03T21:49:11.000Z","dependencies_parsed_at":"2024-06-19T04:11:33.030Z","dependency_job_id":"df6add58-f4a9-445f-bbaa-bba3948fb42e","html_url":"https://github.com/mlafeldt/dilbert-feed","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mlafeldt%2Fdilbert-feed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mlafeldt%2Fdilbert-feed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mlafeldt%2Fdilbert-feed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mlafeldt%2Fdilbert-feed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mlafeldt","download_url":"https://codeload.github.com/mlafeldt/dilbert-feed/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246262490,"owners_count":20749170,"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","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":["aws","cdk","dilbert","recreational","rss","rust","serverless","typescript"],"created_at":"2024-08-01T00:01:11.512Z","updated_at":"2025-03-30T00:31:16.254Z","avatar_url":"https://github.com/mlafeldt.png","language":"Rust","funding_links":[],"categories":["💻 Samples","Training Materials and Sample Code"],"sub_categories":["Multi-accounts setup"],"readme":"# dilbert-feed\n\n## Note: The discontinuation of the Dilbert comic strip on March 12, 2023 has made the project futile in its current form.\n\n[![CI](https://github.com/mlafeldt/dilbert-feed/workflows/Rust/badge.svg)](https://github.com/mlafeldt/dilbert-feed/actions)\n\nEnjoy [Dilbert](https://dilbert.com/) in your RSS feed reader without any ads!\n\nUnfortunetly, Dilbert's official feed now forces you to go to the website:\n\n\u003e Dilbert readers - Please visit Dilbert.com to read this feature. Due to changes with our feeds, we are now making this RSS feed a link to Dilbert.com.\n\nThis serverless application provides a custom feed with direct access to Dilbert comics that gets updated every day.\n\nFor some background information, check out my article on [Recreational Programming with Serverless](https://sharpend.io/recreational-programming-with-serverless/).\n\nPS: The Lambda functions used to be [written in Go](https://github.com/mlafeldt/dilbert-feed/tree/golang), now they're [powered by Rust](https://github.com/mlafeldt/dilbert-feed/pull/6). 💪\n\n## Architecture\n\n![](architecture.png)\n\n## Requirements\n\nYou need the following to build and deploy dilbert-feed:\n\n- Node.js + Yarn\n- Rust + `rustup target add aarch64-unknown-linux-gnu`\n- (On macOS, you also need the corresponding [cross compiler toolchain](https://artofserverless.com/rust-lambdas-macos/))\n- Make\n\n## Deployment\n\nFollow these steps to deploy your own dilbert-feed instance to AWS.\n\nSet AWS region and credentials in environment:\n\n```console\nexport AWS_REGION=eu-central-1\nexport AWS_ACCESS_KEY_ID=...\nexport AWS_SECRET_ACCESS_KEY=...\n```\n\nConfigure the heartbeat URL, e.g. as provided by [Healthchecks.io](https://healthchecks.io/):\n\n```console\naws ssm put-parameter --overwrite --name /dilbert-feed-dev/heartbeat-endpoint --type String --value \u003curl\u003e\naws ssm put-parameter --overwrite --name /dilbert-feed-prod/heartbeat-endpoint --type String --value \u003curl\u003e\n```\n\nBuild the Lambdas and deploy the CDK stack:\n\n```console\n# Bootstrap AWS CDK once\nmake bootstrap\n\n# Deploy development environment\nmake dev\n\n# Deploy production environment\nmake prod\n```\n\nAmong other things, the stack outputs will show the URL of the RSS feed, which you can then subscribe:\n\n```console\ndilbert-feed-prod.FeedUrl = https://dilbert-feed-example.s3.amazonaws.com/v2/rss.xml\n```\n\n## Usage\n\nThe serverless stack will update the feed automatically. However, you can also invoke the Lambda functions manually.\n\nGet the comic strip for today:\n\n```console\n$ ./invoke dilbert-feed-prod-get-strip\n{\n  \"date\": \"2019-10-22\",\n  \"title\": \"Best Employees\",\n  \"image_url\": \"https://assets.amuniversal.com/87b83e10c7460137c2df005056a9545d\",\n  \"strip_url\": \"https://dilbert.com/strip/2019-10-22\",\n  \"upload_url\": \"https://dilbert-feed-example.s3.amazonaws.com/strips/2019-10-22.gif\"\n}\n```\n\nGet the comic strip for a specific date:\n\n```console\n$ ./invoke dilbert-feed-prod-get-strip --payload '{\"date\":\"2016-01-01\"}'\n{\n  \"date\": \"2016-01-01\",\n  \"title\": \"Forgetting Meetings\",\n  \"image_url\": \"https://assets.amuniversal.com/1a6be66079e101332131005056a9545d\",\n  \"strip_url\": \"https://dilbert.com/strip/2016-01-01\",\n  \"upload_url\": \"https://dilbert-feed-example.s3.amazonaws.com/strips/2016-01-01.gif\"\n}\n```\n\nGet the comic strips for the last 30 days:\n\n```console\nfor i in $(seq 0 30); do date=$(gdate -I -d \"today -$i days\"); ./invoke dilbert-feed-prod-get-strip --payload \"{\\\"date\\\":\\\"$date\\\"}\"; done\n```\n\nGenerate the RSS feed:\n\n```console\n$ ./invoke dilbert-feed-prod-gen-feed\n{\n  \"feed_url\": \"https://dilbert-feed-example.s3.amazonaws.com/v2/rss.xml\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmlafeldt%2Fdilbert-feed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmlafeldt%2Fdilbert-feed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmlafeldt%2Fdilbert-feed/lists"}