Changelog
See what's new with Windmill.
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
7/29/2024 |
DocsApp 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).
7/29/2024 |
DocsWe'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.
7/26/2024 |
DocsWindmill 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.
7/22/2024 |
DocsDynamic 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.
7/14/2024 |
DocsImproved 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.
7/5/2024 |
DocsThe 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.
7/4/2024 |
DocsFlows 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.
6/17/2024 |
DocsAdded 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
6/10/2024 |
DocsWindmill 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.
6/4/2024 |
DocsWe 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 & vCPUs) 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 vCPUs 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.
5/31/2024 |
DocsWith all Windmill S3 Integration features, 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).
5/27/2024 |
DocsWindmill 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.
5/27/2024 |
DocsApps 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.
5/15/2024 |
DocsObversability 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.
5/15/2024 |
DocsWhen 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
5/15/2024 |
DocsPHP is now supported as a primary language along TypeScript, Python, Go, Bash, or SQL languages.
New Features
- PHP support.
5/13/2024 |
DocsRest 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"`
5/10/2024 |
DocsYou 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
4/28/2024 |
DocsLatest 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.
4/24/2024 |
DocsThe 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.
4/24/2024 |
DocsLabels 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.
4/12/2024 |
DocsAgGrid 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
4/2/2024 |
DocsWhen 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".
4/2/2024 |
DocsWhile 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.
3/27/2024 |
DocsImproved 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.
3/27/2024 |
DocsMap 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"}]}`
3/27/2024 |
DocsWe 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.
3/26/2024 |
DocsYou 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.
3/23/2024 |
DocsFrom 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.
3/23/2024 |
DocsOne 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.
3/22/2024 |
DocsOn 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.
3/13/2024 |
DocsWindmill 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.
3/4/2024 |
DocsFlows 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.
2/27/2024 |
DocsPin 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.
2/15/2024 |
DocsThe 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.
2/15/2024 |
DocsAll 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.
1/24/2024 |
DocsIf 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.
1/23/2024 |
DocsIntroducing 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.
1/23/2024 |
DocsAdded 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.
1/15/2024 |
DocsWindmill 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.
1/11/2024 |
DocsThe 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).
12/17/2023 |
DocsThis 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