Skip to content

docs: visual tour with a screenshot of every feature - #6

Merged
citizen-123 merged 5 commits into
mainfrom
docs-screenshots
Jul 28, 2026
Merged

docs: visual tour with a screenshot of every feature#6
citizen-123 merged 5 commits into
mainfrom
docs-screenshots

Conversation

@citizen-123

Copy link
Copy Markdown
Owner

Adds docs/screenshots.md — a follow-along visual tour with 15 screenshots, plus a hero image and link from the README.

Coverage

Split-pane monitor · flow list (status/size, HTTP/1.1 + HTTP/2) · detail view + JSON highlighting · request headers/body · on-the-fly gzip decode · filter · flag + flagged-only · sort · Repeater (inline response + attack modes) · intercept pause · raw-bytes editor · help overlay · curl export · HAR export.

How they were made

Captured headlessly with tmux + freeze against a small local demo API (a shell as the target).

Safety

  • No real credentials: the only auth header shown is a synthetic sk-demo-FAKE-0000.
  • No PII: neutral demo$ prompt and a demo home — no real usernames or host paths appear (scanned every frame).

Not included

WebSocket injection, gRPC, and transparent (nftables) capture need extra server infrastructure to stage and aren't pictured; noted as such in the doc.

🤖 Generated with Claude Code

citizen-123 and others added 5 commits July 27, 2026 20:40
Add docs/screenshots.md — a follow-along visual tour with 15 screenshots
covering the split-pane monitor, flow list (status/size, HTTP/1.1 + HTTP/2),
detail view with JSON highlighting, request headers/body, on-the-fly gzip
decode, filter, flag + flagged-only, sort, Repeater (inline response + attack
modes), intercept pause + raw-bytes editor, help overlay, and curl/HAR export.

Screenshots were captured headlessly (tmux + freeze) against a local demo API;
all tokens/users are synthetic (sk-demo-FAKE-*) and no host/user paths appear.
Link the tour and the hero image from the README.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A docs-only change (this PR included) ran a full go build, vet, and
race-enabled test suite. Add a `changes` job that diffs the change set
against its merge base and gates `build-test` on the result: markdown,
docs/, LICENSE, and issue templates skip the build, and anything else —
Go sources, go.mod/go.sum, .goreleaser.yaml, the workflows themselves —
still builds, so the list needs no upkeep as new source files land.

Gating a job rather than adding `paths-ignore:` to the trigger is
deliberate: a workflow that never starts leaves a required check pending
forever, whereas a job skipped by `if:` reports as skipped and satisfies
branch protection. `build-test` therefore keeps reporting on every PR.

The filter falls back to building whenever the base commit is missing or
unreadable (force pushes, first push on a branch, manual dispatch), so a
failure to work out the diff can't silently skip CI. Also adds
workflow_dispatch for forcing a run by hand.

release.yml is unchanged: it fires on v* tags only, which are cut
deliberately and always need a build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MavUrTwm29bQRDy2Nufoq3
Tag pushes can't use `paths:` — GitHub ignores path filters on tag events —
so release.yml gets the same treatment as a gate job: compare the tag
against the previous tag (`git describe --tags --abbrev=0 "$TAG^"`) and
skip GoReleaser when nothing but documentation changed between them.

Worth being explicit about the tradeoff, since a tag is a deliberate act
in a way a push isn't: a skipped release means a tag with no binaries,
no checksums, and a Homebrew cask still pointing at the previous version.
Two things keep that from being a trap — the skip is loud (a run
annotation plus a step summary saying what was skipped and why), and
`workflow_dispatch` with a tag input forces a release for a tag the
filter skipped or a run that failed. The first tag in the repo, or any
tag whose predecessor can't be resolved, always releases.

The filter itself moves to .github/scripts/needs-build.sh so both
workflows share one list of documentation-only paths instead of drifting
apart. It prints its verdict on stdout and diagnostics on stderr, which
also makes it runnable locally:

    .github/scripts/needs-build.sh origin/main HEAD

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MavUrTwm29bQRDy2Nufoq3
The screenshot tour shows what each feature looks like; these fill in what
you do with it. Six pages under docs/, indexed by docs/README.md:

- getting-started.md — first capture, what the launcher injects into the
  target's environment, triaging the flow list, where files land, and what
  to check when no traffic appears
- keybindings.md — every binding by context, matching the ? overlay
- scope.md — the [!][field:]pattern grammar and the postures it produces
- intercepting.md — arming, the pause/edit/forward/drop loop, and what
  "edit" means for each protocol
- repeater.md — {{variables}}, payload lists, and the five attack modes
  with the request count each one produces
- exporting.md — every output, its key, its filename, and what it leaks

Each page carries the screenshots for its feature, so all 15 images are
now reachable from a page that explains them rather than only from the
tour. Everything here was read off the source rather than the README, so
a couple of behaviors are documented that weren't written down: specs
within one scope flag are OR'd (each spec becomes its own single-condition
rule and first match wins), a repeated flag keeps only its last value,
sort-by-size is descending, and the filter matches protocol and server
address as well as host/method/path/status.

That last point corrects a README example: `-scope 'method:=POST' -scope
'body:token'` was documented as "every POST that carries a token", but Go's
flag package drops the first value, and two specs would OR rather than AND
even in one flag. Rewritten to say what it does.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MavUrTwm29bQRDy2Nufoq3
Both gates keyed on `== 'true'`, which meant a `changes` job that errored
skipped the gated job — a broken filter would have let a PR merge with no
build and a tag publish nothing. Invert it: only an explicit "false"
skips, so an empty output from a failed detect job still builds and still
releases. `!cancelled()` keeps a cancelled run from proceeding, and also
overrides the implicit `success()` that a bare `if:` would apply, which is
what lets the gated job run after a failed dependency at all.

This matches what needs-build.sh already does internally — every path it
can't evaluate returns "true".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MavUrTwm29bQRDy2Nufoq3
@citizen-123
citizen-123 merged commit ab5e3dc into main Jul 28, 2026
2 checks passed
@citizen-123
citizen-123 deleted the docs-screenshots branch July 28, 2026 10:41
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