Skip to content

release: promote staging to main - #671

Merged
izadoesdev merged 90 commits into
mainfrom
staging
Aug 27, 2026
Merged

release: promote staging to main#671
izadoesdev merged 90 commits into
mainfrom
staging

Conversation

@izadoesdev

Copy link
Copy Markdown
Member

Scope

Single promotion of the staging integration line to main. No direct-to-main changes.

Included

Deliberately excluded

Validation

  • bun run check-types: 35/35 packages
  • bun run lint: clean
  • bun run test with live Postgres/Redis/ClickHouse: 26/26 tasks, 0 failures

izadoesdev and others added 28 commits August 21, 2026 12:07
* fix(annotations): centralize annotation coordinate validation

* fix(analytics): enforce one date-range contract

* fix(mcp): harden tool boundary contracts

* fix(api): use a consistent API-key authentication challenge

* fix(discovery): remove unsupported OAuth discovery

* refactor(mcp): prune duplicate contract scaffolding

* refactor(mcp): reuse shared workflow schemas

* refactor(mcp): inline flag targeting normalization

* refactor(docs): route discovery aliases to canonical endpoints

* test(mcp): cover annotation ranges at the boundary

* fix(discovery): use portable zod import

* refactor(discovery): consolidate builder coverage

* fix(audit): clarify event vocabulary and filtering

* feat(dashboard): improve audit log review experience
…taging

chore(staging): sync main promoted changes
* fix(sdk): catch storage errors in getAnonymousId and getSessionId

* chore: add changeset for sdk storage error fix

* refactor(sdk): use arrow functions in storage-throw test mocks
* fix(dashboard): invalidate flag list with route website id

* fix(dashboard): invalidate archived flag restore with route website id

---------

Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
* docs: document minimum bun version requirement

* docs(contributing): note packageManager bun pin alongside minimum version

* docs: fix bun upgrade guidance

---------

Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
…667)

* fix(shared): respect trackOnlyCategories in generic isBot() fallback

* test(shared): fix describe title style

---------

Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
* feat(notifications): add Discord provider

TODO.md checked off Discord/Teams/Telegram/Google Chat as implemented, but
only Slack/email/webhook existed in providers/ and NotificationChannel.
Adds a real Discord provider as a first, self-contained slice; corrects
the TODO.md checkboxes for the three still-unimplemented channels.

- providers/discord.ts: webhook-based DiscordProvider mirroring
  SlackProvider, posting an embed (title/description/fields, with a
  priority color + footer for non-normal priority)
- providers/payload-utils.ts: truncate/isUserFacingMetadata/
  formatMetadataLabel extracted out of slack.ts so Discord doesn't
  duplicate them; slack.ts now imports from here
- types.ts: NotificationChannel gains "discord"; DiscordPayload/
  DiscordEmbed/DiscordEmbedField added
- client.ts, providers/index.ts: DiscordProvider wired in and exported

Deliberately not touched: the alarms DB schema, RPC destination
validation (packages/rpc/src/routers/alarms.ts), and the dashboard
alarm-sheet UI. Wiring a new channel into the alarms feature end-to-end
is a separate, larger surface — a natural follow-up once this provider
itself lands.

Refs #635

* fix(notifications): enforce Discord's aggregate 6000-char embed limit

Greptile flagged that per-component caps alone aren't enough: Discord
rejects an embed whose title + description + every field's name/value +
footer text sum past 6000 characters, even when each piece individually
respects its own limit (25 fields at the max 1024 chars each alone sums
to 25,600). Track a running total while building fields and stop adding
more once the next one would push the embed over the aggregate limit.

* fix(notifications): skip empty discord embed fields

---------

Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
…636)

* fix(rpc): align funnel cache invalidation key and re-enable caching

invalidateFunnelsCache invalidated `byId:<funnelId>:<websiteId>`, but the
getById handler cached under `byId:<funnelId>` — the keys never matched, so
invalidation silently deleted a Redis key that was never written. All three
funnel read paths (list, getById, analyticsByLink) had caching disabled
entirely to work around this, even though list and analyticsByLink already
used a key/tag format the invalidation helper handles correctly.

Fixes #634

* fix(rpc): authorize funnel getById before the cache, not inside it

Greptile flagged that re-enabling the getById cache let a workspace
authorization check that lived inside queryFn get skipped on a cache hit:
withCache returns the cached row directly without ever invoking queryFn,
so a second caller without access to the funnel's website could read it
once someone else had populated the cache.

Resolve the owning websiteId and call withWorkspace before touching the
cache, mirroring the same two-step pattern already used in update/delete
in this file. Authorization now runs on every request regardless of
cache state; only the row fetch itself is cached.

Also add the new funnels-cache.test.ts to the package's configured test
script (packages/rpc/package.json) — it was passing locally only because
`bun test` with no arguments picks up every *.test.ts file, but the
package's actual `test` script lists files explicitly and was silently
skipping it.

* chore(rpc): drop narrative comments from funnel cache changes

---------

Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
@vercel

vercel Bot commented Aug 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
databuddy-status Ready Ready Preview Aug 27, 2026 12:20pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
dashboard (staging) Skipped Skipped Aug 27, 2026 12:20pm
documentation (staging) Skipped Skipped Aug 27, 2026 12:20pm

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: be31d83f-9f9b-4cd4-95c8-0463728d1993

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Remove the JSON health parser, content hashing, and jsonParsingConfig from
the check pipeline. Classify fetch errors (DNS, refused, reset, TLS) instead
of passing raw messages, treat 4xx as down, and report real retry counts.
Replace the infinite fixed-delay BullMQ retry policy with 3 exponential
attempts for checks and bounded fixed retries for delivery, with failure
retention. Add a 15-minute scheduler resync loop, memoize the health check,
time-box health probes, back off failed probe-IP lookups, and clear the
resync timer on shutdown. Add a Docker smoke stage that boots the compiled
binary and drives /health/status before the image can ship.
…aching

Replace loose record outputs on the uptime router with strict schemas and
drop cron/jsonParsingConfig from responses. Fix schedule permissions to
require create for creation and delete for deletion instead of update.
Pass websiteId through withResource so website-scoped API keys are checked
at the website level. Cache and rate limit the public status-page sitemap,
cap it at 1000 entries, and set audit organization on mutations. Remove
dead uptime AI builders (overview, status breakdown, SSL, by-region) and
the pending status they referenced.
Drop cron/jsonParsingConfig/isPublic from monitor types and forms, add the
new 12h/24h granularities to the status-page add-monitor dialog, surface a
scheduler-inactive warning on monitor details, use DeleteDialog for monitor
deletion, and toast on pulse refresh failure instead of console logging.
@vercel
vercel Bot temporarily deployed to staging – dashboard August 27, 2026 12:19 Inactive
@vercel
vercel Bot temporarily deployed to staging – documentation August 27, 2026 12:19 Inactive
@railway-app
railway-app Bot temporarily deployed to Databuddy / production August 27, 2026 12:19 Inactive
@izadoesdev
izadoesdev merged commit ad4ff58 into main Aug 27, 2026
27 checks passed
@izadoesdev
izadoesdev deleted the staging branch August 27, 2026 12:23
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.

8 participants