Changelog
See what's new with Windmill.
November 2024 - v1.431.0
October 2024 - v1.413.0
September 2024 - v1.398.0
August 2024 - v1.388.0
July 2024 - v1.370.0
June 2024 - v1.347.0
May 2024 - v1.340.0
April 2024 - v1.320.0
March 2024 - v1.298.0
February 2024 - v1.280.0
January 2024 - v1.252.0
December 2023 - v1.227.0
Cloud and enterprise users can now set a custom public URL for their app
New features
- Set a custom public URL for your app
Enterprise users can now search jobs and logs using our new indexer service powered by the rust search engine Tantivy
New features
- Updated helm charts to run the indexer service and enable full text search
- Search jobs from anywhere, querying path, args, results or even job logs
- Minimal grafana-like tool to explore service logs
You can now force the dark or light theme for your app.
New features
- Force dark theme
- Force light theme
- Automatic mode that will match the system color scheme
Enterprise users now have access to a dedicated dashboard for tracking feature requests and issues.
New features
- Private issue tracking dashboard
- Feature request tracking
- Automatic email and Slack/Discord notifications
- GitHub integration for issue tracking
- Release tracking and notifications
Support for Kafka triggers to run jobs when messages are received.
New features
- Add support for Kafka triggers to run scripts and flows when messages are received from Kafka topics
- Kafka triggers run on the server side without consuming worker resources
New pricing
PricingWe've updated our pricing to make it more transparent and easier to understand.
New features
- Compute-based pricing with compute units (2 worker-gb-month)
- Flexible worker memory allocation (1GB, 2GB, or >2GB)
- Per-seat pricing with half-price operator seats
Critical alerts notifications are now displayed in the UI.
New features
- Critical alerts notifications are now displayed in the UI
Windmill AI now supports Mistral's Codestral and Anthropic's Claude 3.5 models.
New features
- Added support for Mistral Codestral model
- Added support for Anthropic Claude 3.5 model
Support for websocket triggers to run jobs when messages are received.
New features
- Connect to websocket servers and trigger scripts/flows when messages are received
- Support for both static websocket URLs and dynamic URLs generated by scripts/flows
- Configure initial messages for authentication or subscriptions
- Filter incoming messages using JSON path matching
- Server-side listening without consuming worker resources
Worker autoscaling automatically adjusts the number of workers based on your workload demands.
New features
- Automatic worker scaling based on workload demands
- Configurable min/max worker limits
- Support for custom scaling scripts
- Occupancy-based scaling decisions
- Cooldown periods to prevent scaling thrashing
- Detailed autoscaling event logging
Frontend script helper to download a file from a url, base64 encoded string, dataUrl or S3 object.
New features
- Download a file from a url, base64 encoded string, dataUrl or S3 object.
Deno has been updated to 2.0.0 in Windmill.
New features
- Deno 2.0 runtime
Critical alerts for jobs waiting in queue.
New features
- Add functionality to monitor job queues and trigger alerts for waiting jobs, with UI for alert management in enterprise feature.
- The "cooldown" parameter determines the minimum duration between two consecutive alerts if the number of waiting jobs are fluctuating around the configured threshold.
Components can be moved inside containers by holding ctrl/cmd and clicking on the component.
New features
- Adds drag-and-drop functionality for moving components between subgrids with visual feedback in the frontend grid system.
Introducing the Quick Access Menu—a streamlined solution that centralizes all key features previously scattered across side panels. Now, you can benefit from the full potential of search, enhanced by intuitive filters, all in one place.
New features
- Powerful Searchbar: Instantly locate flows, scripts, flow logic, or generate new AI scripts.
- Smart Filters: Easily explore components from both the Hub and your Workspace.
- Keyboard Navigation: Quickly select components.
The goal was to be able to build and run workers on Windows without the need of Docker or WSL.
New features
- Add Windows support for workers by updating executors and environment configurations for compatibility.
Windmill supports custom HTTP routes to trigger a script or flow.
New features
- Trigger a script or flow via a custom HTTP route.
- Use a preprocessor to transform the request before it is passed to the runnable.
You can now set progress of script execution from within the script (Python and TypeScript)
New features
- setProgress
- getProgress
You can now edit directly the YAML of flows within the flow editor.
New features
- Edit flow metadata.
- Edit steps ids.
- Edit steps options.
- Edit steps code.
Get a notification everytime on critical events such as when a job is re-run after a crash.
New features
- Get email or Slack notifications for critical events such as everytime a job is re-run after a crash.
- You can set an alert to receive notification via Email or Slack when the number of running workers in a group falls below a given number.
See the logs of any workers or any servers in the service logs of the search modal.
New features
- View logs from workers, servers, and indexers directly in the service logs section.
- Monitor logs in real-time with a 1-minute latency.
- Visualize logs and errors with dedicated graphs for log count and error count.
Windmill now supports Rust scripts.
New features
- Write your Windmill script in Rust.
- Run your Rust scripts locally or in the cloud.
Code editor (in scripts, flows or apps) supports Vim mode (disabled by default).
New features
- Enable Vim mode from code editors.
- Status bar at the bottom of the editor to show modes.
Hide panels on App editor with buttons and shortcuts.
New features
- Hide Output panel (left) with shortcut `⌘ + B` / `CTRL + B`.
- Hide Runnable panel (bottom) with shortcut `⌘ + L` / `CTRL + L`.
- Hide Component panel (right) with shortcut `⌘ + U` / `CTRL + U`.
On approval steps, a new toggle to continue flow execution on disapproval of approval step. If set, instead of failing the flow will bubble up the error and continue.
New features
- New toggle to continue flow execution after disapproval.
- Would allow to put a branchone right after to handle both cases separately.
- New toggle to continue flow execution after disapproval.
- If any disapproval/timeout event is received, the resume payload will be similar to every error result in Winmdill, an object containing an `error` field which you can use to distinguish between approvals and disapproval/timeouts.
Scripts and flows can now be triggered by the delivery of an email.
New features
- Enable scripts and flows to be triggered by incoming emails via SMTP.
- Provide unique email addresses for script and flow triggers, which deliver email content in both raw and parsed formats to the user scripts.
App header is now a component default for all apps, that can be moved, modified or deleted.
New features
- Previous app header (with Recompute, Hide bar on view and Author) has been depreciated.
- App context Summary.
- New component Recompute all to recompute app once or at given frequency.
- New component Topbar with a Text component with ctx.summmary and a Recompute all component.
- Top bar component is default for all apps (can be moved or deleted).
We've made our runtime that we've called "REST" and "nativets" support npm packages and relative imports! There is now no difference in the syntax of TypeScript/Bun scripts and native scripts. Native scripts still only support a subset of what node supports (just the fetch operation) but many npm packages can still be used because that's all they use under the hood (for instance, windmill-client and axios).
How to activate? Just add //native
to the head of your script. Windmill will automatically convert between 'nativets' and 'Bun' scripts based on the presence of this header so you can always just pick TypeScript (Bun) and decide at the end if you want to accelerate it with 'native' if possible.
We've also changed the default docker-compose/helm template to go from 4 small native workers with each 1 subworker to 1 bigger native worker with 8 subworkers as it performed better in our benchmarks. If you need more throughput, simply increase the replicas of the native workers, don't increase the number of subworkers past 8 as the interleaving will result in lower throughput.
This is a huge improvement as you can now make our native runtime an implementation details and we can unify everything under the standard "TypeScript" language without anything Windmill-specific. Legacy native/fetch scripts will still work but the new REST button now simply prefill a Bun script with a //native
header.
Native runtime is great for scripts that are doing simple fetch and require little compute but are io-bound on the response from the API. You can get parallelization of 8 requests/scripts at a time with a single worker, resulting in 8x better throughput between Bun and native scripts at scale.
New features
- Support for npm packages and relative imports in `REST` and `nativets` runtimes.
- Unified syntax between TypeScript/Bun scripts and native scripts.
- Automatic conversion between `nativets` and `Bun` scripts based on `//native` header.
- Improved scaling strategy with a single bigger native worker managing more subworkers.
- Legacy scripts compatibility while promoting new REST standard with pre-filled Bun script templates.
- Parallelization capabilities allowing 8 simultaneous fetch operations.
Windmill now pre-bundles TypeScript (Bun) scripts using Bun bundler and caches them on S3 and locally at deployment time. Furthermore, if a Bun script is run while not being pre-bundled, it will be re-bundled. This will increase stability and optimize (in some cases with 60% improvement) the execution time and the memory consumption, in particular for scripts with many/heavy imports and relative imports.
We also did improvements for non-deployed scripts using better caching strategies for the dependency cache. You cannot do any faster than running a pre-bundled script aside from having the script being already running which is what dedicated workers are made for. This makes Windmill the fastest platform to run TypeScript.
However, in very rare cases (< 1%), this might break existing bun scripts that are incompatible with being bundled. If you notice such issue for a particular script after the upgrade, add //nobundling to the top of the script.
New features
- TypeScript Bun scripts are automatically pre-bundled.
- Cold start improvement.
- Memory usage improvement.
Dynamic select is an helper function within scripts that allows you to create a select field with dynamic options.
New features
- Create dynamic select fields within scripts.
- Options within the select field can dynamically change based on input arguments.
- Support for TypeScript and Python.
- Conditional logic within the function to filer and sort select options based on specified conditions.
Improved the flow status viewer readability.
New features
- Improved dark mode theme.
- You can now pick the iteration to view from directly in the graph.
- For branchall, branchone, while loop and forloops, the status of the branch/iteration is now displayed in the top node. For instance, for branchone, it will also allow you to know which branch was picked.
- Now the color of the forloop itself corresponds to the entire forloop status and not the iteration. The iteration status is in the "Do one iteration" block.
- The forloop detail page now lists every iteration status, even if you have a thousand one without having to load them all.
- The nodes such as forloop and branchall that collect multiple results now show separately the collection of the results of all subflows and the result of the selected branch/iteration.
Full-text search on runs using tantivy and command palette for quick actions.
New features
- Integrated Search bar in every workspace, accessible via `Ctrl + K` on PC and `⌘K` on Mac, or through the sidebar Search button.
- Direct navigation capabilities from the Search bar to various sections including Home, Runs, Variables, Resources, and Schedules.
- Advanced search features using special keys to search across completed runs, script content, and logs, with content search limitations in non-Enterprise editions.
The Navbar component facilitates control over an app by changing its ctx.query and jumping into another app.
New features
- Change the behavior of the app by manipulating the query arguments and hash of the URL.
- Open an external URL in a new tab.
- Open another Windmill app, which allows for creating embedded apps where the user navigates between several of your Windmill apps.
Flows now have versions just like scripts and apps.
New features
- Versions for flows.
- Redeploy Scripts, Flows, Apps from past version.
- Fork Scripts, Flows, Apps from past version.
- Deployment message for Scripts and Flows.
Added new type of input `oneOf@, that displays an option between multiple objects.
New features
- OneOf support in TypeScript scripts and their auto-generated UIs.
- OneOf support in flow inputs and their auto-generated UIs.
- OneOf support in any UI-built schema
Windmill now automatically tracks relative imports in Bun and Python such that if you update a common dependency and update its imports, it will now re-trigger deployment and lockfile computation of all the scripts that depend on it (it was working for Python but not Bun before).
Windmill can now also track such imports in inline scripts of flows and will surgically update the inline lockfiles of those flows if the relative imports change.
New features
- Automatic re-trigger of deployment and lockfile computation of all the scripts that depend on Bun script.
- When doing `wmill sync pull`, the wmill-lock.yaml will now automatically be updated, avoiding re-triggering lockfile computation for all files, only the ones that have changed from last sync.
- Flows inline lockfile can now be updated locally using `wmill flow generate-locks`, which is the equivalent of `wmill script generate-metadata --lock-only` but for flows` inline scripts.
We have released our new Windmill Billing Portal https://portal.windmill.dev/.
You can access your Portal from your Instance settings, in the "Core" tab. Or by visiting https://portal.windmill.dev/, entering your email and then accessing the link sent via email. Update contact information, billing details and subscription (seats & workers) from the portal. From there, you can also enable/disable any time automatic renewal and automatic debit (therefore payment by invoice).
In the Usage section, you can find the seats of workers usage of your Prod instance, and check whether your use of Windmill corresponds to your subscription. There is a ‘Report an error’ button, please use it if reported usage is incorrect.
It's also an opportunity for us to explain our new way of managing license keys for self-hosted instances.
As you know, when you subscribe to Windmill, you receive a license key to enter in the instance settings. Now, this key automatically updates every day as long as the subscription is valid. A key is valid for 35 days and expires as soon as an updated key replaces it. This system relieves you from having to worry about your key expiring. Now everything is automatic as long as your subscription is valid. You can still contact us for exceptions.
New features
- Windmill Billing Portal available at https://portal.windmill.dev/
- See info on subscription and usage.
- Update contact info from your portal.
- Update subscription and billing details.
- Automatic license key renewal.
Read and write from a storage that is not your main storage by specifying it in the S3 object as "secondary_storage" with the name of it.
New features
- Add additional storages from S3, Azure Blob, AWS OIDC or Azure Workload Identity.
- From script, specify the secondary storage with an object with properties `s3` (path to the file) and `storage` (name of the secondary storage).
Windmill AI has been upgrading from GPT 4 and GPT-3.5-turbo to GPT-4o
New features
- Faster execution.
- You do not need to change your existing OpenAI resource.
Apps are executed on behalf of publishers and by default cannot access viewer's resources.
If the resource passed here as a reference does not come from a static Resource select component (which will be whitelisted by the auto-generated policy), you need to toggle "Resources from users allowed".
The toggle "Static resource select only / Resources from users allowed" can be found for each runnable input when the source is an eval.
New features
- By default, dynamic resource input from app runnables can only be filled from components Resource Picker.
- With a toggle on each dynamic resource input, you can allow to pass resources from user or scripts & flows outputs.
Obversability around concurrent jobs has been improved from the Runs menu.
New features
- Filter jobs by their Concurrency Key.
- Graphical view can be set to Concurrency (instead of Duration by default), allowing to see the number of concurrent jobs at a given time.
When set to full height, a component (in its respective view type, desktop or mobile) components will have their height go down until the end of the parent container (if no, canvas).
New features
- Full Height, Desktop mode
- Full Height, Mobile mode
PHP is now supported as a primary language along TypeScript, Python, Go, Bash, or SQL languages.
New features
- PHP support.
Rest scripts are in fact TypeScript fetches. They support all the normal signatures of normal TypeScript but only stdlib JavaScript and the fetch operations. Imports are not allowed. But now the full wmill API is supported.
New features
- wmill API is now supported by nativets/REST scripts with `import * as wmill from "./windmill.ts"`
You can visualize metrics for Delayed jobs per tag and Queue delay per tag.
New features
- Metrics for Delayed jobs per tag
- Metrics for Queue delay per tag
Latest CLI and Git sync have 2 major improvements:
1. Wherever there is a lockfile (in scripts, flows and apps), the lockfile is now stored in a separate file (<same_path_as_script_or_inline_script>.lock
) and referenced in the yaml by !inline <path of lock>
. We had numerous feedback from EE customers that the lockfile were hard to diff and added lots of boilerplate to otherwise clean yaml files.
2. Script in apps (even frontend scripts) are now stored in separate files, similar to what is the case for flows. Which mean now apps are their own folders:myapp.yaml
-> myapp.app/app.yaml
+ myapp.app/inline_script1.ts
+ myapp.app/inline_script1.lock
+ ...
This will improve greatly the ability to use commits/PR to review scripts, flows and apps changes.
To do a clean update:
- Upgrade Deno.
- Upgrade wmill CLI to latest.
- Do a wmill sync pull and push to your repo.
-update the CLI used to 1.320.3 in your GitHub actions.
- Update your git sync script (we've made that easier, just click button and save git settings).
New features
- Scripts pulled locally come with a .lock file (separated from metadata file).
- Script in apps are now stored in separate files.
The AgGrid infinite table component allows you to display an Ag Grid table with infinite scrolling.
New features
- Specific syntax to let component manage rows display.
- Search function.
Labels allow to add static or dynamic tags to jobs with property "wm_labels" followed by an array of strings (e.g. return {"wm_labels":["showcase_labels", "another_label"]}
New features
- Runs are tagged with labels.
- For scripts and flows.
- Labels can be filtered from Runs menu.
- Jobs support multiple labels.
- In Runs menu, click on a Label to filter by it.
AgGrid and Database studio rows now support actions, components that will be displayed at each row of the table.
New features
- Support the following components:
- Button
- Toggle
- Select
While loops execute a sequence of code indefinitely until the user cancels or a step set to Early stop stops.
New features
- The loop will continue to run until canceled, either manually or with an Early stop for step or loop.
- Skip failure mode.
- Test and iteration.
When enabled, the flow will continue to the next step after going through all the retries (if any) even if this step fails.
New features
- The flow will continue to the next step after going through all the retries (if any) even if this step fails.
- This enables to process the error in a branch one for instance.
- By default, each step is set to "Stop on error and propagate error up".
Improved the experience with approval steps.
New features
- You can now remove the deny button from approval page to force more complex patterns using forms with enums processed in ulterior steps.
- Now approval steps resume forms at any level will be displayed at the top-level, regardless of their depths.
- We have updated the default template and there is a new field description to add very clear instructions which support the whole range of of rich display rendering.
Map support in Rich display rendering.
New features
- Display a map from lat and long.
- Marker with specific location and colors.
- Example: `return { "map": { lat: 40, lon: 0, zoom: 3, markers: [{lat: 50.6, lon: 3.1, title: "Home", radius: 5, color: "yellow", strokeWidth: 3, strokeColor: "Black"}]}`
We now support GH flavored markdown for description of scripts, flows, resources.
New features
- Markdown support for scripts descriptions.
- Markdown support for flows descriptions.
- Markdown support for resources descriptions.
You can set and retrieve a value given a key from any step of flow and it will be available from within the flow globally.
New features
- Set custom flow states from any step.
- Retrieve custom flow states from any step.
- Supported in TypeScript and Python.
From Variables tab, admins can create custom contextual variables that will act as env variables for all jobs within a workspace.
New features
- Create custom contextual variables that will act as env variables for all jobs within a workspace.
- For admins only.
- We still recommend using user-defined variables but in some cases (e.g. your imports depend on env variables), this might be a good escape hatch.
One of our large scale customers noticed that their database disk usage was much much higher than they anticipated. After investigation, we realized that our use of the database for streaming was very suboptimal in a few ways due to the nature of update in postgres. When you update a row in Postgres, it will actually keep the prior row as a dead tuple until it is collected. It doesn't matter in much case but it will if you're appending a few log lines to a 25MB log row, every 500ms.
We have completely refactored the way we deal with logs in major ways and starting on 1.295.0 you should feel comfortable having extremely large logs on Windmill
First action we took was to extract the logs from the queue table to a separate table. That was to avoid update unrelated to logs creating dead tuples. Second action was to make the streaming rate from the worker adaptive to the duration of the job, a longer job does not need to update its log every 500ms, every 2.5s is reasonable for jobs of more than 10s, 5s for 60s+, etc...
But that was still not enough, even every 2.5s an update on a 25mb log would create lots of heavy dead tuples. And 25MB is not that large, our customer should feel confident streaming GBs of logs per job with jobs that run for months.
So we completely revisited the way we store logs to only treat the database as a buffer for streaming purpose rather than long term storage. We keep the db as a 5000 char buffer to still provide the same instant preview as before but
1. On EE, the logs will be streamed to S3 if you connected your instance to S3, everything is seamless and you can still download the entire log, Windmill will take care of streaming from S3
2. non EE, the excess log (>10000 chars) will be stored on disk of the worker (mount /tmp/windmill/logs to persist those).
Now the db only stores at most 5Kb of logs per job rows, reducing the pressure on it by order of magnitudes, while users can now run jobs with unlimited logs with minimal impact on the worker or db. And the logs are still as live as before
New features
- Logs moved to a separate table to reduce database clutter.
- Adaptive log update frequency based on job duration to lessen database load.
- Database used as a buffer for instant log previews, storing up to 5000 characters.
- S3 streaming for EE users and local storage for non-EE users for extensive logs.
- Significantly reduced database pressure, supporting unlimited log sizes with minimal impact.
On self-hosted instances, workspaces can have names and IDs updated from the workspace settings.
New features
- Change name and/or ID of each workspace.
- For admins only.
Windmill supports many languages, but organizations usually only use a few, now you can configure the languages that are visible and their order.
New features
- Applies to scripts, flows and apps.
- Global to all users within a workspace.
- Only configurable by admins.
Flows are not the only way to write distributed programs that execute distinct jobs. Another approach is to write a program that defines the jobs and their dependencies, and then execute that program. This is known as workflows as code.
New features
- Define workflows as code in a single script intuitive and lightweight syntax.
- Support for Python.
- Support for TypeScript.
Pin database resource path directly within a SQL script instead of filling it through the UI.
New features
- Use "-- database resource_path" in your script.
- Works with PostgreSQL, MySQL, BigQuery, Snowflake, MS SQL, GraphQL.
The Flow & metadata copilot is an assistant powered by an OpenAI resource that simplifies your script & flows building experience by population fields (summaries, descriptions, step input expressions) automatically based on context and prompts.
New features
- Fills summary of script & flow steps.
- Links flow step inputs to previous steps results.
- Fills flow loops iterator expressions from context.
- Completes branches predicate expressions from prompts.
- Defines CRON schedules from prompts.
All secrets of a workspace are encrypted with a symmetric key unique to that workspace. This key is generated when the workspace is created and is stored in the database in the workspace_settings. You can now manually update the encryption key of a workspace, it will be re-encrypted with the new key and the previous key will be replaced by the new one.
New features
- Manually update the encryption key of a workspace.
If configured, users who are operators in this workspace will be redirected to this app automatically when logging into this workspace.
New features
- Set an app to pop up when an operator logs into the workspace.
- Make sure the default app is shared with all the operators of this workspace before turning this feature on.
Added rich results render for arrays of objects and markdown in scripts and flows.
New features
- Support for arrays of objects.
- Download as CSV and JSON.
- Pagination.
- Hide/show columns.
- Search and filter.
- Support for markdown.
Introducing the Database studio, a web-based database management tool that leverages Ag Grid for table display and interaction. In apps, interaction with database content made easy; from a SQL resource, display, edit, add rows, delete rows ... and connect to other components.
New features
- Display the content of a table.
- Edit the content of a table by directly editing the cells (only when the cell is editable).
- Add a new row.
- Delete a row.
- Support of Postgresql, MySql, MS Sql, BigQuery, Snowflake.
Windmill provides a true NodeJS compatibility mode using Bun. This means that you can run your existing NodeJS code without any modifications. Only comment //nodejs
on the first line of your Bun script.
New features
- Node.js support without any code modification.
The Ag charts component integrates the Ag charts library, enabling the visualization of data through various chart types. This component is designed to offer a flexible and powerful way to display data graphically within the application.
New features
- Chart Display: Leverages the Ag charts library to present data in a visually appealing chart format.
- Diverse Chart Types: Supports multiple chart types including Bar, Line, Scatter, and both Area & Range Bar that are exclusive to Enterprise Edition (because Ag charts key needed).
This app component allows you to create a decision tree controlled by a flow-like structure. Each node in the tree represents a decision point with a dedicated subgrid and can lead to one or more subsequent nodes based on specified conditions.
New features
- Each node has its dedicated container
- Condition behavior with branches
- Debug mode
- setTab to override flow-like structure