Sakamoto is a modular Python Discord bot inspired by the Nichijou character. It focuses on voice features for small-to-medium communities.
It is a Python rewrite intended to apply stronger modular design than earlier projects.
See the setup guide and configuration reference for integration-specific tokens.
export TOKEN='YOUR_DISCORD_BOT_TOKEN'
./init-docker.shBy default, Docker Compose builds Sakamoto locally.
To enable automatic updates, uncomment the published ghcr.io/taichikuji/sakamoto:latest image, the Watchtower label, and the updater service in docker-compose.yml. The updater uses the maintained nickfedor/watchtower fork, only watches labelled containers, and removes old images after successful updates.
Watchtower checks daily at midnight UTC by default. Override its six-field cron expression with WATCHTOWER_SCHEDULE.
docker build -t sakamoto:latest .
docker run -e TOKEN='YOUR_DISCORD_BOT_TOKEN' sakamoto:latestPrebuilt images are available as ghcr.io/taichikuji/sakamoto:latest; they can be used with Kubernetes, though this repository does not provide a Kubernetes manifest.
pipenv install --dev
export TOKEN='YOUR_DISCORD_BOT_TOKEN'
pipenv run python main.pyExtensions live in extensions/, grouped by responsibility:
core/contains always-on administration such as loading, syncing, and shutdown.audio/,moderation/,community/,integrations/, andgeneral/contain user-facing domains.
See the contribution guide, domain context, and wiki.
Sakamoto stores UTC daily aggregate command counts so the Discord application owner can review usage with /analytics. The report defaults to 30 days and accepts a period from 1 to 90 days.
The analytics table contains only the command's fully qualified name and its successful and failed invocation counts. It does not store user or server history, Discord IDs, command arguments or options, message content, search terms, URLs, IP data, or command error details. Direct-message interactions are ignored. Daily rows are permanently deleted after 90 days.
Every guild slash command completion and unhandled error is counted. Commands whose normal operation can end in a handled failure, such as an upstream service error or an immediate playback failure, additionally mark that outcome as failed instead of successful.
Can be seen @ Pipfile