{"id":20687031,"url":"https://github.com/jcsalterego/contrails","last_synced_at":"2025-05-10T17:30:38.225Z","repository":{"id":171490868,"uuid":"647939131","full_name":"jcsalterego/Contrails","owner":"jcsalterego","description":"Contrails is an ATProto Feed Generator backed by Cloudflare Workers and Bluesky Search.","archived":true,"fork":false,"pushed_at":"2024-03-16T14:43:02.000Z","size":2622,"stargazers_count":80,"open_issues_count":9,"forks_count":93,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-22T14:44:01.734Z","etag":null,"topics":["bluesky","cloudflare-workers","feed-generator"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jcsalterego.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}},"created_at":"2023-05-31T21:18:00.000Z","updated_at":"2025-02-15T09:30:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"3e689eb1-2fa4-4a48-8c22-b9ab1f274b8e","html_url":"https://github.com/jcsalterego/Contrails","commit_stats":null,"previous_names":["jcsalterego/contrails"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcsalterego%2FContrails","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcsalterego%2FContrails/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcsalterego%2FContrails/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcsalterego%2FContrails/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jcsalterego","download_url":"https://codeload.github.com/jcsalterego/Contrails/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253453155,"owners_count":21911049,"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":["bluesky","cloudflare-workers","feed-generator"],"created_at":"2024-11-16T22:55:33.152Z","updated_at":"2025-05-10T17:30:37.843Z","avatar_url":"https://github.com/jcsalterego.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Contrails\n\nContrails is an [ATProto Feed Generator](https://github.com/bluesky-social/feed-generator) backed by\n[Cloudflare Workers](https://workers.cloudflare.com) and [Bluesky Search](https://bsky.app/search).\n\nFork or copy the repository and edit `CONFIG.md` to define your feed generator.\n\nDeploy right from [GitHub Actions](https://github.com/features/actions) to [Cloudflare Workers](https://workers.cloudflare.com).\n\nThe current release is [**0.2.5**](https://github.com/jcsalterego/Contrails/releases/latest).\n\n## Requirements\n\n- Bluesky Social account\n- GitHub account ([Sign up](https://github.com/signup) or [Login](https://github.com/login))\n- Cloudflare account ([Sign up](https://dash.cloudflare.com/sign-up) or [Login](https://dash.cloudflare.com/login/))\n- A moderate-to-high tolerance for adventure\n\n## Installation \u0026 Configuration: The Short Version\n\n1. Create a Cloudflare Worker\n2. Create a Cloudflare API Token (the Edit Workers template is fine)\n3. Create a Bluesky App Password\n4. Fork this repository\n5. In your fork's **Settings \u003e Secrets and variables \u003e Actions**, set the following:\n  * Variable: `BLUESKY_HANDLE`\n  * Variable: `CLOUDFLARE_ACCOUNT_ID`\n  * Variable: `CLOUDFLARE_WORKER_NAME`\n  * Secret: `BLUESKY_APP_PASSWORD`\n  * Secret: `CLOUDFLARE_API_TOKEN`\n6. Edit [CONFIG.md](CONFIG.md) in your fork\n7. Go to **Actions** \u003e **1. Check Requirements**, select **Run Workflow**, refresh and wait for completion\n8. Go to **Actions** \u003e **2. Deploy to Cloudflare**, select **Run Workflow**, refresh and wait for completion\n9. Go to **Actions** \u003e **3. Publish Feed Generator**, select **Run Workflow**, refresh and wait for completion\n10. Visit the `BLUESKY_HANDLE` profile, e.g. [https://bsky.app/profile/jcsalterego.bsky.social](https://bsky.app/profile/jcsalterego.bsky.social) and then the Feeds tab\n\nThe longer (and incomplete) instructions can be found in [INSTALL.md](INSTALL.md).\n\n## Upgrading\n\nThe first step before any major upgrade is to make a copy of your markdown config file. Your best bet is to save it in a separate directory such as `backup_configs/`, or you will have to remember to set `isEnabled` to false so it doesn't get picked up as a live config!\n\nIn the event you'd like to pull in the latest changes into a fork of Contrails, GitHub has great documentation here:\n[GitHub Docs: Syncing a fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork)\n\n## Changelog\n\n### 0.2.5\n\n* Fixes deleteFeedGenerator [#28](https://github.com/jcsalterego/Contrails/issues/28)\n\n### 0.2.4\n\n* `denyList` support. [#13](https://github.com/jcsalterego/Contrails/issues/13)\n\n### 0.2.3\n\n* FIX: publishFeedGenerator threw an error. [#19](https://github.com/jcsalterego/Contrails/issues/19)\n\n### 0.2.2\n\n* FIX: Quoted phrases such as `\"blue sky\"` work again. This will require case-insensitive matches, e.g. `blue sky`, `Blue Sky` or `BLUE SKY`.\n\n### 0.2.1\n\n* `+reposts` and `+replies` support. Note: Reposts will not be attributed (\"reposted by User\").\n\n### 0.2.0\n\n* Pagination\n* Safe Mode\n\n### 0.1.0\n\n* New search term type: Users\n\n### 0.0.4\n\n* New search term type: Pinned posts\n\n### 0.0.3\n\n* Multiple feed support\n* Ignore blockquotes in CONFIG.md (to allow comments).\n\n### 0.0.2\n\n* Delete Feed Generator workflow\n\n### 0.0.1\n\n* Initial Release\n\n## Etymology\n\n![](docs/thecloud.png)\n\n_Ed. Note: Bluesky Search is now called [Palomar](https://github.com/bluesky-social/indigo/tree/main/cmd/palomar)._\n\n## Publishing Diagram\n\n```mermaid\nflowchart LR\n    subgraph Bluesky\n        PDS[\"PDS\"]\n    end\n    subgraph GitHub\n        subgraph MD_Config[\"CONFIG.md\"]\n            searchTerms\n        end\n        subgraph CloudflareDeploy[\"Cloudflare Deploy\"]\n            Worker_JS\n            CloudflareApiToken(\"CLOUDFLARE_API_TOKEN\")\n            CloudflareAccountID(\"CLOUDFLARE_ACCOUNT_ID\")\n            CloudflareWorkerName(\"CLOUDFLARE_WORKER_NAME\")\n        end\n        subgraph BlueskyDeploy[\"Bluesky Deploy\"]\n            PublishFeedGenerator\n            BlueskyHandle(\"BLUESKY_HANDLE\")\n            BlueskyAppPassword(\"BLUESKY_APP_PASSWORD\")\n        end\n        MD_Config --\u003e Worker_JS[\"worker.js\"]\n        MD_Config --\u003e PublishFeedGenerator[\"publishFeedGenerator.ts\"]\n    end\n    subgraph \"Cloudflare Worker\"\n        CloudflareWorker[worker.js]\n    end\n    CloudflareDeploy --\u003e|Deploy to Cloudflare| CloudflareWorker\n    BlueskyDeploy --\u003e|Publish Feed Generator| PDS\n```\n\n## Query Diagram\n\n```mermaid\nsequenceDiagram\n    actor CoffeeTeaLover\n    participant Bluesky\n    participant Cloudflare as Cloudflare Worker\n    participant Bluesky Search\n    CoffeeTeaLover-\u003e\u003e+Bluesky: get Coffee\u0026Tea custom feed\n    Bluesky-\u003e\u003e+Cloudflare: get Coffee\u0026Tea custom feed\n    Cloudflare-\u003e\u003e+Bluesky Search: search \"coffee\" and \"tea\"\n    Bluesky Search-\u003e\u003e+Cloudflare: posts matching \"coffee\" and \"tea\"\n    Cloudflare-\u003e\u003e+Bluesky: IDs of posts matching \"coffee\" and \"tea\"\n    Bluesky-\u003e\u003e+CoffeeTeaLover: posts for Coffee\u0026Tea custom feed\n```\n\n## LICENSE\n\n[2-Clause BSD](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcsalterego%2Fcontrails","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjcsalterego%2Fcontrails","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcsalterego%2Fcontrails/lists"}