{"id":20687110,"url":"https://github.com/pojntfx/skysweeper","last_synced_at":"2025-05-10T17:30:39.796Z","repository":{"id":195848240,"uuid":"693782785","full_name":"pojntfx/skysweeper","owner":"pojntfx","description":"Automatically delete your old skeets from Bluesky.","archived":true,"fork":false,"pushed_at":"2023-10-07T22:48:29.000Z","size":23187,"stargazers_count":25,"open_issues_count":3,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-22T14:44:05.362Z","etag":null,"topics":["atproto","bluesky","tweet-deleter"],"latest_commit_sha":null,"homepage":"https://skysweeper.p8.lu/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pojntfx.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}},"created_at":"2023-09-19T17:47:09.000Z","updated_at":"2024-12-31T16:01:54.000Z","dependencies_parsed_at":"2023-12-31T01:59:48.669Z","dependency_job_id":null,"html_url":"https://github.com/pojntfx/skysweeper","commit_stats":null,"previous_names":["pojntfx/aeolius","pojntfx/skysweeper"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pojntfx%2Fskysweeper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pojntfx%2Fskysweeper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pojntfx%2Fskysweeper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pojntfx%2Fskysweeper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pojntfx","download_url":"https://codeload.github.com/pojntfx/skysweeper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253453157,"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":["atproto","bluesky","tweet-deleter"],"created_at":"2024-11-16T22:55:54.682Z","updated_at":"2025-05-10T17:30:38.077Z","avatar_url":"https://github.com/pojntfx.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SkySweeper\n\n![Header](./docs/header.png)\n\nAutomatically delete your old skeets from Bluesky.\n\n[![hydrun CI](https://github.com/pojntfx/skysweeper/actions/workflows/hydrun.yaml/badge.svg)](https://github.com/pojntfx/skysweeper/actions/workflows/hydrun.yaml)\n[![Docker CI](https://github.com/pojntfx/skysweeper/actions/workflows/docker.yaml/badge.svg)](https://github.com/pojntfx/skysweeper/actions/workflows/docker.yaml)\n[![sweeper CI](https://github.com/pojntfx/skysweeper/actions/workflows/sweeper.yaml/badge.svg)](https://github.com/pojntfx/skysweeper/actions/workflows/sweeper.yaml)\n![Go Version](https://img.shields.io/badge/go%20version-%3E=1.21-61CFDD.svg)\n[![Go Reference](https://pkg.go.dev/badge/github.com/pojntfx/skysweeper.svg)](https://pkg.go.dev/github.com/pojntfx/skysweeper)\n[![Matrix](https://img.shields.io/matrix/skysweeper:matrix.org)](https://matrix.to/#/#skysweeper:matrix.org?via=matrix.org)\n\n## Overview\n\nSkySweeper is a service which automatically deletes your old skeets from Bluesky, similarly to how [TweetDeleter](https://tweetdeleter.com/) allows deleting old tweets on Twitter/X.\n\nIt enables you to ...\n\n- **Increase your privacy**: By decreasing your digital footprint, SkySweeper can help you more easily exercise your right to be forgotten.\n- **Move on**: By deleting your old skeets, SkySweeper makes it easier for you to move on from positions you no longer hold.\n- **Configure what should be deleted**: SkySweeper allows you to set the maximum post age, after which older skeets will be deleted.\n\n## Installation\n\nSkySweeper is available to the public and can be used by opening it in a browser:\n\n\u003ca href=\"https://skysweeper.p8.lu/\"\u003e\u003cimg src=\"https://github.com/pojntfx/webnetesctl/raw/main/img/launch.png\" alt=\"PWA badge\" width=\"200\"/\u003e\u003c/a\u003e\n\nIf you prefer to self-host, see [contributing](#contributing); static binaries for the manager and worker, a `.tar.gz` archive for the frontend and an OCI image for containerization are also available on [GitHub releases](https://github.com/pojntfx/skysweeper/releases) and [GitHub container registry](https://github.com/pojntfx/skysweeper/packages) respectively.\n\n## Screenshots\n\nClick on an image to see a larger version.\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-initial.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-initial.png\" width=\"45%\" alt=\"Screenshot of the initial screen\" title=\"Screenshot of the initial screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-initial-dark.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-initial-dark.png\" width=\"45%\" alt=\"Screenshot of the initial dark screen\" title=\"Screenshot of the initial dark screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-login.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-login.png\" width=\"45%\" alt=\"Screenshot of the login screen\" title=\"Screenshot of the login screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-login-dark.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-login-dark.png\" width=\"45%\" alt=\"Screenshot of the login dark screen\" title=\"Screenshot of the login dark screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-disabled.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-disabled.png\" width=\"45%\" alt=\"Screenshot of the disabled screen\" title=\"Screenshot of the disabled screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-enabled.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-enabled.png\" width=\"45%\" alt=\"Screenshot of the enabled screen\" title=\"Screenshot of the enabled screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-initial-mobile.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-initial-mobile.png\" width=\"45%\" alt=\"Screenshot of the initial mobile screen\" title=\"Screenshot of the initial mobile screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-initial-mobile-dark.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-initial-mobile-dark.png\" width=\"45%\" alt=\"Screenshot of the initial mobile dark screen\" title=\"Screenshot of the initial mobile dark screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-login-mobile.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-login-mobile.png\" width=\"45%\" alt=\"Screenshot of the login mobile screen\" title=\"Screenshot of the login mobile screen\"\u003e\n\u003c/a\u003e\n\n\u003ca style=\"display:inline\" href=\"./docs/screenshot-login-mobile-dark.png?raw=true\"\u003e\n\u003cimg src=\"./docs/screenshot-login-mobile-dark.png\" width=\"45%\" alt=\"Screenshot of the login mobile dark screen\" title=\"Screenshot of the login mobile dark screen\"\u003e\n\u003c/a\u003e\n\n## Reference\n\n### Command Line Arguments\n\n```shell\n$ skysweeper-server --help\nAutomatically delete your old skeets from Bluesky.\nFind more information at:\nhttps://github.com/pojntfx/skysweeper\n\nUsage:\n  skysweeper-server [command]\n\nAvailable Commands:\n  completion  Generate the autocompletion script for the specified shell\n  help        Help about any command\n  manager     Start an SkySweeper manager\n  worker      Start an SkySweeper worker\n\nFlags:\n  -h, --help                        help for skysweeper-server\n      --postgres-url DATABASE_URL   PostgreSQL URL (can also be set using DATABASE_URL env variable) (default \"postgresql://postgres@localhost:5432/skysweeper?sslmode=disable\")\n\nUse \"skysweeper-server [command] --help\" for more information about a command.\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eExpand subcommand reference\u003c/summary\u003e\n\n#### Manager\n\n```shell\n$ skysweeper-server manager --help\nStart an SkySweeper manager\n\nUsage:\n  skysweeper-server manager [flags]\n\nAliases:\n  manager, w\n\nFlags:\n  -h, --help            help for manager\n      --laddr string    Listen address (default \":1337\")\n      --origin string   Allowed CORS origin (default \"https://skysweeper.p8.lu\")\n\nGlobal Flags:\n      --postgres-url DATABASE_URL   PostgreSQL URL (can also be set using DATABASE_URL env variable) (default \"postgresql://postgres@localhost:5432/skysweeper?sslmode=disable\")\n```\n\n#### Worker\n\n```shell\n$ skysweeper-server worker --help\nStart an SkySweeper worker\n\nUsage:\n  skysweeper-server worker [flags]\n\nAliases:\n  worker, w\n\nFlags:\n      --api-key string                       API key to check incoming requests for\n      --apply-writes-limit int               Limit of records to apply writes for per API call (see https://atproto.com/blog/rate-limits-pds-v3; 10 as of September 2023) (default 10)\n      --dry-run                              Whether to do a dry run (only fetch for posts to be deleted without actually deleting them) (default true)\n  -h, --help                                 help for worker\n      --laddr string                         Listen address (default \":1338\")\n      --list-records-limit int               Limit of records to return per API call (see https://atproto.com/blog/rate-limits-pds-v3; 100 as of September 2023) (default 100)\n      --rate-limit-points-did int            Maximum amount of rate limit points to spend per DID (see https://atproto.com/blog/rate-limits-pds-v3; must be less than 1666 per hour as of September 2023) (default 200)\n      --rate-limit-points-global int         Maximum amount of rate limit points to spend per rate limit reset interval for this IP (see https://atproto.com/blog/rate-limits-pds-v3; must be less than 3000 per hour as of September 2023) (default 2500)\n      --rate-limit-reset-interval duration   Duration of a rate limit reset interval for this IP (see https://atproto.com/blog/rate-limits-pds-v3; 5 minutes as of September 2023) (default 5m0s)\n      --verbose                              Whether to enable verbose logging\n\nGlobal Flags:\n      --postgres-url DATABASE_URL   PostgreSQL URL (can also be set using DATABASE_URL env variable) (default \"postgresql://postgres@localhost:5432/skysweeper?sslmode=disable\")\n```\n\n\u003c/details\u003e\n\n### Environment Variables\n\nAll command line arguments described above can also be set using environment variables; for example, to set `--dry-run` to `false` with an environment variable, use `SKYSWEEPER_DRY_RUN='false'`. In addition to this, there are also some aliases in place for compatibility with Railway/Heroku conventions; for example, you can `export PORT=3000` to listen on port 3000 as an alternative to setting the listen address, or `export DATABASE_URL='postgresql://username:password@myhost:5432/mydb'` to set the database URL. For more info, see the [command line arguments](#command-line-arguments).\n\n## Acknowledgements\n\n- [sqlc-dev/sqlc](https://github.com/sqlc-dev/sqlc) provides the SQL library.\n- [pressly/goose](https://github.com/pressly/goose) provides migration support.\n- [bluesky-social/indigo](https://github.com/bluesky-social/indigo) provides the Bluesky API client.\n\n## Contributing\n\nTo contribute, please use the [GitHub flow](https://guides.github.com/introduction/flow/) and follow our [Code of Conduct](./CODE_OF_CONDUCT.md).\n\nTo build and start a development version of SkySweeper locally, run the following:\n\n```shell\n$ git clone https://github.com/pojntfx/skysweeper.git\n$ cd skysweeper\n\n$ make depend\n$ docker rm -f skysweeper-postgres \u0026\u0026 docker run -d --name skysweeper-postgres -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=skysweeper postgres\n$ docker exec skysweeper-postgres bash -c 'until pg_isready; do sleep 1; done'\n\n$ export SKYSWEEPER_ORIGIN='http://localhost:3000'\n$ go run ./cmd/skysweeper-server manager # Starts the manager\n\n# In another terminal\n$ export SKYSWEEPER_API_KEY='supersecureapikey'\n$ # export SKYSWEEPER_DRY_RUN='false' # Uncomment to actually delete posts instead of just logging the execution plan\n$ go run ./cmd/skysweeper-server worker # Starts the worker\n\n# In another terminal\n$ export SKYSWEEPER_API_DEFAULT='http://localhost:1337'\n$ cd frontend\n$ bun dev # Now visit http://localhost:3000 to open the frontend and sign in\n\n# In another terminal\n$ export SKYSWEEPER_API_KEY='supersecureapikey'\n$ curl -v -H \"Authorization: Bearer ${SKYSWEEPER_API_KEY}\" -X DELETE http://localhost:1338/posts # Scans for skeets and deletes them\n```\n\nOf course, you can also contribute to the utilities and VPNs like this.\n\nHave any questions or need help? Chat with us [on Matrix](https://matrix.to/#/#skysweeper:matrix.org?via=matrix.org)!\n\n## License\n\nSkySweeper (c) 2023 Felicitas Pojtinger and contributors\n\nSPDX-License-Identifier: AGPL-3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpojntfx%2Fskysweeper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpojntfx%2Fskysweeper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpojntfx%2Fskysweeper/lists"}