Skip to content

LinkMarks v1.0.1: hardening round 1

Latest

Choose a tag to compare

@louzt louzt released this 28 Jul 20:59
v1.0.1

LinkMarks v1.0.1 — hardening round 1

Additive release. No breaking changes vs v1.0.0.

Highlights

  • Tracking-param blocklist: 6 → 21 entries with documented sources
    (fbclid, gclid, gbraid, wbraid, msclkid, dclid, yclid,
    twclid, li_fat_id, igshid, ttclid, ref, ref_src, ref_url,
    source, spm, scm, _hsenc, _hsmi, mkt_tok; utm_* and
    mc_* as prefix match).
  • Per-domain preservation: new canonical_config module with
    ALWAYS_FUNCTIONAL list and CanonicalConfig::is_preserved. Operators
    can override the blocklist per domain via ~/.config/linkmarks/config.toml.
    See config.toml.example for the YouTube / Vimeo / GitHub / Twitter-X /
    Amazon recipes.
  • SQLite hardening: new storage module applies 5 pragmas at every
    open(): journal_mode=WAL, busy_timeout=5000, synchronous=NORMAL,
    foreign_keys=ON, temp_store=MEMORY. Concurrent-reader + single-writer
    pattern with bounded lock contention.

Documentation

3 ADRs in MADR format document the design rationale:

Validation

  • 65/65 tests pass (was 58 in v1.0.0; +4 canonical + +3 storage).
  • cargo clippy --all-targets -- -D warnings → 0 warnings.
  • cargo fmt --check → clean.
  • cargo build --release → OK, binary ≈ 2.5 MB.

Commits (4 ahead of main at v1.0.0)

98d0d19 docs: config.toml.example with per-domain preservation rules
a460b36 docs(decisions): ADR 0002/0003/0004 — canonical, sqlite, crdt tombstones
4757e8c feat(core): SQLite WAL + busy_timeout storage helper
fab59d0 feat(core): expand tracking-param blocklist + per-domain preservation rules

Compatibility

All new APIs are additive. Existing v1.0.0 callers of canonicalize(),
is_tracking(), and the bridge crates continue to work unchanged. The
storage module is opt-in: callers that don't yet use it are unaffected.

Full Changelog

See CHANGELOG.md and the v1.0.0...v1.0.1 comparison.