<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Tidewater changelog</title>
<link>https://saas.phoenixcodes.org/changelog</link>
<description>Every new feature, improvement and fix in Tidewater, newest first.</description>
<language>en-us</language>
<lastBuildDate>Tue, 20 Oct 2026 00:00:00 GMT</lastBuildDate>
<atom:link href="https://saas.phoenixcodes.org/changelog/rss.xml" rel="self" type="application/rss+xml" />
<item>
<title>New: Freshness checks for Kafka topics</title>
<link>https://saas.phoenixcodes.org/changelog#2026-10-20-kafka-topic-freshness</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-10-20-kafka-topic-freshness</guid>
<pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
<description>Watch how old the newest message on a topic is, and alert when a producer goes quiet.</description>
<category>New</category>
<category>Monitoring</category>
<content:encoded><![CDATA[<p>Watch how old the newest message on a topic is, and alert when a producer goes quiet.</p><p>You can now add a freshness check to any Kafka topic. Tidewater reads the timestamp of the newest message with a read-only client and compares it with the gap you expect.</p>
<ul><li>Set an expected gap per topic, or let Tidewater learn it after two weeks.</li><li>Quiet periods such as nights and weekends are respected when you set a schedule.</li><li>A topic with consumer lag but fresh messages is reported as a consumer problem, not a producer problem, so the alert reaches the right team.</li></ul>
<p>Existing consumer group lag monitors keep working and now link to the topic they read.</p>]]></content:encoded>
</item>
<item>
<title>Improved: Lineage follows column renames in dbt</title>
<link>https://saas.phoenixcodes.org/changelog#2026-10-06-lineage-dbt-renames</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-10-06-lineage-dbt-renames</guid>
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
<description>Column level lineage no longer breaks when a dbt model renames a column.</description>
<category>Improved</category>
<category>Lineage</category>
<content:encoded><![CDATA[<p>Column level lineage no longer breaks when a dbt model renames a column.</p><p>When a model renames <code>order_total</code> to <code>order_total_usd</code>, the lineage graph now keeps one continuous path instead of ending one column and starting another.</p>
<p>Tidewater compares the compiled SQL of the old and new versions of a model and treats a column that keeps its source expression as the same column. Impact analysis for the old name now shows the same dashboards as before the rename, so a rename in review no longer hides what it will touch.</p>
<p>This applies to dbt Core and dbt Cloud projects on Snowflake, BigQuery and Redshift.</p>]]></content:encoded>
</item>
<item>
<title>New: Route alerts to the owner of the table</title>
<link>https://saas.phoenixcodes.org/changelog#2026-09-22-owner-routing</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-09-22-owner-routing</guid>
<pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
<description>Send an alert to the team that owns the late table instead of one shared channel.</description>
<category>New</category>
<category>Alerts</category>
<content:encoded><![CDATA[<p>Send an alert to the team that owns the late table instead of one shared channel.</p><p>Alert rules can now use the owner of the affected table. Owners come from a <code>meta.owner</code> field in dbt, a tag in your orchestrator, or a setting in Tidewater, and you can mix the three.</p>
<ul><li>One rule can cover every pipeline: &quot;send late data alerts to the owning team&apos;s channel&quot;.</li><li>If a table has no owner, the alert goes to a fallback channel you choose, and the alert says that the owner is missing.</li><li>The alert timeline shows who was notified and who acknowledged.</li></ul>
<p>Teams that used one shared channel reported far fewer ignored alerts after the switch. The post on alert fatigue explains why.</p>]]></content:encoded>
</item>
<item>
<title>Fixed: Duplicate alerts after an Airflow scheduler restart</title>
<link>https://saas.phoenixcodes.org/changelog#2026-09-08-duplicate-alerts-airflow-restart</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-09-08-duplicate-alerts-airflow-restart</guid>
<pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate>
<description>A restarted Airflow scheduler no longer makes Tidewater see old runs as new ones.</description>
<category>Fixed</category>
<category>Integrations</category>
<content:encoded><![CDATA[<p>A restarted Airflow scheduler no longer makes Tidewater see old runs as new ones.</p><p>After a scheduler restart, Airflow sometimes re-emitted events for runs that had already finished. Tidewater treated them as new runs, which could open a second alert for the same late table.</p>
<p>Run events are now matched on the run identifier and the logical date, so a repeated event updates the existing run. Alerts that were opened twice in the last 30 days have been merged, and their timelines keep both notifications.</p>]]></content:encoded>
</item>
<item>
<title>New: Quiet hours and daily digests</title>
<link>https://saas.phoenixcodes.org/changelog#2026-08-25-quiet-hours-digests</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-08-25-quiet-hours-digests</guid>
<pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
<description>Hold low urgency alerts until the morning and receive them as one message.</description>
<category>New</category>
<category>Alerts</category>
<content:encoded><![CDATA[<p>Hold low urgency alerts until the morning and receive them as one message.</p><p>Each alert rule has a new urgency setting. Urgent alerts always send at once. Everything else can wait for quiet hours to end and arrive as a single digest, grouped by owner and ordered by how many downstream tables are affected.</p>
<p>Quiet hours use the time zone of the person or channel being notified, not the time zone of the workspace. A late table that recovers before the digest is sent is left out of the digest and listed as resolved.</p>]]></content:encoded>
</item>
<item>
<title>Improved: Faster lineage graphs for large warehouses</title>
<link>https://saas.phoenixcodes.org/changelog#2026-08-11-faster-lineage-large-warehouses</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-08-11-faster-lineage-large-warehouses</guid>
<pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
<description>Graphs with more than 20,000 tables now open in under two seconds.</description>
<category>Improved</category>
<category>Lineage</category>
<content:encoded><![CDATA[<p>Graphs with more than 20,000 tables now open in under two seconds.</p><p>The lineage view used to draw every table it knew about. It now draws what you are looking at, plus one step in each direction, and loads the rest as you expand.</p>
<p>On a test warehouse with 24,000 tables the first view went from 11 seconds to 1.6 seconds at the median. Search inside the graph is unchanged, and now also finds columns.</p>]]></content:encoded>
</item>
<item>
<title>New: Pipeline groups</title>
<link>https://saas.phoenixcodes.org/changelog#2026-07-28-pipeline-groups</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-07-28-pipeline-groups</guid>
<pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
<description>Put pipelines into groups to share owners, thresholds and alert rules.</description>
<category>New</category>
<category>Platform</category>
<content:encoded><![CDATA[<p>Put pipelines into groups to share owners, thresholds and alert rules.</p><p>A group is a named set of pipelines, for example &quot;finance close&quot; or &quot;marketing attribution&quot;. You can attach an owner, a freshness expectation and an alert rule to the group, and every pipeline in it inherits them.</p>
<p>A pipeline can belong to more than one group. When two groups disagree, the stricter expectation wins, and the pipeline page shows which group it came from.</p>]]></content:encoded>
</item>
<item>
<title>Fixed: Wrong run time for runs that crossed midnight UTC</title>
<link>https://saas.phoenixcodes.org/changelog#2026-07-14-runs-crossing-midnight-utc</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-07-14-runs-crossing-midnight-utc</guid>
<pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
<description>Runs that started before midnight UTC and finished after it now show the correct duration.</description>
<category>Fixed</category>
<category>Monitoring</category>
<content:encoded><![CDATA[<p>Runs that started before midnight UTC and finished after it now show the correct duration.</p><p>A run that began at 23:50 UTC and finished at 00:10 UTC was shown as lasting 23 hours and 40 minutes. The duration was computed from the time of day instead of the full timestamps.</p>
<p>Durations are fixed for new and old runs. If a run&apos;s wrong duration had triggered a slow run alert, that alert was closed and marked as caused by this bug.</p>]]></content:encoded>
</item>
<item>
<title>Improved: Bulk pipeline updates in the API</title>
<link>https://saas.phoenixcodes.org/changelog#2026-06-30-bulk-pipeline-api</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-06-30-bulk-pipeline-api</guid>
<pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
<description>Update up to 200 pipelines in one request, with a result for each.</description>
<category>Improved</category>
<category>API</category>
<content:encoded><![CDATA[<p>Update up to 200 pipelines in one request, with a result for each.</p><p><code>PATCH /v1/pipelines</code> accepts a list of changes and returns one result per pipeline, so a script that assigns owners to hundreds of pipelines makes a handful of calls instead of hundreds.</p>
<p>Changes are applied independently: a failure on one pipeline does not roll back the others, and the response says which ones failed and why. The Python and TypeScript clients have a new <code>update_many</code> method.</p>]]></content:encoded>
</item>
<item>
<title>New: Monitor Apache Spark applications</title>
<link>https://saas.phoenixcodes.org/changelog#2026-06-16-spark-job-monitoring</link>
<guid isPermaLink="false">https://saas.phoenixcodes.org/changelog#2026-06-16-spark-job-monitoring</guid>
<pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
<description>Track Spark application status, duration and stage timings next to your other pipelines.</description>
<category>New</category>
<category>Integrations</category>
<content:encoded><![CDATA[<p>Track Spark application status, duration and stage timings next to your other pipelines.</p><p>Connect a Spark history server and Tidewater lists each application as a pipeline run. You get status, duration, the slowest stages and the tables each application wrote.</p>
<ul><li>Slow run alerts compare an application with its own recent runs, not with a fixed number.</li><li>Failed stages are shown on the run, with the executor error that Spark reported.</li><li>Lineage includes the tables Spark reads and writes when the application uses the Spark SQL listener.</li></ul>]]></content:encoded>
</item>
</channel>
</rss>
