Skip to content

New web UI: runs, presets, options and saved analyses - #1

Merged
code-zm merged 5 commits into
code-zm:mainfrom
xss3cut10n3r:web-ui-redesign
Oct 4, 2026
Merged

code-zm merged 5 commits into
code-zm:mainfrom
xss3cut10n3r:web-ui-redesign

Conversation

@xss3cut10n3r

Copy link
Copy Markdown
Contributor

A redesign of fvol serve: the web UI now works like a desktop forensics tool, with a start
screen, runs of several plugins, presets, every global fvol option, and analyses that are
saved and come back when a dump is reopened.

Workspace
Results

What changes

  • Quick Start on launch: continue with the -f image, browse for a new one (including the
    desktop's own file dialog via kdialog/zenity on loopback), or reopen a previous analysis.
  • Workspace in four resizable panels: File Overview (the image and windows.info facts,
    printed line by line), Plugins, Runs, and Triage Hints.
  • Plugins: a Select tab (tick plugins, their options unfold underneath) and a Presets tab
    with six built-in sets (System Information, Windows Triage, Windows Malware and Persistence,
    Linux Triage, Linux Rootkit Hunt, macOS Triage) plus the user's own (Save Preset).
  • Runs: the ticked plugins start together as one named run, a few at a time. Results
    replace the left two panels, a tab per plugin; one filter applies across a run's plugins and
    is kept per run. Columns can be moved, resized and fitted; process trees draw proper guides.
  • Options: every global fvol option, each applied where the web UI has the same step
    (opening the image, each run, or the new fvol output export). See docs/web-ui.md.
  • Triage rules: Load Rules… adds the user's own JSON checks next to the built-in hints.
  • Saved analyses: ~/.fvol/<dump_id>-metadata.json (dump path, size, mtime, options,
    rules, runs) plus each plugin's rows in ~/.fvol/<dump_id>/<run>/<n>.jsonl. dump_id is the
    ~/.cache/fastvol image key, so a reopened dump finds warm caches; results come back without
    re-running anything. --clear-cache never touches ~/.fvol. Delete in Previous removes an
    analysis (never the dump).
  • System fonts replace the embedded JetBrains Mono; the old UI's files are removed.

Behaviour changes to be aware of

  • fvol serve now writes to ~/.fvol by default (0700 folder, 0600 files). Those files
    hold case paths, options and result rows. If you would rather have this opt-in or add a
    --no-save flag, it is a small change: say which you prefer.
  • The options can name files the server writes: --save-config only into a run's output
    folder, -l only to a regular *.log file (one line per run, control characters replaced).
  • POST /api/session still accepts symbol_dirs; it now goes through the options (-s on the
    command line still wins over an analysis's saved options).
  • New API routes: /api/batches, /api/options, /api/rules, /api/analyses (with
    DELETE /api/analyses/<dump_id>), /api/presets and /api/pick-file (all in docs/web-ui.md).
  • The old UI's hex viewer, process view, run comparison and timeline are not part of the new
    UI. /api/mem and /api/disasm are still there.
  • bench/web/serve.sh gives test servers their own HOME, so they never write the
    developer's ~/.fvol (the caches stay shared).

The project's rules

  • [dependencies] stays empty; the UI is hand-written HTML/CSS/JS with no build step.
  • CLI output is untouched: the change is limited to src/web, bench/web, docs and README.
  • No panic on bad input: damaged saved files and option values give error messages.
  • Nothing is taken from vol-rs.

Tested

  • Static fast build warning-free on Rust 1.95; cargo test --profile fast --locked: 609
    passed, 109 ignored. One failure, codecs::xz::tests::codecs_xz_real_isf, is unrelated and
    pre-existing: it only runs when ~/.cache/volatility3 holds that ISF, and it hard-codes the
    checksum of one particular conversion (the file embeds its conversion time).
  • CI's smoke test and README-artwork check pass locally.
  • End to end on a Windows 11 image: a run is saved, the server restarted, the analysis reopened
    from Previous; restored rows are identical to a fresh run and no plugin re-ran. Options
    checked for their effect (-e, --write-config output identical to fvol --save-config,
    -l, -r/--hide-columns, --parallelism off, --offline reopening).
  • bench/web/shots.py (rewritten for the new UI, with a readme step and --scrub for local
    paths) and bench/web/perf.sh (browser part ported) pass.
  • Not tested here: arm64, the newest stable Rust, and bench/web/e2e.sh (needs the Linux test
    image).

xss3cut10n3r and others added 5 commits September 30, 2026 06:38
An image opened through the API (a script, the fvol MCP server) left the
Quick Start over the workspace, so its runs could not be seen. The Quick
Start now closes when the session changes under it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Saved analyses:
- A metadata file that cannot be read (damaged, too large, another
  format) is no longer written over, nor its result rows deleted: the
  dump opens without it, the session says why, and Previous lists it as
  unreadable. Deleting it there starts saving the open dump again.
- Opening another image closes the runs of the one left (after saving
  them), so a restored run never shares its id with another image's run;
  rename, filter, cancel and remove acted on the wrong one.
- open_image keeps the analysis lock until the new dump's analysis and
  runs are in place, and the analysis saves the runs of its own session:
  the background saver can no longer pair one dump with another's runs.
- Result rows are written through a buffered file instead of a copy of
  the whole table in memory.
- Saved options that no longer validate are reported instead of silently
  dropped; `fvol serve -o` wins over a saved output folder.

UI:
- Esc on a menu, the Options or Save Preset dialog or the Quick Start
  closes only that, not the results behind it.
- Enter on a button inside a run, preset or saved-analysis row is that
  button's (Delete in Previous opened the analysis).
- The process list, capture time and triage hints of the previous image
  are dropped when another image opens, and reloaded when the image
  reopens with new options.
- Keyboard focus survives the per-second re-renders of the tab bar and
  the Runs panel.
- Rule regexes ignore the g and y flags (test() kept lastIndex between
  processes); a late saved-rules answer no longer replaces rules loaded
  meanwhile.
- Tree guides end at the last row of the table.
- Removed core.js modal() and int0(), unused since the redesign.

Unit tests get their own .fvol folder; new tests cover the batch,
options, presets, rules and analyses routes and the two data-loss cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@code-zm
code-zm merged commit 59144d1 into code-zm:main Oct 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants