Clean up your Slack workspace before you leave. Delete DMs, leave channels, and archive your data.
Project description
OffBoarding
Clean up your Slack messages before you leave. Your messages, your choice.
OffBoarding is an open-source tool that lets you bulk-delete your Slack DMs and channel messages. Built for employees who want to leave a workspace cleanly, with privacy in mind.
No data is ever stored or sent anywhere. The CLI runs entirely on your machine. The web dashboard processes everything in-memory. The code is fully open source.
Why?
Slack doesn't let you bulk-delete messages. When you leave a company, all your DMs stay behind — visible to workspace admins who can export them at any time. OffBoarding gives you a way to clean up before you go.
Two ways to use it
| CLI | Web Dashboard | |
|---|---|---|
| Best for | Developers, power users | Non-technical users |
| Setup | pip install + paste token |
Deploy to Railway + Sign in with Slack |
| Privacy | Runs 100% on your machine | Self-hosted, you control the server |
| Features | Interactive TUI, progress bars | Point-and-click UI |
CLI
Install
pip install slack-offboarding
Or from source:
git clone https://github.com/ruwad-io/slack-offboarding.git
cd slack-offboarding
pip install -e .
Setup
offboarding login
This will guide you through creating a Slack App and getting your token. You'll need to:
- Go to api.slack.com/apps and create a new app
- Add the required OAuth scopes (the CLI tells you exactly which ones)
- Install the app to your workspace
- Paste the token
Your token is stored locally at ~/.config/offboarding/config with 600 permissions.
Usage
# See what you're working with
offboarding scan
# Interactive cleanup — pick conversations to clean
offboarding clean
# Clean all DMs at once
offboarding clean --all
# Simulate first (recommended)
offboarding clean --all --dry-run
# Nuclear option — wipe everything
offboarding nuke
# Check your connection
offboarding status
# Remove your saved token
offboarding logout
Commands
| Command | Description |
|---|---|
offboarding login |
Setup wizard — guides you through getting a Slack token |
offboarding scan |
Scan all DMs and show a table with message counts |
offboarding clean |
Interactive cleanup — select which conversations to delete |
offboarding clean --all |
Delete messages in all DM conversations |
offboarding clean --dry-run |
Simulate without actually deleting |
offboarding nuke |
Delete everything — requires typing "DELETE EVERYTHING" |
offboarding status |
Show current auth status and user info |
offboarding logout |
Remove saved Slack token |
Web Dashboard
For a point-and-click experience, deploy the web dashboard:
git clone https://github.com/ruwad-io/slack-offboarding.git
cd slack-offboarding
pip install -e .
cp .env.example .env
# Edit .env with your Slack App credentials
python run.py
Deploy to Railway, Render, or Fly.io for HTTPS (required by Slack OAuth).
Railway (one-click)
- Connect this repo in your Railway dashboard
- Add environment variables:
SLACK_CLIENT_ID,SLACK_CLIENT_SECRET,SLACK_SIGNING_SECRET,SECRET_KEY,APP_URL - Deploy — Railway detects the
railway.tomlautomatically
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/conversations |
List DMs with message counts |
| GET | /api/preview/<id> |
Preview messages to delete |
| POST | /api/delete/<id> |
Delete messages in one conversation |
| POST | /api/delete-all |
Delete all DMs |
| GET | /health |
Health check |
All POST endpoints accept { "dry_run": true } for simulation.
FAQ
Can I delete other people's messages? No. Slack's API only allows you to delete your own messages.
Will the other person know I deleted my messages? The messages will disappear from the conversation, but Slack doesn't notify them.
Does the other person still see their own messages? Yes. Only your messages are removed.
Can my workspace admin recover deleted messages? No. Once deleted via the API, messages are permanently gone.
Is this allowed by Slack's terms of service? Yes. You're using Slack's official API to delete your own messages.
How long does it take? Slack rate-limits deletions to about 50 per minute. A conversation with 1,000 messages takes about 20 minutes.
Project Structure
slack-offboarding/
├── src/
│ ├── cli.py # Rich CLI (click + rich)
│ ├── app.py # Flask web app
│ ├── config.py # Configuration
│ ├── routes/
│ │ ├── auth.py # OAuth login/callback
│ │ └── main.py # Dashboard & API
│ └── services/
│ └── slack_cleaner.py # Core Slack API logic
├── templates/ # HTML templates
├── static/ # CSS & JS
├── tests/ # Tests
├── slack-app-manifest.yml # Slack App manifest
├── railway.toml # Railway deployment config
├── Dockerfile # Docker build
└── pyproject.toml # Python project config
Contributing
PRs welcome! Please open an issue first to discuss what you'd like to change.
git clone https://github.com/ruwad-io/slack-offboarding.git
cd slack-offboarding
pip install -e ".[dev]"
pytest
ruff check src/
License
MIT — see LICENSE
Built by
Ruwad — Open source tools for a better developer experience.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file slack_offboarding-1.5.0.tar.gz.
File metadata
- Download URL: slack_offboarding-1.5.0.tar.gz
- Upload date:
- Size: 26.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e885b7199cfacf479f8578ee7a267a1a574367cb45e36ca02ad2a00b88966adf
|
|
| MD5 |
a36d1031c313965823247b45e813b59a
|
|
| BLAKE2b-256 |
c280cb231571366404ae5e476f9c6be7c5898886f32cc33f0019c79b938e1ffe
|
Provenance
The following attestation bundles were made for slack_offboarding-1.5.0.tar.gz:
Publisher:
release.yml on Ruwad-io/slack-offboarding
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
slack_offboarding-1.5.0.tar.gz -
Subject digest:
e885b7199cfacf479f8578ee7a267a1a574367cb45e36ca02ad2a00b88966adf - Sigstore transparency entry: 1247460133
- Sigstore integration time:
-
Permalink:
Ruwad-io/slack-offboarding@94da48d20c7061f8a3809a86322c7a7ed52c93fa -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Ruwad-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94da48d20c7061f8a3809a86322c7a7ed52c93fa -
Trigger Event:
push
-
Statement type:
File details
Details for the file slack_offboarding-1.5.0-py3-none-any.whl.
File metadata
- Download URL: slack_offboarding-1.5.0-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9d3daeded30edfdc48860fd45728a9c2f144eaea78f897546883b27bf263de4
|
|
| MD5 |
6ae412f5f862a4ccbc7af1884235e557
|
|
| BLAKE2b-256 |
dd596dbddfadb2accfab3c62ba49e2b8f1385939eb474dbbe50e8c0a81f5c653
|
Provenance
The following attestation bundles were made for slack_offboarding-1.5.0-py3-none-any.whl:
Publisher:
release.yml on Ruwad-io/slack-offboarding
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
slack_offboarding-1.5.0-py3-none-any.whl -
Subject digest:
c9d3daeded30edfdc48860fd45728a9c2f144eaea78f897546883b27bf263de4 - Sigstore transparency entry: 1247460147
- Sigstore integration time:
-
Permalink:
Ruwad-io/slack-offboarding@94da48d20c7061f8a3809a86322c7a7ed52c93fa -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Ruwad-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94da48d20c7061f8a3809a86322c7a7ed52c93fa -
Trigger Event:
push
-
Statement type: