<?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, 14 Apr 2026 06:11:29 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[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>