{"ref":"main","files":[{"name":".config","kind":"directory","size":0,"lastCommitHash":"4eb59e4f6cb4d9f2fdb4c222c3e88e9b685014d0","lastCommitWhen":"2026-09-24T13:09:23Z","lastCommitMessage":"Creating a mega test binary\n\nOverall `just test` runs about 10-20s faster on this branch than current main, for me, with around 170s instead of around 180-190s. But the cool thing is the compile time. Making a simple edit to any file involved and running `just test` on main takes about 60s to recompile the test binaries. On this branch it takes less than 15s.\n\nThis is done by replacing a ton of separate test binaries with a single megabinary.\n\nOnly test files that looked safe have been included, avoiding ones that do stuff like setting env.\n"},{"name":".sqlx","kind":"directory","size":0,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":".tangled","kind":"directory","size":0,"lastCommitHash":"e3b987b4e54e425c9474b5b4ffe8f695d2c14e0f","lastCommitWhen":"2026-10-02T11:06:50Z","lastCommitMessage":"ci: tag main on every image push\n\nInstead of moving :latest, this adds :main for the intrepid adventurers who wish to live dangerously.\n\nAnd then we can have :latest track the latest proper release instead.\n"},{"name":"crates","kind":"directory","size":0,"lastCommitHash":"c807ee603060f6811fe59e87a0df2e5c8207eada","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: drop upstream's subscribeRepos rate limit\n\nReverts upstream 8fd032f (\"Rate limit subscribeRepos\", in v0.7.0), which\nlimited com.atproto.sync.subscribeRepos to 5 connections per 60s per IP.\nAna asked for the fork to run without it. Every other rate limit is kept.\n\nNo test covered the limit (the test env sets DISABLE_RATE_LIMITING), so\nno tests change. Upstream's CHANGELOG entry for it is left as history.\n"},{"name":"deploy","kind":"directory","size":0,"lastCommitHash":"dc2fbe665419961694ba7add4402e56dfebcc19e","lastCommitWhen":"2026-08-13T05:35:23Z","lastCommitMessage":"chore: use JSON array for healthcheck now that container is distroless\n"},{"name":"docs","kind":"directory","size":0,"lastCommitHash":"b4d382120838f47f60df2039729b250924c414b0","lastCommitWhen":"2026-10-05T11:35:18-04:00","lastCommitMessage":"signup: optional Cloudflare Turnstile check on account creation\n\nOff unless both TURNSTILE_SITE_KEY and TURNSTILE_SECRET_KEY are set.\nWhen on, createAccount, _account.createPasskeyAccount and SSO\ncomplete-registration need a token in the x-turnstile-token header,\nverified against siteverify (secret, response, remoteip from the rate\nlimiter's client IP, PDS hostname check) before any other work or\ninvite-code use. Siteverify failures fail closed (503\nCaptchaUnavailable); missing and rejected tokens are 400\nCaptchaRequired and InvalidCaptcha.\n\nRequests carrying a createAccount service token from the DID they bring\n(inbound migration, BYOD did:web) are exempt so goat and PDSMoover keep\nworking; delegated accounts are already authenticated. describeServer\ngains turnstileSiteKey only when enabled.\n"},{"name":"examples","kind":"directory","size":0,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"frontend","kind":"directory","size":0,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"migrations","kind":"directory","size":0,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"observability","kind":"directory","size":0,"lastCommitHash":"158628f1a71c810947217f936e5204fe8e32a0de","lastCommitWhen":"2026-01-18T16:41:41Z","lastCommitMessage":"feat: docs tweaks & standalone frontend\n"},{"name":"scripts","kind":"directory","size":0,"lastCommitHash":"7978246c6632d77860daa8ac8e86bfc247540c5f","lastCommitWhen":"2026-09-23T17:24:44Z","lastCommitMessage":"Remove redundant cargo test build and set SQLX_OFFLINE=true\n\nThe pg tests were missing SQLX_OFFLINE\n"},{"name":"shells","kind":"directory","size":0,"lastCommitHash":"8c3386a3ab805365b850bd0ffadae2e3d50130d2","lastCommitWhen":"2026-09-01T16:31:10Z","lastCommitMessage":"caddy: on-demand TLS endpoint\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":".containerignore","kind":"file","size":142,"lastCommitHash":"4015217a2ebc265d14ba79c70adfeecbddda778c","lastCommitWhen":"2026-05-30T23:46:22+03:00","lastCommitMessage":"feat(store): Clock trait for DST\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"},{"name":".dockerignore","kind":"symlink","size":16,"lastCommitHash":"cc9ac301ca36dabf5ebdcf25b58be276b393b6dc","lastCommitWhen":"2026-09-21T14:41:54Z","lastCommitMessage":"Little tweaks for multi-arch image building\n\nUpdates the default runner debian image sha to the multi-arch image instead of amd64-only. Also symlinks .containerignore -> .dockerignore since docker refuses to read .containerignore.\n\nWith that one can build and push multi-arch, like so:\n\n```\ndocker buildx create --name tranquil-multiarch --driver docker-container --bootstrap\n\ndocker buildx build \\\n  --builder tranquil-multiarch \\\n  --platform linux/amd64,linux/arm64 \\\n  -t atcr.io/tranquil.farm/tranquil-pds:0.6.7 \\\n  --push \\\n  .\n\ndocker buildx imagetools create \\\n  -t atcr.io/tranquil.farm/tranquil-pds:latest \\\n  atcr.io/tranquil.farm/tranquil-pds:0.6.7\n```\n\nif one were so inclined, that is.\n"},{"name":".envrc","kind":"file","size":19,"lastCommitHash":"613a65b393c7cdd51b04ee8e68327ad6e6bb1ad4","lastCommitWhen":"2025-12-28T13:09:01Z","lastCommitMessage":"source .env in devshell if one is pressent\n"},{"name":".gitignore","kind":"file","size":122,"lastCommitHash":"4015217a2ebc265d14ba79c70adfeecbddda778c","lastCommitWhen":"2026-05-30T23:46:22+03:00","lastCommitMessage":"feat(store): Clock trait for DST\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"},{"name":"Cargo.lock","kind":"file","size":231705,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"Cargo.toml","kind":"file","size":6716,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"CHANGELOG.md","kind":"file","size":2623,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"config.dev.toml","kind":"file","size":537,"lastCommitHash":"093484388f285cc90f77efc2dc1ee847252ec63c","lastCommitWhen":"2026-08-28T12:36:47Z","lastCommitMessage":"Allow private IPs in dev\n\nRunning tranquil with `just run-dev` using `pds.test` seems to be broken due to a recent change that blocks requests to private ips. Inside the compose network `pds.test` resolves to the traefik container's private IP. So it can't make requests to stuff like `https://pds.test/oauth-client-metadata.json` or the local plc.\n\nIntroduces a new flag, default off, that allows connecting to private IPs, set to true for the dev compose.\n"},{"name":"CONTRIBUTING.md","kind":"file","size":10147,"lastCommitHash":"9538a1dd482fad2411e714da336f344dd54131cf","lastCommitWhen":"2026-10-02T09:07:25Z","lastCommitMessage":"docs: impromptu LLM-talk and other small touches\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"default.nix","kind":"file","size":791,"lastCommitHash":"dbc3c23c957fad03635c9e3c665831622ac7af91","lastCommitWhen":"2026-04-09T21:30:03Z","lastCommitMessage":"fix(nix): allow fetch Git deps\n"},{"name":"docker-compose.prod.yaml","kind":"file","size":2577,"lastCommitHash":"221b32d66f6f9573aab6ee36f02cbc690f443c98","lastCommitWhen":"2026-06-19T09:16:30+03:00","lastCommitMessage":"build: smaller faster prod container\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"},{"name":"docker-compose.yaml","kind":"file","size":4393,"lastCommitHash":"072e993c9d70d45b7f963416e4cda1db1c47b23b","lastCommitWhen":"2026-10-02T13:35:24+03:00","lastCommitMessage":"docker-compose: did-method-plc apparently needs forcing to main branch\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"Dockerfile","kind":"file","size":3958,"lastCommitHash":"3054f04354402c4693f07856bcb7e6fb97a1eb4b","lastCommitWhen":"2026-09-27T07:32:18Z","lastCommitMessage":"ci: restore image publishing\n"},{"name":"Dockerfile.dev","kind":"file","size":448,"lastCommitHash":"48ae1e8b7bb12213c02e5ec31135c8c0d881c81c","lastCommitWhen":"2026-06-16T14:31:32+03:00","lastCommitMessage":"Move Dockerfile(s) from musl to glibc\n\nMusl is tier 2 on rust support, and glibc is tier 1.\nhttps://doc.rust-lang.org/nightly/rustc/platform-support.html\nGenerally, glibc rust is reported to be more performant. Could vary due\nto any other reason, but in my testing, builds were up to 50% faster\n(for docker cross-compilation amd64->arm64 at least).\n"},{"name":"example.toml","kind":"file","size":26976,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"flake.lock","kind":"file","size":614,"lastCommitHash":"9ccec274aab92d37fd48dcf6f2a7baa3a0ad4a55","lastCommitWhen":"2026-07-17T02:14:30+02:00","lastCommitMessage":"chore: nix flake update\n"},{"name":"flake.nix","kind":"file","size":1541,"lastCommitHash":"8c3386a3ab805365b850bd0ffadae2e3d50130d2","lastCommitWhen":"2026-09-01T16:31:10Z","lastCommitMessage":"caddy: on-demand TLS endpoint\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"frontend.nix","kind":"file","size":849,"lastCommitHash":"f2754efeb20a311768e9058a8d123d0c33916e15","lastCommitWhen":"2026-07-17T02:14:30+02:00","lastCommitMessage":"chore(nix): use fetcherVersion 4 of fetchPnmpDeps\n"},{"name":"justfile","kind":"file","size":9565,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"KNOWN_ISSUES.md","kind":"file","size":715,"lastCommitHash":"7faec624d12618e09ea915753c87c1b123e418ed","lastCommitWhen":"2026-01-05T23:08:25+02:00","lastCommitMessage":"General linting, document react-native-streamplace-oauth-problem\n"},{"name":"LICENSE","kind":"file","size":497,"lastCommitHash":"a3b5f6135a2c14537e36b97d801062fd02c9cd57","lastCommitWhen":"2025-12-25T18:57:18Z","lastCommitMessage":"add license information\n"},{"name":"LICENSE-AGPL-3.0-or-later","kind":"file","size":34523,"lastCommitHash":"a3b5f6135a2c14537e36b97d801062fd02c9cd57","lastCommitWhen":"2025-12-25T18:57:18Z","lastCommitMessage":"add license information\n"},{"name":"LICENSE-CC-BY-SA-4.0","kind":"file","size":20137,"lastCommitHash":"a3b5f6135a2c14537e36b97d801062fd02c9cd57","lastCommitWhen":"2025-12-25T18:57:18Z","lastCommitMessage":"add license information\n"},{"name":"module.nix","kind":"file","size":7664,"lastCommitHash":"8c3386a3ab805365b850bd0ffadae2e3d50130d2","lastCommitWhen":"2026-09-01T16:31:10Z","lastCommitMessage":"caddy: on-demand TLS endpoint\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"nginx.conf","kind":"file","size":2756,"lastCommitHash":"54504670117375c80f364a446c58275409de1e91","lastCommitWhen":"2026-03-07T21:06:25Z","lastCommitMessage":"fix: container build should use all-in-one backend+frontend\n"},{"name":"pkgs.nix","kind":"file","size":227,"lastCommitHash":"39f74b5adf870a66a8e46444646cc84b5e3280e7","lastCommitWhen":"2026-06-07T22:14:27+02:00","lastCommitMessage":"feat(nix): pratice what i preach. expose lib.mkPackages\n"},{"name":"README.md","kind":"file","size":6333,"lastCommitHash":"c74f6c8f96859e70b112cd08f9eb9cabb5d97742","lastCommitWhen":"2026-10-20T23:36:12Z","lastCommitMessage":"sync: upstream tranquil-pds v0.7.1\n\nBrings in upstream v0.7.1, including the webpki-roots / webpki-root-certs\n1.0.10 and rustls-webpki 0.103.16 bump for the eMudhra intermediate\ncompromise. Version stays at upstream's 0.7.1.\n\nConflicts:\n- authorize/login.rs: upstream wraps authorize_get responses in respond!()\n  (iOS cookie test); the fork's ?sso= forwarding (register and login\n  redirects) now goes through respond!() too. authorize_post takes\n  upstream's begin_second_factor flow; the device cookie it uses is read\n  with the fork's current_device() (bumps last_seen, drops swept devices).\n- authorize/mod.rs: AuthorizeQuery keeps both the fork's `sso` and\n  upstream's `redirect_test` fields.\n- authorize/passkey.rs, two_factor.rs: upstream's begin/complete_second_factor\n  and consent_or_code structure, with every extract_device_cookie() call\n  replaced by current_device() as the fork's device-retention commit did.\n- tests/it/store_parity.rs: union of imports (fork DeviceId, upstream\n  OutboundMessage).\n- tranquil-store metastore/oauth_ops.rs: fork device-link helpers and\n  stage_account_devices_removal kept; one test module with both the fork's\n  stale-device sweep test and upstream's completed-identity guard test\n  (chrono::Duration imported in the test module since upstream dropped it\n  from the top-level import).\n- frontend api.ts: createPasskeyAccount takes upstream's requestUri and the\n  fork's captchaToken.\n- frontend registration/flow.svelte.ts: fork's single sign-up form kept;\n  upstream's registration binding applied by sending requestUri from the\n  URL in createAccount (upstream's did:web/BYOD code stays removed).\n- frontend Register.svelte: upstream's login_required -> goToLogin handling\n  added (goToLogin ported) alongside the fork's signup.errors.generic text.\n- frontend tests/oauth-registration.test.ts (auto-merged, adapted): the\n  new request_uri test now drives the fork's createAccount(); the passkey\n  variant is dropped as the fork's flow has no passkey-account creation.\n\n\nSquashed from the merge 7aaa931 (parents 7a4c109, v0.7.1 4e5ded7) so the PR applies as\na patch on tangled; the tree is identical to that merge.\n"},{"name":"rust-toolchain.toml","kind":"file","size":86,"lastCommitHash":"7a54ccf6a38a748e9a63c9d7c8bfe201aeefeeec","lastCommitWhen":"2026-05-29T09:39:14+03:00","lastCommitMessage":"fix(tranquil-config): reject unknown keys in TlsConfig, bump rust 1.96\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"},{"name":"shell.nix","kind":"file","size":700,"lastCommitHash":"8c3386a3ab805365b850bd0ffadae2e3d50130d2","lastCommitWhen":"2026-09-01T16:31:10Z","lastCommitMessage":"caddy: on-demand TLS endpoint\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"test.nix","kind":"file","size":10227,"lastCommitHash":"05ab0b7423c0c67bfaf2d8c1eb8def0bd6a27e18","lastCommitWhen":"2026-06-22T20:31:06+03:00","lastCommitMessage":"nix: use systemd-nspawn tests\n\nthis speeds tests up like 10 fold; had to swap from sudo to runuser\nsince sudo wanted passwords\n"},{"name":"traefik.dev.yaml","kind":"file","size":835,"lastCommitHash":"c0caa93228585cfbcbcadf53ea575fc669e4f577","lastCommitWhen":"2026-08-23T09:50:08Z","lastCommitMessage":"Dev compose improvements\n\n1. Set the max connections to 20, I frequently see\n\ndb-1            | 2026-08-23 08:57:02.784 UTC [12641] FATAL:  sorry, too many clients already\n\n2. Add a wildcard route in Traefik to serve DID documents locally.\n\n3. Expose the PLC port locally so I can point an app at `http://localhost:2582` and be able to do full OAuth flows.\n"},{"name":"TRANQUIL_OWN_DB_RFC.txt","kind":"file","size":8840,"lastCommitHash":"282f08f207a63b5e74caee9b7de586dd645f0cca","lastCommitWhen":"2026-03-22T18:54:51+02:00","lastCommitMessage":"feat(rfc): outline tranquil-store idea for comment\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"}],"branches":[{"name":"main","hash":"c807ee603060f6811fe59e87a0df2e5c8207eada","when":"2026-10-20T23:36:12Z","isDefault":true,"message":"sync: drop upstream's subscribeRepos rate limit\n\nReverts upstream 8fd032f (\"Rate limit subscribeRepos\", in v0.7.0), which\nlimited com.atproto.sync.subscribeRepos to 5 connections per 60s per IP.\nAna asked for the fork to run without it. Every other rate limit is kept.\n\nNo test covered the limit (the test env sets DISABLE_RATE_LIMITING), so\nno tests change. Upstream's CHANGELOG entry for it is left as history.\n"},{"name":"wisp/device-retention","hash":"e776556955f2b4d0b2e89aedd2faf428f4b0c788","when":"2026-10-12T17:52:19-04:00","isDefault":false,"message":"oauth: forget sign-in devices of deleted accounts and idle ones\n\noauth_device keeps the IP address and user agent of every browser that\nsigned in, but nothing ever deleted a row: account deletion cascaded\nonly the oauth_account_device link, so the device row outlived the\naccount, and the tranquil-store backend kept the link too.\n\nEvery account deletion path (delete_account_complete, the admin one and\ndelete_account_with_firehose; tranquil-store's shared delete path) now\ndeletes, in the same transaction or write batch, the devices only that\naccount is linked to. Devices another account also signs in on keep\ntheir row and just lose the link.\n\nA sweep on the scheduled delete-check tick removes devices unused for\nscheduled.oauth_device_retention_secs (OAUTH_DEVICE_RETENTION_SECS,\ndefault 90 days, 0 disables), and unlinked devices after a day: they\nare created when a sign-in starts, before any account is linked.\nUse is the newest of the device's last_seen_at, its account links'\nupdated_at (bumped on every sign-in on it) and, on postgres, the\nupdated_at of tokens issued through it (bumped on refresh); tokens in\ntranquil-store don't record their device. Devices still trusted for 2FA\nare kept until the trust ends. last_seen_at was never refreshed before;\nthe authorize endpoints now bump it whenever they read the device\ncookie, and a cookie naming a swept device is treated as no cookie, so\na sign-in can't hit the oauth_device foreign keys with a dead id.\noauth_token.device_id and oauth_authorization_request.device_id are ON\nDELETE SET NULL, so deleting a device never ends a session.\n\nTests: store_parity covers all three deletion paths and the sweep on\nboth backends, plus postgres-only trust and token-refresh cases; a\ntranquil-store unit test covers the sweep with backdated links and a\ntrusted device.\n"},{"name":"lt/llm-talk","hash":"443b024d56d96349f7d4fffd94783eaffd85724e","when":"2026-10-01T13:38:07+03:00","isDefault":false,"message":"docs: impromptu LLM-talk and other small touches\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"lt/comms-locale-template","hash":"9de8e5f4676fac1bc6cb3218884fa00383f7cf10","when":"2026-10-01T12:41:10+03:00","isDefault":false,"message":"comms: typed locale templates, single-pass render\n\nLewis: May this revision serve well! <did:plc:3fwecdnvtcscjnrx2p4n7alz>\n"},{"name":"push-mlyormwoxyzn","hash":"8a168f1daacbce84595f7a402531540df2d84571","when":"2026-08-29T02:43:11+02:00","isDefault":false,"message":"fix(api): dont do rotation key validation in signPlcOperation as it blocks migrations\n"},{"name":"push-luotlruqmzxm","hash":"218e364e606af7b9626bd3d132945a9efa468823","when":"2026-07-25T12:57:02+02:00","isDefault":false,"message":"feat(docs): explain our definition of \"correct PDS implementation\"\n"},{"name":"push-lvllowrtytqy","hash":"726cbbfc53ab92b3503134ea436811e61b997416","when":"2026-07-15T00:27:15+02:00","isDefault":false,"message":"feat(config): add more default crawlers/relays\n"},{"name":"push-mmlouqxtnnpm","hash":"bfadc936c02cdbd0f3a05c8778e20f4e344d34be","when":"2026-06-11T23:23:37+02:00","isDefault":false,"message":"fix(api): dont verify signature or DID during importRepo\n"},{"name":"fix/zombie-websocket-connections","hash":"28f2735023badc90c269a9d476c6c539fe0bcd25","when":"2026-04-28T22:15:08+02:00","isDefault":false,"message":"feat(test): test that websockets get closed\n"},{"name":"feat/tranquil-store-initial-ver","hash":"05246aec585ea58f6e17409b528c651d0467ea74","when":"2026-04-10T13:57:47+03:00","isDefault":false,"message":"feat(tranquil-store): gc and hardening\n\nLewis: May this revision serve well! <lu5a@proton.me>\n"}],"totalBranches":10,"tags":[{"name":"v0.6.7-wisp.e776556","commitHash":"e776556955f2b4d0b2e89aedd2faf428f4b0c788","tagHash":"4918f2884198f9b4bb6b383fdcca946009c58ded","when":"2026-10-12T18:16:24-04:00","message":"pds.wisp.place build: + forget sign-in devices of deleted accounts and idle ones","taggerName":"nekomimi.pet"},{"name":"v0.6.7-wisp.450f0cd","commitHash":"450f0cd80380f618c3086186a603a536ab1dea8b","tagHash":"14cac85793b9c38fc64a7f5e039b7124abf584a1","when":"2026-10-05T13:12:12-04:00","message":"pds.wisp.place build: + sso shortcut on /oauth/authorize","taggerName":"nekomimi.pet"},{"name":"v0.6.7-wisp.0b71df0","commitHash":"0b71df07b16c6ec3ade61e6666aa2792e6bc114b","tagHash":"c2af556b5236880383d7198366454b930e1375bc","when":"2026-10-05T12:51:45-04:00","message":"pds.wisp.place build: + GitHub sign-ups set a password","taggerName":"nekomimi.pet"},{"name":"v0.6.7-wisp.f88b2e1","commitHash":"f88b2e13c3b8d2938126fe25f8b4d673ad768fcf","tagHash":"f675da8b7fa144425f860ac975079e25d26b8793","when":"2026-10-05T12:19:45-04:00","message":"pds.wisp.place build: + source link on every app page","taggerName":"nekomimi.pet"},{"name":"v0.6.7-wisp.7b052af","commitHash":"7b052af719f48252402ed93d74aba93ba0a0c44f","tagHash":"4fd0fa1bd7c58ee1abab01f84189c3d097ef2e44","when":"2026-10-05T12:13:08-04:00","message":"pds.wisp.place build: v0.6.7 + turnstile + wisp sign-up + migration DID login + source link","taggerName":"nekomimi.pet"},{"name":"v0.6.7","commitHash":"75c341b94b9b4a1525a7bd370adbb0b72efea629","tagHash":"517bec62790d2ddc487fe26cccc0d8db045f96e8","when":"2026-09-20T22:31:07+02:00","message":"Version 0.6.7\nFeatures and noteworthy implementation changes:\n- OAuth tokens now get their scopes, collapsed into the minimal equivalent set and brotli compressed to minimise the size of tokens. Thanks lou.gg (did:plc:w64dlsa4zwjv2wljlvmymldc)!\n- Update getServiceAuth to support the new aud parameter as per proposal 0014 (https://github.com/bluesky-social/proposals/tree/main/0014-service-auth-revised). Thanks lou.gg (did:plc:w64dlsa4zwjv2wljlvmymldc)!\n- Second OAuth flow and consent screen overhaul to better support transitional scopes, and to be more robust to erroneous or nonsensical scope requests. Thanks trezy.codes (did:plc:4jrld6fwpnwqehtce56qshzv)!\n- The S3 blob storage backend now supports a path config parameter. Thanks calico.lgbt (did:plc:qthgnl7ryv5fmh6lnssdmo6w)!\n- Unified various in-mem caches into the PDS cache.\n- Tranquil now serves on-demand TLS responses suitble for Caddy under `/.well-known/caddy/ask`.\n\nBug fixes:\n- Fix the URI parsing to support non-authority URIs. Thanks jack.is (did:plc:cwdkf4xxjpznceembuuspt3d)!\n- Restore RPC scopes for delegation presets. Thanks trezy.codes (did:plc:4jrld6fwpnwqehtce56qshzv)!\n- Keep blob ownership per user so we don't risk deleting an in-use blob that's used by multiple people. Thanks jola.dev (did:plc:bvraa6gajy4tfr3eh2sisdkr)!\n- Add MIME version to out going emails as mandated by RFC 2045. Thanks luna.pds.devcat.one (did:plc:qij7bjzgwlshfr2fljkjd7gc)!\n- Loosen CORS header requirements to be more flexible to apps adding unexpected headers. Thanks jola.dev (did:plc:bvraa6gajy4tfr3eh2sisdkr)!\n- Don't accidentally block migrations by denying signPlcOperation requests that remove the PDSs rotation keys.","taggerName":"nelind"},{"name":"v0.6.6","commitHash":"72fa88d79adfd30fb29e330987bb3cb0eb51f310","tagHash":"de1446fbf8c0b41f873db041882ff9809b1a2863","when":"2026-07-26T00:26:37+02:00","message":"Version 0.6.6\n\nMajor changes:\n\n- Permission sets now work properly with delegated accounts and the permission consent screen has gotten a face lift. Thanks trezy.codes (did:plc:4jrld6fwpnwqehtce56qshzv)!\n- To support Bluesky Tranquil has to implement a variety of non-spec behaviours. These can now be disabled at compile time with the `bsky-support` Cargo feature.\n  Additionally the `bsky` Cargo feature can now be used to disable Bluesky specific features like the age assurance override.\n- Postgres now also supports the kind of structural repair that was added to tranquil-store last version.\n- Tranquil can now also serve HTTP/3 traffic on it's own.\n- The ripple cache backend now uses QUIC instead of TCP.\n\nNotable bug fixes and smaller best practice or compatibility changes:\n\n- Inter service auth tokens are now minted with uppercase `JWT` instead of lowercase `jwt` in the `typ` header claim. Thanks ave.zone (did:plc:mchrltkrhuzpxleiwpmmvpar)!\n- At least for now cred auth token expiry time now matches the higher expirys of the ref impl. Thanks ave.zone (did:plc:mchrltkrhuzpxleiwpmmvpar)!\n- At least for now cred auth token reuse has been given a 2 hour grace period to match the ref impl behaviour. Thanks ave.zone (did:plc:mchrltkrhuzpxleiwpmmvpar)!\n- did:web accounts are no longer required to have the bogus #atproto_reserved verification method in their DID document during sign up.\n- tranquil-store has recieved a variety of op related bug fixes.\n- autocomplete is now no longer blocked for the TOTP field during login. Thanks igneousflock.dev (did:plc:mwpubvpiaddthywa6tqvg7kv)!","taggerName":"nelind"},{"name":"v0.6.5","commitHash":"91999819c616afbb26586dce4e1ab70f767684de","tagHash":"2402261868cb24d61df457a8c3107a776518ce1e","when":"2026-06-04T21:44:45+02:00","message":"Version 0.6.5\n\n- (PR#175) Authenticated Bluesky feedgens now work properly. Thank you to @ave.zone (did:plc:mchrltkrhuzpxleiwpmmvpar).\n- (PR#162) putRecord without a $type now pulls the type off of the collection instead of failing.\n- tranquil-store now has some MST self healing features.","taggerName":"nelind"},{"name":"v0.6.4","commitHash":"7e4c9e1daba4b72906d0a37c504302ec48228963","tagHash":"196760e32b7ce31be7f6b3c674e4cdc0d6e19285","when":"2026-05-30T21:23:18+03:00","message":"- Firehose no longer drops events when sequence numbers commit out of order.\n- Migration follows the oauth account:* spec (ie. *don't* use that lol) and supports p256 keys.\n- Nix data storage paths now default off the dataDir option.\n- TlsConfig rejects unknown keys, and the toolchain moves to rust 1.96.","taggerName":"lewis"},{"name":"v0.6.3","commitHash":"e85394c3144e780ac8e75a8cf8955cf929d417b0","tagHash":"aa4aface927a3b91ff53645099e4f06fac63d3cb","when":"2026-05-27T19:30:52+02:00","message":"Version 0.6.3","taggerName":"nelind"},{"name":"v0.6.2","commitHash":"bdaf510898c9675bd4ea7acc7ddd524d453be9c8","tagHash":"3cb04213b04e9e4c285be7fcdc036ad06e3ec2d1","when":"2026-05-27T19:08:22+02:00","message":"Version 0.6.2","taggerName":"nelind"},{"name":"v0.6.0","commitHash":"b1d86caa7848a006683a017c8effdfdf63709316","tagHash":"f5cf46d795a3442c354618445128a86ecb00bf3c","when":"2026-05-27T19:07:54+02:00","message":"Version 0.6.0","taggerName":"nelind"},{"name":"v0.5.7","commitHash":"8f7aad3756fe0afa384eaf45cf35f804f16c0c4e","tagHash":"cab9f01b7768daf9aefdbc218001db29695531a9","when":"2026-05-27T19:07:31+02:00","message":"Version 0.5.7","taggerName":"nelind"},{"name":"v0.5.6","commitHash":"180de2998450d831e864cd4832ffa843eac5d209","tagHash":"fc817cea4c2beda2aa1e939a1f97a4d69fcb51b1","when":"2026-05-27T19:07:04+02:00","message":"Version 0.5.6","taggerName":"nelind"},{"name":"v0.5.5","commitHash":"b9574f3ec144bba9b06397bd387fa53f028b7726","tagHash":"40287cf405e796e809d9e9eee0eb4f2aa38509c6","when":"2026-05-27T19:06:24+02:00","message":"Version 0.5.5","taggerName":"nelind"},{"name":"v0.5.4","commitHash":"d51bfd59da71c3d283eeb803050d7c07d7742a97","tagHash":"6c05a73c386af21ce5053bcd2ba15b73a55097e8","when":"2026-05-27T19:06:02+02:00","message":"Version 0.5.4","taggerName":"nelind"},{"name":"v0.5.3","commitHash":"8ccdd30cb3159d9c103c3c76a7b330710e5e98c3","tagHash":"47c9e09e0921a02ed85e76caeefa3fe4abd604fc","when":"2026-05-27T19:05:30+02:00","message":"Version 0.5.3","taggerName":"nelind"},{"name":"v0.5.2","commitHash":"1dfbd27cce9784a1bb7e2f85441473c1506647d6","tagHash":"6243a28067452fb205b0460efb9790dd4582e67c","when":"2026-05-27T19:05:05+02:00","message":"Version 0.5.2","taggerName":"nelind"},{"name":"v0.5.1","commitHash":"34f050a1f0dce0167ae71e705fd0a8a7cf878428","tagHash":"0dd6c2961dfe5d215be475c307c54aced2700660","when":"2026-05-27T19:04:25+02:00","message":"Version 0.5.1","taggerName":"nelind"},{"name":"v0.5.0","commitHash":"8d0e0c6810badd4f46f60037a5824873bce6d1ca","tagHash":"dcd1593b1cc824d81fcba019f42bf9317595ba71","when":"2026-05-27T19:04:05+02:00","message":"Version 0.5.0","taggerName":"nelind"},{"name":"v0.4.7","commitHash":"e6c8a44a42e7d0b158ea8188c02b1b6047177973","tagHash":"ad7d51bc2bfdf4c46fe50af06d7e37c16f17a33e","when":"2026-05-27T19:02:54+02:00","message":"Version 0.4.7","taggerName":"nelind"},{"name":"v0.4.6","commitHash":"4d86f026dfaea61732abe4ba36657a0054364358","tagHash":"09c26d129c01fef8ec95c13479e9e7ce37533e2d","when":"2026-05-27T19:02:25+02:00","message":"Version 0.4.6","taggerName":"nelind"},{"name":"v0.4.5","commitHash":"5c8894d531d2a5f1a945114548fe79f96f0e214f","tagHash":"eae3bc90bc28fcad79884e6c443028eabcc12fd0","when":"2026-05-27T19:01:54+02:00","message":"Version 0.4.5","taggerName":"nelind"},{"name":"v0.4.4","commitHash":"ebf5af49223675980f78df92fdd750d21f6bcd54","tagHash":"aa682e5d63fb5d9b093ae47cb74dc71ba66624fa","when":"2026-05-27T19:01:11+02:00","message":"Version 0.4.4","taggerName":"nelind"},{"name":"v0.4.3","commitHash":"7926c798c663ecc7d3629c99c77351fb2cbbf5da","tagHash":"c033880fbc2c28735a72fa118fca8ad62d701b47","when":"2026-05-27T19:00:41+02:00","message":"Version 0.4.3","taggerName":"nelind"},{"name":"v0.4.2","commitHash":"d5ed420dd7fb4ccadfc1f6e41974ea8349bd24c4","tagHash":"01448b16b07b2cc731eba722577ce45f6b76e012","when":"2026-05-27T18:59:39+02:00","message":"Version 0.4.2","taggerName":"nelind"},{"name":"v0.4.1","commitHash":"546d3421367633457273563f85152b5fdd8cdd6b","tagHash":"bfaab7f4c3b5a8f6035a01d01bc493ed44cfdd3f","when":"2026-05-27T18:58:40+02:00","message":"Version 0.4.1","taggerName":"nelind"},{"name":"v0.4.0","commitHash":"458b9b7e0d756ae5c723b0efa425d74b4ded9668","tagHash":"402b9d27c0bf5f65c684ca07de6c0874804d6e0e","when":"2026-05-27T18:57:36+02:00","message":"Version 0.4.0","taggerName":"nelind"},{"name":"v0.3.1","commitHash":"2c8568b20794359155bc87967d7c0a4cdd364da6","tagHash":"473ddf3c9de721626478bbd85bf7977293211c01","when":"2026-05-27T18:56:52+02:00","message":"Version 0.3.1","taggerName":"nelind"},{"name":"v0.3.0","commitHash":"f78b004df3d3266cf1769ca715bf9a5513735031","tagHash":"e91ec07b7dc409b91a061e7e9e60c49785fddfcd","when":"2026-05-27T18:55:55+02:00","message":"Version 0.3.0","taggerName":"nelind"},{"name":"v0.2.1","commitHash":"91cfc536c62094ab6cef82aef426f75ee08d7e92","tagHash":"cad811f6f83b54b840f87c161a4b529e1c173b2f","when":"2026-05-27T18:54:36+02:00","message":"Version 0.2.1","taggerName":"nelind"},{"name":"v0.2.0","commitHash":"326aadcdb6e56a09261d79bf6c5d9dc93977c09a","tagHash":"4d00dc3997dae0653aecf2aedc171fddbe87eaad","when":"2026-05-27T18:47:46+02:00","message":"Version 0.2.0","taggerName":"nelind"},{"name":"v0.1.0","commitHash":"9c326604bddbf99973c4ad5fd5f7e12c2570c73f","tagHash":"01facd1aa3257eb4f40a77a4f3f2c59a17f3f9e0","when":"2026-05-27T18:45:20+02:00","message":"Version 0.1.0","taggerName":"nelind"}],"totalTags":33,"languages":[{"name":"Rust","size":7428930,"share":88.12966773414223,"percentage":88},{"name":"Svelte","size":416248,"share":4.937965216390683,"percentage":5},{"name":"TypeScript","size":408932,"share":4.851175241368306,"percentage":5},{"name":"CSS","size":117287,"share":1.3913799617891596,"percentage":2},{"name":"Nix","size":22481,"share":0.26669292352078316,"percentage":0},{"name":"HTML","size":21133,"share":0.2507015503209248,"percentage":0},{"name":"Shell","size":9886,"share":0.11727797882329354,"percentage":0},{"name":"Docker","size":4406,"share":0.05226853881199994,"percentage":0},{"name":"JavaScript","size":242,"share":0.0028708548326155207,"percentage":0}],"failed":{"files":false,"refs":false,"languages":false},"compact":{".tangled":"workflows","examples":"notification-templates","crates/tranquil-comms/tests/templates":"en","crates/tranquil-comms/tests/templates-txt":"en"}}