We shipped major performance improvements this week: sub-millisecond flag evaluation via LRU caching, links endpoint optimization that killed Redis round-trips, and fixed a real bug where 4xx HTTP responses were incorrectly marked as downtime. Status pages got a complete overhaul (7/30/90-day time ranges, auto-refresh, dynamic OG images). We also migrated the entire dashboard and docs to LT Superior typography with a new hex color palette, added email alerts for monitor status changes, built a mobile sidebar drawer, and upgraded the insights engine to deduplicate results with a 6-hour generation cooldown.
What's new in Databuddy
All the latest features, improvements, and fixes shipped to Databuddy, straight from the team.
Databuddy changelog for March 23-30
Highlights
Status page overhaul with time ranges, auto-refresh, and dynamic OG images
Public status pages now include 7/30/90-day range selector, aggregate uptime summary, auto-refresh every 60 seconds, and dynamically generated OG images showing org name, status, and uptime percentage. Redis and ISR caching keep pages responsive even with many monitors.
Sub-millisecond flag evaluation with LRU cache and CDN caching
Flag endpoint latency dropped dramatically. In-process LRU caches (500 entries, 5s TTL) sit before the Redis layer, eliminating network round-trips on hot paths. Fixed Fastly CDN caching too by overriding the CORS Vary header, so repeated requests actually hit the cache instead of going to origin every time.
Fixed uptime status classification: 4xx responses are now marked UP, not down
We discovered 4xx responses (429, 404, etc.) were being marked as downtime. That's wrong; they mean the server is responding. Now only 5xx and network errors mark monitors as down. Updated backend check logic, dashboard labels, and the public status page to handle the full status code spectrum.
Brand refresh: LT Superior fonts and hex color palette across dashboard and docs
Migrated from Geist/Manrope and oklch variables to LT Superior and LT Superior Mono local fonts. New hex-based color palette with brand tokens (amber, coral, purple). All charts and UI controls now use the correct palette instead of near-black/white primary.
Uptime monitor email alerts on status transitions
Monitors can send email notifications when they go down or recover. Users pick recipients from their org members. Emails are clean React templates matching the dashboard design, sent via Resend.
More Updates
Features & Enhancements
- Public status pages with per-monitor visibility control - Added /status/[slug] public pages. Unauthenticated access in proxy. Includes heatmaps and Databuddy navbar CTA. (Author: @izadoesdev)
- Response time latency charts on monitor details and status pages - Added avg and p95 latency charts below uptime heatmaps. Hourly queries for granular 7-day data. Lazy-loaded via next/dynamic to keep bundles small. (Author: @izadoesdev)
- Mobile sidebar drawer and improved links UX - Vaul left drawer on mobile with category tabs, search, theme, profile. Links page shows search skeleton during load and busy state on refresh. Cleaner state management overall. (Author: @izadoesdev)
- Insights page with deduplication, 6-hour cooldown, and sort/filter - Added /insights route with expandable rows (severity left border accent), sort dropdown (priority/newest/biggest change), filter toolbar. Insights only regenerate if stale (6-hour cooldown) to control AI costs. Feedback now persistent in Postgres. (Author: @izadoesdev)
- Unified URL param capture for UTMs and ad click IDs - Consolidated TRACKED_PARAMS config for persistent params (localStorage across navigations) and transient params (fresh from URL each time). Gclid now stored as first-class ClickHouse column. (Author: @izadoesdev)
- Public analytics overview at /public/[id] - Read-only route showing main overview for sites with public sharing enabled. Includes site identity, date toolbar, Databuddy branding, and marketing CTA. Unauthenticated access via proxy. (Author: @izadoesdev)
- Slack webhooks for sign-ups and plan purchases - Team gets Slack notifications when users sign up, orgs are created, and Autumn plan updates happen (new, upgrade, renew). (Author: @izadoesdev)
- Newsletter email capture with Vercel BotID on docs - Footer newsletter form adds contacts to Resend. Bot detection protects POST routes for newsletter, contact, and ambassador sign-ups. (Author: @izadoesdev)
- Manifesto page - New /manifesto route with editorial layout and Databunny examples. Linked from footer and sitemap. (Author: @izadoesdev)
Performance Improvements
- Links: in-process LRU caches eliminate Redis round-trips on hot paths - Added 5s TTL caches for link slugs, geo lookups, click dedup, ETags, bot detection, UA parsing. Fixed stale DEFAULT_RATE_LIMIT.reset timestamp computed at module load. (Author: @izadoesdev)
- Links latency tracking and cache observability - Redirect handler now emits timing breakdown (total, rate-limit, cache, DB) and cache hit/miss to Axiom. Silent Redis calls replaced with error capture for visibility into degraded states. (Author: @izadoesdev)
- Dashboard: prevent Cumulative Layout Shift on latency chart loading - Added LatencyChartChunkPlaceholder for next/dynamic loading state. Fixed header stats and chart block height (168px) to reserve space before chunks load. (Author: @izadoesdev)
- Dashboard: prevent sidebar hydration flicker when loading sites - Defer flag-gated category rows until mount. Use getFlag ready/on matching Sidebar. Add Observability block to loading home nav to avoid mount flicker. (Author: @izadoesdev)
- Status page ISR with 60s revalidation - Headerless RPC client with unstable_cache + revalidate=60 prevents fully dynamic rendering on every request. ClickHouse/Postgres queries run at most once per minute. (Author: @izadoesdev)
Infrastructure
- Consolidated logging across all services with evlog and Axiom - Dropped OpenTelemetry from API, basket, links, uptime, RPC. All services drain batched evlog wide events to Axiom. Optional NDJSON to disk in dev. Structured errors unified on EvlogError. (Author: @izadoesdev)
- Autumn SDK v1.2.2 migration in dashboard and API - Dashboard: Product→Plan, CustomerProduct→Subscription, CustomerFeature→Balance. Webhook events: customer.threshold_reached→balances.limit_reached, added balances.usage_alert_triggered. API webhook dispatch via map for easy extension. (Author: @izadoesdev)
- Tracker: Navigation API SPA tracking and batch filter/sampling - Use Navigation API with fallback instead of history monkey-patching (Next.js 16 safe). Filter/sampling applied in _trackInternal; custom track() bypasses them. Global properties merged in track(). (Author: @izadoesdev)
- API mount Autumn at /api/autumn to fix OpenAPI docs - Elysia mount(autumnHandler) at /api/autumn with path rewrite prevents Autumn from hijacking /* and returning 404 for / and /spec.json. (Author: @izadoesdev)
Bug Fixes
- Fixed SDK and tracker tests for flags refactor - Tests updated to use BrowserFlagsManager, new single-blob storage API (setAll/getAll/clear), and removed tests for deleted APIs. (Author: @izadoesdev)
- Fixed heatmap cell tooltip handlers - HeatmapCell now spreads Radix Slot props and ref so status heatmap tooltips receive pointer handlers correctly. (Author: @izadoesdev)
- Fixed RPC output schemas for strict type safety - Replaced loose z.record outputs with explicit schemas for website, uptime.listSchedules, and funnel analytics. Clients get proper type inference instead of unknown. (Author: @izadoesdev)
- Fixed tracker validation to accept public client IDs as website IDs - Replaced z.uuid() with bounded string so CDN tracker nanoid IDs validate. (Author: @izadoesdev)
- Fixed links edit sheet form not populating from parent - Radix controlled Sheet doesn't invoke onOpenChange(true) when open is set externally. Sync form state in useLayoutEffect when sheet opens with deps on link ID. (Author: @izadoesdev)
- Dashboard sidebar nav items now hydrate stably - Resolve org from session activeOrganizationId when no explicit scope. Cookie-backed queries avoid double-fetch. Made orgId optional on links.create and uptime.createSchedule. Silence AbortError in Query/Mutation cache. (Author: @izadoesdev)
- Fixed dashboard usage limits and locale-stable numbers on hydration - Defer website header usage badge until client hydrates and billing loads so SSR and first client pass match. Centralize en-US number formatting across billing, charts, and event limits. (Author: @izadoesdev)
- Fixed Google and GitHub image sources in CSP - Allow image-src from google.com and github.com. (Author: @mezotv)
- Stop Google from crawling the dashboard - Robots.txt now disallows /dashboard to prevent indexing of authenticated content. (Author: @mezotv)
- Fixed demo URL in docs hero - Corrected image source URL in hero iframe. (Author: @mezotv)
Documentation
- Feature flags and uptime landing pages with mega menu - Added /feature-flags and /uptime (coming soon) landing pages with feature grid and FAQ. Features mega menu in navbar (desktop and mobile). /error-tracking and /web-vitals redirect to docs. FAQ answers rewritten to focus on outcomes. (Author: @izadoesdev)
- Comparison pages for Amplitude, Rybbit, Mixpanel, Matomo, PostHog, Umami - Expanded comparison-config with more competitors. Added /alternatives and /switch-from routes. Competitor Simple Icons avatars. Programmatic titles/descriptions with sitemap entries. (Author: @izadoesdev)
- Pricing FAQ and newsletter signup - 7-item FAQ section on pricing page with structured data for rich snippets. Resend-powered newsletter form in footer with /api/newsletter/subscribe endpoint. (Author: @izadoesdev)
- Cookie banner calculator with ROI scenarios - Interactive /calculator page with scenarios and OG share cards. Visitor-to-paid rate model with conservative defaults. Opportunity cost vs Databuddy pricing. (Author: @izadoesdev)
- Branding page with asset downloads - /branding page with brand assets, color swatches, download cards. Logo context menu on right-click (copy SVG/PNG, download). (Author: @izadoesdev)
- SEO improvements: JSON-LD, AI crawler allowlist, canonical URLs - Root layout with title template and tighter defaults. FAQPage, BlogPosting, TechArticle JSON-LD on docs. Robots.txt allows GPTBot and ChatGPT-User on marketing pages. Blog posts get canonical URLs. (Author: @izadoesdev)
- Docs and dashboard now share unified navbar and branding - Extracted Branding component with light/dark variants. Shared navbar across docs and main site. Brand assets organized by type/theme. (Author: @izadoesdev)
Databuddy March 22-29: Status pages, insights polish, and brand refresh
This week brought public status pages with automatic uptime heatmaps, response time charts on monitor details, and a more polished insights system with better deduplication and AI-driven suggestions. The dashboard received a complete visual brand refresh with new fonts and color system. Uptime monitoring now includes email alerts when monitors transition to down or recover. The link page was redesigned with favicons and inline copy buttons. Behind the scenes, the team completed a major logging infrastructure migration from OpenTelemetry to evlog, improved performance across status pages with smarter caching and client boundaries, and added service health endpoints for better observability.
Highlights
Public status pages with automatic uptime heatmaps
Organizations can publish read-only status pages showing monitor uptime heatmaps, response times, and aggregate health without login or consent. Pages auto-refresh every 60 seconds with dynamic OG images, time range selectors for 7, 30, and 90-day views, and month markers for easier scanning.
Response time charts on monitor detail pages
Monitor pages now display latency trends (average and p95 percentiles) with hourly granularity over 7-day windows. The charts are collapsible and show matching response time visualization on public status rows, giving teams visibility into performance without extra setup.
AI-driven insights with structured metrics and smarter deduplication
Insights surface as deduplicated, priority-scored cards with structured metrics and actionable suggestions tied to your analytics data. A 6-hour generation cooldown balances freshness with compute cost. Teams can dismiss all insights at once with a new clear-all button.
Uptime email alerts when monitors transition
Organizations can configure email notifications when monitors go down or recover. The system sends templated alerts to organization members via Resend. This fills a gap where uptime changes previously went unnoticed until someone checked the dashboard.
Link redesign with favicons and inline copy
Link rows now display target domain favicons, inline copy-to-clipboard buttons (visible on hover), tighter spacing, colored expiry badges, and a cleaner search interface with better empty states. The layout is more compact and scannable.
More Updates
Features & Enhancements
- Public status page UX overhaul - Dynamic OG images, time range selector (7/30/90d), auto-refresh countdown, pulsing operational status banner, org logo in header, month markers on heatmap. (Author: @izadoesdev)
- Monitor detail recent activity and uptime pagination - Infinite scroll for recent checks with dedicated scroll region, stable scrollbar gutter, improved empty/loading states. Recent activity UI is shared across Pulse and monitor pages. (Author: @izadoesdev)
- Insights polish engine and org context - Referrer-aware prompts, dedupe keys, UUIDs before insert, Sonnet model, org website map, human page labels, higher output budget. Dashboard: clear-all cache updates, org loading gates initial state. (Author: @izadoesdev)
- Clear all stored insights for org - POST /v1/insights/clear deletes analytics_insights rows, related feedback, and invalidates Redis cache. Dashboard includes destructive confirmation dialog. (Author: @izadoesdev)
- Dashboard branded elements and org context - Primary logo overlays on Traffic Trends and top tables. SectionBrandOverlay supports inline and corner layouts. Fullscreen modal matches header branding. (Author: @izadoesdev)
- Overview nav section and structured insight prompts - Group Home and Insights under Overview with distinct section icon. Replace clipboard copy with structured agent prompt and clearer UI labels. (Author: @izadoesdev)
- Persist insight feedback via RPC and Postgres - Move thumb votes from localStorage to Postgres (insight_user_feedback table). Dismissals remain client-side. Votes reflect via TanStack Query. (Author: @izadoesdev)
- Enhanced insights UI with sorted, collapsible feed - Replace card-in-card layout with full-page divide-y rows. Severity left borders (red/amber/blue). One row expanded at a time. Dismiss on hover. Reduced actions to Investigate + View analytics + menu. Add sort dropdown. (Author: @izadoesdev)
- Mobile sidebar drawer and links loading UX - Mobile sidebar with vaul drawer, category tabs, search, theme, profile. Links page includes search skeleton and busy state for refresh. (Author: @izadoesdev)
- Add Insights page and fix app shell scroll - New /insights route with feed, filters, cards, dismiss/feedback, hash scroll. Lock viewport scrolling. Register Insights in nav behind flag. Compact filter toolbar. (Author: @izadoesdev)
- Link sheet form and chart redesign - Split link-sheet from ~988 to ~388 lines, link-stats-content from ~659 to ~288. Extract shared components and helpers. (Author: @izadoesdev)
- Unified URL param capture with gclid support - Consolidate UTM and ad click ID handling. Persist params (gclid, fbclid, ttclid) via localStorage. Transient params (UTMs) read fresh from URL. Wire gclid through basket validation and ClickHouse schema. (Author: @izadoesdev)
Performance Improvements
- Status page backend cache and query optimization - Add 7-day date filter to ClickHouse query. JOIN org+schedules into single Postgres query. Redis cacheable wrapper with 60s TTL and stale-while-revalidate at 30s. (Author: @izadoesdev)
- Status page heatmap rendering optimization - Skip redundant TooltipProvider wrappers. Skip all Tooltip components for non-interactive strips. Heatmap builder uses Map lookup instead of .find() in loop. (Author: @izadoesdev)
- Status page ISR with 60s revalidation - Use headerless RPC client with unstable_cache + revalidate=60 instead of getServerRPCClient. Queries run at most once per minute instead of on every page load. (Author: @izadoesdev)
- Split client boundaries and CDN cache for status - MonitorRow server component with client island for heatmap tooltips and latency chart only. StatusNavbar server component with ThemeToggle client island. Cache-Control: s-maxage=60, stale-while-revalidate=300. Loading skeleton for instant perceived load. (Author: @izadoesdev)
- Remove blocking server session in dashboard layout - Remove server-side auth.api.getSession() from (main)/layout. Switch sidebar to authClient.useSession() for non-blocking client session. Use useWebsitesLight in sidebar (Postgres-only). Cache isTrackingSetup permanently. (Author: @izadoesdev)
- Latency tracking and cache observability for links - Redirect handler emits full timing breakdown (total, rate-limit, cache, DB) and cache hit/miss to both OTel spans and Axiom wide events. Silent Redis catch() replaced with captureError. (Author: @izadoesdev)
Bug Fixes
- Heatmap tooltip handlers on status cells - MonitorRow spreads Radix Slot props and ref so status heatmap tooltips receive pointer handlers correctly. (Author: @izadoesdev)
- Prevent CLS when latency chart chunk and data load - Add LatencyChartChunkPlaceholder for next/dynamic loading state. Reserve fixed 168px chart block height. (Author: @izadoesdev)
- Fix layout scroll and hydration on docs - Root layout: replace nested main with flex column; clip overflow. Home/docs: remove min-h-screen stacking. Navbar: fixed header + spacer; sidebar uses dvh + safe-area. (Author: @izadoesdev)
- Align root not-found with site theme and icons - Replace lucide and hardcoded dark styling with Spotlight, Section, theme tokens, SciFiButton. Add client go-back button; fetch GitHub stars for Navbar consistency. (Author: @izadoesdev)
- Stable sidebar nav hydration and Observability loading - Defer flag-gated category rows until mount. Add Observability block to loading home nav to avoid mount flicker. (Author: @izadoesdev)
- Resolve org from session, optional orgId RPC, silence abort noise - API query: resolve org from session activeOrganizationId when no explicit scope. RPC: optional organizationId on links.create and uptime.createSchedule. oRPC + Query cache: ignore AbortError. (Author: @izadoesdev)
- Improve insights engine from product evaluation - Reweight priority scoring toward actionability and business impact. Require prescriptive suggestions. Forbid generic monitor/review fluff. Inject last 14d insight titles per website to cut redundancy. (Author: @izadoesdev)
- Make insights feedback thumbs visible with label and contrast - Improve visibility and accessibility of feedback controls. (Author: @izadoesdev)
- Fix insights card row min-height, a11y cleanup, stopPropagation - Use min-h-20 for stable collapsed height. Biome-ignore for div role=button rows. Remove non-interactive wrapper handlers. stopPropagation on links and buttons. (Author: @izadoesdev)
- Fix insights layout, single-row expand, sort, reduce button noise - Remove card-in-card. Full-page divide-y rows with border-b. One row expanded at a time. Dismissed buttons on hover. Reduced actions from 7 to 3. (Author: @izadoesdev)
- Status page header and footer pinning - Pin header and footer. Scroll only main content. (Author: @izadoesdev)
- Agent queue UI layout and status-page formatting - Move Clear all outside QueueSectionTrigger so it does not toggle. Formatting cleanup in status-page router. (Author: @izadoesdev)
- Grok model id and agent chat UI fixes - Use x-ai/grok-4.1-fast (drop invalid :online suffix). Simplify agent header, input, new chat. Ephemeral ToolStep tool display. Streamdown markdown tables with copy/download. (Author: @izadoesdev)
- X search handling, tool logger fallback, chat hydration - Steer Twitter/X questions to x_search in analytics prompts. Handle empty Grok responses. Fall back to global evlog when AI tools run outside request scope. Restore chat messages in useLayoutEffect. (Author: @izadoesdev)
- Tracker validation and public client IDs - Accept public client IDs (nanoid) as websiteId on /track. Replace z.uuid() with bounded string. Extract trackEventSchema for reuse and unit tests. (Author: @izadoesdev)
- Fix populate edit sheet when opening from parent - Sync form state in useLayoutEffect when sheet opens. (Author: @izadoesdev)
- Improve notice banner and switch contrast - NoticeBanner: use bg-accent + text-accent-foreground pair. Switch: align dashboard and docs; primary border/bg and primary-foreground thumb when checked. (Author: @izadoesdev)
- Dialog/sheet footer buttons, website context menu, autocomplete schema - Outline buttons use bg-card with accent hover/active for contrast. Align cancel/close actions in help dialog and sheets. Website card: wrap ContextMenu trigger. Autocomplete: explicit z.object output schema. (Author: @izadoesdev)
- Brand refresh and shared email blocks - Add email-brand tokens and primary logo header. Extract EmailLinkFallback and EmailNote. Tighten transactional templates. Harden UptimeAlertEmail for react-email preview. (Author: @izadoesdev)
- OpenAPI docs alignment with current RPC router - Drop obsolete HIDDEN_FROM_DOCS keys not on appRouter. Refresh Scalar tag list. Type docsRouter filter callback. (Author: @izadoesdev)
- Type website RPC outputs and dashboard consumers - Define explicit websiteOutputSchema for websites router. getById guard when website is missing. WebsiteHeader uses WebsiteBasic for RPC-shaped rows. (Author: @izadoesdev)
- Type getSchedule output so schedule fields are strings - Replace loose z.record output with explicit schema for uptime getSchedule. Fix TS errors when passing scheduleId to mutations. (Author: @izadoesdev)
- Theme toggle tooltip opt-in - Default off. Enable with tooltip prop. Restore tooltip on category sidebar. Status navbar uses toggle without tooltip. (Author: @izadoesdev)
- Public org status pages and per-monitor visibility - Add /status/[slug] public pages with uptime heatmaps. Store isPublic on uptime_schedules. Extend uptime create/update and dashboard monitors. Allow unauthenticated /status in proxy. (Author: @izadoesdev)
- PageHeader height, badge contrast, org selector - Set min-h-[88px] on shared PageHeader. Badge variants: drop striped gradients. Organization selector: remove plan badge from trigger. (Author: @izadoesdev)
- Align PageHeader height and monitor row layout - PageHeader: min-h-[88px]. truncate description. Match padding and flex patterns with shared header. WebsitePageHeader: min-h-[88px]. (Author: @izadoesdev)
- Add filter dialog scroll and mobile page headers - Cap add-filter dialog height with vertical scroll. Let WebsitePageHeader grow on small screens. Wrap actions. Shorten labels. Fix flex truncation. (Author: @izadoesdev)
- Category sidebar icon contrast in light mode - Use sidebar-foreground for inactive icons (primary-foreground was nearly invisible). (Author: @izadoesdev)
- Canonical Google Ads favicons and referrer labels - Map googleadservices, googleads doubleclick, syndicatedsearch.goog, and googlesyndication hosts to one favicon host. Align referrer labels. (Author: @izadoesdev)
- Dashboard hydration-safe usage limits and locale-stable numbers - Defer website header usage badge until client hydrated and billing loaded. Centralize en-US number formatting. Drive sidebar active state from useSearchParams. (Author: @izadoesdev)
- Profile button always visible with passed user - Profile button visible in dev mode with passed user. Dev cookie prefix in proxy. (Author: @izadoesdev)
- Auth: use no-reply@databuddy.cc for transactional email - Switch from-address for transactional emails. (Author: @izadoesdev)
- Auth: separate dev cookie prefix and remove session Redis storage - Dev cookies use different prefix. Remove cookie cache and Redis session storage. (Author: @izadoesdev)
- Pricing page feature rows from shared plan limits - Add gated-feature-rows from PLAN_FEATURE_LIMITS and FEATURE_METADATA. Respect HIDDEN_PRICING_FEATURES. Map enterprise to Scale. Omit features unlimited on every tier. (Author: @izadoesdev)
- Remove websites row from pricing comparison - Drop websites line items and normalization from comparison table. (Author: @izadoesdev)
- Remove websites feature from pricing plans - Remove websites feature from starter, growth, and scale tiers. (Author: @izadoesdev)
Infrastructure
- Comprehensive logging migration to evlog and Axiom - Adopt evlog across API, basket, links, uptime services. Replace @databuddy/shared pino logger with evlog (RPC-compatible shim). Drop OpenTelemetry. Wire createAxiomDrain for batched event delivery. Move producer/geo/schema enrichment from OTel to wide events. (Author: @izadoesdev)
- Structured error handling on evlog EvlogError - Add structured-errors with basketErrors factories and buildBasketErrorPayload. Throw EvlogErrors from track, llm, request-validation routes. Keep billing Response and pixel/bot ignore. (Author: @izadoesdev)
- Batched Axiom, sampling, enrichers, and dev FS drains - Wire createDrainPipeline, initLogger tail sampling, middleware enrich (UA, request size, trace context). Optional NDJSON to apps/*/.evlog/logs in development. Basket: structured errors in auth, geo, producer, request validation. (Author: @izadoesdev)
- Evlog-only RPC context and wider API logging - Replace OpenTelemetry span helpers with evlog wide-event helpers in @databuddy/rpc. Remove @opentelemetry/api and @orpc/otel. API: mergeWideEvent/captureError patterns, uncaught handlers, logging on MCP/health/insights/public. (Author: @izadoesdev)
- Consolidate auth context into single global wide event enricher - Replace fragmented API key enricher with applyAuthWideEvent. Parallel session and API key resolution. Strip duplicated auth fields from RPC enricher. (Author: @izadoesdev)
- Uptime worker error step merging into wide events - When captureError includes error_step, merge request_error and fields onto evlog wide event. Standardize on error_step and snake_case context keys. (Author: @izadoesdev)
- Simplify JSON health extraction and add service health routes - Replace parseJsonResponse with extractHealth. Default json parsing on for new monitors. Add Bun tests for json-parser health snapshot. Inline /health probes per app. (Author: @izadoesdev)
- Split liveness /health and dependency /health/status - API, basket, links, uptime: GET /health returns 200. Dependency probes under GET /health/status (503 if degraded). CI waits on /health. (Author: @izadoesdev)
- Dual-write ClickHouse via Vector replica sinks - Mirror each ClickHouse sink to CLICKHOUSE_REPLICA_*. (Author: @izadoesdev)
- Funnel errors via ClickHouse subqueries - Replace in-memory step grouping with buildStepSubquery. Track dropoffs with errors alongside session error aggregates. (Author: @izadoesdev)
- Effect-based producer in basket with UUIDv7 - Rewrite producer with Effect (Ref, Schedule, ManagedRuntime). Expose send/sendBatch/disconnect as Effect. Generate event row IDs with randomUUIDv7. (Author: @izadoesdev)
- Pino-compat object logs and batched Axiom drain for links - Emit object-only logger calls in RPC shim (matches Pino behavior). Add evlog-links drain pipeline + flush on shutdown. (Author: @izadoesdev)
- TCC instrumentation for distributed tracing - Add TCC instrumentation. Init Node SDK for tracing. (Author: @armans-code)
Documentation
- SEO metadata unification and JSON-LD structured data - Root layout: title template, default description, twitter/OG defaults. Homepage: dedicated metadata, FAQPage JSON-LD. Blog posts: BlogPosting JSON-LD with dates/images, canonical URL. Docs pages: TechArticle JSON-LD. Robots: GPTBot and ChatGPT-User allowed on marketing pages. (Author: @izadoesdev)
- Cookie banner calculator with scenarios and OG cards - Add /calculator page with interactive tool, scenarios, OG share cards. Wire pricing-based ROI. Link in navbar and footer. (Author: @izadoesdev)
- Reframe calculator as visitor data loss - Replace bounce-rate language with visitor data loss (default 55%). Update hero, scenarios, CTA, share copy with peer-reviewed sources. (Author: @izadoesdev)
- Make cookie calculator defensible — no ROI, clearer labels - Replace ROI multiplier with opportunity cost vs Databuddy $/mo. Rename to visitor-to-paid rate. Conservative defaults. 20–40% bounce range. (Author: @izadoesdev)
- Simplify calculator hero and trim defensive copy - Shorter hero, tighter hints, lean sources intro. (Author: @izadoesdev)
- Honest framing on calculator — measurement gap, not literal loss - Reframe copy as unmeasured/unattributed revenue. Tighten hero, results labels, CTA, share, sources. (Author: @izadoesdev)
- Public analytics overview at /public/[id] - Read-only route for websites with public sharing enabled. Site identity, date toolbar, Databuddy branding, marketing CTA in footer. Unauthenticated access. (Author: @izadoesdev)
- Compare page expansion with new competitors and honest features - Add Mixpanel, Amplitude, Rybbit, Matomo. Fix Fathom claims and pricing. Expand with PostHog and Umami. (Author: @izadoesdev)
- Landing page CRO overhaul - Rewrite hero headline (privacy/cookieless value prop). Add "Start free" CTA to hero and sticky navbar. Remove Google Ads/Promptwatch scripts. Add social proof line (GitHub stars). Fix bento card SSR. Rename Dashboard→Log in. Simplify footer. (Author: @izadoesdev)
- Newsletter email capture and pricing FAQ - Resend-powered newsletter form in footer. 7-item FAQ section on pricing page with structured data. (Author: @izadoesdev)
- Vercel BotID for newsletter and form API routes - Install botid and wrap Next config. Add instrumentation-client init for protected POST paths. Verify requests with checkBotId. (Author: @izadoesdev)
- Web Vitals scores visible without JS animation - Replace motion.div/span with static elements so scores render at full opacity on SSR. (Author: @izadoesdev)
- Use LT Superior font tokens for --font-sans and --font-mono - Point :root and .dark stacks at brand CSS variables. Fix circular --font-serif. (Author: @izadoesdev)
- Point Live demo CTA to /demo instead of /docs - Update navigation. (Author: @izadoesdev)
- GA/Fathom compare copy and migration CTA - Add comparison content. Add with AI on getting started. (Author: @izadoesdev)
- Sitemap reorder — comparison pages first - Emit /compare hub and subpages before docs and static pages. (Author: @izadoesdev)
Brand & Design
- Branding page with assets, swatches, downloads - New /branding page with brand assets, color swatches, download cards. Context menu on logo right-click (copy SVG/PNG). Unified docs/main site Navbar. (Author: @izadoesdev)
- Font refresh to LT Superior and LT Superior Mono - Replace Geist/Manrope across docs and dashboard. Fix dark mode --accent for visible hover highlights. (Author: @izadoesdev)
- Brand color tokens and hex palette - Add amber, coral, purple tokens. Convert oklch variables to hex. (Author: @izadoesdev)
- Dashboard branding pass — fonts, hex palette, chart colors - Replace Geist Mono with LT Superior Mono. Swap chart rendering from --color-primary to --color-chart-1 across stat cards, mini charts, website cards, metrics, pie, retention, revenue, events, errors. (Author: @izadoesdev)
- Dashboard brand colors for interactive controls - Replace bg-primary with brand-purple for switch, checkbox, slider, progress, radio, segmented control, tabs. Use chart-1 for tooltip dots, cohort grid, funnel bars. (Author: @izadoesdev)
- RealFaviconGenerator icons and web manifests - Add favicon.ico, icon0.svg, icon1.png, apple-icon.png, app/manifest.json to both apps. Set appleWebApp title metadata. (Author: @izadoesdev)
- Shared brand assets and Branding component - Organize SVGs under public/brand by asset type and theme. Introduce logo/branding.tsx with variant props. Wire docs/dashboard to Branding. (Author: @izadoesdev)
- Fix border colors, sidebar row heights, sticky toolbar - Separate --border / --sidebar-border tokens from accent fills. Move border-b onto h-10 elements. Remove sticky positioning. Replace overscroll-contain. Add overflow-y-auto to goals, funnels, settings pages. (Author: @izadoesdev)
- Remove hover border accent on simple metrics chart card - Chart card no longer switches to primary border on hover for a calmer default. (Author: @izadoesdev)
Messaging & Copy
- Hero cookie tooltip and calculator trust copy - Underline no cookies with Advance Metrics tooltip. Add cited sources to calculator hero. (Author: @izadoesdev)
- Manifesto page - New /manifesto route with editorial layout, chapter numbers, callouts, monospace prompt block. Link footer Company section. (Author: @izadoesdev)
- Early-access to GA-ready CTAs - Replace product waitlist framing. Hero primary CTA: Get started. (Author: @izadoesdev)
Databuddy changelog for March 9-16, 2026
This week brought improvements to the analytics dashboard and website experience. We added a fully-featured changelog page integrated with Notra, unified the navbar across the docs and main site to reduce confusion, and fixed several bugs affecting chart display and API reliability. Under the hood, we cleaned up logging and made the API more resilient to edge cases.
Highlights
Changelog page with Notra integration
Added a changelog page to the website with a split-view layout that fetches posts from the Notra REST API. The page now lives on both the main site and docs, with a linked 'Powered by Notra' badge. (Author: @mezotv)
Unified navbar for consistency
Simplified and unified the navbar between the main site and documentation, removing the old inconsistent navigation that moved around. (Author: @mezotv)
AI agent chart generation fixed
Fixed errors in AI-powered chart generation and corrected chart display issues that were preventing insights from rendering properly. (Author: @izadoesdev)
More Updates
Features & Enhancements
- Changelog page to landing page #342 - Integrated Notra API to power changelog posts with a polished split-view interface, added changelog navigation links, and upgraded Next.js to ^16.1.6. (Author: @mezotv)
Bug Fixes
- Use same navbar for docs and main #343 - Removed scattered navbar logic and unified the navigation between docs and main site to fix inconsistencies. (Author: @mezotv)
- AI agent charts and generation error - Fixed chart generation errors in the AI insights engine that were blocking users from viewing insights. (Author: @izadoesdev)
- Tool displays - Fixed display rendering for analytics tools. (Author: @izadoesdev)
- Tablet categorization - Corrected device categorization logic for tablet detection. (Author: @izadoesdev)
Infrastructure
- Logger cleanup and API resilience - Cleaned up logger implementation and made the API more resilient with better output handling for edge cases. (Author: @izadoesdev)
- Improved context for insights engine - Enhanced annotation context passed to the insights engine for more accurate analysis. (Author: @izadoesdev)
Databuddy changelog: March 6-13, 2026
This week brought several reliability improvements to the analytics dashboard, including a critical fix for event charts that were silently truncating data when tracking many event types. We also improved device categorization, solidified error handling for API key scopes, and refined the insights engine context for more useful recommendations. If you're tracking multiple custom events or debugging device tracking, these changes will make a difference.
Highlights
Fixed events trend chart cutting off with many event types
The custom events trends query was silently limiting results to roughly 11 days when tracking 14+ event types. The query default limit was 100 rows; with ~14 event types over 30 days, this truncated the entire dataset. Bumped to 5000 and fixed org-level filtering to show accurate trending data.
Improved error handling for API key scopes
Cleaned up MCP protocol integration issues and clarified error messaging when API keys lack required permissions. Better defaults on scope requests mean fewer cryptic auth failures.
Better loading state feedback
Improved visual feedback during data fetches so users know the dashboard is working when requests take time.
Fixed device categorization for tablets
Tablet detection was miscategorizing some devices. Now correctly identifies tablets separately from phones and desktops.
Sharper insights engine context
Refactored event page context and consolidated tooltip utilities to give the insights engine better information for generating relevant recommendations.
More Updates
Bug Fixes
- Unstack chart visualization - Fixed stacked chart layout issue affecting readability.
- Org-level query filtering - Corrected WHERE clause for org-specific dashboard queries to respect organization boundaries.
Features & Enhancements
- Consolidated chart utilities - Unified tooltip and context handling across event dashboards to reduce duplication.
- Removed experimental LLM analytics tracking - Cleaned up temporary analytics module pending future redesign.
Internal Changes
- Dead code cleanup - Removed obsolete event dashboard code paths.
- UI refinements - Visual tweaks to gradient fills and background patterns across dashboard views.