v2.3.0
The largest release since the FastAPI rewrite. Three things land together, plus the groundwork they share.
URL safety. A full abuse pipeline that takes a report through analysis, a verdict, and enforcement with no manual step in between. Reported destinations run through a chain of providers and get a tiered verdict stored per host, and a toxic one switches off every link that verdict covers across v2, v1 and emoji links alike, evicting caches and leaving a reason stamped on each document. Threat feeds (fishfish.gg, Google Web Risk, operator lists) also gate creation, so a known-bad destination is refused up front instead of blocked later. Creation-burst scoring and two retroactive sweeps cover what reports never reach: campaigns that never get a click, and destinations that turn bad after the links pointing at them were made. A deep tier renders a destination and classifies it. Every action is bounded by the scope of the verdict behind it, so one phishing page on a shared platform takes down its own path and not everyone else's links. The framework ships switched off.
Account deletion. Accounts can now be deleted from the product rather than by hand. DELETE /api/v1/me re-authenticates, then holds the account for a grace period during which sign-in is blocked and POST /auth/restore can cancel. After that a sweep erases everything: links, click history, custom domains, API keys, layouts, webhooks, uploads and the account itself.
Free tools API. GET /api/v1/metadata now answers anonymous callers, with its own per-IP limits, and returns the raw page title, description and favicon alongside the normalised tags. Two new endpoints join it: /api/v1/expand walks a short link's redirect chain and reports every hop with an honest safety read on the destination, and /api/v1/domain-intel returns a host's DNS, registration and TLS records.
Underneath all three: every link now stores and indexes the parsed parts of its destination, so pivoting on a domain is a lookup rather than a scan, and a scheduled task runner hosts the recurring feed syncs, sweeps and erasure passes.
What's Changed
- feat: anonymous metadata, expand, and domain-intel endpoints by @Zingzy in #320
- feat: parse and index destination URL parts by @Zingzy in #297
- feat: report-triggered safety analysis, verdicts and enforcement by @Zingzy in #299
- feat: threat feeds and the create-time policy gate by @Zingzy in #300
- feat: creation-pattern anomaly scoring by @Zingzy in #301
- feat: retroactive sweeps for feed drift and screening coverage by @Zingzy in #303
- feat(safety): block legacy v1/emoji links with a per-link audit trail by @Zingzy in #304
- feat(safety): L2 deep tier — investigation, LLM capability, evidence tools by @Zingzy in #305
- fix(safety): bound every enforcement action by verdict scope by @Zingzy in #316
- fix(safety): close the stack review findings by @Zingzy in #318
- refactor(safety): one Web Risk client behind both callers by @Zingzy in #324
- chore(caddy): sync the prod vhost from the box and allowlist /tools by @Zingzy in #323
- fix(safety): fail the Web Risk budget closed by @Zingzy in #325
- feat: self-serve account deletion with scheduled erasure by @Zingzy in #306
Full Changelog: v2.2.1...v2.3.0