Button guide
Let non-technical colleagues run your Python web scraper they upload a URL list, press Run and download a CSV
You can use Button (https://button.bitgate.dev) to put a web form in front of the Python scraper that's already on your computer, so colleagues can upload a list of URLs, set a page limit, press Run and get a CSV back without touching a terminal. The scraper runs on your own machine with your existing browser automation, proxies and credentials, not in Button's cloud. Each run can take up to 30 minutes, and the Free plan ($0) covers 1 published tool, 3 colleagues and 100 runs a month.
How it works
Button has two parts: a web page your colleagues see, and a small runner you install on your computer (macOS, Linux or Windows). When someone fills out the form and presses Run, Button's servers relay the form values and uploaded files from their browser to the runner on your computer, the runner executes your Python script locally, and the resulting CSV goes back through Button's servers so your colleague can download it.
Nothing runs in Button's cloud. Your script runs on your machine, in the same environment where you already have your browser automation setup, proxy settings and credentials configured. Colleagues don't install Python, don't need the repo, and never pay.
And because the runner is on your machine, your computer has to be on and online when people use the tool. The tool page shows Ready, Busy or Offline so they can see right away whether it'll run.
1. Make your scraper take command-line arguments
If your script currently has a hard-coded URL list path or prompts the user with input(), swap that out for argparse. Button passes each form field to your program as a command-line argument and gives you an output directory where you write any files you want the user to download.
For a scraper that takes a text file with one URL per line and a page limit, and writes a CSV, the wrapper looks like this (run_scraper stands in for your existing code):
import argparse
import csv
import os
from my_scraper import run_scraper
parser = argparse.ArgumentParser()
parser.add_argument("--url-file", required=True)
parser.add_argument("--page-limit", type=int, default=10)
parser.add_argument("--out-dir", required=True)
args = parser.parse_args()
with open(args.url_file, encoding="utf-8") as f:
urls = [line.strip() for line in f if line.strip()]
rows = run_scraper(urls, max_pages=args.page_limit)
with open(os.path.join(args.out_dir, "results.csv"), "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(rows)
Fixed flags like --url-file, --page-limit and --out-dir are part of the command you approve during setup. Colleagues only supply the values for the form fields.
The runner invokes your program directly with no shell, every form value is passed as its own argument, and a value from a form field can't start with -. So a colleague can't inject extra flags or shell commands by typing them into the URL box.
2. Install the runner and publish the form
Once the script works from your own terminal, putting a form on it takes a few steps:
- Sign in at https://button.bitgate.dev.
- Install the Button runner on your computer using the one-line command the site shows you (it's a
curlcommand on macOS and Linux, or PowerShell on Windows). - Open the local setup page and pick your Python program and script. The runner pins the exact command you approve on that computer by hash, and that's the only command it will ever execute.
- Describe the inputs for the form. Button supports text, number, yes/no, choice and file inputs. For this scraper, you'd add a file input for the URL list and a number input for the page limit, and point the output at the folder where your script writes
results.csv. - Publish the tool and invite your colleagues. Button gives the tool its own page.
If you change the tool later, people have to confirm the new version before they run it again.
3. What your colleagues do
- They open the link from their invite email and sign in with Google or a one-time email code.
- They see whether your computer is Ready, Busy or Offline.
- They upload their URL list, type a page limit and press Run.
- When the scraper finishes, they download the CSV from the page.
Every run is logged with who ran it and when. You can revoke someone's access or set it to expire whenever you want.
Limits and pricing
Scrapers can take a while and produce decent-sized CSVs, so check the limits before you wire everything up.
| Limit or plan detail | Free ($0) | Pro ($15/month, or $144/year at $12/month) |
|---|---|---|
| Published tools | 1 | 50 |
| People (invited colleagues; you don't count) | 3 | 250 |
| Runs per month (includes your own runs) | 100 | 5,000 |
| File transfer per month | 1 GB | 50 GB |
| Max run duration | 30 minutes | 30 minutes |
| Concurrent runs per computer | 1 at a time | 1 at a time |
| Runners (computers) per workspace | 1 | 1 |
| File size limit | 25 MB per file; up to 8 files and 100 MB per run | 25 MB per file; up to 8 files and 100 MB per run |
| Logs per run | Up to 1 MB | Up to 1 MB |
| Data retention on Button's servers | Inputs deleted after 24 hours, outputs after 7 days | Inputs deleted after 24 hours, outputs after 7 days |
Recipients never pay, and if you go to Pro and later downgrade to Free, downgrading deletes nothing.
When another tool is the better choice
Button is built for running a script on your own machine when a colleague clicks a button. It's the wrong fit in a few situations:
- A single scrape takes longer than 30 minutes, or produces a CSV over 25 MB (or more than 100 MB across up to 8 files in a single run). You'll want to either make the page limit smaller or run the job outside Button.
- Several colleagues need to run slow scrapes at the same time. A workspace has one computer (runner), and that computer runs one job at a time; while a 20-minute scrape is going, the page shows Busy for everyone else.
- You close your laptop all day and don't have an always-on desktop or workstation you can pair as the runner. If your computer is asleep or offline, the tool page shows Offline and runs can't start.
- You need the scraper to run on a timer overnight or be triggered by another system, rather than a person filling in a form and pressing Run; a cron job or a scheduler like Windmill fits that better.
FAQ
Does my scraper run in Button's cloud?
No, jobs always run on your own computer, so your local Python environment, browser automation setup, proxies and credentials work the way they do when you run the script yourself. Button's servers only relay the form inputs and output files between your colleague's browser and your computer.
How long does Button keep the uploaded URL lists and output CSVs?
Input files and values are deleted 24 hours after a run ends, and output files are deleted after 7 days.
What happens if I want to move the scraper to a different computer?
Each workspace has one runner at a time, on both Free and Pro. You can pair a new computer whenever you like, and pairing the new one replaces the previous computer.
Do I need to rewrite my scraper in a specific framework?
No. Any program that can take command-line arguments and write files works - Python, Node, R, PowerShell, shell scripts or compiled binaries.
Can a colleague pass extra flags to my Python script through the form?
No. The runner only runs the exact command you approved (pinned by hash), passes each form value as a separate argument without a shell, and blocks any form value that starts with -.
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.