Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
🪄 Pimconf

CLI and lib to discover PIM-related services, written in Rust.
This repository ships three things:
- Low-level I/O-free coroutines (no_std state machines that emit read/write requests)
- Mid-level clients, based on coroutines (standard, blocking)
- High-level CLI, based on std clients
Table of contents
Features
- Mozilla Thunderbird Autoconfiguration support wiki (requires
autoconfigfeature):- ISP main and
/.well-known/URL lookups - Thunderbird ISPDB lookup
- DNS MX-based retry against the MX target's parent domain
- DNS TXT
mailconf=<URL>redirect
- ISP main and
- RFC 6186 SRV mail service discovery rfc6186 (requires
rfc6186feature):_imap._tcp,_imaps._tcp,_submission._tcpassembly into a single report
- RFC 6764 SRV CalDAV/CardDAV discovery rfc6764 (requires
rfc6764feature):_caldav._tcp,_caldavs._tcp,_carddav._tcp,_carddavs._tcpassembly into a single report
- PACC discovery support draft-ietf-mailmaint-pacc-02 (requires
paccfeature):- Well-known JSON configuration fetch
- SHA-256 digest verification against the
_ua-auto-configTXT record
- TLS support:
- Rustls with ring crypto (requires
rustls-ringfeature) - Rustls with aws crypto (requires
rustls-awsfeature) - Native TLS (requires
native-tlsfeature)
- Rustls with ring crypto (requires
- JSON output via
--json
[!TIP] pimconf is written in Rust and uses cargo features to gate functionality. The default feature set is declared in Cargo.toml.
Installation
Pre-built binary
The CLI binary pimconf has not been officially released yet. Check the releases GitHub workflow and look for the Artifacts section. These pre-built binaries are built from the master branch.
[!NOTE] Pre-built binaries are built with the default cargo features, plus
cli. If you need more features, please use another installation method.
Cargo
You can also use the git repository for a more up-to-date (but less stable) version:
To use pimconf as a library, add it to your Cargo.toml:
[]
= { = "0.1", = false, = ["autoconfig", "pacc", "rfc6186", "rfc6764", "client"] }
The client feature pulls in the std-blocking helpers. Drop it (and pick any combination of autoconfig / pacc / rfc6186 / rfc6764) for a no_std-friendly, pure-coroutine build.
Nix
If you have the Flakes feature enabled:
Or run without installing:
Sources
Usage
Library
Using a low-level DNS MX I/O-free coroutine:
use ;
use ;
use Url;
let resolver = parse.unwrap;
let mut stream = connect.unwrap;
let mut coroutine = new;
let mut buf = ;
let mut arg: = None;
let records = loop ;
for record in records
Using a mid-level std PACC client:
use DiscoveryPaccClientStd;
use Tls;
use Url;
let dns = parse.unwrap;
let mut client = new.with_tls;
let config = client.discover.unwrap;
println!;
CLI
Run the full Thunderbird Autoconfiguration chain on <local_part> <domain>:
The chain tries, in order: every ISP main URL (secure then plain), every /.well-known/ URL (secure then plain), the Thunderbird ISPDB, then re-tries the same against the MX target's parent domain, then logs the mailconf=<URL> TXT redirect if one is published.
Run a single primitive instead:
Run RFC 6186 SRV discovery (top-level subcommand):
Run RFC 6764 CalDAV/CardDAV SRV discovery:
Run PACC discovery:
JSON output:
Pick a specific TLS stack and crypto provider:
FAQ
Use --log <level> where <level> is one of off, error, warn, info, debug, trace:
The RUST_LOG environment variable, when set, overrides --log and supports per-target filters (see the env_logger documentation). RUST_BACKTRACE=1 enables full error backtraces.
Logs are written to stderr, so they can be redirected easily to a file:
License
This project is licensed under either of:
at your option.
AI disclosure
This project is developed with AI assistance. This section documents how, so users and downstream packagers can make informed decisions.
-
Tools: Claude Code (Anthropic), Opus 4.7, invoked locally with a persistent project-scoped memory and a small set of repo-specific rules.
-
Used for: Refactors, mechanical multi-file edits, boilerplate (feature gates, error enums, derive macros, trait impls), test scaffolding, doc polish, exploratory design conversations.
-
Not used for: Engineering, critical code, git manipulation (commit, merge, rebase…), real-world tests.
-
Verification: Every AI-assisted change is read, compiled, tested, and formatted before commit (
nix develop --command cargo check / cargo test / cargo fmt). Behavioural correctness is verified against the relevant RFC or upstream spec, not assumed from the model output. Tests are never adjusted to fit AI-generated code; the code is adjusted to fit correct behaviour. -
Limitations: AI models occasionally produce code that compiles and passes tests but is subtly wrong: off-by-one errors, missed edge cases, plausible but nonexistent APIs, stale RFC references. The verification workflow catches most of this; it does not catch all of it. Bug reports are welcome and taken seriously.
-
Last reviewed: 31/05/2026
Social
- Chat on Matrix
- News on Mastodon or RSS
- Mail at pimalaya.org@posteo.net
Sponsoring
Special thanks to the NLnet foundation and the European Commission that have been financially supporting the project for years:
- 2022 → 2023: NGI Assure
- 2023 → 2024: NGI Zero Entrust
- 2024 → 2026: NGI Zero Core
- 2027 in preparation…
If you appreciate the project, feel free to donate using one of the following providers:
