v2.1.0
What's Changed
- build(deps): bump cloudflare/wrangler-action from 3 to 4 by @dependabot[bot] in #228
- build(deps): bump actions/checkout from 6 to 7 by @dependabot[bot] in #227
- build(deps): bump actions/setup-node from 5 to 6 by @dependabot[bot] in #226
- feat: per-country geo-targeting rules on short links by @Zingzy in #230
- feat: custom meta-tags (social link previews) by @Zingzy in #231
- feat: per-user /me API — onboarding resume, layouts, feature availability by @Zingzy in #235
- feat: reserved alias list blocks frontend-path short codes by @Zingzy in #236
- fix(auth): propagate user email to CurrentUser for feature-flag email allowlists by @Zingzy in #238
- feat: public link preview endpoint by @Zingzy in #240
- feat: X-Error-Code header + edge-composed error bodies by @Zingzy in #239
- feat: public per-link stats endpoint by @Zingzy in #241
- feat: report intake + contact API by @Zingzy in #242
- fix: unmatched routes get negotiated errors, not Starlette's default by @Zingzy in #243
- fix(public-stats): skip malformed v1 dimension entries instead of 500ing by @Zingzy in #245
- fix: enforce time-based URL expiry at resolve + derive effective status by @Zingzy in #246
- fix(stats): null avg_redirection_time when no measurements exist by @Zingzy in #247
- feat(api): add GET /api/v1/apps connected-apps list by @Zingzy in #248
- feat: profile editing (user_name update, picture upload and unset) by @Zingzy in #249
- refactor: move profile picture endpoints to /api/v1/me by @Zingzy in #250
- fix(auth): serialize auth timestamps with explicit UTC offset by @Zingzy in #252
- feat: emoji short links on the v2 API by @Zingzy in #251
- feat(api): complete URL addressing with create-response id and single-resource GETs by @Zingzy in #253
- feat: bulk URL operations (delete, status, expiry) by @Zingzy in #255
- feat: bulk move domain endpoint by @Zingzy in #257
- feat(api): expose accepted emoji set at GET /api/v1/emoji-set by @Zingzy in #256
- fix(auth): standardize error shapes on refresh and device revoke by @Zingzy in #258
- chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #254
- feat(auth): PKCE and grant-scoped tokens for connected apps by @Zingzy in #260
- feat(analytics): add device and UTM click dimensions by @Zingzy in #259
- chore(deps): bump actions/setup-python from 6 to 7 by @dependabot[bot] in #262
- feat: attribute requests to clients and API keys in logs by @Zingzy in #265
- feat: api key last_used_at and failed auth logging by @Zingzy in #266
- feat: carry resolved identity into request_completed logs by @Zingzy in #267
- feat: persist created_via on shortened urls by @Zingzy in #268
- refactor: move operator Discord pings out of infrastructure/webhook by @Zingzy in #269
- feat(webhooks): discord and slack delivery flavors by @Zingzy in #272
- feat: webhooks by @Zingzy in #270
- feat: serve Next frontend on beta.spoo.me by @Zingzy in #237
- chore: relicense from Apache 2.0 to AGPL-3.0 by @Zingzy in #261
- feat: send rate limit headers on limited responses by @Zingzy in #273
- feat: claimable anonymous links via one-time claim tokens by @Zingzy & @revanthlol in #277
Full Changelog: v2.0.2...v2.1.0