Skip to content

Repository roadmap

Items that span several projects. Site home page: index.md. Per-project roadmaps:

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

  • .editorconfig and a first dotnet format of 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 to main that touches the docs (or by hand). The built HTML is committed to the orphan branch pages, served by Codefloe Pages at https://xas.codefloe.page/keepass-core/. Strict build: a broken link fails it. Local preview: pip install zensical then zensical serve.

To do

1. Rename the projects

  1. KeePassCore (WinForms) → KeePassCore.WinApp: details and pitfalls in the app roadmap (namespaces, translation keys, assembly-name strings, portable configuration file name).
  2. 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 name KeePassCore must 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.