{"id":28148160,"url":"https://github.com/gojiplus/ghostsky","last_synced_at":"2026-04-21T22:35:25.796Z","repository":{"id":289535781,"uuid":"971589190","full_name":"gojiplus/ghostsky","owner":"gojiplus","description":"Autopost a random (or new) Ghost blog to bsky","archived":false,"fork":false,"pushed_at":"2025-05-02T01:42:03.000Z","size":38,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-15T00:25:28.459Z","etag":null,"topics":["bsky-bot","ghost-blog","github"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gojiplus.png","metadata":{"files":{"readme":"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,"zenodo":null}},"created_at":"2025-04-23T18:48:25.000Z","updated_at":"2025-05-02T01:42:07.000Z","dependencies_parsed_at":"2025-05-02T02:27:50.228Z","dependency_job_id":null,"html_url":"https://github.com/gojiplus/ghostsky","commit_stats":null,"previous_names":["gojiplus/ghostsky"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/gojiplus/ghostsky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gojiplus%2Fghostsky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gojiplus%2Fghostsky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gojiplus%2Fghostsky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gojiplus%2Fghostsky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gojiplus","download_url":"https://codeload.github.com/gojiplus/ghostsky/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gojiplus%2Fghostsky/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263446920,"owners_count":23467858,"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":["bsky-bot","ghost-blog","github"],"created_at":"2025-05-15T00:24:16.252Z","updated_at":"2026-04-21T22:35:20.773Z","avatar_url":"https://github.com/gojiplus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## \u0026#x1F47B;\u0026#x1F98B; Post Random Ghost Blog to Bluesky\n\nFetch a random post from your Ghost blog’s sitemap and publish it to your Bluesky feed on a schedule or on demand.\n\n## Features\n\n- Reads all post URLs from your Ghost sitemap (`sitemap-posts.xml`)\n- Picks one at random each run\n- Authenticates and posts via the Bluesky AT Protocol client\n- Fully configurable via Action inputs\n\n## Usage\n\n### 1. Add the Action to your repo\n\nCreate a folder `.github/actions/post-ghost` and put both:\n- [action.yaml](#action-metadata)  \n- `scripts/post_random_ghost.py` (from earlier)\n\n### 2. Configure Secrets\n\nGo to **Settings → Secrets** and add:\n- `BSKY_HANDLE` – your Bluesky username\n- `BSKY_PASSWORD` – your Bluesky password\n\n### 3. Example workflow\n\n```yaml\nname: 🥝 Post Random Ghost Blog to Bluesky\n\non:\n  schedule:\n    - cron: '0 16 * * *'     # every day at 16:00 UTC\n  workflow_dispatch:         # allow manual trigger\n\njobs:\n  post:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Post random blog link\n        uses: ./.github/actions/post-ghost\n        with:\n          handle: ${{ secrets.BSKY_HANDLE }}\n          password: ${{ secrets.BSKY_PASSWORD }}\n          sitemap-url: https://www.gojiberries.io/sitemap-posts.xml\n```\n\n### Inputs\n\n| Name        | Description                                     | Required | Default                                 |\n|-------------|-------------------------------------------------|:--------:|:----------------------------------------|\n| `handle`      | Your Bluesky handle (username)                  | ✅       |                                          |\n| `password`    | Your Bluesky password                           | ✅       |                                          |\n| `sitemap-url` | Full URL to your Ghost blog’s `sitemap-posts.xml` | ✅       | `https://yourblog.com/sitemap-posts.xml` |\n\n\n\n### How it works\n\n1. Fetch the sitemap (XML) and extract all \u003cloc\u003e URLs\n2. Choose one at random\n3. Login to Bluesky via atproto-client\n4. Post a status like\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgojiplus%2Fghostsky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgojiplus%2Fghostsky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgojiplus%2Fghostsky/lists"}