A Ruby tool to selectively delete content from your Bluesky account.
- ποΈ Selective Deletion: Choose what to delete - posts, replies, likes, reposts, or any combination
- β° Time-based: Delete content older than a specified number of days (default: 90 days)
- π― ID-based: Target specific posts by their IDs
- π« Exclude Lists: Protect specific posts from deletion with exclude-ids
- π Dry-run Mode: Preview what would be deleted before committing (enabled by default)
- π Secure: Uses Bluesky app passwords for authentication
- π Detailed Output: Progress tracking and comprehensive logging
- Ruby 3.0 or higher
- A Bluesky account
- A Bluesky app password (generate one at bsky.app/settings/app-passwords)
-
Clone or download this repository
-
Install dependencies:
bundle install
-
Make the script executable:
chmod +x vanillasky.rb
VanillySky uses a command-based syntax where you specify what types of content to delete:
./vanillasky.rb --help
./vanillasky.rb --versionDelete posts older than 90 days (preview only):
./vanillasky.rb postsDelete both posts and likes (preview only):
./vanillasky.rb posts likesDelete only replies (preview only):
./vanillasky.rb repliesAdd --force to perform actual deletions:
./vanillasky.rb posts --force
./vanillasky.rb posts replies likes --forceDelete content older than 30 days:
./vanillasky.rb posts --days 30 --forceDelete everything (including today's content):
./vanillasky.rb posts likes reposts --days 0 --forceDelete only specific posts by their IDs:
./vanillasky.rb posts --ids abc123,def456,ghi789Delete posts but protect certain ones:
./vanillasky.rb posts --exclude-ids important123,keepme456 --forceposts: Top-level posts (not replies to other posts)replies: Your replies to other people's postslikes: Posts you've likedreposts: Posts you've reposted/shared
You can specify multiple types in one command:
./vanillasky.rb posts replies likes reposts --forceCreate a .env file:
BLUESKY_HANDLE=your-handle.bsky.social
BLUESKY_APP_PASSWORD=your-app-passwordIf no environment variables are set, you'll be prompted for:
- Your Bluesky handle (e.g.,
username.bsky.social) - Your app password (not your main account password!)
Important: Use an app password, not your main account password.
posts- Delete posts (not replies)replies- Delete replies to other postslikes- Delete likesreposts- Delete reposts
-d, --days DAYS- Delete content older than DAYS (default: 90)-n, --dry-run- Show what would be deleted without deleting (default)-f, --force- Actually delete content (required to disable dry-run)--ids ID1,ID2,ID3- Delete only specific IDs of the specified type--exclude-ids ID1,ID2,ID3- Exclude specific IDs from deletion-h, --help- Show help message-v, --version- Show version
# Preview
./vanillasky.rb posts --days 60
# Execute
./vanillasky.rb posts --days 60 --force./vanillasky.rb posts replies --exclude-ids important1,important2 --force./vanillasky.rb likes --days 30 --force- π Secure authentication with app passwords
- π‘οΈ Dry-run mode by default - requires
--forceto delete β οΈ Confirmation prompt before actual deletion- π Detailed preview of what will be deleted
- β±οΈ Rate limiting to avoid API issues
- π Comprehensive logging
- π« Exclude lists to protect important content
- β Mutual exclusion prevents conflicting options
π VanillaSky - Bluesky Skeet Auto-Delete
=========================================
β
Successfully authenticated as alice.bsky.social
π DRY RUN MODE - Nothing will be deleted
π« Excluding 2 IDs from deletion: important123, keepme456
π Scanning for posts older than 2024-05-25...
....
π Found 23 posts older than 90 days
π¬ Found 15 replies older than 90 days
[DRY RUN] ID: abc123 | 2024-03-15 - Just tried that new coffee shop...
[DRY RUN] ID: def456 | 2024-03-10 - Beautiful sunset today! πΈ
...
π DRY RUN: Would have deleted 23 posts
π DRY RUN: Would have deleted 15 replies
- Authentication: Connects to Bluesky using your handle and app password
- Command Parsing: Determines what content types to process
- Scanning: Fetches your content in batches, checking dates and types
- Filtering: Applies time thresholds and exclude lists
- Preview/Execution: Shows what would be deleted or performs deletions
- Rate Limiting: Processes deletions with delays to respect API limits
- v0.2.1: Fix SSL certificate CRL verification errors on Ruby 3.4+
- v0.2: Command-based interface, replies support, exclude-ids functionality
- v0.1: Original flag-based interface
- Credentials are only used for the current session and never stored
- All API communications use HTTPS
- App passwords have limited scope compared to main passwords
- App passwords can be revoked anytime from Bluesky settings
- Processes content sequentially to respect rate limits
- Cannot recover deleted content
- Some very old content might not be accessible via the API
Feel free to open issues or submit pull requests for bugs or feature suggestions.
This project is licensed under the MIT License - see the LICENSE file for details.