Repository roadmap¶
Items that span several projects. Site home page: index.md. Per-project roadmaps:
- KeePassCoreLib (the library, main goal)
- KeePassCore (WinForms app, Windows only)
- KeePassCore.CLI (terminal UI, cross-platform)
- KeePassCore.Security.Memory (in-process memory protection)
- TrlUtil (translation tool)
Versions: v3.x = make it work, v4.x = production ready. Until v4.0, every project has
the same version, set once in Directory.Build.props (<Version>); at v4.0 each project gets
its own <Version> again.
Hard constraint for every item: never break KDBX 4.x databases (files must still open in KeePassXC, KeePassDX, Strongbox, KeePass 2.x).
Done¶
.editorconfigand a firstdotnet formatof the lib.- Test rules: add a test only when it validates a rule, a flow, a requirement or a
specification; no test of a test, no noise; no new
Debug.Assert. - Documentation site:
docs/built with Zensical (zensical.toml) by the Forgejo Actions workflow.forgejo/workflows/pages.yml, on every push tomainthat touches the docs (or by hand). The built HTML is committed to the orphan branchpages, served by Codefloe Pages at https://xas.codefloe.page/keepass-core/. Strict build: a broken link fails it. Local preview:pip install zensicalthenzensical serve.
To do¶
1. Rename the projects¶
KeePassCore(WinForms) →KeePassCore.WinApp: details and pitfalls in the app roadmap (namespaces, translation keys, assembly-name strings, portable configuration file name).- Then
KeePassCoreLib→KeePassCore(folders,.csproj, assembly and root namespace,KeePassCore.slnx,InternalsVisibleTo, project references of the CLI and tests,tests/KeePassCoreLib.Tests, docs). In this order: the nameKeePassCoremust be free first.
2. Formatting on a dedicated branch¶
The working tree used to mix real changes with dotnet format changes (whitespace, line breaks,
line endings, using order) in hundreds of files, which made staging and reviewing hard. Those
were reverted from the work in progress. Plan: a full format in its own branch / commit, with
nothing else in it. Editors that format on save will otherwise reintroduce the noise.
3. CI (Forgejo Actions on Codefloe)¶
Build + tests on Windows, Linux and macOS (the documentation site already has its workflow).
Codefloe has no Windows or macOS runner (windows-latest / macos-latest are not supported):
those two need another solution. Several tests only run on one OS (DPAPI, [LibraryImport]
exports, Windows paths, platform memory protection): without the matrix they are never run.
4. Shared build settings¶
Directory.Build.props: company, copyright, version (today repeated in each.csproj).Directory.Packages.props: central package versions.
5. Migration tool: KeePassCore.Migration.CLI (later)¶
- What: a console application that converts any old database (KeePass 1.x KDB, KDBX 3.1 and older) to the latest KDBX 4 format (AES-256 or ChaCha20, Argon2d), so that KeePass Core itself stays KDBX 4 only.
- Why: the WinForms app no longer imports KDB, and the lib is to stop reading KDBX 3.1. Users of old files still need a way in, without depending on KeePass 2.x or KeePassXC.
- How (to decide):
- the old readers live in this tool only, not in the lib: the KDB reader removed from the app
(
src/KeePassCore/DataExchange/Formats/KeePassKdb1*.cs, in the git history) and the KDBX 3.1 read path of the lib (HashedBlockStream, Salsa20 inner stream, AES-KDF from the outer header); - so the lib's KDBX < 4 removal should land together with, or after, this tool;
- non-interactive: input file, key (password / key file), output file; never overwrite the input; check that the output opens again before reporting success;
- Dockerfile (Alpine, build stage + runtime stage).
- Checks: fixtures written by KeePass 1.x and KeePass 2.x (KDBX 3.1), converted then read by the lib and by an independent reader (pykeepass).
6. Remove all Debug.Assert (later)¶
- State: lib 822, app 3,356, TrlUtil 60; about 70 % are
Debug.Assert(false). - Why: noise; they kill a Debug test host; they hide behavior that tests should pin down.
- How: for each one, drop it, or replace it with a real check (exception, return value, log) only when a test justifies it. No test for a test, no noise in the test projects.