All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
If a release patches a publicly known vulnerability, it will be noted explicitly under the affected version with a reference to the CVE or advisory.
- Bump
modernc.org/sqlitefrom 1.52.0 to 1.53.0, with transitive bumps tomodernc.org/libc(1.72.3 → 1.73.4),cc/v4,ccgo/v4, andgc/v3(routine upstream maintenance)
1.2.3 - 2026-05-27
- Bump
golang.org/x/netfrom 0.54.0 to 0.55.0 — security release patching 6 CVEs in thehtmlparser (XSS in foreign-content handling, DoS via cubic-complexity tree construction) andidna(hostname-validation bypass). sendit usesx/net/htmldirectly. - Bump
goreleaser/goreleaser-actionfrom 7.2.1 to 7.2.2 (internal CI deps update) - Bump
golangci/golangci-lint-actionfrom 9.2.0 to 9.2.1 - Bump
codecov/codecov-actionfrom 6.0.0 to 6.0.1 - Bump
github/codeql-actionfrom 4.35.5 to 4.36.0
1.2.2 - 2026-05-17
- Bump
google.golang.org/grpcfrom 1.80.0 to 1.81.1 — includes security fix for potential authorization bypass in xDS RBAC (see grpc-go#9111) - Bump
modernc.org/sqlitefrom 1.50.0 to 1.50.1 (SQLite 3.53.1) - Bump
golang.org/x/netfrom 0.53.0 to 0.54.0 (QUIC and HTTP/2 bug fixes)
1.2.1 - 2026-04-26
- Bump
modernc.org/sqlitefrom 1.48.1 to 1.50.0 - Bump
golang.org/x/netfrom 0.52.0 to 0.53.0 - Bump
github.com/rs/zerologfrom 1.35.0 to 1.35.1 - Bump
goreleaser/goreleaser-actionfrom 7.0.0 to 7.1.0 - Bump
github/codeql-actionfrom 4.35.1 to 4.35.2 - Bump
actions/create-github-app-tokenfrom 3.0.0 to 3.1.1 - Bump
actions/upload-artifactfrom 7.0.0 to 7.0.1
1.2.0 - 2026-04-05
authblock per target:bearer,basic,header, andqueryauthentication forhttpandwebsockettargets- Token values resolved at dispatch time from literal config values or environment variables (
token_env,username_env,password_env) - Literal token/password in config triggers a startup warning log — use env-var references in production
github.com/cucumber/godog(Cucumber for Go) — BDD feature tests covering all four auth types, both literal and env-var token sources, and the error path for unset env varsauthblock supported intarget_defaultsto apply shared credentials to all file-loaded targets
1.1.1 - 2026-03-27
- Docs site descriptions (site root, docs root,
hugo.toml) updated to includegRPCalongside HTTP, DNS, WebSocket, and browser - Metrics reference:
typelabel now listsgrpcas a valid value
1.1.0 - 2026-03-27
type: grpcdriver — executes unary gRPC calls using server reflection; no.protofiles required. URL format:grpc://host:port/Service/Method(plaintext) orgrpcs://(TLS). JSON body is unmarshalled to protobuf via reflection. gRPC status codes are mapped to HTTP-like codes so the engine's error classifier and backoff work uniformly. Connections and method descriptors are cached per address.grpcblock inTargetConfigandTargetDefaultsConfigwith fields:body,timeout_s,tls,insecure- gRPC driver documented in Drivers, Configuration, and Dependencies docs pages
1.0.0 - 2026-03-24
sendit start --tui: live terminal UI powered by Bubble Tea; displays mode, running time, request counts (total/ok/errors), avg/p95 latency, and a latency sparkline; auto-falls back to plain log output when stdout is not a TTYinternal/tuipackage:State(lock-free shared counters + latency ring buffer), Bubble Teamodel, andRunentry pointEngine.SetObserver(fn): hook called after every dispatched result, used by the TUI and available for future integrations
v1.0.0 marks a compatibility guarantee: CLI flags, config schema, and Prometheus metric names will not have breaking changes without a major version bump.
0.15.3 - 2026-03-24
CLAUDE.md: correct Go download URL (wasgo1.22, nowgo1.24); addburstpacing mode to architecture notes; addinternal/outputandinternal/pcapto key packages table- Docs site (
_index.md): addburstto pacing modes description in sections table - Docs site (
dependencies.md): removehowett.net/plistfrom direct dependencies table (it is an indirect dependency); correct count from 13 to 12; remove from licence compatibility table - CI: fuzz job now tolerates Go fuzz engine's
context deadline exceededon-fuzztimeexpiry (known Go behaviour, not a test failure); real findings are still caught via corpus entry detection (scripts/fuzz.sh)
0.15.0 - 2026-03-22
- Test coverage raised from 62% to 71% overall;
internal/metricsfrom 44% to 94% - New unit tests for
detectProbeType,probeRcodeLabel,probeFormatBytes,probeSummary,pinchSummary,isConnRefused,printDryRun(all pacing modes) - New unit tests for
chromeBookmarks,walkChromeNode,firefoxDefaultProfile,firefoxFallbackProfile,historyDBInfo - New unit tests for
metrics.New()andmetrics.ServeHTTP(/healthzand/metricsroutes via live server)
0.14.2 - 2026-03-21
Distribution-only release — no functional changes. Brings the AUR package up to date with the current latest release after the initial AUR publication landed on v0.11.2 (out-of-sequence due to unblocking prerequisites).
- AUR package:
senditis now installable via AUR helpers (yay -S sendit,paru -S sendit); GoReleaser generates and pushes aPKGBUILDtoaur.archlinux.org/sendit.giton every release; the.pkg.tar.zstdirect install option from v0.11.1 remains available for users without an AUR helper
0.14.1 - 2026-03-21
mode: burstpacing mode fires requests at full worker concurrency with no inter-request delay; intended for internal infrastructure testing and load experiments against services you ownpacing.ramp_up_sconfig field: optional linear ramp-up for burst mode; inter-request delay decreases from ~50 ms × ramp_up_s down to zero over the specified number of seconds, preventing a cold-start spike--duration <duration>flag onsendit start: auto-stops the engine after the specified wall-clock time (e.g.--duration 5m); triggers the same graceful shutdown as SIGTERM; required whenpacing.modeisburst
- Config validation now accepts
mode: burstand skips therequests_per_minutecheck for burst mode (the field is unused in that mode) - Dry-run output now displays burst mode with ramp-up and duration summary, including a reminder that burst is intended for internal infrastructure
0.14.0 - 2026-03-21
- Safari bookmarks support in
sendit generate --from-bookmarks safari: reads~/Library/Safari/Bookmarks.plist(binary and XML plist formats) usinghowett.net/plist; extracts all HTTP/HTTPS bookmark URLs recursively from nested folders - Fixture-based unit tests for browser history and bookmark reading: Chrome-style
SQLite history, Firefox
places.sqlitehistory and bookmarks, and Safari plist bookmarks; each test creates a minimal in-process database with known data and verifies URL extraction, weight capping, and limit enforcement
0.13.4 - 2026-03-21
- Table of contents added to
README.md,CONTRIBUTING.md,CODE_OF_CONDUCT.md, andROADMAP.mdusing GitHub-compatible anchor links
0.13.3 - 2026-03-21
docs/content/docs/dependencies.md— lists all 12 direct dependencies with purpose, licence, and alternatives review findingsdocs/content/docs/ossf.md— published OpenSSF Best Practices evidence page (supersedes the gitignored local working document)
go mod tidyconfirmed clean — no unused indirect dependencies- Removed
ossf-gap-audit.mdfrom.gitignore; content published via docs site
0.13.2 - 2026-03-21
- Benchmark suite covering the hot paths in the dispatch pipeline:
BenchmarkSelectorPick(1/10/100 targets) — confirms O(1) Vose alias behaviourBenchmarkClassifyStatusCode/BenchmarkClassifyError— ~6–8 ns/op, zero allocsBenchmarkRegistryWait— token-bucket acquire at unlimited rate (~100 ns/op)BenchmarkDispatch— full dispatch cycle with a no-op driver (~1 µs/op)
benchCI job runsgo test -bench=. -benchmemon every PR and stores results as abench-resultsworkflow artifact
- Upgraded
actions/upload-artifactfrom v4 to v7.0.0 inbenchCI job - Replaced
golang/govulncheck-actionwith directgo install + govulncheck ./...to eliminate an internal node20 dependency - Documented upcoming CodeQL file-coverage-on-PRs behaviour change (April 2026)
in
security.yml; accepted as default since Codecov covers per-file PR coverage
0.13.1 - 2026-03-21
- Codecov integration:
go testnow runs with-coverprofile=coverage.txt -covermode=atomicin CI and uploads to codecov.io viacodecov/codecov-action@v5.5.3(SHA-pinned); Codecov badge added to README codecov.yml— coverage gate: project coverage must not drop more than 2% relative to base branch; new code in each PR must be at least 50% covered
0.12.7 - 2026-03-21
- Bumped
github.com/chromedp/chromedpfrom 0.14.2 to 0.15.0 - Bumped
modernc.org/sqlitefrom 1.46.1 to 1.47.0 - Bumped
github/codeql-actionfrom 4.32.6 to 4.34.1 (Actions pin) - Bumped
dorny/paths-filterfrom 3.0.2 to 4.0.1 (Actions pin)
0.12.6 - 2026-03-21
- Answered all passing-level criteria on the OpenSSF Best Practices platform,
bringing the badge to passing (99%);
test_mostleft as unknown pending Codecov integration (v0.13.1)
0.12.5 - 2026-03-19
- Five native Go fuzz functions covering the four highest-value input surfaces:
FuzzLoad(config YAML parser),FuzzSelector(Vose alias selector),FuzzClassifyErrorandFuzzClassifyStatusCode(error classifiers),FuzzWriteRecord(PCAP record encoder) fuzzCI job runs each target for 30 s on every PR, satisfying the OSSF ScorecardFuzzingcheck
0.12.4 - 2026-03-19
- OpenSSF Best Practices badge in
README.md(project ID 12213 at bestpractices.coreinfrastructure.org); satisfies the OSSF ScorecardCII-Best-Practicescheck
0.12.3 - 2026-03-19
- Required status checks (
lint,test) added to thebaseline-branch-rulebranch ruleset, satisfying the OSSF ScorecardBranch-Protectioncheck
golang.org/x/net→ 0.52.0actions/upload-artifact→ v7,actions/create-github-app-token→ v3,ossf/scorecard-action→ 2.4.3,github/codeql-action→ v4,actions/attest-build-provenance→ v4
0.12.2 - 2026-03-13
- SLSA provenance attestations attached to every release artifact via
actions/attest-build-provenance; verifiable withgh attestation verify. Satisfies the OSSF ScorecardSigned-Releasescheck
0.12.1 - 2026-03-13
- All GitHub Actions dependencies pinned to full commit SHAs across all five
workflow files; Docker base images pinned to digest in
docker/Dockerfile. Satisfies the OSSF ScorecardPinned-Dependenciescheck
0.12.0 - 2026-03-13
- Workflow token permissions scoped to least privilege across
ci.yml,release.yml, anddocs.yml. Satisfies the OSSF ScorecardToken-Permissionscheck
0.11.1 - 2026-03-13
- Arch Linux
.pkg.tar.zstpackage produced by GoReleaser on every release; install withpacman -U - zsh completion installed to
/usr/share/zsh/site-functions/_senditfor Arch
0.11.0 - 2026-03-13
sendit generatecommand produces a ready-to-useconfig.yamlfrom a targets file, a crawled seed URL, or local browser history/bookmarks- Flags:
--targets-file,--url,--crawl,--depth,--max-pages,--ignore-robots,--from-history,--from-bookmarks,--history-limit,--output
0.10.6 - 2026-03-12
- Synthetic PCAP output from per-request telemetry — no root or
CAP_NET_RAWrequired; uses LINKTYPE_USER0 (147) in pure Go (internal/pcap) --capture <file>flag onsendit startwrites a PCAP while the engine runssendit export --pcap <results.jsonl>converts a previous JSONL result file to PCAP post-run
0.10.5 - 2026-03-12
- macOS binaries for darwin/amd64 and darwin/arm64 are now code-signed with a
Developer ID Application certificate and notarized via Apple's App Store
Connect API using
anchore/quill; Gatekeeper accepts them without user intervention - Removed the temporary Homebrew caveats workaround added in v0.10.3
0.10.4 - 2026-03-09
- Added
SECURITY.mdwith supported versions, private reporting process (GitHub private advisory), 48 h acknowledgement and 7-day resolution targets, and coordinated disclosure policy - Enabled GitHub private vulnerability reporting
- Enabled Dependabot security-fix PRs
- Added
dismiss_stale_reviews_on_push: trueto branch ruleset - Added OSSF Scorecard weekly workflow; results published to GitHub Security tab
- Added
docs/content/docs/security.mdanddocs/static/.well-known/security.txt
0.10.3 - 2026-03-08
- Homebrew cask and Scoop manifest generation now reads checksums from the published release instead of rebuilding archives, ensuring deterministic checksums
0.10.2 - 2026-03-08
- Added
-trimpathfor fully reproducible builds - Use
CommitDateinstead ofDatein ldflags for deterministic build output
0.10.1 - 2026-03-08
github.com/miekg/dns→ 1.1.72github.com/spf13/cobra→ 1.10.2github.com/rs/zerolog→ 1.34.0golang.org/x/time→ 0.14.0actions/upload-pages-artifact→ v4
0.10.0 - 2026-03-08
- Homebrew tap:
brew install lewta/tap/sendit(auto-updated by GoReleaser); bundles shell completions for bash, zsh, and fish - Linux packages:
.deband.rpmfor linux/amd64 and linux/arm64 with shell completions and man page - Scoop bucket:
scoop install lewta/senditfor Windows users
0.9.0 - 2026-03-04
sendit probenow supportswss://targets; connects, optionally sends a message, waits for a reply, and prints latency per round-trip
0.8.2 - 2026-03-04
- Switched license badge to a static shields.io URL to avoid intermittent shields.io API failures
0.8.1 - 2026-03-04
- Expanded OS/arch build matrix: freebsd/amd64, linux/386, linux/armv7
- Documented known Windows limitation (browser driver unavailable on Windows)
0.8.0 - 2026-03-04
domainlabel added tosendit_requests_total,sendit_errors_total, andsendit_request_duration_secondsso individual targets can be distinguished in Prometheus dashboards
Breaking change: existing dashboards and alerts using these metrics must be updated to include the new
domainlabel.
0.7.0 - 2026-03-03
- Multi-stage
Dockerfile(golang:1.24-alpinebuilder →alpineruntime) underdocker/ docker-compose.ymlwith optional Prometheus + Grafana sidecars via--profile observability/healthzendpoint on the metrics port for container liveness checks--foregroundset by default in the container entrypoint
0.6.3 - 2026-03-02
sendit pinch <host:port>subcommand for TCP/UDP port connectivity checks
0.6.2 - 2026-03-02
- Switched Hugo theme to Lotus Docs v0.2.0; fixes broken home page layout
- Added PR build check for docs to catch Hugo errors before merge
0.6.1 - 2026-03-02
- Switched documentation theme from Docsy to Lotus Docs v0.2.0 for a simpler, Node.js-free build
0.6.0 - 2026-03-02
- Public documentation site built with Hugo and hosted on GitHub Pages at
https://lewta.github.io/sendit/ - Pages: getting started, configuration reference, pacing modes, drivers, metrics, CLI reference
- Automatic deployment on every push to
main
0.5.5 - 2026-03-01
- Unit tests for all CLI commands
- Unit tests for
Engine.Reload()covering hot-reload behaviour
0.5.4 - 2026-03-01
sendit reloadsubcommand sendsSIGHUPto a running instance via its PID file, making hot-reload a first-class CLI operation
- Migrated WebSocket driver from the deprecated
nhooyr.io/websocketto its maintained forkgithub.com/coder/websocket
0.5.3 - 2026-03-01
- GoReleaser
archives.format→formatsfield update (reverted and re-applied correctly to avoid breaking the release pipeline) - govulncheck CI step no longer triggers a duplicate Authorization header error
0.5.2 - 2026-03-01
github.com/chromedp/chromedp→ 0.14.2github.com/prometheus/client_golang→ 1.23.2github.com/shirou/gopsutil/v3→ 3.24.5github.com/spf13/viper→ 1.21.0github/codeql-action→ v4
0.5.1 - 2026-02-28
- Config hot-reload on
SIGHUP: targets and weights swapped atomically, pacing and rate-limit registries updated in-place, diff logged on change (originally scoped as v0.4.0) - Security CI:
govulncheckscans dependencies against the Go vulnerability database;gosecSAST linter added to golangci-lint; CodeQL semantic analysis added; Dependabot weekly dependency PRs enabled (originally scoped as v0.5.0)
- Resolved all gosec findings introduced when enabling the gosec linter
0.3.2 - 2026-02-28
- golangci-lint added to CI; runs on every PR
gofmt -sformatting applied across the codebase- Removed unused
baseYAMLWithoutTargetsconstant flagged by staticcheck
0.3.1 - 2026-02-28
- Release pipeline infrastructure fix
0.3.0 - 2026-02-28
sendit probe <target>subcommand for interactive single-target testing (likepingfor web targets)- Auto-detects driver type from URL scheme (
https://→ http, bare hostname → dns) - Flags:
--type,--interval,--timeout,--resolver,--record-type - Prints one line per request with status, latency, and bytes (HTTP) or rcode (DNS); prints min/avg/max summary on Ctrl-C
0.2.0 - 2026-02-28
outputconfig section:file,format(jsonl|csv),appendflag- Dedicated writer goroutine consumes results non-blocking to the dispatch loop
- File is truncated or appended on startup based on the
appendsetting
0.1.0 - 2026-02-28
- Four driver types: HTTP, headless browser (chromedp), DNS (miekg/dns), WebSocket (coder/websocket)
- Three pacing modes:
human(uniform random delay),rate_limited(token bucket),scheduled(cron windows with per-window RPM) - Weighted target selection using the Vose alias method (O(1) picks)
- Prometheus metrics with per-domain rate limiting and decorrelated jitter backoff (AWS-style)
- CPU and memory resource gates: dispatch pauses when either threshold is exceeded
--dry-runflag to preview effective config without sending traffic- Integration test suite covering the full dispatch pipeline