The latest updates, improvements, and fixes to Suga.
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.
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:
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.
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.
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.
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.
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.
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.
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:
This is all available from an unauthenticated state, so you can start adding "Deploy to Suga" buttons to all your project READMEs.
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.
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.