🔐 Who can do what

  • Adding a domain or a TLS certificate needs Manage — they are the application’s public identity. Giving a port or a database public access does not: it costs nothing and is undone by the same role, so it stays with Operate. A role that only operates an application can still open a private port, run its add-ons and change its settings — it just cannot put them on the internet, because that outlives whoever did it.
  • Pages that were open to every member are not any more. Certificates, git tokens, metrics and the order and invoice pages each check a permission now: certificates with Manage, git tokens with Deploy, metrics with any read permission, and invoices and payment retries with Billing. The order page you land on after buying something stays open to whoever bought it.
  • Running a private network, and a static site’s settings, need less than before. Subnets, routes, WireGuard devices and renaming a network are Operate; a static site’s settings are Operate and its Settings icon now appears for the roles that may use it. Reading a cron job needs only View.
  • Deleting a database, or emptying it, needs Manage. Everything else about one — adding it, its public access, its replicas, restoring a backup — stays with Operate. Removing it and resetting it do not come back, which is the difference.
  • Deleting a project no longer depends on who created it. Anyone with the project Manage permission can remove one, the workspace owner included.

🔒 Private networks

  • A new Networking section, where a workspace can give its applications, databases and services a private network of their own. Nothing outside it can reach them, and unlike the isolation you already had, a VPC spans every resource in a region — so an application on one resource can finally talk to a database on another.
  • A new network arrives ready to use. It comes up with a subnet already carved out and a DNS resolver of its own, so the usual path is: create it, attach the database, attach the application, done. Point your own resolver at it to resolve internal names from your office.
  • Attaching restarts the workload, because a network interface cannot be added to a running container. For a database that is a database restart, and the confirmation dialog says so before you commit. An application created with a network chosen up front skips the restart entirely.
  • A workload answers to a name, not to an address. The name is what belongs in a connection string — the address behind it moves whenever the workload rolls.
  • One network per region, and it cannot span regions. A workspace working in two regions gets one in each. The address range defaults to something sensible, and a range that would clash with the platform is refused when you type it rather than failing later.

🔑 VPN

  • Reach a private network from outside over WireGuard, Tailscale or Cloudflare WARP, and join a whole remote network — an AWS VPC, say — over an IPsec site-to-site tunnel.
  • WireGuard is per person or per machine. Add a device, download its configuration, import it. The configuration downloads exactly once: its private key is never stored, so nobody, including us, can produce it again — if the download is lost, delete the device and add another.
  • Tailscale and Cloudflare WARP join networks you already run, using an auth key or a service token. Both need routes telling the network which ranges live behind them, because those ranges live in your configuration rather than ours.
  • Routes are staged and applied together. Applying restarts every attached workload, so you add all the ranges you need and pay that cost once.
  • Pricing: 29/mopergatewayyouenablepergateway,notpernetwork,soanetworkrunningbothWireGuardandTailscaleischargedtwiceand29/mo per gateway you enable — per gateway, not per network, so a network running both WireGuard and Tailscale is charged twice — and 199/mo per site-to-site tunnel, because each one permanently holds a public address. Enterprise includes both. Creating or removing a tunnel needs the Network manage permission, which the Admin role carries.

💾 Shared storage

  • Mount a subdirectory instead of the whole volume. Several applications can now share one volume without seeing each other’s files — each mounts its own path, created automatically if it does not exist.
  • A volume mounts to a given application once. Mounting the same shared storage to the same application again is now refused with a message instead of quietly creating a second mount that unmounting could not tell apart. To move a mount, unmount it and mount it again at the new path.

💌 Email

  • A resource that changes plan now says so. Moving a resource up or down a plan sends its owner a note naming what it moved from and to, with the CPU, memory and disk it now has. It arrives whether the change was paid for or made during a trial — a trial change produces no invoice, so nothing used to tell you it happened.
  • The receipt after a trial converts. When a free trial turned into a paid subscription, the payment went through silently. That first payment is now confirmed like any other.
  • A receipt lists what you bought, not everything the subscription covers. Adding one extra to a running integration used to list the integration itself alongside it, as though it had been charged for again.

💳 Billing

  • Purchase Details shows the items in that order. Same correction as the receipt: an order that added one extra to something already running listed the running thing too.
  • The trial box stays on the order page. An order that started a free trial kept explaining, on the confirmation page, why nothing was charged — until the trial began, at which point the box disappeared. It now stays, and dates the first charge from the trial that is actually running.
  • A free trial needs a card that has not had one. If the card on the subscription turns out to have already been used for someone else’s trial, the setup is refused rather than provisioned. Nothing is built and nothing is charged, the order page says why, and your subscription stays open on the free plan.

👥 Invitations

  • Turn an invitation down from the email. The invitation mail offered only acceptance, so declining meant finding the banner inside the app. It is a text link rather than a second button, and it opens a confirmation page — the invitation is removed only on a deliberate click.
  • Signing in from an invitation joins the workspace. The button said “sign in and join” but only signed you in, leaving you a member of nothing until you found the banner. The click now does both — and nothing about the membership moves before it.
  • The invitation banner reads as an invitation. It sat in the same pale tint as the dismissible announcement above it and scrolled away with the page.

🚀 Deployments

  • A failed deployment says what went wrong where you are already looking — in the deployments panel, on the deployment page and in the failure email — instead of showing raw text from the build system.
  • The deployment history tab is hidden for applications that never record one. An application syncing from a parent image has nothing to show, and the tab used to lead to an empty page.

💬 Slack

  • Connect a channel from Workspace → Settings → Integrations. Slack asks which channel to post to; Miget requests one scope, incoming-webhook, and can do nothing but post there. Connect as many channels as you like.
  • Messages are written to be read, not parsed: the app and what happened, with the state that matters beside it, and links to the running application, its dashboard page, and its logs.
  • Each channel picks its own events and apps. A new channel starts with the five that usually want attention and leaves out the noisy ones.

🔔 Notifications

  • Choose what reaches your inbox under Settings → Notifications: deployment failures, successful deployments, health alerts and state changes. Successful deployments are off by default - on an active application it is the noisiest mail we send.
  • Mail is addressed by responsibility. A failed deployment reaches whoever started it rather than everyone in the workspace; health alerts reach workspace admins.
  • State changes now cover services and add-ons, not applications alone. Turning the switch off used to silence applications and leave their siblings talking.
  • Blocked or deleted applications and billing stay always on.

📈 Observability

  • Services and add-ons have their own Observability page, matching the one applications already had, with charts grouped in the order a problem is usually diagnosed.
  • PostgreSQL add-ons show engine metrics: connections, transactions, database size, cache hit ratio, replication lag and deadlocks. Valkey and MySQL have no engine-level equivalent - their pods have nothing to scrape - but every add-on reports CPU, memory, restarts, network and disk.
  • Sent and received share one chart, mirrored above and below the axis, as do disk reads and writes - so the balance between the two is visible rather than inferred from two charts with independent scales.
  • Disk latency is charted beside the operation rate, because the rate stays flat when each operation takes ten times longer, which is how a database usually starts to hurt.
  • Usage tiles stay put when a metric is quiet. A test application nobody visits used to lose three of them and look broken; they now show a dash.

🪝 Webhooks

  • A failing endpoint is disabled after three consecutive failures, and the workspace admins are emailed to say which one and why. The failed deliveries stay in the history, and re-enabling resumes from the next event.
  • app_state_changed reports a start, stop or restart somebody asked for - which app_stopped, the platform giving up on a crash loop, never covered.
  • Preview environments can be included. A preview environment is an app in its own right, so a webhook narrowed to named apps stayed silent while pull requests deployed; a switch now matches those events against the parent.

💳 Billing

  • A free resource needs a card on file. It is never charged for the free plan - it is what keeps the free tier from being farmed with throwaway accounts. One card, one free resource.
  • Resuming a cancelled subscription is offered once, on the subscription card, instead of twice.

🌐 Static Sites

  • A new resource type: deploy prebuilt HTML, CSS and JavaScript straight from object storage — no compute resource, no replicas, no ports, and no cost. Four sources: GitHub, Git Push, a zip upload you can drag onto the page, and SFTP.
  • Builds without configuration: Git-based sources auto-detect the framework across 33 generators and build with its defaults; override the generator, build command, output directory or monorepo path when detection gets it wrong. SPA mode serves /index.html for unknown paths so deep links survive a refresh.
  • Deployment history you can act on: cancel a running build, roll a GitHub site back to the commit a previous deployment shipped, and browse the files currently deployed to confirm what actually landed.
  • Custom domains work exactly as they do for applications.

🗂️ Projects Own More, and Can Be Kept Private

  • Buckets belong to projects: a bucket can now be placed in a project like everything else, or left at workspace level.
  • Move anything between projects: applications, static sites, services, stacks and buckets can all change project from their own settings, and a stack takes every application and service it runs with it. The workload keeps running on the same resource throughout.
  • Project access: on Organization and Enterprise plans, a project can be closed to a chosen list of members and roles. A project someone cannot reach is not shown to them at all — not its applications, not its services, not its buckets — rather than shown and refused. The workspace owner and the built-in Admin role always keep access.

🖥️ Assign Resources to Projects

  • Dedicate a resource to a project: assign a resource under Project → Settings → Resources, and only the projects it is assigned to may deploy on it. Assigning restricts the resource, never the project — a project with assigned resources can still use the shared pool.
  • Assigning tells you what is in the way: if the resource still runs workloads from another project, the refusal names them and offers to assign the resource to those projects too instead of failing.
  • Reversible at any moment: removing an assignment returns the resource to the shared pool and moves nothing.

🧭 Sidebar Navigation

  • Grouped navigation: the workspace sidebar is now grouped into what you deploy, what runs it, and what you manage, and stays usable when collapsed.
  • Project context follows you: open a project and the sidebar gives it a section of its own, with a real page per resource kind rather than one screen the whole menu points at. The topbar carries the project through to the create flows.
  • Observability for everyone: the Observability link is no longer admin-only — every member can reach the dashboards for the workloads they can see.

🔑 Workspace API Tokens & the Developers Tab

  • Tokens that belong to the workspace, not to a person: create an API token with its own permission list and its own project scope. It keeps working when the person who created it changes role, and stops working when they lose access to the workspace. Editing one takes effect immediately and lands on the activity feed with an author.
  • A Developers settings tab: API tokens and webhooks moved out of Integrations into their own tab, leaving Integrations for connections to other products. Connecting GitHub now lives there too, next to Observability.

🔔 Outbound Webhooks

  • Get told when a deploy starts and finishes instead of polling: register an endpoint, pick the events, and Miget POSTs a signed payload to it. Scope a webhook to specific apps, send a test event, and read the delivery history — with the exact body that was sent — when something does not arrive.

🔒 Databases Private by Default

  • Private by default: New databases are now created private. A database that is publicly reachable shows an amber warning badge and tooltip, with a one-click Switch to private.

⚖️ Clearer Resources & Fair Scheduling

  • “CPU (pooled)”: The shared-CPU label is now “CPU (pooled)” with a tooltip explaining how pooled CPU works on dev plans (pro plans stay dedicated). The full-allocation bar now makes clear that a resource at 100% is fully allocated, not overloaded.
  • Fair Scheduler split-view: Pooled-plan resources show a live per-workload CPU breakdown, so you can see exactly which app or service is using the shared pool in real time.

📈 Observability Hub & Activity Export

  • Observability hub: Observability is now a first-class item in the workspace sidebar, with a hub page that links to Grafana and summarises logs, metrics, and alerts by plan tier.
  • Activity export: Export an Activity feed to CSV or JSON. The export runs in the background and notifies you when it is ready, and the page now shows how long activity is retained.

🔎 Faster Lists: Filter, Search & Share

  • Instant filter & search: The Applications, Services, and Stacks lists now have client-side filters and search that update as you type.
  • Shareable views: Filters live in the URL, so a filtered list can be bookmarked or shared.
  • Quicker navigation: Project pages gain a tab selector with deep-linking (jump straight to Apps, Services, or Stacks), stacks now appear in Spotlight search, lists show per-item metrics and a layout selector, and the top-bar project menu has a View project items shortcut.

📦 Stack Catalogue

  • Deploy from a catalogue: Create a Docker Compose stack from a curated catalogue of self-hostable apps (WordPress, Ghost, n8n, and more) instead of hunting for a compose file — each entry shows its upstream license and a recognisable badge.

🚀 Deploy to Miget Buttons

  • Deploy to Miget buttons: “Deploy to Miget” links can now open the deploy wizard prefilled from a source - a compose stack, a public Git repository, or a container image - so a README or template gallery can launch a ready-to-go deployment in one click.

🐳 Docker Compose Stacks

  • Docker Compose Stacks: Deploy a whole multi-service application from a single compose.yaml in a Git repository. Miget detects every service in the compose file - build-backed apps, standalone images, and managed databases/caches - and provisions them together as one coordinated stack.
    • Automatic detection: Services with a build: become apps, image:-only services become standalone apps, and services tagged as managed (e.g. postgres, redis) are provisioned as managed Miget databases/caches with their connection variables injected for you.
    • Git-driven reconcile: A stack tracks a branch; every deploy re-reads the compose file and reconciles the changes - adding new services, updating changed ones, and cleaning up removed ones.
    • Guided wizard: Pick a repo, review detected services and required environment variables, choose a resource, and deploy - with a capacity check before anything is created.

👥 Workspace Roles & Activity Feed

  • Granular Workspace Roles: Finer-grained workspace permissions let admins grant members exactly the access they need across apps, resources, projects, buckets, and workspace settings.
  • Activity Feed: Event visibility is now role-aware, and entries carry more context per event.

Improvements

  • Worker Deployments: The deployments view now shows the complete history for worker processes.

🔒 Two-Factor Recovery Codes

  • Two-Factor Recovery Codes: Download your recovery codes, and use a recovery code to regenerate a fresh set or disable two-factor authentication if you lose access to your authenticator.

Improvements

  • Clearer Errors: App-creation failures now surface a clear, actionable error message.

🗄️ PostgreSQL 18

  • PostgreSQL 18: Provision PostgreSQL 18 for new databases and add-ons.

📊 Observability & Two-Factor Authentication

  • Observability:
    • Built-in Metrics: Real-time CPU, memory, and traffic metrics for every app, viewable directly from the dashboard.
    • Streamed Logs: Live build and request logs without leaving the Miget UI.
    • Grafana Dashboards: Pre-built Grafana dashboards available out of the box for deeper analysis.
  • Two-Factor Authentication: Protect your account with a TOTP-based second factor. Compatible with 1Password, Bitwarden, Google Authenticator, Authy, and any RFC 6238 authenticator. Recovery codes are generated at enrollment.
  • Workspace-wide Two-Factor Authentication Enforcement: Workspace admins can now require two-factor authentication for all members, with a configurable grace period (Immediately, 3, 7, 14, or 30 days) before unenrolled members are blocked from the workspace. The Security panel also surfaces an aggregate count of how many members have already enrolled.

Improvements

  • Activity Feed: The per-app activity feed now captures more detail per event and supports filtering, so you can narrow down to deployments, configuration changes, or a specific contributor.

🪣 Object Storage, Database Clusters & More

  • S3-Compatible Object Storage (Buckets):
    • Bucket Management: Create and manage S3-compatible storage buckets directly from the Miget dashboard.
    • Built-in File Browser: Upload, download, rename, and organize files and folders through an integrated file browser with drag-and-drop support.
    • Presigned URLs: Generate secure, time-limited URLs for direct file access without exposing your credentials.
    • Policies & ACLs: Configure bucket-level access policies and ACLs for fine-grained permission control.
    • Credential Rotation: Regenerate S3 access credentials at any time for improved security.
  • Database Clusters with Streaming Replication:
    • PostgreSQL Replicas: Create read replicas for your PostgreSQL databases with built-in streaming replication.
    • Replica Promotion: Promote a replica to primary when needed, or connect external replicas for cross-region setups.
    • Disk Usage Monitoring: Track disk usage per database instance for better capacity planning.
  • GitHub Repository Deployments:
    • Deploy from GitHub: Connect public or private GitHub repositories and deploy directly from branches or specific commits.
    • Preview Environments: Automatically create preview environments for pull requests with configurable triggers - auto, label-based, or branch pattern matching.
    • Cleanup Policies: Set retention rules for preview environments with options for immediate cleanup, retention days, or inactivity-based removal.
    • PR Status Comments: Deployment status and URLs are automatically posted as GitHub PR comments.
  • Magic Link Authentication: Sign in with a passwordless magic link sent to your email - no password required.
  • Enterprise Workspaces: Custom plans and billing for enterprise customers with dedicated resource tracking and workspace-level configuration.
  • AI Copilot: Manage your Miget infrastructure from AI-powered editors like Cursor, Claude Code, and Windsurf using Miget Agent Skills.

✨ New Features & Enhancements

  • Advanced CI/CD with Git Integration:
    • Preview Environments: Automatically create live application instances for every GitHub pull request.
    • Auto-Deploy: Enable automatic deployments on every push to your designated production branch.
    • Deploy from Commits: Select and deploy specific commits for granular release control.
  • Enhanced Deployment Control & Visibility:
    • Real-time Build & Deployment Logs: View live-streaming logs for your builds and deployments.
    • Deployment History & Rollbacks: Access a complete deployment history and roll back to a previous version with a single click.
    • Cancel Deployments: Immediately stop a running deployment directly from the UI.
  • New Application Builder: A redesigned, multi-step process to guide you through application creation and configuration.
  • Application-level Security & Networking:
    • Basic Authentication: Secure your running applications with a username and password.
    • Port Management: Take control of your app’s networking by managing and exposing specific ports.
  • UI Refresh: Implemented numerous design tweaks and improvements across the platform for a more polished and consistent user experience.

🚀 Public API & Status Page Now Live

  • Public API: The Miget Public API is now available. You can now programmatically manage applications, services, and resources to automate deployments, handle configurations, and integrate Miget into your CI/CD pipelines. For more details, see the API Reference.
  • Status Page: We’ve launched a new status page at status.miget.com to provide real-time monitoring of all Miget services and track incident reports.

📦 December Update: Container Registries, Workspaces & More

  • Container Registry Deployments: You can now deploy applications directly from various container registries, including Docker Hub, GitHub CR, GitLab CR, AWS ECR, and any other Docker V2 compatible registry.
  • Registry Auto-Sync: Enable “Auto-Sync” to have Miget automatically redeploy your application whenever a new image is pushed to your connected registry, without requiring webhooks.
  • New Checkout & Billing UI: The billing and checkout process has been completely redesigned for a more integrated experience, featuring a self-hosted checkout page, a unified view for payment methods and invoices, and the ability to retry failed payments.
  • New Documentation: The official documentation has been rewritten for better clarity and now includes more examples and step-by-step guides.
  • Open Source Program: We now offer free hosting for qualifying open-source projects.

🔄 Application Cloning

  • Full Application Duplication: A new feature to create complete replicas of your applications, including configuration, addons, environment variables, and deployment settings.
  • Flexible Deployment Modes: Cloned apps can be built from source or use the parent’s container image for instant deployments, which is ideal for staging environments. An auto-sync option keeps the cloned app updated with the parent’s latest image.
  • Selective Data Cloning: You can now choose to clone data for PostgreSQL databases and Storage volumes, creating fully populated environments instantly.

🔒 Secret Files Management

  • Securely Manage Sensitive Files: You can now securely manage configuration files, certificates, and other sensitive data as “Secret Files.”
  • Encrypted & Auto-Mounted: Files are encrypted at rest and automatically mounted into your running applications at runtime, with changes applied instantly without a full redeploy. This feature is available in your Project or Application settings.

🗄️ Shared Storage for Multi-Instance Apps

  • Centralized, Shareable Volumes: The new “Shared Storage” feature allows multiple application instances or different applications to read and write to the same storage volume simultaneously.
  • Use Cases: This is ideal for high-availability deployments, file sharing between services (e.g., web servers and workers), and centralized backups or logs.
  • Flexible Mounting: You can create a shared storage volume and mount it to your applications as needed, with quotas managed at the service level.