Releases: deeplook/dirplot
v0.4.4
Fixed
--inlinefills terminal width in iTerm2 — the iTerm2 inline image protocol now
receives an explicitwidth=<cols>parameter so the image always fills the full column
count, regardless of pixel-to-cell rounding differences (scrollbar width, DPI). Ghostty
and Kitty are unaffected.
Added
-
dirplot diffcommand — compares two directory trees A and B as a treemap. Files are
sized by B. Borders show diff status: green = added, red = removed, blue = changed (content
differs). Unchanged files show no border. Supports--context/--no-context(default: on,
i.e. unchanged files are shown). A and B accept any source supported bydirplot map:
local directories,github://owner/repo[@ref], archives (.zip,.tar.gz, …),s3://,
ssh://,docker://, andpod://. All visual and remote-access options are available:
--output,--format,--show/--no-show,--inline,--font-size,--colormap,
--exclude,--depth,--size,--cushion/--no-cushion,--dark/--light,
--log-scale,--header/--no-header,--quiet,--ssh-key,--ssh-password-file,
--aws-profile,--no-sign,--github-token-file,--k8s-namespace,
--k8s-container,--password-file, and--no-input. -
dirplot diffenhancements — single-argument shorthand:dirplot diff .diffs the
working tree against HEAD (git) or tip (hg). Supports<path>@<ref>syntax for local git
repos (e.g.dirplot diff .@HEAD~5 .@HEAD). When a source is a local git or hg repo,
only tracked files are scanned (untracked files ignored). Change detection uses blob hash
comparison — edits that don't change file size are caught, and Git LFS files are handled
transparently (pointer size vs disk size no longer causes false positives). -
--includeflag (replaces--subtree, which remains as a hidden alias) — available on
map,diff, andmetrics. Keeps only the named subtrees after scanning; supports nested
paths (--include src/dirplot/fonts). Allowlist complement to--exclude. -
Glob patterns in
--exclude— the--excludeflag now accepts glob patterns on all
commands and all backends (local, git, hg, SSH, S3, GitHub, Docker, Kubernetes, archives).
Plain names (.git,node_modules) still work as before and match any path component.
New: single-component globs (*.egg-info), relative paths (src/vendor), and**globs
(**/__pycache__). Matching is consistent across all backends — previously each backend
used a different comparison strategy (absolute paths, basenames, full URIs). -
ISO 8601 timestamps in event log —
dirplot watch --event-lognow writes timestamps
as timezone-aware ISO 8601 strings (e.g.2026-05-12T14:21:52.341+00:00) instead of raw
Unix epoch floats.dirplot replaystill accepts both formats for backwards compatibility. -
--inlineondirplot gitanddirplot hg— displays the single-frame output
directly in the terminal (iTerm2, Kitty, Ghostty protocols). Only available in
single-frame mode (no--rangeor--period). -
@refon HTTPS GitHub URLs —https://github.com/owner/repo@v1.0is now a valid
repoargument fordirplot git, equivalent togithub://owner/repo@v1.0.
Changed
-
dirplot gitanddirplot hginterface redesigned — the animation model is now
explicit:--rangeor--periodtriggers animation mode (APNG / MP4, one frame per
commit); neither flag produces a single static PNG of the last commit (HEAD / tip). -
--animateremoved (git,hg) — use--rangeor--periodto produce an
animation. Without either, a single static frame is rendered. -
--max-commitsrenamed to--first(git,hg) — keeps the first N commits
after the range/period filter is applied. The old name is no longer accepted. -
--last Nadded (git,hg) — keeps the last N commits after the range/period
filter is applied. Counterpart to--first. -
--last PERIODrenamed to--period(git,hg) — the time-period filter is now
--period 30d,--period 24h, etc. The old--lastname for this flag is removed. -
--periodwithout--rangetriggers animation — commits within the period relative
to now are fetched and animated. GitHub URLs use--shallow-sincefor an efficient
date-bounded shallow clone. -
--periodwith--rangefilters relative to range end — when both are given, the
period cutoff is anchored to the timestamp of the last commit in the range rather than
to now (e.g. "last 3 days of activity on this branch"). -
--first/--lastslice post-fetch — the count cap is applied in Python after all
commits are fetched, not viagit log -n. This ensures--firstalways gives the oldest
N commits and--lastalways gives the newest N commits. -
--firstno longer controls clone depth when--rangeis given — previously
--first Nwould pass--depth Ntogit clone, making tags outside the shallow history
unreachable.--depthis now only used when--rangeis absent. -
Output extension
.pngfor animations — APNG output uses.png(not.apng). -
--output -implies--no-show— piping to stdout no longer opens a viewer window;
pass--showexplicitly to override. -
dirplot watchsimplified — animation output removed fromwatch; usedirplot replay
on a--event-logfile to produce APNG/MP4. New--snapshot FILEoption writes the current
treemap PNG on each filesystem change (for external tools or wallpaper updaters). -
matplotlib replaced by cmap — matplotlib is no longer a dependency. Colormap lookups
now use thecmappackage instead, which is significantly smaller. All colormap names
previously accepted by matplotlib continue to work.
v0.4.3
Changed
- Secret flags removed —
--github-token,--ssh-password, and--password
flags have been removed from all commands. Use the$GITHUB_TOKEN/$SSH_PASSWORD
environment variables or the--github-token-file,--ssh-password-file, and
--password-fileoptions instead. This prevents secrets from appearing in shell
history and process listings. SSH_KEYandSSH_PASSWORDenvironment variables removed — SSH credentials
are now resolved via--ssh-key/--ssh-password-fileflags,~/.ssh/config
IdentityFile, the ssh-agent, or an interactive prompt. The non-standard env vars
are no longer read.--logscalerenamed to--log-scale— the flag now follows the standard
CLI convention of hyphen-separated words.--top -nshort form removed (dirplot metrics) —-nis conventionally
reserved for--dry-run; use--top Ndirectly.--range -r,--max-commits -n,--workers -wshort forms removed (git,
hg) — these single-letter aliases conflicted with conventions or were too obscure
to warrant a shorthand.--colormap -c,--subtree -s,--breadcrumbs -b/-B,--k8s-namespace -N
short forms removed — single-letter flags reserved for commonly-used options per
CLIG guidelines.- Status messages now always go to stderr — info lines from
dirplot mapand
the "Watching … (Ctrl-C to stop)" line fromdirplot watchpreviously went to
stdout in some cases; they now consistently go to stderr. $COLUMNS/$LINEShonoured for terminal size — whenioctland
os.get_terminal_size()are both unavailable (CI, SSH sessions, scripts), the
standard$COLUMNSand$LINESenvironment variables are now checked before
falling back to the hardcoded160×45default.dirplot mapwith no arguments shows help — runningdirplot mapwithout
paths or piped input in an interactive terminal now prints the command help instead
of an error.
Added
dirplot metricscommand — scans any source supported bydirplot map
(local, SSH, S3, GitHub, Docker, Kubernetes, archives, stdin) and prints a
structured text summary:- File and directory counts (with empty-directory count)
- Total size (human-readable)
- Maximum tree depth and scan time
- Top N file extensions with file count and total bytes
- Largest N files and directories, each with its percentage share of total size
--sort-by count|sizeondirplot metrics— controls extension ordering;
count(default) sorts by number of files,sizesorts by total bytes.--top Nondirplot metrics— caps the number of entries shown
in each list (extensions, largest files, largest dirs). Default: 10.--json/--no-jsonondirplot metrics— outputs all metrics as a
structured JSON object, suitable for piping intojqor scripts.--metrics/--no-metricsondirplot map— prints the full metrics
block after scanning, before rendering. Lets you get treemap and metrics in
a single pass without running two commands.tree_metrics(root_node, t_scan, top_n, sort_by) → strin
dirplot.scanner— public API returning the human-readable metrics string.tree_metrics_dict(root_node, t_scan, top_n, sort_by) → dictin
dirplot.scanner— public API returning a structured dict with all metrics;
the source of truth for both the text and JSON outputs.
Changed
--log/--logscalemerged into a single--logscaleparameter — the
boolean--log/--no-logflag has been removed from all commands (map,watch,
git,hg,replay). Pass--logscale <ratio>(any value > 1) to enable
log-scale layout compression; omit it or pass0to disable. The default is0
(disabled). The ratio controls the max/min layout-size ratio of leaf files after
transformation.
Fixed
-
dirplot overviewcommand — Resolves app name/description/version from
importlib.metadataso the overview output shows richer context without requiring
manual wiring. -
macOS Keychain error during git clone —
git cloneis now invoked with
-c credential.helper=to suppress the system credential helper. This prevents
the-25308Keychain error in non-interactive environments (CI, sandboxed runs).
Private repos are unaffected because the GitHub token is embedded directly in the
clone URL, so no credential helper is needed regardless.
v0.4.2
Fixed
- Cushion shading applied to directory tiles — the batch cushion pass
incorrectly treated directory rectangles as file tiles, applying full-strength
shading to the entire area of each directory. Directories are now shaded at half
strength (scale 0.5) to give broad structural context, while individual file leaf
tiles continue to receive full-strength shading. The effect is two-level: directory
gradients provide coarse orientation, per-file gradients add local detail — matching
the hierarchical intent of van Wijk (1999). Both the PNG and SVG renderers are updated.
Added
-
dirplot overviewcommand — prints a human-readable summary of all
commands, their arguments, options, and global options. Appears at position
#2 in the help listing. -
dirplot hgcommand — replay Mercurial changeset history as an animated
treemap, identical in interface todirplot git. Supports--animate,
--max-commits,--last,--total-duration,--frame-duration,--fade-out,
--dark/--light,--workers,--crf,--codec, and all other animation flags.
The@revsuffix on the repo path passes a revset directly tohg log.
RequireshgonPATH. Only local repositories are supported — there is no
hg://URI scheme because there is no Mercurial equivalent of GitHub.dirplot hg /path/to/repo --output history.png --animate dirplot hg /path/to/repo@tip --output history.png dirplot hg /path/to/repo --animate --last 30d --output history.mp4
v0.4.1
Added
-
--last PERIODfordirplot git— filter commits by a relative time period instead
of (or in addition to)--max-commits. Accepts a number followed by a unit:
m(minutes),h(hours),d(days),w(weeks),mo(months = 30 days).
For GitHub URLs, usesgit clone --shallow-sincefor an efficient date-bounded shallow
clone.--lastand--max-commitsmay be combined (date filter + count cap both apply).dirplot git . -o history.mp4 --animate --last 30d dirplot git . -o history.mp4 --animate --last 24h dirplot git github://owner/repo -o history.mp4 --animate --last 2w --max-commits 10
-
dirplot democommand — new subcommand that runs a curated set of example commands
and saves outputs to a folder. Useful for first-time walkthroughs or verifying that
everything works in a given environment. Accepts--output(default:demo/),
--github-url(default:https://github.com/deeplook/dirplot), and
--interactive/-ito step through and confirm each command individually. Output
uses rich formatting with colour, section rules, and status indicators.dirplot demo # run all examples, save to ./demo/ dirplot demo --output ~/dp-demo --interactive
-
--fade-outfor animated output — appends a fade-out sequence at the end of
animations produced bydirplot git --animate,dirplot watch --animate, and
dirplot replay. Four flags control the effect:--fade-out/--no-fade-out— enable/disable (default: off)--fade-out-duration SECS— total fade length in seconds (default: 1.0)--fade-out-frames N— number of blend steps; defaults to 4 per second of duration
so longer fades are automatically finer-grained--fade-out-color COLOR— target colour:auto(black in dark mode, white in light
mode),transparent(PNG/APNG only; fades to fully transparent), any CSS colour
name, or hex code (e.g."#1a1a2e")
dirplot git . -o history.png --animate --fade-out dirplot git . -o history.mp4 --animate --fade-out --fade-out-duration 2.0 dirplot git . -o history.png --animate --fade-out --fade-out-color transparent
-
--dark/--lightmode for all treemap commands — controls background and border
colours. Dark mode (default) uses a near-black canvas with white directory labels; light
mode uses a white canvas with black labels. Available onmap,git,watch, and
replay.dirplot map . --light dirplot git . -o history.mp4 --animate --light
-
Metadata in MP4/MOV output —
dirplot git,dirplot watch, anddirplot replay
now embed the same dirplot metadata (date, software version, OS, Python version,
executed command) into MP4/MOV files that was previously only written to PNG and SVG.
dirplot read-metareads it back viaffprobe. -
Automatic
ghCLI credential fallback — if--github-tokenandGITHUB_TOKEN
are both absent, dirplot silently runsgh auth token. Users authenticated with the
GitHub CLI (gh auth login) can access private repositories
with no extra configuration. Token resolution order:--github-token→
$GITHUB_TOKEN→gh auth token.
Changed
--fade-out-framesdefaults dynamically toround(fade_out_duration × 4)rather than
a fixed 4, so a 2-second fade automatically uses 8 frames and a 0.5-second fade uses 2.
Fixed
--total-durationovershooting the target length — when many commits fell within
a burst (closely-spaced timestamps), their proportional frame durations would each be
raised to the 200 ms floor, inflating the total well beyond the requested duration
(e.g. 34 s instead of 30 s). The floor is still applied for readability, but the
non-floored frames are now scaled down to compensate so the sum always matches
--total-durationexactly.
Docs
- Added
## dirplot read-metasection todocs/CLI.md(previously undocumented). - Documented external tool requirements:
git(required bydirplot git),ffmpeg
(required for MP4 output),ffprobe(required byread-metaon MP4 files) — in both
README.mdanddocs/CLI.md.
v0.4.0
Added
-
MP4 video output — all three animation commands (
watch --animate,git --animate,
replay) now write MP4 video when the output path ends in.mp4or.mov. Quality is
controlled via--crf(Constant Rate Factor: 0 = lossless, 51 = worst, default 23) and
--codec(libx264H.264 orlibx265H.265). MP4 files are typically 10–100× smaller
than equivalent APNGs. Requiresffmpegon PATH.dirplot git . -o history.mp4 --animate dirplot git . -o history.mp4 --animate --crf 18 --codec libx265 dirplot replay events.jsonl -o replay.mp4 --total-duration 30 dirplot watch . -o treemap.mp4 --animate
-
@refsuffix fordirplot git: local repository paths now accept an optional
@refsuffix to target a specific branch, tag, or commit SHA without needing
--range(e.g.dirplot git .@my-branch -o out.apng --animate).--rangetakes
precedence when both are provided. -
dirplot gitsubcommand — replays a git repository's commit history as an
animated treemap. Each commit becomes one frame; changed tiles receive the same
colour-coded highlight borders aswatch --animate(green = created, blue = modified,
red = deleted). The commit SHA and local timestamp are shown in the root tile header,
and a progress bar at the top of each frame advances as the animation plays.# Animate all commits, write APNG dirplot git . --output history.apng --animate --exclude .git # Last 50 commits on main, 30-second animation with time-proportional frame durations dirplot git . --output history.apng --animate \ --range main~50..main --total-duration 30 # Live-updating static PNG (last frame wins; useful with an auto-refreshing viewer) dirplot git /path/to/repo --output treemap.png --max-commits 100
-
--range(-r): git revision range passed directly togit log
(e.g.main~50..main,v1.0..HEAD). Defaults to the full history of the current branch. -
--max-commits(-n): cap the number of commits processed. -
--frame-duration: fixed frame display time in ms when--total-durationis not set
(default: 1000 ms). -
--total-duration: target total animation length in seconds. Frame durations are
scaled proportionally to the real elapsed time between commits, so quiet periods in
development history map to longer pauses and burst activity to rapid flips. A 200 ms
floor prevents very fast commits from being invisible; durations are capped at 65 535 ms
(APNG uint16 limit). A summary line reports the actual range:
Proportional timing: 200–7553 ms/frame (total ~30.1s). -
--workers(-w): number of parallel render workers in animate mode (default: all
CPU cores). Rendering is memory-bandwidth bound, so 4–8 workers is typically optimal;
use this flag to tune for your hardware. -
Time-proportional progress bar: a 2 px bar at the top of each frame advances in
proportion to animation time consumed, not frame count — so a burst of closely-spaced
commits produces only a small movement while a long quiet period advances it visibly.
With fixed--frame-durationthe bar is linear as before. -
Debounced watch (
--debounce SECONDS, default0.5): thewatchsubcommand now
collects rapid file-system event bursts and regenerates the treemap once per quiet
period instead of on every raw event. Agit checkouttouching 100 files triggers
exactly one render after the activity settles. Pass--debounce 0to restore the
old immediate-fire behaviour.dirplot watch . --output treemap.png # 500 ms debounce (default) dirplot watch . --output treemap.png --debounce 1.0 # 1 s quiet window dirplot watch . --output treemap.png --debounce 0 # immediate, as before
-
Event log (
--event-log FILE): on Ctrl-C exit, all raw file-system events
recorded during the session are written as newline-delimited JSON (JSONL) to the
given file. Each line hastimestamp,type,path, anddest_pathfields.
The log is written only if there are events to record.dirplot watch src --output treemap.png --event-log events.jsonl # Ctrl-C, then: cat events.jsonl | python3 -m json.tool
-
File-change highlights (
--animate): each APNG frame now draws colour-coded
borders around tiles that changed since the previous frame — green for created,
blue for modified, red for deleted, orange for moved. Deleted files are highlighted
retroactively on the previous frame (since the tile no longer exists in the current
one), so the animation clearly shows both the disappearance and the appearance of files.
Moved files appear as a deletion at the old path and a creation at the new path. -
Graceful finalization: Ctrl-C now flushes any pending debounced render before
stopping the observer, so the output file always reflects the final state of the
watched tree. A second Ctrl-C during APNG writing is ignored so the file can finish
being written. -
Tree comment stripping: trailing
# commentsintreeoutput are now ignored
by the path-list parser, so annotated tree listings (e.g.├── config.json # app config)
are parsed correctly. Filenames containing#without a leading space are preserved. -
scripts/apng_frames.py: utility script to list frame durations, dimensions, and
offsets in an APNG file. -
scripts/watch_events.py: utility script to watch directories and log filesystem
events to a CSV file (or stdout) in real time using watchdog. -
--depthforwatch: thewatchsubcommand now accepts--depth Nto limit
recursion depth, matching the behaviour ofdirplot map.dirplot watch . --output treemap.png --depth 3 -
dirplot replaysubcommand — replays a JSONL filesystem event log (as produced
bydirplot watch --event-log) as an animated treemap APNG. Events are grouped into
time buckets (one frame per bucket, default 60 s), with colour-coded highlight borders
matchingwatch --animate. Only files referenced in the event log appear in the
treemap; the common ancestor of all paths is used as the tree root. Frame durations
can be uniform (--frame-duration, default 500 ms) or proportional to the real time
gaps between buckets (--total-duration). Frames are rendered in parallel.# Replay an event log with 60-second buckets, 30-second total animation dirplot replay events.jsonl --output replay.apng --total-duration 30 # Smaller buckets for fine-grained activity, fixed frame duration dirplot replay events.jsonl --output replay.apng --bucket 10 --frame-duration 200
-
dirplot gitaccepts GitHub URLs — pass agithub://owner/repo[@branch]or
https://github.com/owner/repoURL directly todirplot git. dirplot clones the
repository into a temporary directory (shallow when--max-commitsis set, full
otherwise), runs the full history pipeline locally, and removes the clone on exit.
No permanent local copy is created.# Animate the last 50 commits of a GitHub repo — no local clone needed dirplot git github://owner/repo --output history.png --animate --max-commits 50 # Specific branch dirplot git github://owner/repo@main --output history.png --animate --max-commits 50
-
Total commit count shown —
dirplot gitnow reports the total number of commits
available alongside the number being animated, so you can gauge how much history
exists before committing to a longer run:Replaying 20 of 147 commit(s) (increase --max-commits to process more) ...For GitHub URLs the count is fetched with a single cheap API request (one commit
object +Linkheader). For local reposgit rev-list --count HEADis used. -
--github-token($GITHUB_TOKEN): added todirplot gitfor private GitHub
repos or to raise the API rate limit when fetching the total commit count.
Changed
-
libarchive-cis now an optional dependency. Install it with
pip install 'dirplot[libarchive]'(plus the system library:
brew install libarchive/apt install libarchive-dev) to enable
.iso,.cpio,.rpm,.cab,.lha,.xar,.pkg,.dmg,.a,.ar,
and.tar.zst/.tzstsupport. The base install works without it; a clear
error is shown if you try to open one of these formats without the extra. -
--animatewrites the APNG once on exit instead of reading and rewriting the
entire file on every render. Frames are accumulated as raw PNG bytes in memory and
flushed as a single multi-frame APNG when the watcher stops (Ctrl-C). This removes
an O(N²) disk-I/O pattern where frame K required reading a K-frame APNG just to
append one more frame. Status output during a session now readsCaptured frame N;
the finalWrote N-frame APNG → …line confirms the file was written on exit.
Fixed
- Initial scan progress: the
watchsubcommand now printsScanning <roots> …
before the first render and starts the filesystem observer only after the initial
treemap has been generated, avoiding spurious events during the first scan. --animaterace condition: the debounce timer thread was marked as daemon,
causing an in-progress render to be killed when the main thread exited after
observer.join(). The timer is no longer a daemon thread;flush()joins any
in-flight render before stopping.--animatePillow APNG regression: passingpnginfoalongsidesave_all=True
caused Pillow to silently write a static PNG instead of an APNG. Thepnginfo
argument is now omitted from multi-frame saves (cross-process timing metadata is
no longer needed since frames are held in memory for the lifetime of the process).- *APNG frame duration overflow...
v0.3.3
Added
- Breadcrumbs mode (
--breadcrumbs/--no-breadcrumbs,-b/-B, on by default): directories
that form a single-child chain (one subdirectory, no files) are collapsed into a single tile
whose header shows the full path separated by/(e.g.src / dirplot / fonts). When the
label is too wide, middle segments are replaced with…(src / … / fonts). The root tile
is never collapsed. Disable with-Bor--no-breadcrumbs. - Tree depth in root label: the root tile header now includes
depth: Nalongside the
file, directory, and size summary (e.g.myproject — 124 files, 18 dirs, 4.0 MB (…), depth: 6).
The depth reflects the original tree structure and is invariant to whether breadcrumbs mode
is active.
v0.3.2
Added
- Vertical file labels: file tiles that are at least twice as tall as wide now
display their label rotated 90° CCW, letting the text span the full tile height
instead of being squeezed into the narrow width. - Scan and render timing shown in header output:
Found 1,414 files … [2.3s]andSaved dirplot to out.png [0.4s]. - Multiple local roots:
dirplot map src testsaccepts two or more local
directory paths, finds their common parent, and shows only those subtrees. --subtree/-soption (repeatable) — allowlist complement to--exclude:
keep only the named direct children of the root after scanning. Supports nested
paths such as--subtree src/dirplot/fonts.
Fixed
--excludeon pod and Docker backends now prunes entire subtrees — previously only
the exact path was matched, so all children leaked through.- Clearer error for distroless pods: exit code 126 from
kubectl execnow surfaces as
an actionable message explaining that the container has no shell orfindutility. - Adaptive file-label font size is now computed with a single
textbboxmeasurement
(one call per tile) instead of stepping down one pixel at a time — eliminates an
O(font_size × n_tiles) bottleneck that caused near-blocking on large trees such as
.venvdirectories.
Changed
-sshort alias reassigned from--font-sizeto--subtree.--font-sizestill
works as before; it just no longer has a single-letter alias.
v0.3.1
Added
-
github://URI now accepts an optional subpath after the repository name, letting
you scan a subdirectory directly:github://owner/repo/sub/path— subpath on the default branchgithub://owner/repo@ref/sub/path— subpath on a specific branch, tag, or commit SHAhttps://github.com/owner/repo/tree/branch/sub/path— full GitHub URL form- Tags and commit SHAs are supported wherever a branch ref was previously accepted
(e.g.github://torvalds/linux@v6.12), as the GitHub trees API accepts any git ref.
-
--legend Nreplaces the old boolean--legend/--no-legendflag. It now shows a
file-count legend — a sorted list of the top N extensions by number of files,
with a coloured swatch and the file count for each entry:- Pass
--legendalone to use the default of 20 entries. - Pass
--legend 10for a custom limit. - Omit the flag entirely to show no legend.
- The number of rows is also capped automatically so the box never overflows the
image, based on available vertical space and the current--font-size. - Extensions with the same count are sorted alphabetically as a tiebreaker.
- When the total number of extensions exceeds the limit, a
(+N more)line is
appended at the bottom of the box.
- Pass
-
The root tile header now includes a summary of the scanned tree after an em-dash
separator:myproject — 124 files, 18 dirs, 4.0 MB (4,231,680 bytes).
Applies to both PNG and SVG output. The label is truncated with…when the tile
is too narrow to fit the full string. -
Greatly expanded archive format support via the new
libarchive-ccore dependency
(wraps the system libarchive C library):- New formats:
.iso,.cpio,.xar,.pkg,.dmg,.img,.rpm,.cab,
.lha,.lzh,.a,.ar,.tar.zst,.tzst - New ZIP aliases:
.nupkg(NuGet),.vsix(VS Code extension),.ipa(iOS app),
.aab(Android App Bundle) .tar.zst/.tzstrouted through libarchive for consistent behaviour across all
supported Python versions (stdlibtarfileonly gained zstd support in 3.12).libarchive-c>=5.0added as a core dependency alongsidepy7zrandrarfile.
Requires the system libarchive library:
brew install libarchive/apt install libarchive-dev.- See ARCHIVES.md for the full format table, platform notes, and
intentionally unsupported formats (.deb, UDIF.dmg).
- New formats:
-
Encrypted archive handling:
--passwordCLI option passes a passphrase upfront.- If an archive turns out to be encrypted and no password was given, dirplot prompts
interactively (Password:hidden-input prompt) and retries — no need to re-run with a flag. - A wrong password exits cleanly with
Error: incorrect password. PasswordRequiredexception exported fromdirplot.archivesfor programmatic use.- Encryption behaviour by format (since dirplot reads metadata only, never extracts):
- ZIP and 7z: central directory / file list is unencrypted by default → readable without
a password even for encrypted archives. - RAR with header encryption (
-hp): listing is hidden without password;
wrong password raisesPasswordRequired.
- ZIP and 7z: central directory / file list is unencrypted by default → readable without
Fixed
--versionmoved back to the top-leveldirplotcommand (was accidentally scoped
todirplot mapafter the CLI was restructured into subcommands).
v0.3.0
Added
- Kubernetes pod scanning via
pod://pod-name/pathsyntax — useskubectl execand
findto build the tree without copying files out of the pod. Works on any running
pod that has a POSIX shell andfind(GNU or BusyBox). No extra dependency; only
kubectlis required.- Namespace can be specified inline (
pod://pod-name@namespace:/path) or via
--k8s-namespace. - Container can be selected for multi-container pods via
--k8s-container. -xdevis intentionally omitted so mounted volumes (emptyDir, PVC, etc.) within
the scanned path are traversed — the common case in k8s where images declare
VOLUMEentries that are always mounted on a separate filesystem.- Automatically falls back to a portable
sh+statloop on BusyBox/Alpine pods.
- Namespace can be specified inline (
- Docker container scanning via
docker://container:/pathsyntax — usesdocker exec
andfindto build the tree without copying files out of the container. Works on any
running container that has a POSIX shell andfind(GNU or BusyBox). No extra
dependency; only thedockerCLI is required.- Automatically detects BusyBox
find(Alpine-based images) and falls back to a
portablesh+statloop when GNU-printfis unavailable. - Virtual filesystems (
/proc,/sys,/dev) are skipped via-xdev. - Supports
--exclude,--depth,--log, and all other standard options. Dockerfileand.dockerignoreadded so the project itself can be used as a
scan target.
- Automatically detects BusyBox
- SVG output format via
--format svgor by saving to a.svg-suffixed path with--output.
The output is a fully self-contained, interactive SVG file:- CSS hover highlight — file tiles brighten and gain a soft glow; directory headers
brighten on mouse-over (.tile/.dir-tileclasses, no JavaScript needed). - Floating tooltip panel — a JavaScript-driven semi-transparent panel tracks the cursor
and shows the file or directory name, human-readable size, and file-type / item count.
No external scripts or stylesheets — the panel logic is embedded in the SVG itself. - Van Wijk cushion shading — approximated via a single diagonal
linearGradient
overlay (gradientUnits="objectBoundingBox"), defined once and shared across all tiles.
Matches the ×1.20 highlight / ×0.80 shadow range of the PNG renderer.
Disabled with--no-cushion.
- CSS hover highlight — file tiles brighten and gain a soft glow; directory headers
--format png|svgCLI option; format is also auto-detected from the--outputfile
extension.create_treemap_svg()added to the public Python API (from dirplot import create_treemap_svg).drawsvg>=2.4added as a core dependency.- Rename the treemap command to
map(dirplot map ). - Add
termsizesubcommand and restructure CLI as multi-command app. - Add
--dephtparameter to limit the scanning of large file trees. - Support for SSH remote directory scanning (
pip install dirplot[ssh]). - Support for AWS S3 buckets in the cloud (
pip install dirplot[s3]). - Support for local archive files, .zip, tgz, .tar.xz, .rar, .7z, etc.
- Include example archives for 17 different extentions for testing.
- Comprehensive documentation.
github://owner/repo[@branch]URI scheme for GitHub repository scanning. The old
github:owner/reposhorthand has been removed.- File tiles now have a 1-px dark outline (60/255 below fill colour per channel) so
adjacent same-coloured tiles — e.g. a directory full of extension-less files — are
always visually distinct rather than blending into a single flat block.
Changed
docs/REMOTE-ACCESS.mdrenamed todocs/EXAMPLES.md; Docker and Kubernetes pod
sections added; images with captions added for all remote backends.
Fixed
- SVG tooltips now show the original byte count when
--logis active, not the
log-transformed layout value.Node.original_sizeis populated byapply_log_sizes
for both file and directory nodes and is used by the SVG renderer fordata-size. - GitHub error messages are now clear and actionable.