Download files in apps
Within your Windmill apps, you might want users to download files. There are two options: the download button, and the transformers. Both involve manipulating data URLs scheme with a Base64 encoded string.
Download button
The download button component allows you to download a file. The data source of the Download button must be a data URL scheme with a Base64 encoded string:
Transformers
A transformer is a function that alters the output of the runnable, often used to format the output.
You can then download the file from your browser with the right transformer:
// Assuming `result` is your data URL scheme with a Base64 encoded string
// Function to download the data as a file
function downloadDataAsFile(dataUrl, fileName) {
  // Create an anchor element
  const anchor = document.createElement('a');
  // Set the href to the data URL
  anchor.href = dataUrl;
  // Set the download attribute to the desired file name
  anchor.download = fileName;
  // Append the anchor to the body (required for Firefox)
  document.body.appendChild(anchor);
  // Trigger the download by simulating a click on the anchor
  anchor.click();
  // Remove the anchor from the body
  document.body.removeChild(anchor);
}
// Call the function with your data URL and a file name
downloadDataAsFile(result, 'name.file');
or if the result is just regular JSON:
// Function to download the data as a file
function downloadDataAsFile(dataUrl, fileName) {
  // Create an anchor element
  const anchor = document.createElement('a');
  // Set the href to the data URL
  anchor.href = dataUrl;
  // Set the download attribute to the desired file name
  anchor.download = fileName;
  // Append the anchor to the body (required for Firefox)
  document.body.appendChild(anchor);
  // Trigger the download by simulating a click on the anchor
  anchor.click();
  // Remove the anchor from the body
  document.body.removeChild(anchor);
}
// Call the function with your data URL and a file name
downloadDataAsFile(result, 'selected_row.md');
Here is an example of downloading a file from a button in a table.
And here is another example of a background script and a transformer automatically downloading a file upon input change (here the selected row of a table).