What's New.
A better view of your projects
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.
A clearer deployment history
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.
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.
Smarter Docker Compose imports
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.
TCP proxies are now a paid feature
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.
Deploy on Suga buttons
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:
[](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:
Persistent logging and a new log explorer
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.
If a spike shows up in your per-replica metrics, you can now jump straight to the logs to find out what caused it.
Duplicated services no longer share a build
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.
Clearer errors for Cloudflare-proxied custom domains
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.
More control over builds
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.
Knowing when your Suga URL is live
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.