Changelog

What's new

Every meaningful improvement we ship to DeployMill, newest first. Subscribe via RSS to follow along.

#

Seed a preview from a volume backup, and tidier account settings

New

  • Seed a preview from a volume backup. A new preview data-mode restores a chosen file-level volume backup of the parent app into the preview's fresh volume. It's the volume counterpart to seeding a preview database from a backup. Paid.

Improved

  • Account settings, organized into tabs. The settings page is now split into Security (email, password, two-factor, connected accounts), Notifications, and Workspace, instead of one long scroll. The bell's "Notification settings" link opens the right tab.
#

Volume backups, a delete prompt that spells out the risk, and a clearer spend cap

New

  • Volume backups. Persistent volumes now get portable, point-in-time backups you can see and download. list_backups returns them alongside database backups over MCP, get_app shows a per-mount health badge, and download_backup hands you a short-lived link to a .tar.gz.
  • A delete prompt that tells you what you'll lose. The Delete app action now opens a confirmation that lists exactly what gets torn down: app, deployments, domains, env vars, and an explicit warning for a managed database or any persistent volumes. That way you never delete attached data you didn't realize was there.

Improved

  • A billing page that tells the truth about the spend cap. The dashboard now explains the two tiers clearly: new apps, wakes, and previews stop at your cap, while a live production app may coast up to the hard ceiling (2× the cap) before it's slept, so prod never drops silently while the bill still stays bounded.

Fixed

  • Previews stay isolated after a database swap. A preview of an app whose database was moved with swap_database now correctly gets its own isolated database instead of quietly sharing live prod.
  • Deleting an app drops the right database. After a swap, delete_app now cleans up the app's actual current database instead of orphaning it and dropping the wrong one.
  • Bring-your-own-storage buckets aren't orphaned. Deleting an app or pruning its storage now tears down the bucket on the external store it actually lives on.

Security

  • No leaks through aliased columns in SQL results. query_database redaction now catches a secret column renamed with an alias (e.g. SELECT password AS x), and the list of credential-like column names it redacts has been expanded.
#

Backups you can see, download, and prove, plus bring your own S3 storage

New

  • See your backups, not just trust they exist. The app page now has a Backups panel showing your backup cadence, retention, last and next backup, a health badge (healthy / stale / failing / none), recent history, and an integrity checksum per backup. get_app carries the same backup health over MCP.
  • Download a backup. Owners and admins can download any successful database backup as a portable, decrypted .sql.gz. The file is decrypted server-side and handed to you as a short-lived link, so no long-term storage key is ever exposed.
  • Prove a backup actually restores. The new verify_backup tool (and a "Test this backup" button) spins up a throwaway preview seeded from a chosen backup, runs the health check, and stamps it verified-good. Free on every plan. Paid plans also get an automated daily restore drill, so your backups are continuously proven restorable, not just present.
  • Restore a backup as a new database, then swap it in. restore_backup can now restore into a fresh database without touching your live one (zero blast radius), and the new swap_database tool re-points an app at it and rolls, keeping the old database as a named rollback point. Together that's a fully reversible "restore and swap" in two calls. Paid.
  • Preview against a past snapshot. A new preview data-mode seeds a preview's isolated database from a chosen backup instead of cloning live prod, so you can preview against a known-good point in time. Paid.
  • Bring your own object storage. Connect any S3-compatible store (AWS S3, Cloudflare R2, MinIO, or Backblaze B2) from a new Storage tab under Connections. Credentials are validated with a real read/write probe at connect time and stored encrypted, never shown back.

Fixed

  • Importing a repo resumes instead of dead-ending. Re-running import_repo after a half-finished import now reuses the existing app and picks up where it left off, rather than failing on a name collision.
  • Auto-generated Dockerfiles build without a lockfile. Importing a Node repo with no committed lockfile now produces a buildable Dockerfile.
  • Annotated read-only queries are accepted. query_database no longer rejects a valid single statement just because it contains a ; inside a comment.
#

Park apps for free, plus a clearer bill and tighter security

New

  • Park apps for free. Your active-app slot is only held by an app that's actually up (running, asleep, or mid-deploy). Stop an app and it costs $0 and frees the slot, so you can keep several stopped apps around and only pay for the one you bring up. To start a second, stop the first.
  • Resize an app from your agent. set_app_resources is now an MCP tool, so a paying org can adjust an app's CPU and memory straight from the agent, not just the dashboard.
  • Adjust a preview's expiry without leaving the page. The preview detail page now shows when a preview auto-expires and gives you an inline Extend / Set TTL button.
  • Turn off shared preview data org-wide. Admins can flip a single switch so every preview always gets its own isolated database, bucket, and volumes, overriding any per-call or per-project "share prod resources" opt-in. Previews also now return a clear hitsProdData flag so your agent knows whether it's touching prod data.

Improved

  • Your bill shows every app you ran this period, even deleted ones. Per-app spend now lists apps you've since stopped, slept, or deleted, by their real name, so usage is never invisible or unattributable. The copy is also clearer that deleting or sleeping an app stops new charges but doesn't erase usage already accrued.
  • Custom-domain setup now uses a CNAME, not an IP. DNS instructions point you at a CNAME (or ALIAS/ANAME for apex domains) instead of a bare A record, so if our ingress IP ever changes your domain keeps working. The exact record to create is shown inline in the dashboard.
  • Database tab on the app page. App detail now shows the managed database provider and name when one's provisioned, with clear setup steps when there isn't.
  • Name your apps. Apps now have an editable display name separate from their slug. Click the name on the app page to rename it.

Fixed

  • Deleting a running app cleans up its database. Tearing down an actively-running app no longer leaves an orphaned database and role behind.
  • Email verification links land you on onboarding instead of the homepage.
  • Clearer object-storage errors on free. Free orgs hitting the storage tools now get a coded upgrade prompt with a link to the guide, instead of a dead-end "add a storage block" message.

Security

  • Custom app names are scoped to your workspace. A custom name now can't collide with another org's database, storage, or deployment.
  • Reused storage tools can't reach another bucket. The object-storage tools now operate on the bucket derived from your app record, closing a path where a tenant could repoint at another bucket. The managed S3_* connection keys are also now reserved and can't be overwritten.
  • Stolen MCP refresh tokens can't be replayed. Refreshing now invalidates the old token immediately, so a captured refresh token is useless after the legitimate client rotates past it.
  • No credentials leak in error text. Diagnostic and scheduled-job error messages are now redacted before they reach you, so a provider error can never carry a connection string or token.
  • Tighter file-tool input checks and stricter per-member rate limits so one noisy caller can't drain your whole workspace's request budget.
  • Database connection strings are now stored as encrypted secrets rather than plain env vars, and masked in env-var listings.
#

Notifications, a safer spend cap, and a roomier free tier

New

  • Notifications. A bell in the dashboard now keeps you posted on what matters: a failed deploy, an auto-rollback, a reaped preview, a cert that wouldn't issue, your spend cap getting close. There's an unread badge, a feed, and per-category toggles so you only hear about what you care about, except critical billing alerts, which always send.
  • Send notifications to your own tools (paid). Wire up a signed webhook to Slack, Discord, PagerDuty, or anywhere else and have your alerts land where your team already works. Each delivery is HMAC-signed and carries a stable ID so your receiver can dedupe.
  • Pick a billing contact. Admins can name an extra member to receive billing notices on top of the workspace owners.

Improved

  • A spend cap that won't take prod down by surprise. Over your soft cap, a running production app keeps serving and we ping you. Only at the hard ceiling (2× the cap) does it sleep, so a budget never silently drops prod while the bill still stays bounded. get_account now shows both thresholds.
  • A roomier free tier. Free apps can now stay awake up to 8 hours a day (up from 2), so a full evaluation session won't get cut short mid-build.
  • A daily digest for low-priority notices. Routine info-level updates batch into one summary email a day instead of pinging you for each. Warnings and critical alerts still arrive immediately.
  • A pricing page you can trust. The rate table is now derived from the exact meter that bills you, so the advertised number can't drift from what you actually pay.

Fixed

  • Wake-on-request respects your spend cap. A sleeping app woken by ordinary traffic now honors the same spend limits as an explicit start, so an over-cap app can't quietly resume billing.
  • Accurate metering at month boundaries. Uptime and storage used in the final hours of a month are now billed instead of being missed.
  • Reliable previews on large databases. Fixed a paging bug that could hide branches on big Neon projects, which had made some preview database branches fail to tear down.

Security

  • Cross-tenant app names blocked. A custom app name must now belong to your own workspace, closing a path where a forged name could collide with another org's database, storage, or deployment.
  • No credentials in teardown warnings. Provider errors surfaced when deleting an app are now redacted, so a failed database, storage, domain, or registry cleanup can never leak a connection string or token.
#

Talk to your database directly

New

  • Query your database from your agent. New tools let you describe a managed database's schema and run read queries against it without leaving DeployMill. Handy for debugging data, checking a migration, or just looking around.
  • On-demand direct access. Need to connect a tool like psql or a GUI? Request temporary direct credentials and connect straight to your managed database, then let them expire.
  • A clearer picture of your database. See its provider, size, and connection details in one place.

Improved

  • The default managed-database options are now tuned to sensible, usable providers out of the box, so a new app gets a database that just works.
  • A round of dashboard readability and layout fixes across the app and account pages.

Fixed

  • Resolved a version-mismatch error that could interrupt forking a preview's database branch, so previews of database-backed apps come up reliably.
#

Apps that sleep to save resources, and verified SSO domains

New

  • Apps that sleep. Most apps an agent deploys aren't busy all the time. Idle apps now hibernate automatically and wake on the next request. You keep the URL, and we stop burning resources while nobody's there. Wake is transparent to visitors.
  • Choose what idle means. Prefer an app to fully stop when idle instead of sleeping? That's now a per-app setting.
  • SSO domain verification. Verify a domain you own so members signing in with single sign-on are matched to your workspace.

Improved

  • The marketing site got a cleaner, full-width header and the blog gained category badges so you can tell vision posts from engineering deep-dives at a glance.
  • Seat limits are now enforced cleanly when you invite past your plan, with a clear path to add capacity.

Security

  • Session cookies are pinned to stricter flags, and the operator alerting path for abuse was tightened.
#

A full audit trail for the REST API, and safer API keys

New

  • The DeployMill blog is live. Read the thinking behind a neutral, agent-safe way to ship apps. Find it in the top nav.

Improved

  • Every REST API call is now in the audit trail, attributed to the key that made it, so you always have a clear record of what changed and who (or what) changed it.
  • API keys now expire after 90 days by default. You can still set your own lifetime, but the safe default means a forgotten key doesn't live forever.
  • Workspace protection settings now apply immediately to existing apps, not just new ones.

Security

  • An API key is now revoked automatically the moment its owner is removed from the workspace or has their access changed, with no lingering credentials.
  • Tenant apps are firewalled from the cluster's internal control surfaces at the network layer, an extra wall around your workloads.
#

Deploy from the dashboard, plus a security tune-up

New

  • Deploy and redeploy from the dashboard. The app detail page gained a deploy action and a clear, live deploy status, so you no longer have to drop to the agent just to ship the current branch.
  • Filter your apps by status and see at a glance which ones are asleep.

Improved

  • Faster and steadier under the hood. We moved the platform onto the latest web framework and validation stack. No action needed, and apps just keep running.

Security

  • Closed an SSRF gap in how outbound URLs were checked (an IPv6 edge case) and tightened how your workspace is resolved when an account belongs to more than one. Both now fail closed, the safe direction.
  • Hardened the sign-in-to-deploy hand-off so it can't be tricked into acting on the wrong workspace.
#

Two-factor auth, rate limits, and a safer free tier

A security-heavy day. Most of this protects you without you having to do anything.

New

  • Two-factor authentication. Enroll an authenticator app from account settings. Scan a QR code, save your recovery codes, done. Workspace owners can require 2FA for every member, with a grace banner so nobody gets locked out mid-task.
  • A compliance dashboard. Owners and admins can configure a security-event webhook (SIEM), export the audit log as JSON or CSV, and review database-backup evidence, all from one page.
  • Account lockout on repeated failed logins, so a brute-force attempt against your account gets shut down automatically.

Improved

  • Fair-use rate limits across the API and deploy paths keep one busy workspace from slowing things down for everyone, with clear, machine-readable signals (and a Retry-After) when you hit a cap, never a silent stall.
  • The free tier is now contained by design: locked egress at the network layer and curated templates keep it safe to give away, while the part that matters, watching your agent build and ship, stays wide open.

Security

  • Privileged workspace actions (role changes, member removals, invites) are now written to an attributable audit log, with invitee emails stored as one-way hashes.
#

Plans, live deploy visibility, and password-protected apps

A batch focused on knowing what's happening and controlling who sees it.

New

  • Password- and workspace-protected apps. Put a site behind a password, or behind your DeployMill login so only members of your workspace can reach it, which suits staging and internal tools. Previews inherit their parent app's protection automatically.
  • Plans and clear limits. Your workspace now runs on a named plan with explicit, discoverable capabilities and limits instead of invisible defaults, so you always know where you stand and what an upgrade includes. (Seats are free and unlimited on every plan, and you pay for the uptime you run, not for app or storage quotas.)
  • A single-app detail view (get_app). One call returns everything about an app: its repo and branch, port, size, domains, and current status.
  • Billing & usage in the dashboard. See your plan, what it includes, and your current usage at a glance.

Improved

  • Watch a deploy as it happens. A blocking deploy now streams progress (clone, build, health-gate, live), so you (and your agent) can see exactly which phase it's in instead of staring at a spinner.
  • Know what's actually serving traffic. list_deployments flags the deployment that's currently live, so a rollback rolls back from the right version.
  • SQLite as a database option for low-concurrency apps, behind the same interface as managed Postgres.
#

Custom domains, bring-your-own code, and build logs

This week is about meeting your app where it already lives.

New

  • Custom domains. Attach a domain you own (www.acme.com) to any app, right alongside the platform host you get for free. TLS is handled for you.
  • Bring your own code with import_repo. Already have a GitHub repo? Adopt it as a DeployMill app instead of starting from a template. DeployMill figures out the port (from your Dockerfile's EXPOSE, among other signals) and wires everything up.
  • Build & deploy logs with get_logs. When a deploy fails, your agent can read the actual build output and fix the problem, with no more guessing from a red X.
  • Workspaces. Every account gets a workspace with its own apps, members, and quotas, so teams and projects stay cleanly separated.

Improved

  • After each deploy, DeployMill runs a quick health check against every attached domain so a broken deploy surfaces immediately instead of at your customer's first visit.
  • list_apps now shows how much headroom you have left against your active-app quota.
#

Managed databases and truly isolated previews

The two pieces that make it safe to hand an agent a real environment landed this week.

New

  • Managed databases for your apps. Declare a database in your project config and DeployMill provisions one for you, with no connection strings to copy by hand and no console to click through. Managed Postgres (including Neon) is wired into your app automatically.
  • Previews that fork their own database. Spin up a preview and it gets a copy-on-write branch of the parent database plus a fresh volume. Run a risky migration, throw the preview away, and production never knew. Opt into a shared database per project when you'd rather not branch.
  • create_preview, redeploy_preview, delete_preview. Previews are now first-class. Create one on demand from any branch, redeploy it, and tear it down when you're done. Each preview gets its own URL.

Improved

  • Previews can wire host-pinned environment variables (like auth callback URLs) to the preview's real URL automatically, so a cloned app boots correctly instead of pointing back at production.