Mastomation
mastomation is a small Elixir CLI for automation of Mastodon workflows.
It can:
- inspect and export thread content
- delete your posts with safety defaults
- download and search your private profile notes
For delete workflows, it keeps pinned, bookmarked, and favourited (by you) statuses and only deletes the rest.
Warning
This tool performs destructive actions against your account.
- Deletions are permanent.
-
Start with
--dry-runto verify which statuses would be removed. - Use a dedicated access token with only the permissions you need.
Requirements
-
Elixir
~> 1.18 - Network access to your Mastodon instance
- A Mastodon access token able to delete statuses
Create a Mastodon access token
-
Open your instance app page:
https://<your-instance>/settings/applications/new
-
Create a new application (name can be anything, e.g.
mastomation). -
Enable these permissions/scopes:
readwriteprofile
- Save the application and copy the generated access token.
-
Configure these environment variables:
MASTODON_INSTANCE_URLMASTODON_ACCESS_TOKEN
Examples:
Bash:
export MASTODON_INSTANCE_URL="https://mastodon.social"
export MASTODON_ACCESS_TOKEN="YOUR_TOKEN"Fish:
set -x MASTODON_INSTANCE_URL "https://mastodon.social"
set -x MASTODON_ACCESS_TOKEN "YOUR_TOKEN"
You can also pass them as CLI options (--instance-url and --access-token).
Installation
Install from Hex (recommended):
mix escript.install hex mastomationThis installs:
mastomationinto~/.mix/escripts- the CLI executable only (shell completions are not installed automatically)
Install from source:
git clone https://codeberg.org/maikelthedev/mastomation.git
cd mastomation
mix deps.getBuild the escript:
mix escript.buildInstall it:
mix escript.installAfter installation, the executable is available under:
~/.mix/escripts/mastomation
Add ~/.mix/escripts to your PATH so you can run mastomation directly.
If you prefer running from source in the project folder:
iex -S mixThen call modules directly:
Mastomation.run(["delete", "--dry-run"])
Mastomation.run(["thread", "see", "https://mastodon.social/@me/123456789012345678"])Usage
Run without arguments to see help:
mastomationDeletion is explicit, and credentials can be passed as flags or environment variables:
mastomation delete allOr, without env vars:
mastomation delete all --instance-url https://mastodon.social --access-token YOUR_TOKENOptions
delete all subcommand options:
-i,--instance-url INSTANCE_URL: Mastodon instance URL-t,--access-token ACCESS_TOKEN: access token-d,--delay-ms MILLISECONDS: delay between deletions (default:60000)--keyword KEYWORD(repeatable): delete only statuses containing keyword(s)--override-instance-url INSTANCE_URL: override target instance for this run--override-access-token ACCESS_TOKEN: override token for this run--dry-run: print what would be deleted, but do not delete--no-backup: skip backup export before delete--frontmatter: include YAML frontmatter in backup markdown files
By default, delete operations backup statuses before deleting. Backups are written under ./export/backups (relative to where you run mastomation).
delete thread command:
mastomation delete thread https://mastodon.social/@me/123456789012345678delete thread uses the same auth/backup/keyword flags as delete all, includes the source toot if authored by you, and caps delay at 2 seconds between deletions because thread batches are typically shorter and less likely to hit Mastodon's default delete rate limit (30 deletions per 30 minutes).
Thread subcommands
Inspect a joined thread from a source toot (same author only), including replies/subtoots in order.
mastomation thread see https://mastodon.social/@me/123456789012345678
Export the thread to markdown and media files under ./export:
mastomation thread export https://mastodon.social/@me/123456789012345678Thread auth options:
-i,--instance-url INSTANCE_URL-t,--access-token ACCESS_TOKEN--frontmatter: include YAML frontmatter in exported markdown--override-instance-url INSTANCE_URL--override-access-token ACCESS_TOKEN
Notes subcommands
Download private profile notes for accounts you follow and that follow you:
mastomation notes downloadSearch downloaded notes:
mastomation notes search "project"
mastomation notes search --term ops --term infraOptional notes flags:
--path FILE_PATH: custom notes JSON location
Default notes file location:
$XDG_DATA_HOME/mastomation/notes.json(or~/.local/share/mastomation/notes.jsonwhenXDG_DATA_HOMEis unset)
notes download also supports auth override flags:
-i,--instance-url INSTANCE_URL-t,--access-token ACCESS_TOKEN--override-instance-url INSTANCE_URL--override-access-token ACCESS_TOKEN
Notes search profile links use MASTODON_INSTANCE_URL. If MASTODON_UI=DECK, links are rendered as /deck/@handle (for example https://vmst.io/deck/@nik@toot.teckids.org).
Compatibility aliases still supported:
mastomation thread <URL_OR_ID>behaves likemastomation thread see <URL_OR_ID>mastomation deletebehaves likemastomation delete allmastomation delete --thread-source <URL_OR_ID>behaves likemastomation delete thread <URL_OR_ID>
Examples
Delete all with default backup:
mastomation delete allDelete by keyword only:
mastomation delete all --keyword projectx --keyword launchDelete your replies in a thread:
mastomation delete thread https://mastodon.social/@me/123456789012345678Behavior
The tool:
-
Resolves your account ID via
/api/v1/accounts/verify_credentials -
Fetches statuses in pages (
limit=40) from/api/v1/accounts/:id/statuses - Filters out pinned/bookmarked/favourited statuses
-
Deletes each remaining status via
/api/v1/statuses/:id -
Waits
delay_msbetween deletions to reduce rate-limit pressure
Development
Run tests:
mix testFormat and lint:
mix format
mix credoShell completions
Fish completion file:
completions/mastomation.fish
Install Fish completions
Copy-based install:
mkdir -p ~/.config/fish/completions
cp completions/mastomation.fish ~/.config/fish/completions/mastomation.fishIf you installed from Hex and do not have the repository checked out, download and install the completion file directly:
mkdir -p ~/.config/fish/completions
curl -fsSL https://codeberg.org/maikelthedev/mastomation/raw/branch/main/completions/mastomation.fish \
-o ~/.config/fish/completions/mastomation.fishSymlink-based install (recommended during development):
mkdir -p ~/.config/fish/completions
ln -sf "$PWD/completions/mastomation.fish" ~/.config/fish/completions/mastomation.fishReload fish (or open a new shell):
exec fishVersioning and changelog
-
Semantic versioning policy:
SEMVER.md -
Change history:
CHANGELOG.md
Telemetry events
Mastomation emits telemetry events you can attach to:
[:mastomation, :http, :get, :start]/:stop(metadata includesurl)[:mastomation, :http, :delete, :start]/:stop(metadata includesurl,attempt)[:mastomation, :delete, :all, :start]/:stop[:mastomation, :delete, :thread, :start]/:stop(metadata includesthread_source)[:mastomation, :thread, :export, :start]/:stop(metadata includesdry_run)