# Canadian Cities Labeler An atproto labeler that puts a Canadian city badge on accounts that ask for one over Bluesky DMs. 1. Subscribe to `@cities.pds.cosocial.ca` (the Subscribe button on its profile). 2. Follow it. 3. DM it your city, e.g. `Halifax` or `Richmond, BC`. Send `remove` to 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](https://tangled.org/nonbinary.computer/jacquard) for atproto types and XRPC. ## Local test ```sh 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='`. 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 ```sh 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:` and `:latest`, and tags the commit as `v`. It refuses to run with uncommitted changes or an existing tag. Prerequisites (once): ```sh 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: ```sh scripts/release.sh 0.1.0 ```