The image now packages a cross-compiled musl binary on distroless instead of compiling inside Docker. The script builds it, pushes :<version> and :latest to git.cosocial.info, and tags the commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Canadian Cities Labeler
An atproto labeler that puts a Canadian city badge on accounts that ask for one over Bluesky DMs.
- Subscribe to
@cities.pds.cosocial.ca(the Subscribe button on its profile). - Follow it.
- DM it your city, e.g.
HalifaxorRichmond, BC. Sendremoveto clear it.
The labeler polls its DMs, matches the city against data/cities.json, and signs an account
label (e.g. halifax-ns), negating any previous one. Labels are stored in SQLite and served over
com.atproto.label.subscribeLabels and queryLabels.
Built on jacquard for atproto types and XRPC.
Local test
cp .env.example .env # set LABELER_APP_PASSWORD
cargo run --bin keygen # paste SIGNING_KEY_HEX into .env
cargo run # :4100
rust-toolchain.toml pins the Rust version; rustup installs it on first build.
The labeler account must allow DMs from everyone (Settings → Privacy and security → Chat).
DM it from a test account, then check
curl 'localhost:4100/xrpc/com.atproto.label.queryLabels?uriPatterns=<did>'.
Labels won't appear in the Bluesky app until the labeler is deployed publicly and its DID
document has the #atproto_label key and #atproto_labeler service.
First time setup
cargo run --bin setup -- declare # label definitions; gives the account a Subscribe button
cargo run --bin setup -- did # run after deploying; requires labeler account's main password + emailed code
Release
Releases are made manually with the Rust toolchain. scripts/release.sh cross-compiles a static
linux/amd64 binary, packages it into a container image, pushes
git.cosocial.info/cosocial-canada/atproto-cosocial-labeler:<version> and :latest, and tags the
commit as v<version>. It refuses to run with uncommitted changes or an existing tag.
Prerequisites (once):
brew install zig # linker and C compiler for cross-compiling
cargo install --locked cargo-zigbuild
docker login git.cosocial.info # token with the write:package scope
The pinned toolchain and its x86_64-unknown-linux-musl target come from rust-toolchain.toml.
Docker must be running. Then:
scripts/release.sh 0.1.0