v3.0.0
Highlights
Stable release of the bw serve HTTP transport rewrite. All features from the 3.0.0a1/a2 prereleases, plus:
- Strict TypedDict API layer —
BwItemCreate,BwItemResponse,BwItemLogin,BwUri,BwField,BwFido2Credential,BwFolder,BwCollection. Alldict[str, Any]eliminated from transport code. Generated_bw_api_types.pyis the canonical source for spec-derived shapes. - Org-scoped dedup index — Fixes collection-blind imports where personal-vault entries shadowed an empty org vault. Dedup is now scoped to
organizationIdand optionallycollectionId. - Collection-aware import — Items already in the org but in a different collection get a
PUTto add the target collection instead of being silently skipped. - Rich progress bars — Live progress for processing, creating, and uploading phases, plus a final migration summary.
- FIDO2/passkey migration — KeePassXC
KPEX_PASSKEY_*attributes converted to Bitwardenfido2Credentials. - Codegen drift CI —
codegen-check.ymlfails PRs when_bw_api_types.pydrifts fromspecs/vault-management-api.json.
New since v2.0.0
bw serveHTTP transport (persistent process, automatic port, health polling, signal-safe cleanup) by @kjanat in #2- Batch import via
bw importfor bulk creation - Async parallel attachment uploads (bounded concurrency)
- O(1) dedup index (no more per-item API lookups) by @kjanat in #3
-d/--debugflag for full DEBUG logging-vnow shows kp2bw operational detail only (httpx silenced)- KeePass metadata migration (tags, expiry, timestamps) as custom fields
--skip-expired/--include-recycle-bin/--metadataflags- CLI help metavars improved
- All env vars documented (
KP2BW_*)
Key fixes
- Shell injection in
bw import(replacedshell=True) bw serveIPv6 binding mismatch causing 60s timeoutorganizationIdquery param casing on collection list- Dedup cache stale after collection PUT
- Signal handler init race on early timeout
close()double-call crash- Sensitive secrets redacted from diagnostic output
Breaking changes
- Requires Python ≥ 3.14
- New dependencies:
httpx>=0.28.0,rich>=13.0.0 - Transport layer completely replaced — CLI behavior is the same but internal API changed
Full Changelog: v2.0.0...v3.0.0