Modal Release Notes
Last updated: Mar 20, 2026
- Mar 3, 2026
- Date parsed from source:Mar 3, 2026
- First seen by Releasebot:Mar 20, 2026
1.3.5 (2026-03-03)
Modal adds a changelog CLI, programmatic Secret updates, and richer function stats for tracking running inputs, making it easier to surface release information and manage live workloads.
We’ve added a modal changelog CLI for retrieving changelog entries with a flexible query interface (e.g. modal changelog --since=1.2 , modal changelog --since=2025-12-01 , modal changelog --newer ). We expect that this will be a useful way to surface information about new features to coding agents.
We’ve added a new modal.Secret.update method, which allows you to programmatically modify the environment variables within a Secret. This method has the semantics of Python’s dict.update : Secret contents can be overwritten or extended when using it. Note that Secret updates will take effect only for containers that start up after the modification.
The dataclass returned by modal.Function.get_current_stats() now includes a num_running_inputs field that reports the number of inputs the Function is currently handling.
- Feb 23, 2026
- Date parsed from source:Feb 23, 2026
- First seen by Releasebot:Mar 20, 2026
1.3.4 (2026-02-23)
Modal adds Directory Snapshots beta for persisting sandbox directories across sessions, plus Sandbox.detach(), a wait option for terminate(), 8x faster stdin writes for Sandbox exec, and Volume.from_id() for referencing volumes by object id.
- We’re introducing “Directory Snapshots”: a new beta feature for persisting specific directories past the lifetime of an individual Sandbox. Using the new methods
modal.Sandbox.snapshot_directory()andmodal.Sandbox.mount_image(), you can capture the state of a directory and then later include it in a different Sandbox:
sb = modal.Sandbox.create(app=app) snapshot = sb.snapshot_directory("/project") sb2 = modal.Sandbox.create(app=app) sb2.mount_image("/project", snapshot)This feature can be useful for separating the lifecycle of application code in the Sandbox’s main Image from project code that changes in each Sandbox session. Files in the mounted snapshot also benefit from several optimizations that allow them to be read faster. See the Sandbox Snapshot guide for more information.
We’ve added a new
modal.Sandbox.detach()method that we recommend calling after you are done interacting with a Sandbox. This method disconnects your local client from the Sandbox and cleans up resources associated with the connection. After calling detach, operations on the Sandbox object may raise and are otherwise not guaranteed to work.The
modal.Sandbox.terminate()method now accepts awaitparameter. Withwait=True, terminate will block until the Sandbox is finished and return the exit code. The defaultwait=Falsemaintains the previous behavior.Throughput for writing to the stdin of a
modal.Sandbox.execprocess has been increased by 8x.We’ve added a new
modal.Volume.from_id()method for referencing a Volume by its object id.
All of your release notes in one feed
Join Releasebot and get updates from Modal and hundreds of other software products.
- Feb 12, 2026
- Date parsed from source:Feb 12, 2026
- First seen by Releasebot:Mar 20, 2026
1.3.3 (2026-02-12)
Modal adds a billing report CLI, promotes workspace billing report API to general availability, introduces Queue and Dict lookup helpers, enables async usage warnings by default, and fixes an ASGI state leakage bug.
- We’ve added a new modal billing report CLI and promoted the modal.billing.workspace_billing_report API to General Availability for all Team and Enterprise plan workspaces.
- We’ve added modal.Queue.from_id() and modal.Dict.from_id() methods to support referencing a Queue or Dict by its object id.
- Modal’s async usage warnings are now enabled by default. These warnings will fire when using a blocking interface on a Modal object in an async context. We’ve aimed to provide detailed and actionable suggestions for how to modify the code, which makes the warnings verbose. While we recommend addressing any warnings that pop up, as they can point to significant performance issues or bugs, we also provide a configuration option to disable them (MODAL_ASYNC_WARNINGS=0 or async_warnings = false in the .modal.toml). Please report any apparent false positives or incorrect suggested fixes.
- We’ve fixed a bug where the ASGI scope’s state contents could leak between requests when using @modal.asgi_app.
- Jan 30, 2026
- Date parsed from source:Jan 30, 2026
- First seen by Releasebot:Mar 20, 2026
1.3.2 (2026-01-30)
Modal adds dashboard access for objects, apps, and volumes, including a new .get_dashboard_url() method and dashboard CLI commands. It also lets container logs accept Sandbox IDs, shows token names in token info, and fixes stale arguments in repeated with_options calls.
Modal objects now have a
.get_dashboard_url()method. This method will return a URL for viewing that object on the Modal dashboard:fc = f.spawn() print(fc.get_dashboard_url()) # Easy access to logs, etc.There is also a new modal dashboard CLI and new modal app dashboard / modal volume dashboard CLI subcommands:
modal dashboard# Opens up the Apps homepage for the current environmentmodal dashboard <object-id># Opens up a view of this objectmodal app dashboard <app-name># Opens up the dashboard for this deployed Appmodal volume dashboard <volume-name># Opens up the file browser for this persistent Volume
You can now pass a Sandbox ID (
sb-xxxxx) directly to the modal container logs CLI.The modal token info CLI will now include the token name, if provided at token creation.
We’ve fixed an issue where
modal.Cls.with_options()(or thewith_concurrency()/with_batching()methods) could sometimes use stale argument values when called repeatedly.
- Jan 22, 2026
- Date parsed from source:Jan 22, 2026
- First seen by Releasebot:Mar 20, 2026
1.3.1 (2026-01-22)
Modal improves experimental Python 3.14t support in containers, switches Protobuf runtime handling, adds Sandbox custom domains, new token info and timestamp CLI options, and brings reliability fixes for app builds and Sandbox exec.
We’ve improved our experimental support for Python 3.14t (free-threaded Python) inside Modal containers.
The container environment will now use the Python implementation of the Protobuf runtime rather than the incompatible upb implementation.
As 3.14t images are not being published to the official source for our prebuilt modal.Image.debian_slim() images, we recommend using modal.Image.from_registry to build a 3.14t Image:
modal.Image.from_registry( "debian:bookworm-slim", add_python="3.14t" )
Note that 3.14t support is available only on the 2025.06 Image Builder Version.
Support is still experimental, so please share any issues that you encounter running 3.14t in Modal containers.
It’s now possible to provide a custom_domain for a modal.Sandbox:
sb = modal.Sandbox.create(..., custom_domain="sandboxes.mydomain.com")Note that Sandbox custom domains work differently from Function custom domains and must currently be set up manually by Modal; please get in touch if this feature interests you.
We added a new modal token info CLI command to retrieve information about the credentials that are currently in use.
We added a --timestamps flag to a number of CLI entrypoints (modal run, modal serve, modal deploy, and modal container logs) to show timestamps in the logging output.
The automatic CLI creation for modal run entrypoints now supports Literal type annotations, provided that the literal type contains either all str or all int values.
We’ve fixed a bug that could cause App builds to fail with an uninformative CancelledError when the App was misconfigured.
We’ve improved client resource management when running modal.Sandbox.exec, which avoids a rare thread race condition.
- Dec 19, 2025
- Date parsed from source:Dec 19, 2025
- First seen by Releasebot:Mar 20, 2026
1.3.0 (2025-12-19)
Modal adds Python 3.14 support, introduces experimental async-context warnings, and updates its SDK with new exception handling and API renames. This release also drops Python 3.9 support, removes a few legacy methods, and improves micromamba image Python version defaults.
Modal now supports Python 3.14. Python 3.14t (the free-threading build) support is currently a work in progress, because we are waiting for dependencies to be updated with free-threaded support. Additionally, Modal no longer supports Python 3.9, which has reached end-of-life.
We are adding experimental support for detecting cases where Modal’s blocking APIs are used in async contexts (which can be a source of bugs or performance issues). You can opt into runtime warnings by setting
MODAL_ASYNC_WARNINGS=1as an environment variable orasync_warnings = trueas a config field. We will enable these warnings by default in the future; please report any apparent false positives or other issues while support is experimental.This release also includes a small number of deprecations and behavioral changes:
The Modal SDK will no longer propagate
grpclib.GRPCErrortypes out to the user; our ownmodal.Errorsubtypes will be used instead. To avoid disrupting user code that has relied on GRPCError exceptions for control flow, we are temporarily making some exception types inherit from GRPCError so that they will also be caught byexcept grpclib.GRPCErrorstatements. Accessing the.statusattribute of the exception will issue a deprecation warning, but warnings cannot be issued if the exception object is only caught and there is no other interaction with it. We advise proactively migrating any exception handling to use Modal types, as we will remove the dependency on grpclib types entirely in the future. See themodal.exceptiondocs for the mapping from gRPC status codes to Modal exception types.The
max_inputsparameter in the@app.function()and@app.clsdecorators has been renamed tosingle_use_containersand now takes a boolean value rather than an integer. Note that onlymax_inputs=1has been supported, so this has no functional implications. This change is being made to reduce confusion with@modal.concurrent(max_inputs=...)and so that Modal’s autoscaler can provide better performance for Functions with single-use containers.The async (
.aio) interface has been deprecated frommodal.FunctionCall.from_id,modal.Image.from_id, andmodal.SandboxSnapshot.from_id, because these methods do not perform I/O.The
replace_bytesanddelete_bytesmethods have been removed from themodal.file_iofilesystem interface.Images built with
modal.Image.micromamba()using the 2023.12 Image Builder Version will now use a Python version that matches their local environment by default, rather than defaulting to Python 3.9.
- Dec 16, 2025
- Date parsed from source:Dec 16, 2025
- First seen by Releasebot:Mar 20, 2026
1.2.6 (2025-12-16)
Modal fixes a bug where iterating on a modal.Sandbox.exec output stream could raise unauthenticated errors.
Fixed bug where iterating on a modal.Sandbox.exec output stream could raise unauthenticated errors.
Original source Report a problem - Dec 12, 2025
- Date parsed from source:Dec 12, 2025
- First seen by Releasebot:Mar 20, 2026
1.2.5 (2025-12-12)
Modal adds custom Function names without serialized=True, support for launching modal shell from an Image ID, and clearer argument warnings. It also fixes shell Unicode issues and Sandbox cleanup, while improving Image directory handling and async Sandbox performance.
- It is now possible to set a custom
name=for a Function without usingserialized=True. This can be useful when decorating a function multiple times, e.g. applying multiple Modal configurations to the same implementation. - It is now possible to start modal shell with a Modal Image ID (
modal shell im-abc123). Additionally, modal shell will now warn if you pass invalid combinations of arguments (like--cputogether with the ID of an already running Sandbox, etc.). - Fixed a bug in modal shell that caused e.g.
vito fail with unicode decode errors. - Fixed a thread-safety issue in
modal.Sandboxresource cleanup. - Improved performance when adding large local directories to an Image.
- Improved async Sandbox performance by not blocking the event loop while reading from stdout or stderr.
- Nov 21, 2025
- Date parsed from source:Nov 21, 2025
- First seen by Releasebot:Mar 20, 2026
1.2.4 (2025-11-21)
Modal fixes a Sandbox exec bug and adds HTTP/2 support in modal.forward.
Fixed a bug in modal.Sandbox.exec when using stderr=StreamType.STDOUT (introduced in v1.2.3).
Added a new h2_enabled option in modal.forward, which enables HTTP/2 advertisement in TLS establishment.
- Nov 20, 2025
- Date parsed from source:Nov 20, 2025
- First seen by Releasebot:Mar 20, 2026
1.2.3 (2025-11-20)
Modal adds non-preemptible CPU Functions, smarter client retry handling for throttling, a more reliable and efficient modal.Sandbox.exec, a new modal shell --add-local flag, and fixes a Memory Snapshot bug affecting captured Modal objects.
CPU Functions can now be configured to run on non-preemptible capacity by setting nonpreemptible=True in the @app.function() or @app.cls() decorator. This feature is not currently available when requesting a GPU. Note that non-preemptibility incurs a 3x multiplier on CPU and memory pricing. See the Guide for more information on preemptions.
The Modal client can now respond more gracefully to server throttling (e.g., rate limiting) by backing off and automatically retrying. This behavior can be controlled with a new MODAL_MAX_THROTTLE_WAIT config variable. Setting the config to 0 will preserve the previous behavior and treat rate limits as an exception; setting it to a nonzero number (the unit is seconds) will allow a limited duration of retries.
The modal.Sandbox.exec implementation has been rewritten to be more reliable and efficient.
Added a new --add-local flag to modal shell, allowing local files and directories to be included in the shell’s container.
Fixed a bug introduced in v1.2.2 where some Modal objects (e.g., modal.FunctionCall) were not usable after being captured in a Memory Snapshot. The bug would result in a has no loader function error when the object was used.