<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Suga Changelog</title>
        <link>https://suga.app</link>
        <description>The latest updates, improvements, and fixes to Suga.</description>
        <lastBuildDate>Tue, 28 Jul 2026 05:46:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Suga Changelog</title>
            <url>https://suga.app/favicon.ico</url>
            <link>https://suga.app</link>
        </image>
        <copyright>All rights reserved 2026 Nitric Inc.</copyright>
        <item>
            <title><![CDATA[A better view of your projects]]></title>
            <link>https://suga.app/changelog/054-projects-index-redesign</link>
            <guid isPermaLink="false">054-projects-index-redesign</guid>
            <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The projects page used to be a plain grid of names. Now each card gives you a quick sense of what's actually inside a project before you open it.

Every card surfaces:

- The most recently active environment and its status at a glance.
- A preview of that environment's resources: services, functions, databases, and volumes.
- Compact CPU and memory meters showing what's allocated against your limits.
- A footer with environment and resource counts and when the project was last updated.
- Recent deployment activity.

We've also added search and sorting, so finding the right project is quick once you've got a few of them. Sort by name, last activity, or when it was created.

![The redesigned projects index](/screenshots/changelog/054-projects-index-redesign/projects-index.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[A clearer deployment history]]></title>
            <link>https://suga.app/changelog/053-deployment-history-redesign</link>
            <guid isPermaLink="false">053-deployment-history-redesign</guid>
            <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The history panel has been rebuilt around the thing you actually scan for: what changed, and when.

At first glance you can see the status, who started the deployment, when the deployment happened, the commit message, and how many resources were created or destroyed. Expand to see the details.

![The redesigned deployment history panel](/screenshots/changelog/053-deployment-history-redesign/history-panel.png)

Selecting a past deployment no longer snaps your canvas to it. You preview it and apply the historical state deliberately, with a separate button, so browsing history can't clobber unsaved work. You will also be able to see active deployments in this list.

We've also updated the flow of the apply, with commit messages now being required. To keep that from being a chore, you can generate a short summary of your changes as the default message. Now every entry in the history carries something meaningful even when you don't type one yourself.

![The redesigned review changes](/screenshots/changelog/053-deployment-history-redesign/review-page.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Smarter Docker Compose imports]]></title>
            <link>https://suga.app/changelog/055-smarter-compose-imports</link>
            <guid isPermaLink="false">055-smarter-compose-imports</guid>
            <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Importing a compose file with a lot of shared configuration used to mean a lot of repeated typing. A stack like Supabase reuses the same values, such as a database password or a signing secret, across many services, and we were asking you to fill each one in every service that used it.

Two changes fix that:

- **Shared variables are asked for once.** When the same variable shows up across multiple services, we now set it up as an environment-level secret that each service references, instead of a separate copy per service. The import form groups these as shared, so you fill in a database password once rather than ten times.
- **Variables inside connection strings are picked up.** Values embedded in a larger string, like a password inside a `postgres://` URL, used to be missed entirely. They're now detected and surfaced alongside everything else.

The result is a much shorter form when you import a real-world stack, and fewer chances to fat-finger the same secret into a dozen boxes.

![Configuring environment variables while importing a Docker Compose stack](/screenshots/changelog/055-smarter-compose-imports/compose-import.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[TCP proxies are now a paid feature]]></title>
            <link>https://suga.app/changelog/051-tcp-proxies-paid-tier</link>
            <guid isPermaLink="false">051-tcp-proxies-paid-tier</guid>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Public TCP proxies are moving to paid plans. On the free tier you'll still see the option in the public networking config, but it now sits behind an upgrade prompt. For existing applications with TCP proxies, there is no migration to do. These will continue to work and won't be torn down. The change will only apply to creating new TCP proxies. Those on Pro and Enterprise plans are unaffected.

Public TCP proxies are a power-user capability: most legitimate free projects never reach for them, yet we were seeing them frequently for users who were running antagonistic workflows. Gating them to paid plans keeps the free tier focused on trying Suga out and lets us keep it generous for everyone using it as intended.

If you have a legitimate reason for trying out TCP proxies you can reach out to us at support@suga.app and we can arrange a trial.
]]></content:encoded>
            <category>Adjustment</category>
        </item>
        <item>
            <title><![CDATA[Deploy on Suga buttons]]></title>
            <link>https://suga.app/changelog/052-deploy-on-suga-button</link>
            <guid isPermaLink="false">052-deploy-on-suga-button</guid>
            <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
You can now turn any Git repo into a one-click deploy. Drop a "Deploy on Suga" button in your README, and anyone who clicks it lands in Suga with your project ready to configure and deploy.

If your repo already has a compose file, that's all you need. Suga reads it, wires up the services, and asks for any variables before deploying. No extra config to maintain alongside your project.

It works from a signed-out state, so the button is genuinely one click for whoever finds your repo. It's an easy way to share a working template, hand someone a starting point, or let people try your project without walking them through a setup.

Adding one is two lines of markdown. Point the link at your repo and use our badge as the image:

```md
[![Deploy with Suga](https://suga.app/badge.svg)](https://dashboard.suga.app/new/template?repo=your-org/your-repo)
```

Swap `your-org/your-repo` for your GitHub repo and you're done. A few options if you need them:

- If your compose file isn't on the default branch or at the repo root, add `&branch=` and `&path=` to the link.
- To point straight at a compose file anywhere, use `?compose=<url>` instead of `?repo=`.
- For READMEs with a dark background, swap the badge for `https://suga.app/badge-light.svg`.

This will render like this:

<a href="https://dashboard.suga.app/new/template?id=postgres" aria-label="Deploy with Suga">
 <svg xmlns="http://www.w3.org/2000/svg" width="166" height="32" viewBox="0 0 166 32" role="img" aria-label="Deploy with Suga">
  <title>Deploy with Suga</title>
  <rect width="166" height="32" rx="6" fill="#0A0A0A" />
  <rect x="0.5" y="0.5" width="165" height="31" rx="5.5" fill="none" stroke="#1F1F22" />
  <g transform="translate(14 4) scale(0.032877)" aria-hidden="true">
   <path d="M315 117.868C345.94 100.004 384.06 100.004 415 117.868L553.157 197.632C584.097 215.496 603.157 248.508 603.157 284.235V443.765C603.157 479.492 584.097 512.504 553.157 530.368L415 610.133C384.06 627.996 345.94 627.996 315 610.133L176.843 530.368C145.903 512.504 126.843 479.492 126.843 443.765V284.235C126.843 248.508 145.903 215.496 176.843 197.632L315 117.868Z" fill="#FFFFFF" />
   <path d="M369 556V417.524C369 380.432 389.531 346.387 422.337 329.079L540 267" fill="none" stroke="#0A0A0A" strokeWidth="25" strokeLinecap="round" />
  </g>
  <g transform="translate(44.882 20)" fill="#ECECEE" aria-hidden="true">
   <path d="M1.118 0L1.118-9.230L4.082-9.230Q6.253-9.230 7.423-8.027Q8.593-6.825 8.593-4.602L8.593-4.602Q8.593-2.392 7.443-1.196Q6.292 0 4.160 0L4.160 0L1.118 0ZM4.082-1.287Q7.137-1.287 7.137-4.602L7.137-4.602Q7.137-6.292 6.377-7.118Q5.616-7.943 4.082-7.943L4.082-7.943L2.522-7.943L2.522-1.287L4.082-1.287ZM13.039 0.156Q12.051 0.156 11.310-0.293Q10.569-0.741 10.166-1.560Q9.763-2.379 9.763-3.458L9.763-3.458Q9.763-4.537 10.160-5.356Q10.556-6.175 11.291-6.624Q12.025-7.072 13-7.072L13-7.072Q13.949-7.072 14.664-6.637Q15.379-6.201 15.776-5.376Q16.172-4.550 16.172-3.406L16.172-3.406L16.172-3.055L11.206-3.055Q11.258-2.054 11.739-1.541Q12.220-1.027 13.052-1.027L13.052-1.027Q13.650-1.027 14.059-1.307Q14.469-1.586 14.638-2.080L14.638-2.080L16.068-1.989Q15.795-1.014 14.983-0.429Q14.170 0.156 13.039 0.156L13.039 0.156ZM14.703-4.095Q14.651-4.992 14.196-5.447Q13.741-5.902 13-5.902L13-5.902Q12.259-5.902 11.791-5.434Q11.323-4.966 11.206-4.095L11.206-4.095L14.703-4.095ZM17.641 1.950L17.641-6.916L18.941-6.916L18.967-5.863Q19.266-6.448 19.812-6.760Q20.358-7.072 21.060-7.072L21.060-7.072Q22.035-7.072 22.705-6.591Q23.374-6.110 23.699-5.291Q24.024-4.472 24.024-3.458L24.024-3.458Q24.024-2.457 23.693-1.638Q23.361-0.819 22.698-0.332Q22.035 0.156 21.060 0.156L21.060 0.156Q20.384 0.156 19.838-0.137Q19.292-0.429 19.019-0.936L19.019-0.936L19.019 1.950L17.641 1.950ZM20.813-1.040Q21.645-1.040 22.120-1.684Q22.594-2.327 22.594-3.458L22.594-3.458Q22.594-4.589 22.120-5.233Q21.645-5.876 20.813-5.876L20.813-5.876Q19.968-5.876 19.494-5.259Q19.019-4.641 19.019-3.458L19.019-3.458Q19.019-2.275 19.494-1.658Q19.968-1.040 20.813-1.040L20.813-1.040ZM27.040 0Q26.325 0 25.922-0.364Q25.519-0.728 25.519-1.469L25.519-1.469L25.532-9.230L26.910-9.230L26.910-1.599Q26.910-1.131 27.378-1.131L27.378-1.131L27.937-1.131L27.937 0L27.040 0ZM32.175 0.156Q31.187 0.156 30.446-0.286Q29.705-0.728 29.296-1.547Q28.886-2.366 28.886-3.458L28.886-3.458Q28.886-4.550 29.296-5.369Q29.705-6.188 30.446-6.630Q31.187-7.072 32.175-7.072L32.175-7.072Q33.150-7.072 33.898-6.624Q34.645-6.175 35.048-5.363Q35.451-4.550 35.451-3.458L35.451-3.458Q35.451-2.366 35.048-1.554Q34.645-0.741 33.898-0.293Q33.150 0.156 32.175 0.156L32.175 0.156ZM32.175-1.040Q33.046-1.040 33.534-1.677Q34.021-2.314 34.021-3.458L34.021-3.458Q34.021-4.602 33.534-5.239Q33.046-5.876 32.175-5.876L32.175-5.876Q31.304-5.876 30.810-5.239Q30.316-4.602 30.316-3.458L30.316-3.458Q30.316-2.314 30.810-1.677Q31.304-1.040 32.175-1.040L32.175-1.040ZM37.063 1.950L37.063 0.819L37.895 0.819Q38.233 0.819 38.402 0.715Q38.571 0.611 38.675 0.364L38.675 0.364L38.896-0.208L38.467-0.208L35.971-6.916L37.427-6.916L39.325-1.482L41.145-6.916L42.601-6.916L39.845 0.806Q39.624 1.404 39.221 1.677Q38.818 1.950 38.103 1.950L38.103 1.950L37.063 1.950ZM48.438 0L46.332-6.916L47.775-6.916L49.257-1.508L50.778-6.916L52.091-6.916L53.612-1.508L55.094-6.916L56.550-6.916L54.431 0L52.884 0L51.428-4.940L49.985 0L48.438 0ZM57.798 0L57.798-6.916L59.176-6.916L59.176 0L57.798 0ZM57.772-7.917L57.772-9.295L59.215-9.295L59.215-7.917L57.772-7.917ZM63.310 0Q62.322 0 61.854-0.449Q61.386-0.897 61.386-1.872L61.386-1.872L61.386-5.785L60.333-5.785L60.333-6.916L61.386-6.916L61.386-8.541L62.764-8.541L62.764-6.916L64.597-6.916L64.597-5.785L62.764-5.785L62.764-1.976Q62.764-1.508 62.965-1.320Q63.167-1.131 63.609-1.131L63.609-1.131L64.597-1.131L64.597 0L63.310 0ZM66.014 0L66.014-9.230L67.392-9.230L67.392-5.915Q67.652-6.500 68.185-6.786Q68.718-7.072 69.420-7.072L69.420-7.072Q70.525-7.072 71.136-6.351Q71.747-5.629 71.747-4.446L71.747-4.446L71.747 0L70.369 0L70.369-4.082Q70.369-5.005 70.044-5.460Q69.719-5.915 69.056-5.915L69.056-5.915Q68.289-5.915 67.841-5.434Q67.392-4.953 67.392-4.056L67.392-4.056L67.392 0L66.014 0ZM80.353 0.208Q79.261 0.208 78.449-0.189Q77.636-0.585 77.162-1.307Q76.687-2.028 76.609-2.977L76.609-2.977L78.052-3.068Q78.182-2.093 78.767-1.580Q79.352-1.066 80.379-1.066L80.379-1.066Q81.289-1.066 81.777-1.404Q82.264-1.742 82.264-2.392L82.264-2.392Q82.264-2.808 82.069-3.101Q81.874-3.393 81.348-3.647Q80.821-3.900 79.820-4.147L79.820-4.147Q78.689-4.420 78.039-4.752Q77.389-5.083 77.097-5.558Q76.804-6.032 76.804-6.760L76.804-6.760Q76.804-7.553 77.188-8.158Q77.571-8.762 78.299-9.100Q79.027-9.438 80.002-9.438L80.002-9.438Q81.536-9.438 82.453-8.613Q83.369-7.787 83.525-6.435L83.525-6.435L82.095-6.357Q81.978-7.189 81.439-7.677Q80.899-8.164 79.976-8.164L79.976-8.164Q79.183-8.164 78.715-7.794Q78.247-7.423 78.247-6.812L78.247-6.812Q78.247-6.396 78.436-6.143Q78.624-5.889 79.099-5.694Q79.573-5.499 80.496-5.278L80.496-5.278Q82.238-4.875 82.973-4.199Q83.707-3.523 83.707-2.470L83.707-2.470Q83.707-1.651 83.285-1.046Q82.862-0.442 82.102-0.117Q81.341 0.208 80.353 0.208L80.353 0.208ZM87.685 0.156Q86.632 0.156 86.021-0.540Q85.410-1.235 85.410-2.470L85.410-2.470L85.410-6.916L86.788-6.916L86.788-2.821Q86.788-1.885 87.113-1.443Q87.438-1.001 88.101-1.001L88.101-1.001Q88.855-1.001 89.278-1.489Q89.700-1.976 89.700-2.860L89.700-2.860L89.700-6.916L91.078-6.916L91.078 0L89.791 0L89.778-1.131Q89.505-0.494 88.972-0.169Q88.439 0.156 87.685 0.156L87.685 0.156ZM95.667 2.106Q94.445 2.106 93.659 1.567Q92.872 1.027 92.651 0.117L92.651 0.117L94.081 0.026Q94.224 0.494 94.595 0.728Q94.965 0.962 95.667 0.962L95.667 0.962Q97.435 0.962 97.435-0.507L97.435-0.507L97.435-1.508Q97.175-0.975 96.636-0.663Q96.096-0.351 95.420-0.351L95.420-0.351Q94.562-0.351 93.880-0.774Q93.197-1.196 92.820-1.963Q92.443-2.730 92.443-3.705L92.443-3.705Q92.443-4.680 92.820-5.447Q93.197-6.214 93.867-6.643Q94.536-7.072 95.381-7.072L95.381-7.072Q96.109-7.072 96.675-6.734Q97.240-6.396 97.487-5.824L97.487-5.824L97.487-6.916L98.826-6.916L98.826-0.546Q98.826 0.715 97.981 1.411Q97.136 2.106 95.667 2.106L95.667 2.106ZM95.641-1.521Q96.473-1.521 96.961-2.119Q97.448-2.717 97.448-3.757L97.448-3.757Q97.448-4.745 96.954-5.324Q96.460-5.902 95.641-5.902L95.641-5.902Q94.809-5.902 94.341-5.317Q93.873-4.732 93.873-3.718L93.873-3.718Q93.873-2.704 94.348-2.113Q94.822-1.521 95.641-1.521L95.641-1.521ZM102.739 0.156Q101.647 0.156 101.010-0.345Q100.373-0.845 100.373-1.729L100.373-1.729Q100.373-2.613 100.906-3.120Q101.439-3.627 102.583-3.848L102.583-3.848L104.962-4.303Q104.962-5.902 103.480-5.902L103.480-5.902Q102.193-5.902 101.920-4.745L101.920-4.745L100.490-4.836Q100.685-5.876 101.472-6.474Q102.258-7.072 103.480-7.072L103.480-7.072Q104.871-7.072 105.606-6.325Q106.340-5.577 106.340-4.225L106.340-4.225L106.340-1.534Q106.340-1.287 106.431-1.190Q106.522-1.092 106.717-1.092L106.717-1.092L106.964-1.092L106.964 0Q106.834 0.039 106.457 0.039L106.457 0.039Q105.846 0.039 105.508-0.221Q105.170-0.481 105.079-1.066L105.079-1.066Q104.819-0.520 104.182-0.182Q103.545 0.156 102.739 0.156L102.739 0.156ZM102.973-0.936Q103.883-0.936 104.423-1.456Q104.962-1.976 104.962-2.821L104.962-2.821L104.962-3.263L102.947-2.873Q102.336-2.756 102.070-2.509Q101.803-2.262 101.803-1.859L101.803-1.859Q101.803-1.417 102.109-1.177Q102.414-0.936 102.973-0.936L102.973-0.936Z" />
  </g>
 </svg>
</a>

{/_ TODO: add screenshot of the import landing flow _/}
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Persistent logging and a new log explorer]]></title>
            <link>https://suga.app/changelog/050-logs-explorer</link>
            <guid isPermaLink="false">050-logs-explorer</guid>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Until now, logs were real-time only. You could read them whilst the service was running but as soon as it was replaced during a deployment or restart, the previous logs were no longer accessible.

Logs are now retained, and there are two new places to work with them: a dedicated Logs explorer for each environment, and a refreshed logs tab in the service panel on the canvas.

The new explorer is available from the sidebar. It has a bunch of new features:

- Search by keyword across all your services, and filter by service and level (info, warn, error, debug).
- A volume histogram above the stream, stacked by level, so a jump in errors is easy to spot.
- Time ranges from 5 minutes to 14 days, preset or custom, with longer history on paid plans.
- Click any line for a detail panel: the full message, parsed fields, stack trace, and a permalink you can send so a teammate lands on the same entry.
- Live mode to watch entries stream in, or page back through a fixed window.
- Copy the lines on screen, or export the filtered set to CSV or JSON.

The logs tab on a service got the same treatment. Filter by log level inline and open the full explorer with that service already selected when you need more than a quick look. The UTC/local toggle, replica toggle, and follow/tail are all still there for quick debugging.

![The logs tab in the service sidebar](/screenshots/changelog/050-logs-explorer/sidebar.png)

If a spike shows up in your per-replica metrics, you can now jump straight to the logs to find out what caused it.

![The Logs explorer](/screenshots/changelog/050-logs-explorer/logs.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Duplicated services no longer share a build]]></title>
            <link>https://suga.app/changelog/047-service-duplication-isolation</link>
            <guid isPermaLink="false">047-service-duplication-isolation</guid>
            <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
If you duplicated a service that had a GitHub build wired up, the original and the duplicate ended up pointing at the same build configuration. Editing one would silently change the other. Each duplicate now gets its own.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Clearer errors for Cloudflare-proxied custom domains]]></title>
            <link>https://suga.app/changelog/048-cloudflare-proxied-custom-domains</link>
            <guid isPermaLink="false">048-cloudflare-proxied-custom-domains</guid>
            <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
If your custom domain's CNAME was proxied through Cloudflare (the orange cloud), Cloudflare answers DNS with its own edge IPs and hides the record Suga checks for. Verification would fail with a generic "CNAME not found" message, with no hint that the proxy was the cause.

Suga now detects when a record is being proxied through Cloudflare and tells you exactly what to fix: set the CNAME to "DNS only" (the gray cloud), then verify. No more guessing why an otherwise correct record won't validate.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[More control over builds]]></title>
            <link>https://suga.app/changelog/049-build-env-vars</link>
            <guid isPermaLink="false">049-build-env-vars</guid>
            <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Some frameworks bake env vars into the output at build time rather than reading them at runtime. Vite is the obvious example: anything prefixed `VITE_` gets inlined into the bundle when `vite build` runs. Until now Suga only supported runtime env vars, so frameworks that needed values during the build couldn't see them.

You can now set build-time env vars on any service, available for both auto-detect and Dockerfile builds. Custom build and start commands are also configurable for auto-detect, so you can override what Suga's framework detection picked if it didn't match what your project actually does.

![Build-time env vars](/screenshots/changelog/049-build-env-vars/build-vars.mp4)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Knowing when your Suga URL is live]]></title>
            <link>https://suga.app/changelog/045-deployment-polish</link>
            <guid isPermaLink="false">045-deployment-polish</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
It wasn't always clear when your Suga URL was actually live. Adding a generated URL made the row in the dashboard look ready right away, even though the service still had to be redeployed before traffic flowed. Hitting a `*.suga.run` host that wasn't currently routed would land you on a generic gateway error, with nothing to say whether the route was wrong, the deploy had been torn down, or the platform was broken.

Both are sorted now. Custom domain rows show a clear pending state with a redeploy prompt right in the row, and unrouted `*.suga.run` hosts serve a branded Suga page that explains the hostname isn't routed yet.

![Suga fallback for an unrouted subdomain](/screenshots/changelog/045-deployment-polish/fallback-page.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Undo a typo, not the canvas]]></title>
            <link>https://suga.app/changelog/046-canvas-shortcuts-respect-inputs</link>
            <guid isPermaLink="false">046-canvas-shortcuts-respect-inputs</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Hitting `ctrl+z` while typing in a sheet used to undo your last canvas edit instead of fixing your typo. Same story for redo and a handful of other shortcuts that fired when you didn't mean them to. Canvas shortcuts now stay out of the way while you're typing.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[A new new project flow]]></title>
            <link>https://suga.app/changelog/044-new-project-flow</link>
            <guid isPermaLink="false">044-new-project-flow</guid>
            <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
We've updated the flow for new projects so there's more direction on what you can do. We used to just put you on an empty canvas, but now there's a proper `/new` page that asks where you want to start before it goes off and creates anything. There are three new options:

- **Import a GitHub repo**, where you pick a repo and configure the build before deploying.
- **Start from a template**, and once you pick one and fill in any env vars it needs, you end up with a project that's already wired up.
- **Start with an empty project**, which is the same path it always was for getting to a blank canvas.

This is all available from an unauthenticated state, so you can start adding "Deploy to Suga" buttons to all your project READMEs.

![New project flow](/screenshots/changelog/044-new-project-flow/new-project.mp4)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Empty repo imports]]></title>
            <link>https://suga.app/changelog/043-empty-repo-imports</link>
            <guid isPermaLink="false">043-empty-repo-imports</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
If you tried to import a repo you'd just pushed commits to, you might have seen it show up as "empty" and refuse to import, leaving you stuck with no obvious way forward. Fixed now.

Worth sharing the lesson: the GitHub API exposes a `size` field on each repo, and `size === 0` is a tempting shortcut for detecting empty ones. It isn't reliable. That field is updated by a background job on GitHub's side that can lag by up to an hour, so a repo you just pushed to can still report zero size well after the fact. We now detect empties at the branch-fetch stage instead: no branches, no commits, nothing to import. Repos with actual content sail through, regardless of what `size` claims.

![Empty repository state](/screenshots/changelog/043-empty-repo-imports/empty.png)
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Builds are up to 2x faster]]></title>
            <link>https://suga.app/changelog/042-faster-builds</link>
            <guid isPermaLink="false">042-faster-builds</guid>
            <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Builds from a git repo now run end-to-end inside the builder itself. The clone and build-plan step used to run on a separate worker before handing off, which meant copying your repo across the wire twice. Now the builder fetches your code directly and goes straight into the build.

For most repos this lands up to 2x faster, with no action needed on your end.
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Build log fixes]]></title>
            <link>https://suga.app/changelog/041-build-log-fixes</link>
            <guid isPermaLink="false">041-build-log-fixes</guid>
            <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
If you noticed your build log freezing mid-build, that wasn't you. Fixed now, along with a couple of related quirks.

- Logs will reliably stream live as the build runs.
- Logs consistently show up on completed builds too, not just in-progress ones.
- If your connection drops mid-build, it reconnects and picks up where it left off.

![Build Log Improvements](/screenshots/changelog/041-build-log-fixes/build-log-fixes.mp4)]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Redesigned canvas nodes]]></title>
            <link>https://suga.app/changelog/039-redesigned-canvas-nodes</link>
            <guid isPermaLink="false">039-redesigned-canvas-nodes</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Service and volume nodes on the canvas have a new design with more useful information visible up front.

- An icon bar on each service node shows git/image source, mount path, and network status without opening config.
- Status is now split into live state (running, failed, deploying, warning) and change state (new, modified, deleted). Both are visible at the same time, so a running service with pending changes shows both.
- If volumes are detached from their parent service, they now reposition near the parent node. Resolving an issue that caused volume nodes to be moved off screen.

![Canvas Nodes](/screenshots/changelog/039-redesigned-canvas-nodes/nodes.png)]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[UX fixes and polish]]></title>
            <link>https://suga.app/changelog/040-ux-fixes-and-polish</link>
            <guid isPermaLink="false">040-ux-fixes-and-polish</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Handful of UI improvements:

- The "enable Suga domain" option was hard to find and didn't prefill the port. It's now a clickable card with a default port.
- We've improved the consistency of styling (borders, radius, etc.) for UI elements, such as inputs, selects, and autocompletes.
- Services no longer require a private port. Public ports are automatic, so leaving private ports empty is fine.
- Container errors in deployment logs now link to explanations, instead of just expanding the log line.

![Error](/screenshots/changelog/040-ux-fixes-and-polish/error.png)]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Connection status and graceful degradation]]></title>
            <link>https://suga.app/changelog/038-connection-status-and-graceful-degradation</link>
            <guid isPermaLink="false">038-connection-status-and-graceful-degradation</guid>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Sometimes the connection between your browser and Suga's hosted infrastructure can drop, whether it's your internet going down or an outage on Suga's end. Previously, these issues could be confused with errors in your deployed resources. Now they're clearly identified as connection problems.

- If sync disconnects, the canvas locks and shows a connection banner instead of stale or loading indicators.
- If workflow statuses can't be retrieved, they show "unknown" rather than errors that look like your service is broken.
- If real-time updates drop, a banner lets you know updates have paused.

This was done along with an updated [Suga status page](https://status.suga.app/) for each part of the system.]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Fuzzy search for GitHub repositories and branches]]></title>
            <link>https://suga.app/changelog/036-fuzzy-search-github-repos</link>
            <guid isPermaLink="false">036-fuzzy-search-github-repos</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Searching for GitHub repositories and branches in your build config now uses fuzzy matching. Partial names and minor typos will still surface the right results instead of showing an empty list.

When there's genuinely no match, the empty state now includes your search term so it's clear what was filtered: "No repositories found for 'docs'".]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Canvas node positioning and selection fixes]]></title>
            <link>https://suga.app/changelog/037-canvas-node-positioning-fixes</link>
            <guid isPermaLink="false">037-canvas-node-positioning-fixes</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
A round of fixes to how nodes behave on the deployment canvas:

- Services no longer appear behind the config panel when added to the canvas. Centering now accounts for the side panel width.
- Adding a new service opens the config tab automatically. Switching between existing services preserves whichever tab you were on.
- Unmounting a volume no longer sends it off screen. Detached volumes now reposition next to their parent node.
- Undo after deleting a node restores it to its original position on the canvas.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Custom domains]]></title>
            <link>https://suga.app/changelog/035-custom-domains</link>
            <guid isPermaLink="false">035-custom-domains</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
It has always been possible to get public domains for Suga services, but now you can use a custom domain for your Suga services. Map your custom domain to any service on Suga, whether it's a root domain (`example.com`) or a subdomain (`app.example.com`) Suga will handle:

- **DNS Verification** Suga checks that it's registered and detects your DNS provider.
- **SSL Certificates** SSL is automatically managed, ensuring a secure connection without any setup from you.
- **Traffic Routing** Routes all traffic to your service automatically.

## How it works

1. **Add a domain**: Enter the domain you want to use. 
2. **Pick a port**: Choose which port on your service the domain should route to.
3. **Configure DNS**: Copy and paste the DNS record information into your provider.

Once your DNS records are in place, Suga verifies ownership automatically and provisions an SSL certificate. You can track verification and SSL status directly in the dashboard, no manual steps required after the initial DNS setup.

## Details

- Available on Pro (up to 10 domains) and Enterprise plans.
- Each domain maps to a single service and port within an environment.
- Apex domains require a DNS provider that supports CNAME flattening (Cloudflare, Namecheap, etc.).

See the full documentation: https://docs.suga.app/reference/custom-domains

![Custom Domains](/screenshots/changelog/035-custom-domains/custom.mp4)]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Service templates and discovery]]></title>
            <link>https://suga.app/changelog/032-service-templates-discovery</link>
            <guid isPermaLink="false">032-service-templates-discovery</guid>
            <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Browse and deploy from a curated library of service templates with the new discovery UI. Templates cover common service types: web servers, data stores, workers, and more. Each template comes with pre-configured settings, environment variables, port mappings, and sensible resource defaults.

## How it works

When adding a new service to the canvas, you can now browse templates by category instead of starting from a blank configuration. Select a template, customize the settings if needed, and deploy. Variable references between services are wired up automatically based on the template definition.

Templates are designed to get you from zero to deployed as fast as possible, especially for common patterns like "web server + database + cache" that most projects need.

![Service template discovery](/screenshots/changelog/032-service-templates/discovery.mp4)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Environment variable forking]]></title>
            <link>https://suga.app/changelog/034-environment-variable-forking</link>
            <guid isPermaLink="false">034-environment-variable-forking</guid>
            <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
When creating a new environment, you can now fork variables from an existing one. Instead of re-entering every variable from scratch, select a source environment and its variables will be carried over.

A review step shows exactly which variables will be copied before anything is applied, so you can adjust values (like swapping production URLs for staging ones) before confirming. This is especially useful when spinning up preview or staging environments that share most of their configuration with production.

![Environment variable forking](/screenshots/changelog/034-environment-variable-forking/forking.mp4)]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Variable masking improvement]]></title>
            <link>https://suga.app/changelog/031-variable-masking-improvement</link>
            <guid isPermaLink="false">031-variable-masking-improvement</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Switched environment variable masking from native input type toggling to CSS-based masking. This fixes cross-browser inconsistencies where some browsers would offer to save masked values as passwords or interfere with copy/paste behavior.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[App sidebar navigation]]></title>
            <link>https://suga.app/changelog/033-app-sidebar</link>
            <guid isPermaLink="false">033-app-sidebar</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Navigation has been overhauled with a new app sidebar that works at both the org and project level. Org settings like billing, members, cluster configuration, and variables are now accessible directly from the sidebar instead of through nested settings pages.

The sidebar adapts based on context: at the org level it shows org-wide settings and navigation, and within a project it switches to project-specific links. A collapsible mode toggle lets you minimize it when you need more canvas space. Mobile users get a dedicated trigger for the sidebar as well.

![App sidebar](/screenshots/changelog/033-app-sidebar/sidebar-video.mp4)]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[GitHub integration UX improvements]]></title>
            <link>https://suga.app/changelog/030-github-integration-ux</link>
            <guid isPermaLink="false">030-github-integration-ux</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Several improvements to the GitHub integration experience:

- Permission updates are handled gracefully without losing auth state
- Git connection cards in the build config show the connected repo clearly
- GitHub repo names are used as display names for cleaner service labels
- Consistent header sizing on the GitHub settings page

![Git connection card](/screenshots/changelog/030-github-integration-ux/github.mp4)]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Circular reference detection]]></title>
            <link>https://suga.app/changelog/029-circular-reference-detection</link>
            <guid isPermaLink="false">029-circular-reference-detection</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Environment variable references are now checked for circular dependencies. If service A references a variable from service B, which references one from service A, you'll see a clear warning on the canvas before deploying. Circular edges are rendered with a distinct style so they're easy to spot.

Circular references cause infinite resolution loops at deploy time, which previously resulted in confusing deployment failures. Now these are caught before you deploy.

![Circular reference detection](/screenshots/changelog/029-circular-reference/canvas.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Automatic redeployment on git push]]></title>
            <link>https://suga.app/changelog/028-automatic-container-image-pushes</link>
            <guid isPermaLink="false">028-automatic-container-image-pushes</guid>
            <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Services will now automatically rebuild and update when you `git push` to your repository.

## What is Keel

[Keel](https://keel.sh) is a Kubernetes operator that watches for new container image tags and triggers rolling updates automatically. It runs inside your cluster and listens for webhook notifications from container registries (Docker Hub, GitHub Container Registry, etc.).

When a new image tag is published, Keel receives the webhook, matches it against your deployment's image policy, and initiates a rolling update. No CI/CD pipeline changes needed.

## How it works in Suga

When you deploy a service through Suga, we configure Keel's image update policy for that deployment. Push a new tag to your registry, and Keel handles the rest: it detects the new tag, updates the deployment spec, and Kubernetes rolls out the new pods.

This is particularly useful for teams that build images in external CI systems (GitHub Actions, CircleCI, etc.) and want deployments to update automatically without triggering a full redeploy through the Suga dashboard.
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Auto-provisioned build infrastructure]]></title>
            <link>https://suga.app/changelog/026-auto-provisioned-build-infrastructure</link>
            <guid isPermaLink="false">026-auto-provisioned-build-infrastructure</guid>
            <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
New organizations now get build infrastructure automatically provisioned on creation. No more manual setup steps before your first deploy. Create an org, add a service, and you're ready to build.
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[GitHub integration]]></title>
            <link>https://suga.app/changelog/027-github-integration</link>
            <guid isPermaLink="false">027-github-integration</guid>
            <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Connect your GitHub repositories directly to Suga for source-linked builds.

## How it works

1. **Connect**: Click "Connect GitHub" in your project settings. A popup-based OAuth flow installs the Suga GitHub App on your account or organization.
2. **Link a repo**: In the build configuration for any service, select which GitHub repository to link.
3. **Build**: When you trigger a deployment, Suga pulls the source from your linked repo and builds the container image.
4. **Trace**: Each build shows the commit hash, author, and a direct link back to the source on GitHub, making it easy to trace what's deployed to the code that produced it.

## Features

- Popup-based OAuth flow (no redirect away from the dashboard)
- Per-build author attribution and commit links
- GitHub App permissions management from the settings page
- Works with both personal accounts and organizations
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Resource limits and CPU/memory ratios]]></title>
            <link>https://suga.app/changelog/024-resource-limits-cpu-memory-ratios</link>
            <guid isPermaLink="false">024-resource-limits-cpu-memory-ratios</guid>
            <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The dashboard now shows org-level resource limits and enforces CPU-to-memory ratios per tier. A banner in the changes panel warns you when you're approaching limits before you deploy.

- Minimum memory ratio enforcement to prevent misconfigured pods
- Validation messages match the enforced limits exactly
- Clear upgrade path when you hit the ceiling on your current tier

![Resource limits banner](/screenshots/changelog/024-resource-limits/banner.png)]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Suga Free tier]]></title>
            <link>https://suga.app/changelog/025-suga-free-tier</link>
            <guid isPermaLink="false">025-suga-free-tier</guid>
            <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The free tier has been renamed from Hobby to **Suga Free**. The upgrade-to-pro banner can now be dismissed, and it respects your dismissal across sessions.]]></content:encoded>
            <category>Adjustment</category>
        </item>
        <item>
            <title><![CDATA[Infrastructure cost metering and credits]]></title>
            <link>https://suga.app/changelog/023-infrastructure-cost-metering</link>
            <guid isPermaLink="false">023-infrastructure-cost-metering</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Suga now tracks infrastructure costs per service and supports a credit-based billing model. See what each service costs in terms of compute and storage, and apply credits to offset usage.

- Per-service cost breakdown on the billing page
- Credit balance and usage tracking
- Upgrade prompts when approaching tier limits
- Links to billing directly from deployment dialogs

![Cost metering](/screenshots/changelog/023-cost-metering/billing.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Canvas viewport improvements]]></title>
            <link>https://suga.app/changelog/021-canvas-viewport-improvements</link>
            <guid isPermaLink="false">021-canvas-viewport-improvements</guid>
            <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Fixed several canvas viewport issues:

- New nodes now center correctly in the viewport regardless of sidebar state
- Fixed offset calculation when the sidebar is open, so nodes don't appear shifted
- Volume deletion no longer causes sync issues that could desync the canvas state
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Volume creation dialog]]></title>
            <link>https://suga.app/changelog/022-volume-creation-dialog</link>
            <guid isPermaLink="false">022-volume-creation-dialog</guid>
            <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
You can now create and configure persistent volumes directly from the canvas via a dedicated dialog. The dialog validates mount paths and storage sizes before creation, and includes tooltips on delete actions to prevent accidental data loss.

![Volume creation dialog](/screenshots/changelog/022-volume-creation-dialog/dialog.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Autoscaling configuration]]></title>
            <link>https://suga.app/changelog/020-autoscaling-configuration</link>
            <guid isPermaLink="false">020-autoscaling-configuration</guid>
            <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
You can now configure service autoscaling directly from the canvas. Set CPU and memory thresholds, and Suga handles the HPA configuration on your cluster.

- Per-service autoscaling rules
- CPU and memory target thresholds
- Replica limits enforced per tier
- Real-time replica count visible on the canvas node

When a threshold is exceeded, Suga scales the deployment up automatically. The canvas node updates in real-time to reflect the current replica count as pods come online.

![Autoscaling config](/screenshots/changelog/020-autoscaling/config.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Project navigation redesign]]></title>
            <link>https://suga.app/changelog/019-project-navigation-redesign</link>
            <guid isPermaLink="false">019-project-navigation-redesign</guid>
            <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Project navigation has been redesigned with dedicated links for each project and a toggle-style switcher. It's now faster to jump between projects and environments without going through nested menus.
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Suga Cloud]]></title>
            <link>https://suga.app/changelog/018-suga-cloud</link>
            <guid isPermaLink="false">018-suga-cloud</guid>
            <pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Introducing Suga Cloud: managed cloud operated by Suga.

## How it works

Create a project, pick a region, and deploy. Suga Cloud provisions, sets up, and manages your infrastructure for you. 

Clusters are available in three regions:

- **US** (North America)
- **EU** (Europe)
- **AU** (Australia)

Upgrades, scaling, and networking are all handled automatically. You get the same canvas, metrics, logs, and autoscaling features as with a self-managed cloud, without the operational overhead.

## Pricing

Suga Cloud is available on both the Free and Pro tiers. The Free tier gives you enough resources to experiment and prototype. Pro unlocks higher resource limits, more replicas, and priority support.

]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Color-coded replica logs]]></title>
            <link>https://suga.app/changelog/017-color-coded-replica-logs</link>
            <guid isPermaLink="false">017-color-coded-replica-logs</guid>
            <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Log lines are now color-coded by replica. When tailing logs from a service with multiple replicas, each replica gets a distinct color so you can visually track which instance produced which log line.

![Color-coded logs](/screenshots/changelog/017-color-coded-logs/logs.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Volume management improvements]]></title>
            <link>https://suga.app/changelog/016-volume-management-improvements</link>
            <guid isPermaLink="false">016-volume-management-improvements</guid>
            <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Volume management on the canvas has been improved:

- Volumes can now be added and mounted directly from the compute node context menu
- Improved cancel and unmount UX with clearer confirmation dialogs
- Volume panel shows mount paths and storage class at a glance
- Unique name generation for volumes to avoid conflicts

![Volume context menu](/screenshots/changelog/016-volume-management/context-menu.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Private container registry support]]></title>
            <link>https://suga.app/changelog/015-private-container-registries</link>
            <guid isPermaLink="false">015-private-container-registries</guid>
            <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
You can now pull container images from private Docker registries. Add your registry credentials in the service configuration and Suga handles the rest. Credentials are encrypted at the application level and never exposed in the UI after being set.

- Supports Docker Hub, GitHub Container Registry, and most Docker-compatible registries
- Credentials are write-only from the UI for security
- Credentials are scoped per environment to prevent leaking between staging and production

Credentials are encrypted at the application level before being stored. This means even database access doesn't expose plaintext registry passwords.

![Registry credentials](/screenshots/changelog/015-private-registries/credentials.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Resource name validation]]></title>
            <link>https://suga.app/changelog/014-resource-name-validation</link>
            <guid isPermaLink="false">014-resource-name-validation</guid>
            <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Resource names are now validated before deployment to catch naming issues early. Previously, invalid names (too long, unsupported characters) would only fail at deployment with cryptic error messages. Now you get clear feedback in the UI before you deploy.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Async deployments]]></title>
            <link>https://suga.app/changelog/013-async-deployments</link>
            <guid isPermaLink="false">013-async-deployments</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Deployments now run fully asynchronously with improved retry logic and exponential backoff. You can navigate away from the deployment view and come back later. The deployment continues in the background and its status is always up to date.]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Real-time sync with Zero]]></title>
            <link>https://suga.app/changelog/012-real-time-sync-zero</link>
            <guid isPermaLink="false">012-real-time-sync-zero</guid>
            <pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The Suga dashboard now uses [Zero](https://zero.rocicorp.dev) as a real-time sync layer between the client and backend.

## Why Zero

Traditional web apps fetch data from the server on every interaction and show loading spinners while waiting. Zero takes a different approach: it maintains a local cache on the client that stays in sync with the server via PostgreSQL replication.

This means:

- **Instant reads**: All data comes from the local cache, so the UI never blocks on network requests
- **Optimistic mutations**: Changes appear immediately in the UI and sync to the server in the background
- **Conflict resolution**: If two users edit the same resource, Zero handles the merge automatically

## What this enables

The immediate benefit is a faster, more responsive dashboard. No more loading states when switching between projects or environments.

Longer term, this architecture enables multiplayer editing. Multiple team members can work on the same project canvas simultaneously without overwriting each other's changes. Zero's conflict resolution ensures that concurrent edits converge to a consistent state.
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Environment variable importing]]></title>
            <link>https://suga.app/changelog/011-env-file-importing</link>
            <guid isPermaLink="false">011-env-file-importing</guid>
            <pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
You can now import `.env` files directly into your service configuration. Drop in an existing `.env` file and all key-value pairs are parsed and added to your service's environment variables. No more copying them one by one.

![Env file import](/screenshots/changelog/011-env-importing/import.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Google Translate compatibility]]></title>
            <link>https://suga.app/changelog/010-google-translate-compatibility</link>
            <guid isPermaLink="false">010-google-translate-compatibility</guid>
            <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
We fixed several issues where Google Translate broke the Suga dashboard for users with auto-translate enabled in their browser.

## The problem

Google Translate works by walking the DOM and replacing `TextNode` elements with `<font>` elements containing the translated text. This is fundamentally incompatible with React, which maintains references to the original DOM nodes. When React tries to update or remove a node that Google Translate already replaced, two things happen:

1. **Stale content**: React updates its reference to the old `TextNode`, but that node is no longer in the DOM. The translated `<font>` element stays unchanged, so dynamic content like form values and status indicators stop updating.
2. **Crashes**: When React tries to call `removeChild` on a node that Google Translate already removed, it throws a `NotFoundError` that can crash the entire component tree.

Martijn Hols wrote an [excellent deep dive](https://martijnhols.nl/blog/everything-about-google-translate-crashing-react) on this exact issue, which informed our approach.

## Our fix

We took two approaches:

1. **`translate="no"` attributes** on interactive elements and dynamic content: dialog inputs, endpoint URLs, form fields, and status text that updates in real-time. This tells Google Translate to leave those nodes alone while still translating static UI labels and descriptions.

2. **Wrapping conditional `TextNode`s in `<span>` elements**. When React conditionally renders a text node (e.g., `{isLoading ? "Loading..." : "Done"}`), Google Translate can replace the bare `TextNode` before React swaps it out, causing the `removeChild` crash. Wrapping these in a `<span>` gives React a stable parent element to work with, which solved a large chunk of the crashes.

This is not a perfect solution (as the blog post explains, there is no complete fix for this incompatibility), but it protects the critical paths where stale or broken content would cause real problems.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Auth UX improvements]]></title>
            <link>https://suga.app/changelog/009-auth-ux-improvements</link>
            <guid isPermaLink="false">009-auth-ux-improvements</guid>
            <pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
The login and signup experience has been polished:

- **Continue with GitHub/Google** buttons on the signup page for faster onboarding
- Gradient loading states during authentication
- Smoother transitions between auth states with no layout flash

![Login page](/screenshots/changelog/009-auth-ux/login.png)
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Background workflows with Hatchet]]></title>
            <link>https://suga.app/changelog/008-background-workflows-hatchet</link>
            <guid isPermaLink="false">008-background-workflows-hatchet</guid>
            <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Long-running operations like cluster initialization and deployment rollouts are now powered by [Hatchet](https://hatchet.run), an open-source durable execution engine.

## Why Hatchet

We needed a workflow engine that could handle multi-step infrastructure operations reliably. Hatchet stood out for a few reasons:

- **TypeScript-native**: Workflows are defined in the same language as the rest of our stack, no YAML or DSLs
- **Durable execution**: If a step fails mid-workflow, it retries from where it left off rather than restarting from scratch
- **DAG-based workflows**: Steps can run in parallel or sequence with explicit dependency graphs
- **Step-level visibility**: You can see exactly which step a workflow is on and what failed

## What changed

Cluster setup, deployment rollouts, and resource cleanup now run as Hatchet workflows. Each step has its own retry policy and timeout, so transient failures (like a cloud API being slow) are handled automatically without failing the entire operation.

Progress is tracked per-step, so the UI always reflects exactly where things stand.
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Deployment history]]></title>
            <link>https://suga.app/changelog/007-deployment-history</link>
            <guid isPermaLink="false">007-deployment-history</guid>
            <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Every environment now keeps a history of past deployments. You can see what was deployed, when, and by whom.

## What's tracked

Each deployment entry records:

- **Who** triggered the deploy (user avatar and name)
- **When** it happened
- **What changed** in that deployment
- **Status** (success, failed, in progress)

The history view shows the 5 most recent deployments by default, with a "show more" button to load older entries. It refreshes automatically after each new deployment completes.

## Rollback

If a deployment introduces a problem, you can roll back to a previous environment state directly from the history view. This restores the configuration as it was at that point in time and triggers a new deployment with the restored settings.

![Deployment history](/screenshots/changelog/007-deployment-history/history.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Service templates]]></title>
            <link>https://suga.app/changelog/005-service-templates</link>
            <guid isPermaLink="false">005-service-templates</guid>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
We've added a library of pre-built service templates to speed up common deployment patterns. Instead of configuring a service from scratch, select a template and get a working deployment config with sensible defaults.

## Available templates

- **Express** and **Fastify** for Node.js web servers
- **Redis** for caching and message brokering
- **WordPress** with pre-configured PHP and database settings
- **PocketBase** for a lightweight backend-as-a-service
- **MariaDB** for relational database workloads
- **Uptime Kuma** for self-hosted uptime monitoring

Each template includes pre-configured ports, environment variables, resource limits, and an icon. Templates that depend on other services (e.g., WordPress needing a database) automatically wire up variable references between them.

![Service templates](/screenshots/changelog/005-service-templates/templates.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Deployment stream reliability]]></title>
            <link>https://suga.app/changelog/006-deployment-stream-reliability</link>
            <guid isPermaLink="false">006-deployment-stream-reliability</guid>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Fixed an issue where long-running deployments could time out and lose their connection to the deployment stream. Deployments now maintain a stable connection throughout the entire rollout process, so you always see the final result.
]]></content:encoded>
            <category>Fix</category>
        </item>
        <item>
            <title><![CDATA[Improved log streaming]]></title>
            <link>https://suga.app/changelog/003-improved-log-streaming</link>
            <guid isPermaLink="false">003-improved-log-streaming</guid>
            <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Log streaming has been significantly improved for both build and runtime logs.

- Fixed an issue where streaming logs could lock up the browser UI
- Improved "follow" mode to reliably stick to the bottom of the log output
- Resolved infinite build log accumulation that caused memory issues in long-running builds
- Non-deployed containers now show a clear status message instead of an empty log view
]]></content:encoded>
            <category>Improvement</category>
        </item>
        <item>
            <title><![CDATA[Variable references in templates]]></title>
            <link>https://suga.app/changelog/004-variable-references-in-templates</link>
            <guid isPermaLink="false">004-variable-references-in-templates</guid>
            <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Service templates can now reference environment variables from other services. When you add a template, any variable references are automatically wired up, making it easy to connect services that depend on each other (e.g., a web server referencing a database connection string).

![Variable references on the canvas](/screenshots/changelog/004-variable-references/references.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Per-replica metrics]]></title>
            <link>https://suga.app/changelog/002-per-pod-metrics</link>
            <guid isPermaLink="false">002-per-pod-metrics</guid>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Resource metrics can now be broken down by individual replica, or toggled to a merged view showing aggregate consumption across all replicas.

- CPU and memory usage split per pod with individual charts
- Merge toggle to combine metrics into a single weighted view
- Replica names are displayed as badges for quick identification

![Per-pod metrics](/screenshots/changelog/002-per-pod-metrics/metrics.png)
]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Deployment canvas]]></title>
            <link>https://suga.app/changelog/001-deployment-canvas</link>
            <guid isPermaLink="false">001-deployment-canvas</guid>
            <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Suga now includes a visual deployment canvas powered by [React Flow](https://reactflow.dev). Instead of editing YAML files and running `kubectl apply`, you manage your entire service topology on an interactive canvas.

See containers, functions, environment variables, and their connections at a glance. Click into any node to configure it, drag to rearrange, and deploy changes with a single click.

- Drag-and-drop node management for services and resources
- Visual routing
- Organization and project navigation with environment switching
- Real-time deployment status indicators on each node
- Figma-style panning and zoom controls

![Deployment canvas](/screenshots/changelog/001-deployment-canvas/deployment-canvas.png)]]></content:encoded>
            <category>Feature</category>
        </item>
    </channel>
</rss>