Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 22:00 UTC

pottom / cdu

charm disk usage — a Charm-stack reskin of gdu

GoMIT★ 0 Sterne⑂ 0 Forksseit Juli 2026Auf GitHub ansehen ↗

pottom/cdu erreicht einen Gesundheitsindex von 60 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei AI Readiness (88/100) ab, am schwächsten bei Community & Adoption (24/100). Zuletzt vor 6 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

60
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

60
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Istvan BasaPersönliches Konto
1 Follower4 öffentliche Reposseit Jan. 2013

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/pottom/cduv0.2.1-3vor 6 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

84Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 6 Tagen
20.8/36Commit-Rhythmus — 30/52 Wochen mit Commits
18/18Commit-Volumen — 153 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year153
human_commit_share0,86
days_since_last_push6
active_weeks_last_year30
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 3 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0,6 Tage
8/10OpenSSF Scorecard: Signed-Releases — 3 out of the last 3 releases have a total of 3 signed artifacts.
Verwendete Eingangsdaten
releases_count3
latest_release_tagv0.2.1
releases_from_tagsnein
days_since_latest_release6
mean_days_between_releases0,6

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

24Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 0 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

55Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
5.4/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 76 % der Commits
13.5/13.5Breite der Beitragenden — 56 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled56
top_contributor_share0,761
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
38.2/38.3PR-Annahme — 45/45 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs45
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
2.2/25Reichweite des Inhabers — 1 Follower von pottom
17.1/25Kontohistorie — 4 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers1
owner_typeUser
is_verified
owner_loginpottom
public_repos4
account_age_days4.927
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

92Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 6 Tagen
12/20Versionshistorie — 3 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/pottom/cdu
ecosystemsgo
any_deprecatednein
min_days_since_publish6

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

80Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .golangci.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

48Gefährdet · 16 % des Gesamtindex

Sicherheitslage

48Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
6/7.5Signed-Releases — 3 out of the last 3 releases have a total of 3 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 28 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

88Exzellent · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, build/AGENTS.md, charm/AGENTS.md, docs/AGENTS.md, internal/config/AGENTS.md, internal/dup/AGENTS.md, internal/elevate/AGENTS.md, internal/selfupdate/AGENTS.md, internal/theme/AGENTS.md, internal/trash/AGENTS.md, internal/updater/AGENTS.md, scripts/AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 86 von 86 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesAGENTS.md, build/AGENTS.md, charm/AGENTS.md, docs/AGENTS.md, internal/config/AGENTS.md, internal/dup/AGENTS.md, internal/elevate/AGENTS.md, internal/selfupdate/AGENTS.md, internal/theme/AGENTS.md, internal/trash/AGENTS.md, internal/updater/AGENTS.md, scripts/AGENTS.md
agent_instruction_max_bytes28.873
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .golangci.yml
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
6/10Belegte Agentenpraxis — 3 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
8/8Automatisierte Wartung — 14 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfileja
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,03
toolchain_manifestsgo.mod
dependency_bot_commit_share0,14
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/230 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes46.446
source_files_sampled230
oversized_source_files0

Eckdaten

0GitHub-Sterne
56Mitwirkende
153Commits, letzte 12 Monate
6Tage seit letztem Push
3Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 4.8 / 10
4.8Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-27 21:59 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
8Signed-Releases3 out of the last 3 releases have a total of 3 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities28 existing vulnerabilities detected
Direkte Abhängigkeiten 23
RegistryPaketVersionsvorgabeManifest
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/dgraph-io/badger/v4v4.9.1go.mod
Gogithub.com/fatih/colorv1.19.0go.mod
Gogithub.com/gdamore/tcell/v2v2.13.9go.mod
Gogithub.com/h2non/filetypev1.1.3go.mod
Gogithub.com/lucasb-eyer/go-colorfulv1.3.0go.mod
Gogithub.com/maruel/naturalv1.3.0go.mod
Gogithub.com/mattn/go-isattyv0.0.21go.mod
Gogithub.com/mattn/go-runewidthv0.0.19go.mod
Gogithub.com/minio/selfupdatev0.6.0go.mod
Gogithub.com/muesli/termenvv0.16.0go.mod
Gogithub.com/pkg/errorsv0.9.1go.mod
Gogithub.com/rivo/tviewv0.42.0go.mod
Gogithub.com/sirupsen/logrusv1.9.4go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/ulikunitz/xzv0.5.15go.mod
Gogolang.org/x/sysv0.43.0go.mod
Gogolang.org/x/textv0.36.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.49.1go.mod
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 9141,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1230998,
        "Roff": 10360,
        "Shell": 7674,
        "Makefile": 3225,
        "Dockerfile": 344,
        "PowerShell": 3248
      },
      "pushed_at": "2026-07-21T06:20:18Z",
      "created_at": "2026-07-12T20:14:17Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T06:08:41Z",
      "description": "charm disk usage — a Charm-stack reskin of gdu",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Istvan Basa",
      "type": "User",
      "login": "pottom",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/3420063?v=4",
      "created_at": "2013-01-29T19:17:42Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 4927
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-21T06:20:19Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-20T22:38:09Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-19T23:37:50Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a6be1625b900d1fc12b09656d032330cc36a0866",
          "body": "golden_test.go snapshots the exact rendered output of the browser on each of the five\nthemes, a narrow terminal, and the help screen into testdata/*.golden — catching the\nregression the property tests cannot: a shifted colour or a moved column, where the\nframe is still the right height and no line t\n[…]\n — a shared runner is too noisy for a threshold, and BenchmarkView being flat from\n100 to 10,000 rows is the standing proof the list is windowed.\n\nAlso switches two stray \"right\" literals to keyRight.",
          "is_bot": false,
          "headline": "test: golden screen snapshots and a render-benchmark tripwire (#45)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-21T06:08:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "97cf2cc1262a985ec17450ad89b097a6f5861d25",
          "body": "git describe was called without --dirty, so a make build from a tree with\nuncommitted changes stamped a clean version — e.g. v0.2.0 while files were modified.\nAdding --dirty makes such a build read v0.2.0-N-gHASH-dirty, so a dev binary never\nclaims to be a clean release. Release builds are unaffected: they stamp the version\nfrom the pushed tag, not from the Makefile. The stale --always note (never in the\ncommand) is corrected to describe --dirty.",
          "is_bot": false,
          "headline": "build: mark a dirty tree in the dev version string (#44)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-20T23:10:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "598854214f97a523c39cef86e5b8a6b1f5d4da5c",
          "body": "…#43)\n\nThe pane's state was saved only through the view-save (t then s), like the columns —\nso pressing i and restarting brought it back, which is not what i leads you to expect.\nThe pane is a plain preference, not a per-directory view you try, so it now saves\nitself: toggleInfo returns a tea.Cmd th\n[…]\nss it fails. InfoPane is out of ViewSettings again.\n\nVerified: go test ./... (1050), golangci-lint clean on darwin/linux/windows;\nTestInfoPanePersists drives i and asserts the saver got the new state.",
          "is_bot": false,
          "headline": "fix: persist the info pane the moment i is pressed, not on t then s (…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-20T23:03:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b053f507c667f57588823d5c15f9c82b5c779e54",
          "body": "Re-recorded with the item-info pane on by default — the demo opens on the browser\nwith the pane at the foot, following the cursor through several rows so its live\nmetadata (mode, owner with names, disk vs apparent) is visible — plus the same\nwalkthrough of themes, multi-select, largest files, find and duplicates. midnight\ntheme, on a synthetic RAM-disk tree so no real paths show.",
          "is_bot": false,
          "headline": "docs: refresh the demo GIF for v0.2.0 (#42)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-20T22:13:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "579772389d4677fced5c25abc4cba7287a6446d7",
          "body": "The pane's state is now a saved view setting, like the columns. Its live state moved\nfrom a model field to ui.infoOpen so viewSettings can read it; it is started from the\nconfig's info key via WithInfoPane (default on, --info=false to start it closed), and t\nthen s writes the current state back — a \n[…]\nd document the info key, the flag, and that it\n  persists like the other view toggles\n\nVerified: go test ./... (1050), golangci-lint clean on darwin/linux/windows; --info=false\nstarts the pane closed.",
          "is_bot": false,
          "headline": "feat: persist the item-info pane's on/off in the config (#41)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-20T22:01:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afc402fda82a0aa1d68c5651defc593d154c254c",
          "body": "Press i to fence off a pane at the foot of the list, between two rules, showing the\nselected item's mode, owner, mtime, and disk-vs-apparent size in bytes. It follows the\ncursor and it is on by default — compact and always useful — with i to toggle it off\nfor the rows back, and it hides itself when \n[…]\nvice that could hang;\nan id with no entry keeps its number. Windows has no uid/gid.\n\nWorks on the browser and the largest-files, find, duplicate and queue lists. Documented\nin the help and the footer.",
          "is_bot": false,
          "headline": "feat: a live item-info pane on i, on by default (#40)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-20T21:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2d9954759aab48d425ac10b1b19eaab00b03123",
          "body": "…rks (#39)\n\nThe v0.1.0 run got through build, archives, checksums and cosign, then failed on the\ncontainer: dockers_v2 does one multi-platform buildx build, and the scratch\nDockerfile's `COPY cdu` cannot resolve when the context holds every arch's binary at\nonce (\"/cdu\": not found).\n\nBack to dockers\n[…]\ns binary as `cdu`, joined into a multi-arch manifest.\nThe deprecated blocks still validate (goreleaser check passes); migrating to dockers_v2\nneeds a multi-arch-aware Dockerfile, a separate follow-up.",
          "is_bot": false,
          "headline": "fix: build the container per-arch so the scratch Dockerfile's COPY wo…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T23:26:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7141d037c26f1aee116ae8b8380fb690ced6116c",
          "body": "The first v0.1.0 run failed at validation: GoReleaser, handed the stripped vX.Y.Z in\nGORELEASER_CURRENT_TAG, checks that a vX.Y.Z git tag points at HEAD, but the real tag\nis cdu-vX.Y.Z. --skip=validate drops that check (and the clean-tree check, which a\nfresh CI checkout satisfies anyway); everything else — build, archive, checksum, SBOM,\nsign, docker, release — still runs.",
          "is_bot": false,
          "headline": "fix: skip GoReleaser's tag validation for the cdu- tag prefix (#38)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T23:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "399d375b524c2fd2b6d5a470759983924c7b5864",
          "body": "Neither the README nor the man page documented the config's YAML keys — only where\nthe file lives and --write-config. Both now do: every persistent long flag is a key\nunder its flag name, plus the two blocks with no single flag — sorting (by/order) and\ntheme (preset + #rrggbb token overrides) — with an example. A CONFIGURATION section in\ncdu.1 and an expanded Configuration section in the README, so 'where do I set the\ntheme in a file' has an answer in both places.",
          "is_bot": false,
          "headline": "docs: document the config file format (#37)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T22:59:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dedab3fe4f2c3d2285ea6a01dcd281b96f66a7fc",
          "body": "* docs: rewrite the README and man page for cdu\n\nBoth were still gdu's. The README is now cdu's own: what it is (a gdu fork with a\nCharm interface, the engine unchanged), install via install.sh/install.ps1, the\ncontainer, go install and cdu update, a key-binding table, themes, config, and the\ngdu re\n[…]\nbars and file\nicons, the live theme picker, multi-select and the delete queue, largest files,\ntree-wide find, and duplicate detection — the midnight theme, on a synthetic tree so\nno real paths appear.",
          "is_bot": false,
          "headline": "docs: rewrite the README and man page for cdu (#36)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T22:49:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a766210b8db6459fb82799e2fb3c2966d8786677",
          "body": "… (#35)\n\nThe DOX chain had drifted behind the work. This catches it up:\n\n- Root: the cdu-owned list gains internal/updater, internal/elevate,\n  .goreleaser.yaml, install.sh, install.ps1; Dockerfile joins the conflict surface;\n  a Releasing contract documents the GoReleaser pipeline and the cdu-v* ta\n[…]\nn\n  every list, u=unmark-all / U=undo, the queue, elevated delete); the key list is\n  brought current.\n- scripts: the manual sync steps note the build/cdu.go version bump.\n\nDocs only; no code changed.",
          "is_bot": false,
          "headline": "docs: refresh the AGENTS.md chain for the release infra and recent UX…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:56:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "638fc4bc6cbabd6b74aa51a12ee03ae8775efdbf",
          "body": "The synced gdu version lived in three places — UPSTREAM_VERSION (v5.36.1),\nbuild/cdu.go's GduVersion (5.36.1), and the Makefile's GDU_VERSION — which had\nalready drifted in format and could drift in value. build/cdu.go's GduVersion is\nnow the one source: it is compiled in as the default and surfaced\n[…]\nfile.\n- Point the root AGENTS.md and ADR-001 at build/cdu.go.\n\nVerified: make build and cdu --version both report gdu 5.36.1 from the default, and\nthe watcher's sed bump rewrites GduVersion correctly.",
          "is_bot": false,
          "headline": "build: make build/cdu.go the single source of the gdu version (#34)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:49:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c900f7bae95675e3ec4cabb283bc3f0e5f36b4bc",
          "body": "The startup check tells you a newer cdu exists; this fetches it. cdu update reads\nthe latest release, and if it is newer than the running build, downloads the archive\nfor this OS/arch, verifies it against the published sha256sums, extracts the binary\nand swaps it in atomically (minio/selfupdate hand\n[…]\nclined (its GOARM, which the asset\nname encodes, is not exposed at runtime); reinstalling with install.sh, which reads\nit from uname, covers that. Only public release assets are read; nothing is sent.",
          "is_bot": false,
          "headline": "feat: add a cdu update self-update command (#33)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:36:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a8d9c4ab51fd658411dd4495a34e22d4455067b",
          "body": "One-line installers that fetch the matching release archive from GitHub, verify its\nchecksum (and the keyless cosign signature when cosign is present), and drop the\nbinary on PATH.\n\ninstall.sh is POSIX sh (curl or wget, sha256sum or shasum), detects OS and arch,\nmaps them to the release's asset name\n[…]\nser PATH.\n\nVerified: sh -n and dash -n parse install.sh; the checksum-verify logic matches\nGoReleaser's two-space sha256sums.txt format. End-to-end download is exercised once\nthe first release is cut.",
          "is_bot": false,
          "headline": "build: add install.sh and install.ps1 (#32)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:28:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1e4368c736de9775162e4e4aeae56c7c5a5349d",
          "body": "gdu ships a container (ghcr.io/dundee/gdu); cdu now does too. GoReleaser builds a\nsingle multi-arch image (linux/amd64 + linux/arm64) from the pre-compiled binaries\nand publishes it to GitHub's registry as :vX.Y.Z and :latest — latest held back on\na prerelease.\n\nThe Dockerfile is now a scratch image\n[…]\nldx and a ghcr login. Uses dockers_v2, the current\nconfig, not the deprecated dockers/docker_manifests.\n\nVerified: goreleaser check passes, and the scratch image builds and runs cdu\n--version locally.",
          "is_bot": false,
          "headline": "build: publish a multi-arch container image to ghcr.io/pottom/cdu (#31)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:21:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fef8512f232b065fb909287637b89bb8afedd606",
          "body": "…gn) (#30)\n\nCutting a release was a pile of Makefile targets (gox, hand-rolled tarballs, gpg);\nGoReleaser replaces them. A pushed cdu-vX.Y.Z tag runs the release workflow, which\ncross-compiles the matrix, builds the archives and a sha256sums, generates SBOMs,\nand signs the checksums with keyless cos\n[…]\n-check job on the test workflow validates the config on every PR.\nVerified locally: goreleaser check passes and a --snapshot run builds all 23\narchives + checksums. The container image is a follow-up.",
          "is_bot": false,
          "headline": "build: add GoReleaser release pipeline (matrix, checksums, SBOM, cosi…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T21:16:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b742e7620bdaacab81545e503b2560da9aea4de1",
          "body": "The Makefile was still gdu's: NAME=gdu, the dundee/gdu import path, and a VERSION\nfrom git describe with no tag filter — which returned one of the v1.0.0…v5.36.1\ntags git inherited from the fork, so a build stamped a gdu version.\n\nIt now builds cdu: the pottom/cdu path, cmd/cdu, VERSION from cdu's o\n[…]\ncompiled matrix, archives, checksums, signing, SBOM\nand the container image — is handed to GoReleaser in a follow-up; the Makefile\nkeeps the development targets (build, run, test, lint, man, gobench).",
          "is_bot": false,
          "headline": "build: rewrite the Makefile for cdu, versioned from its own tags (#29)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:57:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ca3914d68503d5b8d152c21a15c0c963102123b",
          "body": "Clearing a selection was esc, and esc only clears in the browser — on the\nlargest-files, find, duplicate and queue screens it backs out, so there was no\nway to drop the set without leaving the screen. u now unmarks all on every one of\nthem (the queue empties its snapshot with it), and shows an 'unse\n[…]\n undo is rare and deliberate and takes the shift. Neither is\ndestructive if mixed up — a stray unmark just re-marks, a stray undo restores a\nfile. The help documents both and d's note now points at U.",
          "is_bot": false,
          "headline": "feat: u unmarks the whole selection on every list; U is undo (#28)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:43:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5065059394f9496450441c27cf3e738419d30ad2",
          "body": "…wser (#27)\n\nThe marked-icon colour landed only in the browser's row renderer; the\nlargest-files, find and duplicate screens each draw their own rows and kept the\nicon (and the duplicates screen's tree branch) in its normal colour while the\nname went red — the same inconsistency, one screen at a tim\n[…]\nur lists agree and a new one\ncannot drift. Its bold-danger matches the browser's own marked icon exactly.\nTests render a marked row on each of the three other screens and assert the\nicon opens danger.",
          "is_bot": false,
          "headline": "feat: danger-tint a marked row's icon on every list, not just the bro…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:27:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28d2d960b4999bd27d2f077ee16ab5c848aff019",
          "body": "A marked row struck and reddened its name but left the folder/file icon in the\naccent colour — the loudest thing on the row, still reading as 'fine' while the\nname read as bound for deletion. The icon now takes the danger colour too, on the\nplain rows and on the cursor row over the selection band alike, so the whole\nentry reads as marked. The glyph is not struck — a glyph carries state by colour,\nthe way flags already do.",
          "is_bot": false,
          "headline": "feat: recolour a marked row's icon danger, not just its name (#26)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:09:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "332cf8c2e299f64e81f8d15abb15396c87842598",
          "body": "The parent row led a subdirectory listing as '..' with a '—' dash where a size\nwould be — the dash claiming to measure something that has no size, and the name\ntwo dots that read as a file more than a way up.\n\nIt now shows a back arrow (the direction ← / h already take), the name '../',\nand a dim 'p\n[…]\n The size column is kept as\nblank space so '../' still lines up under its sibling names; the row carries no\nsize, percentage or bar, because it is a way out of the directory rather than a\nthing in it.",
          "is_bot": false,
          "headline": "feat: make the ../ row read as a way back, not a sized child (#25)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:03:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cd9d8c3f9fd5715e41867dbb9f65f9ab0eb9945",
          "body": "…#24)\n\nThe help was a flat list: every binding with a one-line description, and no\nroom for the gotchas that one line cannot hold (d recovers where D does not,\nwhat each bar mode means, that the scan root scans the disk above it). The\noriginal ask — describe the key you press — could not work, becau\n[…]\nwidth, fixed so the list does not reflow as\nthe cursor moves, and it is dropped on a terminal too short to spare the rows.\n\nhelpEntry gains a detail field; the footer hint reads 'select' not 'scroll'.",
          "is_bot": false,
          "headline": "feat: make the help screen a browsable reference with a detail pane (…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T20:03:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08971393e93aa8cea613dfd0aa7a233eb4fc934d",
          "body": "cdu is a fork with its own UI and feature set, so it carries its own\nsemver (starting v0.1.0) rather than inheriting gdu's. The upstream gdu\nrelease the engine is synced to is recorded as build metadata in a new\nbuild/cdu.go — kept separate from the upstream build/build.go so that\nfile is never edited — and surfaced on a 'gdu base:' line in --version.\n\nThe scheme is cdu vX.Y.Z+gduA.B.C; the header shows cdu's own version.",
          "is_bot": false,
          "headline": "feat: give cdu its own version, with gdu as build metadata (#23)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T19:35:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e0dbfdd4c849db7ebc7a8ed8c418becd7c2a275",
          "body": "…ehind (#22)\n\nThe header now carries this build's version after the wordmark, and — once\na background check has found a newer release — a yellow ↯ and that version\nbeside it. The check is one GET to GitHub's public releases API at startup:\nit sends nothing about the user or the machine, runs off the\n[…]\nd from\nbuild.Version, and a fixed-yellow update style. The glyph is ↯, not ⚡:\n⚡ measures two cells wide and would shift the header's alignment, the same\nrule that keeps emoji out of the laid-out rows.",
          "is_bot": false,
          "headline": "feat: show the version in the header, and a yellow update mark when b…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T14:04:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "630ba1d1249e2c79b48380599a5a31a6f88337a2",
          "body": "Directories took the Dir colour until #33 gave them the accent instead —\nbrighter, and paired with the ▸ marker and trailing /. Dir has coloured\nnothing since; a token the renderer never reads is one a theme author can\nset and watch do nothing. Removed from the Theme struct and the bundled\nthemes' yaml. tokens(), TokenNames(), validation and the contrast test all\nwalk the struct by reflection, so they drop it with the field; parsing is\nlenient, so an old config with a dir: key is simply ignored.",
          "is_bot": false,
          "headline": "refactor(theme): drop the unused Dir token (#21)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T08:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "380d68f7d7be73746817e8e6c4912097e5286d4b",
          "body": "Three tweaks from using it: no gutter glyph — a marked row now reads\nentirely from its red, struck-through name, so the ✗ is gone and the\ncursor bar returns on a marked cursor row. The strike covers the name\ntext and stops there: the trailing padding that fills the name column is\nrendered plain, so \n[…]\n renderMarkedName splits the name column into\nthe struck, red text and its plain padding; markGlyph and the gutter/marker\nhelpers are gone, and the tally now reads \"N marked · size\" without the\nglyph.",
          "is_bot": false,
          "headline": "feat(charm): drop the mark ✗, strike only the name text (#20)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T08:03:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "132b143bd55b16273da3879b2693a67fd6788767",
          "body": "* feat(charm): mark rows with a red ✗ and a struck-through name\n\nThe tick did not read as a deletion mark, and on the cursor row it was\nlost: the mark sat in the gutter and the selection background overrode it,\nso with several rows marked you could not tell whether the one under the\ncursor was among\n[…]\n. It now takes the danger colour too — struck and\nred — kept in markedNameStyle so the plain rows and the cursor row (over\nthe selection background) agree. Under no colour the strike still carries\nit.",
          "is_bot": false,
          "headline": "feat: mark rows with a red ✗ and a struck-through name (#19)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T06:25:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9abb03da3f17985976eb44cee3021d6095ab927",
          "body": "The picker was a full screen of theme names. It is now a box floating\nover the browser, so a theme previews on your own content — your\ndirectory, its bars, the header and footer — not on an abstract list. The\nwhole backdrop re-themes live as the cursor moves; the box's caret marks\nthe choice, since \n[…]\n over the browser's list. The header keeps the browser's\nbreadcrumb and mark tally so the screen behind the box reads as where you\nwere. With every theme in the box at once there is nothing to scroll.",
          "is_bot": false,
          "headline": "feat(charm): float the theme picker over the browser as a popup (#18)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T05:57:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85b5ec6f12f828de406bf70723d75e8394c43981",
          "body": "p opens a theme picker — p for palette. The list re-themes the whole\ninterface live as the cursor moves, so the picker is its own preview: you\nsee a theme on the real screen, not on a swatch, and each row shows its\nname in that theme's own accent so the list reads as a set of swatches.\n\nEnter keeps \n[…]\nn\ntoken override in the config survives it, the way --theme leaves it.\n\napplyTheme rebuilds the styles, the bar's precomputed gradient and the\nspinner colour — the whole of what a live re-theme costs.",
          "is_bot": false,
          "headline": "feat(charm): in-app theme picker on p, live preview, persistent (#17)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-19T05:40:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "052da98c917ab564c5eabc85388d1072e2950a3e",
          "body": "…ials (#16)\n\nTwo things surfaced trying the elevated delete by hand.\n\nThe confirm modal was drawn on a blank backdrop — lipgloss.Place centres\nit on an empty canvas — so opening it read as the whole directory\nvanishing. It now overlays the list it was opened from: only the band the\nbox covers is rep\n[…]\nole set to one sudo — a marked set of root-owned files costs a\nsingle prompt. internal/elevate.RemoveCmd takes several paths for that;\nthe elevated modal counts and sizes the set like any other batch.",
          "is_bot": false,
          "headline": "fix(charm): show the list behind the modal, and elevate a batch's den…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T19:54:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd78afa2bfc52f55586dbf191a2c5b766ec5bbaf",
          "body": "…(#15)\n\nWhen a permanent delete comes back with a permission error, cdu now\noffers a second modal to remove the item with elevated privileges rather\nthan only reporting the wall. cdu never handles the password: on Unix the\nnew internal/elevate package hands the terminal to the real sudo through\ntea.\n[…]\nile even\nroot cannot unlink, and that is reported rather than a success invented\nfor a row still on disk. It is offered for single deletes only; a batch\nreports its permission failures in its summary.",
          "is_bot": false,
          "headline": "feat: elevated delete for a permission-denied removal, via real sudo …",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T19:35:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eddf615dc15350a7f6f0a4b49a0cba5ddb27c9b7",
          "body": "…rowser (#14)\n\nSpace marks and M opens the queue on the largest-files, duplicate and\nfind screens too, and d/D/e act on the marked set from any of them — the\nset is keyed by item, so a file marked on the duplicates screen is the\nsame mark the browser shows. A marked row wears the same filled band\nth\n[…]\no\na screen of bands would only be noise.\n\nmarkUnderCursor reads the cursor through target(), so one path marks on\nevery screen; marksActOnSet gates the batch; markOverlay keeps the band\noff the queue.",
          "is_bot": false,
          "headline": "feat(charm): marking and the queue work on every list, not just the b…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T19:19:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db0fefc92f20b1cf9ee646e693430afe100111f6",
          "body": "CodeQL failed on every push to main — 'Perform CodeQL Analysis' returned\n'Resource not accessible by integration' — because the workflow declared\nno permissions, so the read-only default GITHUB_TOKEN could not upload\nresults. PR runs pass and GitHub only emails failures for the default\nbranch, so it\n[…]\nad.\n\nThe lint job also failed once on main when golangci-lint's config verify\ntimed out fetching its JSON schema over the network; verify: false drops\nthat remote call while still running the linters.",
          "is_bot": false,
          "headline": "ci: fix CodeQL upload permission and the lint config-verify flake (#13)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T19:08:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2302ea4ee66ad4d5e650ba577a14ea9c900eada4",
          "body": "o hands the selected file to whatever the OS opens it with — open on\nmacOS, xdg-open on Linux and the BSDs, start on Windows — the companion to\nv's quick look inside cdu. It works from every list v does: the browser,\nthe largest-files and duplicate screens, find, and the queue. Directories\nare not opened this way, since → already enters them, and the launch runs\noff the render loop so the tree stays live while the app comes up.",
          "is_bot": false,
          "headline": "feat(charm): open a file in its default app, on o (#12)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T18:58:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0dc8e1c380239c91ce16757a24638cbf94c9f1bb",
          "body": "…#11)\n\n* feat(charm): navigate above the scan root with the left key\n\nAt the top of the scanned tree, ← had nowhere to go — it now scans the\ndirectory one level up and lands the cursor back on the old root, so a\nscan rooted too deep can be walked out of without restarting cdu. It goes\none level per \n[…]\n (which would match it on the parent's\nreal name, not \"..\") leaves it out. The scan root shows no ../ row —\nthere is nothing above it in the tree — where the left key scans the\nparent on disk instead.",
          "is_bot": false,
          "headline": "feat: show the scan root and navigate above it (../ row + left key) (…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T15:06:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bed72dac4efe4b0b654d3ea907864cca3c8b891a",
          "body": "* feat(charm): multi-select delete — mark a set, review it, delete together\n\nSpace marks the row under the cursor and steps down, so a run is marked by\nholding it; the set is keyed by item, not row, so marks hold across\nnavigation and re-sorts. A tick sits in the marked row's gutter and the\nheader c\n[…]\nhe browser clears the whole selection at once — the unmark-all to\nspace's mark-one — since there is nothing deeper to back out of there. It\nshows in the footer only when there is a selection to clear.",
          "is_bot": false,
          "headline": "feat: multi-select delete — mark a set, review it, delete together (#10)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T14:33:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9c4a3b2b68d423e77968df56cd9f721741a67669",
          "body": "…ers, folders-first sort (#9)\n\n* fix: the footer shows the essentials and ?, not a truncated dozen\n\nThe browse footer listed a dozen keys, and fitKeys quietly dropped most of\nthem on any real terminal — including ? itself, so the one key that reveals\nall the others was the first to go. The user coul\n[…]\nso a\nshort bar is the light beginning of the gradient and only a full bar\nreaches the dark end. The tip colour then reads as the row's size, and no\nbar has the ramp compressed into a handful of cells.",
          "is_bot": false,
          "headline": "feat: UX polish from live testing — clearer duplicates, distinct fold…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-18T12:37:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c563ef10ec43e971d5ccfa37bb2a0cf1f5f6d573",
          "body": "* feat: find duplicate files, on F\n\nThe same film in two directories stops hiding as two unrelated large files.\nF searches, marks every copy in the browser with a ▲ in the accent, and\nopens a screen that groups the copies and totals what deleting the extras\nwould free.\n\nThis is the one thing in cdu \n[…]\nies shifted to fit the new hint: the column menu's `cols`\ndrops a level later than `rescan` now, because the t-menu's discoverability\nis worth more on a narrow terminal than the rarely-pressed rescan.",
          "is_bot": false,
          "headline": "feat: duplicate detection, filename search, and scoped analysis (#8)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-17T21:53:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5e3547ea89ecb6e982363e26c27bb84bccb41e7",
          "body": "…an (#7)\n\n* feat: the disks screen, cdu -d\n\n`cdu -d` lists the mounted devices and scans the one you pick. It used to\nsend people to --classic.\n\nThe list is the scan's parent, so back at the top of the tree returns to\nit — gdu's own rule, and the reason the screen needs no key of its own. A\ndevice l\n[…]\nts, like the viewer: leaving the help you asked for\nshould not also leave the program. The modal and the filter still swallow `?`,\nbecause a mode that let some keys through is a mode you cannot trust.",
          "is_bot": false,
          "headline": "feat: the disks, largest-files and help screens, and a cancellable sc…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-17T19:37:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f421dc7307ec5f96eb3984cedc1398a4bba09aa",
          "body": "* refactor: build every style from a Theme struct\n\nThe renderer's colours lived in a `palette` struct with hue names — `pink`,\n`purple`, `mint` — plus three literals inlined in newStyles. Both stand in\nthe way of a theme: a literal cannot be replaced at all, and a hue name is\nonly honest in the one \n[…]\nnarrow\nterminal it was cutting away nearly the whole footer. The keys are built as\nplain and styled in parallel now (plainKeys/renderKeys, extracted from\nviewFooter, which was already doing it right).",
          "is_bot": false,
          "headline": "feat: a theme system, cdu's own config, and file-type icons (#6)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-17T12:36:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "228eb33ba1ab94f623dbb7ead6f0627378bec412",
          "body": "…e (#5)\n\nBrings back the browsing controls gdu has that the Charm interface did not yet,\nand adds a fuzzy filter and a safe file viewer on top.\n\nSorting and the column toggles are two-key menus (s then a field; t then a\ncolumn) rather than a key each, so the footer costs one hint instead of eight —\n\n[…]\nped to the size bar as in gdu. nocolor_test.go now allows\nattributes and forbids only colour escapes, forbids every escape under the Ascii\nprofile, and checks nothing panics across profiles and sizes.",
          "is_bot": false,
          "headline": "feat: sorting, column toggles, a fuzzy filter, a file viewer and mous…",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-15T19:41:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3245858674ea41bc3527f4bb420eee2a7d667e7",
          "body": "* feat: recoverable deletes, a confirmation modal, and undo\n\nDeletion is the one thing cdu does that destroys data, so the default is made\nrecoverable and every cost of that is stated rather than smoothed over.\n\nd moves an item to the OS trash and u puts it back; D deletes permanently; e\nempties a f\n[…]\nindows, which is\nonly meaningful once the return code has already reported a failure.\n\nBoth were caught by linting for GOOS=linux and GOOS=windows; the local lint runs\non darwin and sees neither file.",
          "is_bot": false,
          "headline": "feat: recoverable deletes, a confirmation modal, and undo (#4)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-14T20:03:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0449a7308bbabfb21748ca32f13d6fed687c7a8",
          "body": "Brings the Charm interface up to the main mock in docs/design/.\n\nThe usage bar is the design's centrepiece and the part a terminal cannot do\nliterally: a cell holds one colour, so the CSS gradient becomes per-cell\ninterpolation, blended in Luv because a straight RGB lerp between pink and\npurple pass\n[…]\nruecolor exposed 4.1 ms/frame from\n  building a 552-byte Lipgloss style per cell. A precomputed 64-step ramp brings\n  it back to 0.28 ms — flat at 100 and 10,000 rows, so the list is still\n  windowed.",
          "is_bot": false,
          "headline": "feat: gradient bars, header panel and a live scan screen (#3)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-14T13:44:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a8a5f4e812ff2a3c09340aca3231a0c8e148340",
          "body": "* feat: add the Charm interface as the interactive default\n\nThe new interface embeds *common.UI exactly as tui.UI does, so it satisfies\napp.UI and drives the same analyzer, ignore engine and tree. --classic still\nreaches gdu's tview interface, and the non-interactive and export paths are\nuntouched.\n\n[…]\nrs were attached to the same terminal and raced for\ninput, each swallowing every other keystroke: navigation took two presses per\nstep, and so did q.\n\nThe tcell screen is now built only for --classic.",
          "is_bot": false,
          "headline": "feat: Charm interface as the interactive default (walking skeleton) (#2)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-12T21:34:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4f7491b67eb4e9ba0f5996699bb48593104c6eb",
          "body": "* docs: record upstream sync strategy and fix CI targeting\n\nADR-001 documents the core/UI boundary and why gdu cannot be consumed as a\nGo module: internal/common holds the Analyzer interface, the progress struct\nand the ignore engine, and app.UI requires internal types in its signature.\nStrategy B (\n[…]\near history\n\nThe sync model needs a real merge commit to preserve the merge base with\nupstream-cdu; squashing it would make every future sync re-resolve the whole\ntree. Feature PRs stay squash-merged.",
          "is_bot": false,
          "headline": "docs: upstream sync strategy (ADR-001) + CI baseline (#1)",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-12T20:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa11680f658fa07f9f6b514c039de636385ea1fb",
          "body": "Add the DOX rail (AGENTS.md) recording the fork's central rule: the gdu\nengine packages are upstream-owned and never edited, cdu code lives in new\ndirectories, and only seven files form the merge conflict surface.\n\nAdd NOTICE with fork attribution, and mark the README as a fork.\nLICENSE.md and Daniel Milde's copyright are untouched.",
          "is_bot": false,
          "headline": "docs: establish cdu fork identity and ownership contract",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-12T20:13:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "506a8d6ae093bb0f2a04a0d358adc30576f797f6",
          "body": "Mechanical, script-generated rename of the upstream v5.36.1 tree:\nmodule path, cmd/gdu -> cmd/cdu, man page source. Export format\n(progname \"gdu\") and all engine packages are untouched.\n\nRegenerate with scripts/rename-upstream.sh after each upstream merge.",
          "is_bot": false,
          "headline": "chore: rename gdu namespace to cdu",
          "author_name": "Istvan Basa",
          "author_login": "pottom",
          "committed_at": "2026-07-12T20:11:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d64b4f1ef50bf6694cd17e060f9fd80aed3e297",
          "body": null,
          "is_bot": false,
          "headline": "docs: benchmarks updated",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-29T21:34:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4faa51ce96c063f8621afc858ece37564d3bd62b",
          "body": "…g in all analyzers (#563)",
          "is_bot": false,
          "headline": "perf: replace progress channel with atomic counters and ticker pollin…",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-29T09:33:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2a1f0075ece661e2e648f0ec983e2edd069d9ae",
          "body": "* perf: replace filepath.Join with string concatenation in TopDirAnalyzer\n\nfilepath.Join calls filepath.Clean internally which does unnecessary\npath normalization when joining a clean directory path with a simple\nfilename. Use direct string concatenation with os.PathSeparator to\navoid this overhead \n[…]\nn with no-op\ndefaults in CreateTopDirAnalyzer, removing the need for nil\nchecks on every file in the hot loop.\n\n* perf: process subdirs inline when semaphore is full\n\n* fix: remove unnecessary waiting",
          "is_bot": false,
          "headline": "perf: top dir analyzer optimizations (#562)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-29T07:57:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4d040c877580db91cb5a55df7feecbc51f1de81",
          "body": "* test: fix flaky\n\n* fix: try to improve the locking\n\n* fix: wait for all child goroutines",
          "is_bot": false,
          "headline": "test: fix flaky (#561)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-28T17:15:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0476b2bf8af9a981e14a4aa560e37ac54b52642",
          "body": "* Improve SQLite storage and analyzer implementation\n\n- Update InsertItem to use int64 for itemCount for consistency\n- Add RWMutex locking to SqliteItem for thread-safe access\n- Implement robust lazy-loading path resolution in GetPath\n- Optimize RemoveFile using recursive CTE for atomic database upd\n[…]\npass by value\n\n* fix: lint\n\n---------\n\nCo-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>\nCo-authored-by: dundee <27106+dundee@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: improve SQLite storage and analyzer implementation (#541)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-28T14:17:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3a79a048f252505d3798316a1f0a9e3f10e61a8",
          "body": "* refactor: centralize analyzer logic and improve SQLite backend\n\nThis commit introduces a significant refactoring of the analyzer logic\nand improvements to the SQLite storage backend.\n\nKey changes:\n- Created a `BaseAnalyzer` struct in `pkg/analyze/analyzer.go` to\n  centralize progress reporting, fi\n[…]\nx: remove not needed locks\n\n---------\n\nCo-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>\nCo-authored-by: dundee <27106+dundee@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Refactor analyzers and improve SQLite backend (#549)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-28T13:21:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd5f1d8c28f6298e488ea072cc3bc2dae692c7fc",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-27T21:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbab3efd3346b81818eeaa2fb64d9d7046b9bd0d",
          "body": "* feat: top-dir analyzer for non-interactive mode\n\n* feat: try lower concurrency limit\n\n* feat: use atomic\n\n* docs: refresh benchmarks\n\n* fix: add hardlink detection",
          "is_bot": false,
          "headline": "feat: top-dir analyzer for non-interactive mode (#557)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-27T21:25:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de651892f2bc5adee0261223d2e7ec158dd87223",
          "body": "…#554)\n\nBumps [github.com/gdamore/tcell/v2](https://github.com/gdamore/tcell) from 2.13.8 to 2.13.9.\n- [Release notes](https://github.com/gdamore/tcell/releases)\n- [Changelog](https://github.com/gdamore/tcell/blob/main/CHANGESv3.md)\n- [Commits](https://github.com/gdamore/tcell/compare/v2.13.8...v2.1\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/gdamore/tcell/v2 from 2.13.8 to 2.13.9 (…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-22T12:59:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "676f86ca48830464b9d3a6032a433f57de483529",
          "body": "Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.48.2 to 1.49.1.\n- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.48.2...v1.49.1)\n\n---\nupdated-dependencies:\n- dependency-name: modernc.org/sqlite\n  depende\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump modernc.org/sqlite from 1.48.2 to 1.49.1 (#553)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-20T08:12:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d50cd9ec007c6f0ba67bb69ef27d0107351dd33a",
          "body": "Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.\n- [Release notes](https://github.com/softprops/action-gh-release/releases)\n- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/softprops/\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump softprops/action-gh-release from 2 to 3 (#552)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-15T09:00:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32bea5d408b43da66ef874b681e57d09bdcf0093",
          "body": "Bumps [golang.org/x/text](https://github.com/golang/text) from 0.34.0 to 0.36.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.34.0...v0.36.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n  dependency-version: 0.36\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/text from 0.34.0 to 0.36.0 (#547)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-13T08:23:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3eb8cfac8c0c453ac42310e1024055885f09c156",
          "body": "Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.48.0 to 1.48.2.\n- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.48.0...v1.48.2)\n\n---\nupdated-dependencies:\n- dependency-name: modernc.org/sqlite\n  depende\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump modernc.org/sqlite from 1.48.0 to 1.48.2 (#548)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-10T11:11:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00633764976e76a0883e248f658a0a794c1abb59",
          "body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.42.0 to 0.43.0.\n- [Commits](https://github.com/golang/sys/compare/v0.42.0...v0.43.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n  dependency-version: 0.43.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/sys from 0.42.0 to 0.43.0 (#545)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-09T09:03:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c735107c00761752ae0e5c3452245cd1870baf74",
          "body": "…546)\n\nBumps [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) from 0.0.20 to 0.0.21.\n- [Commits](https://github.com/mattn/go-isatty/compare/v0.0.20...v0.0.21)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/mattn/go-isatty\n  dependency-version: 0.0.21\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/mattn/go-isatty from 0.0.20 to 0.0.21 (#…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-09T07:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "011eca57663141dd785dfa6459712e10ce47911f",
          "body": "…SQLite storage (#536)\n\n* pkg/analyze: implement deletion and JSON encoding for SQLite storage\n\nImplemented missing functionality for `SqliteItem` and `SqliteStorage`,\nspecifically:\n- `RemoveFile` and `RemoveFileByName` for atomic item deletion and\n  ancestor stat updates in the database.\n- `EncodeJ\n[…]\nr: fixes and optimizations\n\n---------\n\nCo-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>\nCo-authored-by: dundee <27106+dundee@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: implement deletion, JSON encoding, and query optimizations for …",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-01T14:25:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb46b4f795658e40e7838207d9ecff09594c136e",
          "body": "* test: cover internal packages\n\n* test: cover internal/common package",
          "is_bot": false,
          "headline": "test: cover internal packages (#535)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-04-01T08:18:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f8a6bcfdfabb0b2f1597539ea76a95641f8b92d",
          "body": null,
          "is_bot": false,
          "headline": "docs: usage updated",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-31T08:07:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec033d1ee9bc268fec3b589f30eb021ff3b80f26",
          "body": null,
          "is_bot": false,
          "headline": "docs: release action",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-31T07:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ab53b842967789ab4c19cf1a9274dfb35e3cb39",
          "body": null,
          "is_bot": false,
          "headline": "test: move coverage for app package (#534)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-30T13:55:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd06f72c4832e6ecd7df83c9b23d2dde99a562eb",
          "body": "closes #530",
          "is_bot": false,
          "headline": "feat: force interactive mode (#533)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-30T12:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7ba2e8d93a6a5fe2a910dab65ada794ac920c17",
          "body": "Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.47.0 to 1.48.0.\n- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.47.0...v1.48.0)\n\n---\nupdated-dependencies:\n- dependency-name: modernc.org/sqlite\n  depende\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump modernc.org/sqlite from 1.47.0 to 1.48.0 (#531)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-30T11:52:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b00deb0c8ef2af6701a44ed8eae48e75f24f20d9",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump codecov/codecov-action from 5 to 6 (#529)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-30T11:51:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6207db5e4611efe7c2ace35869992a80693a75a",
          "body": "closes #476",
          "is_bot": false,
          "headline": "feat: print marked items to stdout (#528)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-26T17:49:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1253dce1d16e34d6a5f3c71a4f4bbc78f564c17a",
          "body": "closes #410",
          "is_bot": false,
          "headline": "docs: install from conda forge",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-26T16:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52148fd973c37cf3b4cffad1c4880b05e6934907",
          "body": "Bumps [github.com/fatih/color](https://github.com/fatih/color) from 1.18.0 to 1.19.0.\n- [Release notes](https://github.com/fatih/color/releases)\n- [Commits](https://github.com/fatih/color/compare/v1.18.0...v1.19.0)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/fatih/color\n  dependency-ver\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/fatih/color from 1.18.0 to 1.19.0 (#524)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-25T17:42:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c7d130868b9017ba292ad9f13d60f5c6ccc9473",
          "body": null,
          "is_bot": false,
          "headline": "ci: release gh action (#527)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-25T17:40:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eb56ffdd452ae0dfa298831b6b2609a98187501",
          "body": null,
          "is_bot": false,
          "headline": "test: fix for platforms with bigger block size",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-21T21:12:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "899a7b69bb4f5fab1bcbfd3c58a19041b225054d",
          "body": null,
          "is_bot": false,
          "headline": "test: fix for platforms with bigger block size",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-21T12:16:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b350719547e20bb739e7e2bda2739c7c1db987a3",
          "body": null,
          "is_bot": false,
          "headline": "test: sqlite only on supported platforms",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T23:12:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f80d9911c838b30ec53dc49bd59b7ba690967f1",
          "body": "* feat: show progressbar when analysing whole disk/partition\n\n* feat: config option to show progress bar\n\n* fix: use correct esc seq\n\n* fix: clear terminal progress before exit\n\n* test: more coverage",
          "is_bot": false,
          "headline": "feat: show progress bar when analysing the whole disk/partition (#523)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T18:45:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9811bba4f4d109d7734d23d9058ae4be2c7e5dff",
          "body": "Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.46.1 to 1.47.0.\n- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.46.1...v1.47.0)\n\n---\nupdated-dependencies:\n- dependency-name: modernc.org/sqlite\n  depende\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump modernc.org/sqlite from 1.46.1 to 1.47.0 (#515)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-20T12:18:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f84f4342eaf9d1f5ed8b82f79007e171906fc50",
          "body": null,
          "is_bot": false,
          "headline": "ci: define platforms for snapcraft",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T10:29:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd9d007df398e3cb88fab855ff4fbd87a86375a7",
          "body": null,
          "is_bot": false,
          "headline": "ci: install go for snapcraft",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T10:10:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63dcba9f0a867d1c04929845d9f8fffc7d099b5a",
          "body": null,
          "is_bot": false,
          "headline": "ci: drop support for golang 1.24 (#521)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T08:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "534fe9483e67acb133bd9bba21dc211e2a989d99",
          "body": null,
          "is_bot": false,
          "headline": "ci: snapcraft updated",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-20T07:58:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e7c612f1285c4397ce1f0f846470a49c5ca094f",
          "body": "* fix: make itemCount 64bit\n\n* test: fix\n\n* fix: lint",
          "is_bot": false,
          "headline": "fix: make itemCount 64bit (#520)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-19T21:54:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9dadacb9f20c4c7ca98e972c1b14d39a2e1eb90",
          "body": null,
          "is_bot": false,
          "headline": "fix: use smaller value log file size for 32bit systems (#519)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-19T13:05:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50c23cf1dfd20fb037d2e0155a9bc6940f4807ae",
          "body": null,
          "is_bot": false,
          "headline": "feat: add support for browsing tar archives (#513)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-12T20:13:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e58347a6c10191cb58332065dfd34f2e1d81699",
          "body": "* fix: create parent dir for sqlite db\n\n* fix: lint",
          "is_bot": false,
          "headline": "fix: create parent dir for sqlite db (#511)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-11T21:11:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a64cabca8ac9d25fecfeaba78a61ed40b70acd0b",
          "body": null,
          "is_bot": false,
          "headline": "ci: update gdu.spec",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-09T22:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55eb8721c084d13116280e6accc5432f4a23bdbc",
          "body": "* ci: use Golang 1.26\n\n* fix: bump golangci-lint version",
          "is_bot": false,
          "headline": "ci: use Golang 1.26 (#508)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-09T21:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0337d3003677a0d5822296149aa38557aba5ad3c",
          "body": null,
          "is_bot": false,
          "headline": "docs: update man for release",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-09T07:54:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d550fefcf38efd38ef996fb43e1dcbaad6468f5",
          "body": "* fix: support for sqlite db on all platforms\n\n* fix: lint",
          "is_bot": false,
          "headline": "fix: support for sqlite db on all platforms (#507)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-07T20:30:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df95c12abef17d84cf4ee07dba6d9e719138e29d",
          "body": null,
          "is_bot": false,
          "headline": "ci: fix name",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-03-06T15:42:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ef6f8024328ecfa72e9bdd06718d96bb78de403",
          "body": "Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6.\n- [Release notes](https://github.com/docker/metadata-action/releases)\n- [Commits](https://github.com/docker/metadata-action/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: docker/metadata-action\n  d\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump docker/metadata-action from 5 to 6 (#506)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-06T12:19:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d693bee23bd61eea958292b10a8a48cd59f47d8",
          "body": "Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.\n- [Release notes](https://github.com/docker/login-action/releases)\n- [Commits](https://github.com/docker/login-action/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: docker/login-action\n  dependency-versi\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump docker/login-action from 3 to 4 (#503)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-06T12:18:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "311a09cff78854c063ec80cc3df0b0543015c1ee",
          "body": "Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: docker/build-push-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump docker/build-push-action from 6 to 7 (#505)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-06T12:11:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54737b359597b7c3592bfff7ff2309d61438d0e3",
          "body": "* feat: add --no-view-file flag for interactive viewer (#428)\n\n* test: cover no-view-file branches for codecov (#428)\n\n* test: cover no-delete help text branch (#428)",
          "is_bot": false,
          "headline": "feat: add --no-view-file flag for interactive viewer (#428) (#496)",
          "author_name": "ShivamB25",
          "author_login": "ShivamB25",
          "committed_at": "2026-02-25T09:20:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16d331e7bb7db4d7a231ff39f426caffae9f55c8",
          "body": "* feat(tui): allow navigating above initial directory\n\n* test(tui): cover parent-navigation edge branches\n\n* test(tui): cover parent analysis error branch\n\n* feat(config): gate parent navigation behind browse-parent-dirs option\n\nPut the parent directory traversal feature behind a config file option\n\n[…]\n. The option follows the existing config pattern\n(Flags struct -> getOptions -> UI setter) and is config-file only,\nnot exposed as a CLI flag.\n\n* chore: ignore coverage.out and coverage.html artifacts",
          "is_bot": false,
          "headline": "feat: allow navigating above launch directory (#494)",
          "author_name": "ShivamB25",
          "author_login": "ShivamB25",
          "committed_at": "2026-02-25T09:14:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0bd852cd549fc8b3570d4f2058a5a512fe0f67a",
          "body": "* feat(tui): add interactive file type filtering via T key\n\nAdd the ability to filter items by file extension interactively in the\nTUI, similar to the existing name filter (/ key). Press T to open a\ntype filter input where comma-separated extensions can be entered\n(e.g. go,yaml,json). Filtering is r\n[…]\nsting name filter behavior.\n\nRefactored footer management into rebuildFooter() to support multiple\ncoexisting filter inputs cleanly.\n\nCloses #473\n\n* test(tui): cover missing type filter input branches",
          "is_bot": false,
          "headline": "feat: add interactive file type filtering via T key (#493)",
          "author_name": "ShivamB25",
          "author_login": "ShivamB25",
          "committed_at": "2026-02-25T09:08:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7bd917320070d8fbe89b1917d02e7840b1c4caec",
          "body": "* fix: align columns in non-interactive mode\n\n* test: fix",
          "is_bot": false,
          "headline": "fix: align columns in non-interactive mode (#500)",
          "author_name": "Daniel Milde",
          "author_login": "dundee",
          "committed_at": "2026-02-25T09:03:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "305bdf8db35cbc1a729b64f203ec6e4ce80f49b2",
          "body": "Fixes #431",
          "is_bot": false,
          "headline": "feat: enable --show-item-count in non-interactive mode (#495)",
          "author_name": "ShivamB25",
          "author_login": "ShivamB25",
          "committed_at": "2026-02-24T16:18:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 153,
      "latest_release_at": "2026-07-21T06:20:19Z",
      "latest_release_tag": "v0.2.1",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 30,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/pottom/cdu",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/pottom/cdu",
          "is_deprecated": false,
          "latest_version": "v0.2.1",
          "repository_url": "https://github.com/pottom/cdu",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T06:08:14Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 46446,
      "source_files_sampled": 230,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "build/AGENTS.md",
        "charm/AGENTS.md",
        "docs/AGENTS.md",
        "internal/config/AGENTS.md",
        "internal/dup/AGENTS.md",
        "internal/elevate/AGENTS.md",
        "internal/selfupdate/AGENTS.md",
        "internal/theme/AGENTS.md",
        "internal/trash/AGENTS.md",
        "internal/updater/AGENTS.md",
        "scripts/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 28873
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/dgraph-io/badger/v4",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.9.1"
        },
        {
          "name": "github.com/fatih/color",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.0"
        },
        {
          "name": "github.com/gdamore/tcell/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.13.9"
        },
        {
          "name": "github.com/h2non/filetype",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.3"
        },
        {
          "name": "github.com/lucasb-eyer/go-colorful",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/maruel/natural",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/mattn/go-isatty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.21"
        },
        {
          "name": "github.com/mattn/go-runewidth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.19"
        },
        {
          "name": "github.com/minio/selfupdate",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.0"
        },
        {
          "name": "github.com/muesli/termenv",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.0"
        },
        {
          "name": "github.com/pkg/errors",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.1"
        },
        {
          "name": "github.com/rivo/tview",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.42.0"
        },
        {
          "name": "github.com/sirupsen/logrus",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.4"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/ulikunitz/xz",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.15"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.43.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.36.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.49.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 45,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "dundee",
          "commits": 539,
          "avatar_url": "https://avatars.githubusercontent.com/u/27106?v=4"
        },
        {
          "type": "User",
          "login": "pottom",
          "commits": 47,
          "avatar_url": "https://avatars.githubusercontent.com/u/3420063?v=4"
        },
        {
          "type": "User",
          "login": "danie-dejager",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/13314239?v=4"
        },
        {
          "type": "User",
          "login": "ShivamB25",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/104637569?v=4"
        },
        {
          "type": "User",
          "login": "BUCKU",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/45297393?v=4"
        },
        {
          "type": "User",
          "login": "rare-magma",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/45106055?v=4"
        },
        {
          "type": "User",
          "login": "chutzimir",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/310867?v=4"
        },
        {
          "type": "User",
          "login": "amigan",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/1175936?v=4"
        },
        {
          "type": "User",
          "login": "ramgp",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/1475052?v=4"
        },
        {
          "type": "User",
          "login": "rashil2000",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/46838874?v=4"
        }
      ],
      "contributors_sampled": 56,
      "top_contributor_share": 0.761
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "codeql-analysis.yml",
        "release.yml",
        "test.yml",
        "watch-upstream.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "3 out of the last 3 releases have a total of 3 signed artifacts.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "28 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a6be1625b900d1fc12b09656d032330cc36a0866",
        "ran_at": "2026-07-27T21:59:39Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T10:11:15Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-21T06:08:14Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/pottom/cdu",
    "host": "github.com",
    "name": "cdu",
    "owner": "pottom"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 60,
      "inputs": {
        "security": 48,
        "vitality": 84,
        "community": 24,
        "governance": 55,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "commits_last_year": 153,
              "human_commit_share": 0.86,
              "days_since_last_push": 6,
              "active_weeks_last_year": 30
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "30/52 weeks with commits",
                "points": 20.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 30
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "153 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 153
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v0.2.1",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "3 out of the last 3 releases have a total of 3 signed artifacts.",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 56,
              "top_contributor_share": 0.761
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 76% of commits",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 76
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "56 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 56
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 45,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "45/45 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 45,
                      "decided": 45
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "pottom",
              "public_repos": 4,
              "account_age_days": 4927
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of pottom",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "pottom"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~13 yr old",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/pottom/cdu"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "3 out of the last 3 releases have a total of 3 signed artifacts.",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "28 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 9
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "excellent",
        "name": "AI Readiness",
        "value": 88,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "build/AGENTS.md",
                "charm/AGENTS.md",
                "docs/AGENTS.md",
                "internal/config/AGENTS.md",
                "internal/dup/AGENTS.md",
                "internal/elevate/AGENTS.md",
                "internal/selfupdate/AGENTS.md",
                "internal/theme/AGENTS.md",
                "internal/trash/AGENTS.md",
                "internal/updater/AGENTS.md",
                "scripts/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 28873
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, build/AGENTS.md, charm/AGENTS.md, docs/AGENTS.md, internal/config/AGENTS.md, internal/dup/AGENTS.md, internal/elevate/AGENTS.md, internal/selfupdate/AGENTS.md, internal/theme/AGENTS.md, internal/trash/AGENTS.md, internal/updater/AGENTS.md, scripts/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, build/AGENTS.md, charm/AGENTS.md, docs/AGENTS.md, internal/config/AGENTS.md, internal/dup/AGENTS.md, internal/elevate/AGENTS.md, internal/selfupdate/AGENTS.md, internal/theme/AGENTS.md, internal/trash/AGENTS.md, internal/updater/AGENTS.md, scripts/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "86 of 86 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 86,
                      "sampled": 86
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.03,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.14
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "3 of the last 100 commits agent-authored or agent-credited",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 3,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "14 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 14,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 46446,
              "source_files_sampled": 230,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/230 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 230,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T22:00:06.698238Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/pottom/cdu.svg",
  "full_name": "pottom/cdu",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.