Button guide

Web UI for a command-line tool turn any CLI, Node script or binary into a browser form with file inputs, without writing web code

You can give any command-line program a browser form with Button without writing a web backend. You install a local runner on your own computer, map your script's arguments to form inputs, and share the link; the program executes on your machine whenever a colleague hits Run. The Free plan is $0 for 1 published tool, 3 people, and 100 runs per month, and files up to 25 MB each work out of the box.

Comparing your options

Before you touch your script, it's worth looking at the three main ways people put a web UI in front of a CLI tool.

Writing a wrapper app (Flask or FastAPI) If you already know Python, Flask or FastAPI looks like a quick weekend job. In practice, serving a CLI tool over HTTP means writing routes and an HTML form, handling file uploads and temporary directories, putting a login in front of it, running long jobs in a background worker instead of blocking the HTTP request, and hosting the whole thing somewhere with HTTPS. Do this only if you need a completely custom interface or you're building a customer-facing product.

Self-hosted runners (OliveTin, Script Server) If you have a Linux server and want to host everything yourself for free, look at open-source runners.

OliveTin is open source, self-hosted only, and turns predefined shell commands in a YAML config into web buttons, with typed arguments (text, numbers, dates, checkboxes, dropdowns and more), local users, OAuth2 and access control lists. The catch is that it has no file upload argument; a feature request for it (issue #939) has been open since March 2026. If your tool doesn't take files and you want a YAML-driven server you run yourself, OliveTin is a good fit.

Script Server is an open-source Python web server you host yourself (Linux first, with a Docker image). It turns script parameters into form fields, including file uploads, shows live output, offers output files for download, supports LDAP, Google OAuth and htpasswd logins, and keeps execution history and audit logs. Its latest tagged release is 1.18.0 from August 2023, though the main branch still gets commits. Pick Script Server if you want self-hosted file uploads and LDAP logins.

Button Button is for when you don't want to stand up or maintain a web server at all. You run the Button runner on your own computer (macOS, Linux, or Windows), and Button's servers relay the form values and files between your colleague's browser and your machine. Jobs never run in Button's cloud. If your computer isn't on and online, the tool page shows Offline (otherwise it shows Ready, or Busy during a run, since a computer runs one job at a time). You can have one computer (runner) per workspace on every plan, and pairing a new computer replaces the previous one.

How Button passes arguments to your CLI

Button doesn't run your command inside a shell. When you set up a tool on your computer, you approve the exact command to execute, which gets pinned by hash. If you change the tool later, your colleagues have to confirm the new version before they can run it.

Because there's no shell, each form field becomes one separate argument passed straight to your program (Python, Node, R, PowerShell, shell scripts, or compiled binaries). And there's one strict rule: a form value can't start with -.

That means colleagues can't inject unexpected flags into your CLI. Any fixed flags, like --currency, are part of the base command you approve, and colleagues only supply the values for the form fields.

What your CLI expects What you put in the fixed command Button form field type What the colleague does in the browser
Input file path (nothing, or a flag like --input before the field) Files (up to 25 MB per file; max 8 files and 100 MB per run) Uploads files from their computer
--currency USD --currency Choice (e.g., USD, EUR, GBP) Picks one option from the list
--limit 500 --limit Number Enters a number
--dry-run true --dry-run Yes/No Toggles yes or no
Positional label (nothing) Text Types a text string
Output folder path --out-dir followed by the output folder No field Downloads the generated files after the run

Step-by-step: turning a CLI tool into a web form

  1. Make your script take command-line arguments instead of hard-coded paths or interactive prompts. If your script uses input() or hard-coded local paths, change it to read arguments from the command line - argparse in Python, commandArgs() in R, a param() block in PowerShell, or $1 and $2 in bash. Take each input file path as an argument, and write your results as files into an output folder that's also passed in as an argument. If a switch takes no value (like --dry-run), change it to take a value such as true or false: a form value can't start with -, so it can't add the switch itself.
#!/usr/bin/env bash
# Example: $1 is input file, $2 is currency, $3 is output folder
./process-invoices --input "$1" --currency "$2" --out "$3"
  1. Sign in and install the runner. Go to button.bitgate.dev and sign in. Run the one-line install command the site shows you to put the Button runner on your computer - it's a curl command on macOS and Linux, or PowerShell on Windows.

  2. Pick your program and map its inputs. In the local setup page on your computer, select your script or binary. Define the fixed command and add the inputs your colleagues need to fill out: text, number, yes/no, choice, or files.

  3. Publish and invite your colleagues. When you publish, Button gives the tool its own page. Send invites to the people who need it. Your colleagues open the link from their invite email, sign in with Google or a one-time email code, fill in the form, press Run, and download the resulting files when the job finishes. They don't install anything and they never pay.

Every run is logged with who ran it and when, and you can revoke access or set it to expire at any time.

FAQ

Where do the jobs and files actually go?

Jobs run on your own computer, never in Button's cloud, though form values and files do pass through Button's servers to get between the browser and your machine. Button deletes input files 24 hours after a run ends and output files after 7 days.

What are the size and runtime limits on a job?

A run can take up to 30 minutes, generate up to 1 MB of logs, and accept up to 8 files totaling 100 MB (with each file up to 25 MB). Your computer runs one job at a time.

What happens if my computer is asleep or turned off?

Your computer has to be on and online for colleagues to run your tools. When it isn't, the tool page shows Offline instead of Ready.

How much does Button cost?

The Free plan is $0 and includes 1 published tool, 3 invited people (you don't count toward the people limit, and recipients never pay), 100 runs per month (including your own runs), and 1 GB of file transfer per month. The Pro plan is $15/month, or $144/year ($12/month), and raises those limits to 50 tools, 250 people, 5,000 runs per month, and 50 GB of file transfer per month; downgrading deletes nothing.

Last updated

Put your script behind a form

Button turns a script on your computer into a web form. Colleagues sign in, fill it in, press Run and download the results. Free for 1 tool and 3 people.