Changelog

What we shipped

Every feature, improvement, and fix — in reverse chronological order. No marketing fluff, just what changed and why it matters.

RSS feed
August 2026
Conventions preview pane — see what your rules catch before saving
A live "Sample review preview" block on /settings renders the diff from data/conventions-preview-sample.js (~40 lines, seeded with three intentional smells: a TODO token, a typo, and a raw SQL interpolation that interpolates req.body into a string-concatenated INSERT) and surfaces the findings your conventions produce. Reuses the data/demo-pr-review.js fixture shape so the parser is shared and the preview updates instantly when you toggle a rule on or off. Means you can A/B two convention sets without waiting for the next real PR to come in.
Why it matters
Configuring conventions blind is frustrating — you toggle a rule, save, and only know if it works three hours later when a PR lands. A live preview collapses that loop to seconds, which is how often you actually change rules.
/settings trend chart — 7-day and 30-day review volume sparkline
A compact sparkline now sits next to the toggle set on /settings, showing reviews per day across the last 7 and 30 days on a single axis. Drawn from the pr_review_events table with a server-side aggregation (no client-side fetches). Hover gives the exact count; the max value reads at the right edge so trends are visible at a glance. Stays out of the way when no data exists yet (renders an empty state instead of zeros).
Why it matters
Teams that just installed want to know "is it actually running on my PRs?" within their first session. A bare toggle panel answers "what can I configure?" but not "what is happening?" — the sparkline closes that gap without taking screen real estate from the config controls.
Per-repo PR history page at /app/[repo]/history
A dedicated per-repo timeline lets a team scroll a repo's full AI review history (PRs in merge order, with verdict + blocker / suggestion counts surfaced inline) without paging through the dashboard overview. Routes/repo-history.js resolves the [repo] slug, paginates 25 PRs at a time via the dashboard-overview query helpers, and renders the findings-summary chips from pr_review_events for each PR. CSV export hook is scaffolded for a follow-up cycle.
Why it matters
Once a team has more than 50 PRs reviewed, the dashboard overview's "recent activity" pane becomes a scrolling graveyard — you cannot find the PR from last Tuesday. Putting the timeline behind /app/[repo]/history gives the repo its own review log, matching how engineers actually think about their work ("what happened on the payments repo this month?").
/customers page and /blog shell migration — single marketing chrome across all public pages
Both /customers and /blog now render under the same partials/head + partials/nav + partials/footer shell that /pricing and /compare already use. Shared theme tokens, one font preconnect, the canonical SEO meta block, and the consistent footer link strip. Routes/customers.js + views/customers.ejs now pass pageUrl + ogImage through buildLandingContext the same way the shell expects. /changelog has now been brought into the same family (see "the changelog itself" further down). The two earlier one-offs (customers.ejs, blog/index.ejs) were leaking their own <head> markup and re-declaring Plausible + favicon. Now every public marketing page picks those up from one definition.
Why it matters
Hand-rolled <head> per page means each new page re-decides which meta tags matter, drifts on font weights, and forgets Plausible 1-in-4 times. A single shell is one place to fix bugs, one place to ship a new theme, and one place to wire analytics. Show HN visitors also land on /changelog with a coherent chrome — not a half-rendered bespoke page.
/demo → /install funnel tightening — copy changes, deep-link UTM, new conversion event
The /demo outcome panel copy changed from "Try it on your own repo" (generic) to "Install SiftPulse on GitHub — same review, your code" (concrete). The two primary CTAs now deep-link to /install?utm_source=demo and /pricing?utm_source=demo respectively, so attribution closes the loop end-to-end instead of dying at the homepage. A new Plausible event demo_real_pr_cta_click fires when a visitor who ran a /demo "Review my PR" pass clicks the install CTA — letting us measure the conversion rate from "pasted a real PR" to "installed" without instrumenting a third-party funnel tool.
Why it matters
Without UTM source on the deep-link, every /demo CTA click was attributed to the homepage as the referrer — we could not tell which demo path (canned_diff vs live_demo vs real_pr) converted. Wiring UTM + a dedicated event closes the loop in tooling we already trust.
July 2026
Weekly Digest cron — Monday 09:00 UTC digest pipeline
The weekly customer digest now runs as a first-class cron: jobs/weekly-digest.js, declared in polsia.toml [[crons]] with schedule "0 9 * * 1" (every Monday at 09:00 UTC). The job selects active installations, dedups against last week's digest_sends rows, fetches activity in parallel (PR review events, suggestion events, deploy events for the merge→deploy median), composes the email body in lib/digest.js, sends via services/email.js, and writes a digest_sends row — one per install, even when activity is empty (the EMPTY_BODY variant). digest_sends extended with findings_count and email_id columns (migration 1782709000000_digest_sends_extended) for ROI tracking in aggregate.
Why it matters
Without a dedicated cron entry, the digest runner was triggered by a hand-rolled setInterval hack that lost schedules on deploy restarts. A polsia-managed cron is the source of truth — the schedule is in version control, the job is observable, and re-deploys can't drop a week.
Homepage hero — clearer hook, GitHub install button, social proof
The SiftPulse homepage hero has been sharpened for clarity and conversion. A new subheading ("AI code review that finds what your tests missed.") anchors the value prop before the headline. A prominent "Install free on GitHub" CTA button links directly to the GitHub App install page and fires a `hero_install_click` Plausible event. Social proof ("Teams using SiftPulse cut mean time to first review by 70% — without adding headcount.") is now inline below the CTAs rather than buried in the stats block. A secondary line surfaces the GitHub Action install path ("Or run as a GitHub Action — no OAuth, no inbound webhooks.") for teams that prefer CI-based review without OAuth. A "Security & data →" trust link also appears below the fold for enterprise evaluators.
Why it matters
First-impression clarity is the highest-leverage conversion lever. The previous hero led with a feature list — visitors left before understanding what SiftPulse actually does. The new copy addresses the specific anxiety ("will it find the bugs my CI misses?") and then immediately offers two zero-friction entry points: the Marketplace install and the GitHub Action.
Weekly digest email — finding categories, per-repo breakdown, DORA median
The Monday digest email (jobs/weekly-digest.js) received four new sections: (1) Top finding categories — the top 3 finding types from `suggestion_events` (style, null checks, typos, etc.) are shown as pill badges, giving teams a quick fingerprint of their code health. Falls back to PR-level verdict labels when no suggestion rows exist. (2) Per-repo breakdown — for multi-repo installations, a table shows PR count per repo for the week, so engineering leads can see which repos generated the most AI review activity. Only shown when >1 repo is present. (3) Comparison hook — when blockers were found, a green callout reads "You caught N edge cases your team would have missed," turning the weekly count into a concrete ROI data point. (4) Merge-to-deploy median — when Render deploy tracking is connected, the median merge→deploy lead time for the week appears inline. `digest_sends` extended with `findings_count` and `email_id` columns (migration 1782709000000_digest_sends_extended) to track ROI in aggregate.
Why it matters
Digest emails are the main retention surface for teams that set-and-forget. A flat stats block ("12 PRs reviewed") is inert — it does not teach, does not show progress, and does not create urgency to act. The new sections turn the digest into a weekly engineering health report: what kinds of issues your code keeps producing, which repos need attention, and how fast you are shipping.
/demo "Review my PR" — redirect handling and improved error messages
The live PR reviewer tab at /demo now correctly follows HTTP 301/302 redirects on the GitHub diff endpoint (GitHub occasionally serves a redirect before the raw diff). Previously, the redirect loop caused a silent parse failure and returned a 502 to visitors. Error messages have been tightened across all failure modes: private repos show a specific explanation ("This repo is private — start a trial to review private repos"), rate-limit responses distinguish between per-IP ("5 reviews/hour demo limit") and global throttle, and size rejections clarify the 5,000 LOC cap. `fetchText()` now recursively follows a single redirect via the `location` header.
Why it matters
The /demo page is the highest-intent marketing surface — visitors who paste a real PR URL are one step from signing up. A cryptic 502 at that moment is a conversion killer. The redirect fix unblocks the majority of PRs that hit the GitHub CDN redirect, and the improved error copy reduces "am I doing something wrong?" confusion when a real limit is reached.
June 2026
One-click commit suggestions — AI-written fixes directly in the PR review
SiftPulse now attaches GitHub ```suggestion blocks to applicable findings — reviewers can click "Commit suggestion" to apply the fix directly from the review comment. The AI model produces single-hunk unified diffs only for mechanical, safe fixes (style, obvious bugs, missing null checks, typos, unused vars). Per-repo opt-out via `.siftpulse.yml` `suggestions: false`. Acceptance rate is tracked in the `suggestion_events` table and surfaced on the repo dashboard. Migration `1782700000000_suggestion_events`; service `services/pr-suggestions.js`; new unit tests in `tests/pr-suggestions.test.js`.
Why it matters
Transforms SiftPulse from "pointed it out" to "pointed it out and offered the fix in one click." The acceptance rate becomes a hard ROI metric for the landing page.
Blog launched — 3 long-form posts on AI review benchmarks, DORA measurement, and verdict-based review
Three new essays on the SiftPulse blog: a head-to-head benchmark of AI vs human PR review on 8 real open-source PRs, a deep-dive into what DORA metrics data actually says about engineering teams in 2025, and an argument for judgment-based (verdict) review over comment-parsing AI tools.
Why it matters
Long-form content is how teams evaluate tools seriously. The benchmark page and these essays give engineering leads the evidence to make a decision without a sales call.
Read the docs →
Now on the GitHub Marketplace
SiftPulse is now listed on the GitHub Marketplace — the single largest organic distribution channel for AI code-review tools. Install in one click from the GitHub App page. Includes a free tier for public repos (unlimited PR reviews, no credit card), Starter ($29/mo, up to 5 repos, all features), and Team ($79/mo, unlimited repos + Slack notifications + priority support). Post-install onboarding wizard walks through: repo selection, verdict label set, optional Slack connect, and activation review of your last 10 merged PRs.
Why it matters
GitHub users should be able to find and install SiftPulse without leaving the platform. Organic installs from the Marketplace are the highest-converting acquisition channel for developer tools — and we had zero presence.
PR TL;DR — sticky summary at the top of every PR
Every time a PR opens or receives new commits, SiftPulse now posts (or idempotently edits) a sticky "🧭 SiftPulse TL;DR" comment at the top of the PR. The comment includes: plain-English bullet summary of what changed, up to 3 risk areas (auth/payments/breaking changes/high-churn files), files touched grouped by top-level directory with counts (collapses into a <details> block when >10 directories), and up to 2 suggested reviewers from CODEOWNERS + git-blame recency. Respects .siftpulse.yml `tldr_comment: false` for per-repo opt-out and .siftpulse.yml `review_prompt` for tone. Skips bot-authored PRs. Token budget: diff capped at 60k input tokens with "…N more files omitted" notice. Each event is logged to the new tldr_comment_events table.
Why it matters
Before reading a PR, reviewers want a 30-second overview: what changed, what to watch, what files to focus on. TL;DR gives the answer at a glance — no scroll, no open tabs, no context-switching.
AI-drafted release notes from merged PRs
One click in the dashboard turns your merged PRs into a grouped, highlighted GitHub Release draft. SiftPulse clusters PRs by Conventional Commit type (features, fixes, performance, security, docs, internal), picks the top 3 highlights by code impact, generates clean markdown via AI, and creates a draft GitHub Release — ready to edit and publish. Email confirmation fires on every draft. Drafts are logged to the release_drafts table. GitHub only; Bitbucket parity coming.
Why it matters
Writing release notes is pure overhead — everyone delays it, nobody enjoys it. Shipping draft notes on the first merge creates an activation moment for new installs and keeps changelogs current without adding process.
Read the docs →
Per-repo custom agent instructions
Configure SiftPulse's PR review and issue triage agents with team-specific guidance — right from the dashboard or a `.siftpulse.yml` file in your repo. YAML always wins over dashboard settings, giving you full GitOps control. Custom prompts are prepended as "Team-specific guidance" before the system prompt, and every event row now carries a `custom_prompt_applied` boolean for observability.
Why it matters
Every team has different conventions — variable naming, test coverage requirements, security policies. Generic AI review misses the context that makes feedback actually useful. Custom prompts let your team's rules become the agent's rules.
Read the docs →
Human-in-the-loop sign-off for long-running PR nudges
Before SiftPulse fires a 🐢 long-running nudge on a stale PR, it now emails a team lead for approval. HMAC-signed single-use tokens, 72-hour TTL, one-click approve or skip — no login required. The sign-off outcome is logged in a full audit trail. Operators can also require sign-off globally from the nudge settings UI.
Why it matters
Not every stale PR needs a nudge. Some are parked intentionally. Putting a human checkpoint before the most aggressive nudge type prevents noise and keeps team trust in the system high.
Read the docs →
Merge-to-deploy tracking (DORA metrics)
SiftPulse now tracks the full journey from PR merge to production deploy. Connect Render via a deploy webhook and get four DORA metrics on your dashboard: deploy frequency, lead time for changes, change failure rate, and MTTR. Sparklines cover 7-day and 30-day windows. Lead time also appears in your weekly digest.
Why it matters
DORA metrics are the industry-standard proxy for engineering health. Knowing your lead time and CFR turns "we ship fast" from a vibe into a number you can actually manage and improve.
Read the docs →
Issue → PR routing in triage comments
When SiftPulse triages a new issue, it now scores open PRs by file-path and keyword overlap and surfaces the top three related PRs inline in the triage comment. Threshold 0.35, max 3 results — enough signal to cross-link relevant work without overwhelming the thread.
Why it matters
Teams repeatedly lose time asking "is there a PR for this?" The triage agent now answers that question automatically, before anyone has to ask.