Inspected, never loaded.
A pickle can run code the moment it’s opened, so we never open yours on our servers. We read its bytes, pin the exact versions it needs, and refuse files that would run commands.
Upload a trained model, or deploy it from your notebook in one line of Python. In about four minutes you get a key-protected HTTPS address that anyone you choose can call. No Docker, no servers, no pip.
Sign in with GitHub, Google or an email link. One model free, no card needed.
Typically 1.5 to 4 minutes from upload to live. You’ll watch every step.
Step 1: deploy a trained model from a notebook with one line of Python.
Your model file never runs on our servers. Only in its own service.
Nine frameworks, with packages pinned from what your file itself says. Upload the file, or let the Python client convert it.
Models and pipelines, including pandas column transformers. MLGatee installs the scikit-learn version your file was saved with.
mlgatee.deploy(model, name="iris")installs: scikit-learn at the version saved in your fileSelect a framework to see how it deploys
Not on the list? See what’s coming, and how to convert it today
Deploying is the easy part. Here’s everything that’s there after, including when something goes wrong.
A pickle can run code the moment it’s opened, so we never open yours on our servers. We read its bytes, pin the exact versions it needs, and refuse files that would run commands.
import os, requests url = "https://mlg-iris-7f3a9c21.onrender.com/predict" key = os.environ["MLGATEE_KEY"] res = requests.post(url, headers={"Authorization": f"Bearer {key}"}, json={"input_data": [[5.1, 3.5, 1.4, 0.2]]}) print(res.json()) # {'output': [0], 'model': 'iris'}
Make a new key on the model’s page. The old one keeps working until the new one is live, so nothing breaks in between. Keys are shown once and stored only as a hash.
Replacing or deleting one model never touches another. On the free plan an idle model naps after 15 quiet minutes and wakes on the next call.
Calls, errors and answer times, per hour and per version, for the last 24 hours or 7 days. Never your inputs, outputs or keys.
Scroll to explore the dashboard
Modelsiris
scikit-learn · Free machine · Updated 2 h ago
Send rows of input features to /predict. Classifiers also answer /predict_proba.
export MLGATEE_KEY="paste-your-key-here"
curl -X POST https://mlg-iris-7f3a9c21.onrender.com/predict \
-H "Authorization: Bearer $MLGATEE_KEY" \
-H "Content-Type: application/json" \
-d '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'$env:MLGATEE_KEY = "paste-your-key-here"
$body = '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'
Invoke-RestMethod -Method Post -Uri "https://mlg-iris-7f3a9c21.onrender.com/predict" `
-Headers @{ Authorization = "Bearer $env:MLGATEE_KEY" } `
-ContentType "application/json" -Body $bodyimport json, os, urllib.request
KEY = os.environ.get("MLGATEE_KEY") or "paste-your-key-here"
request = urllib.request.Request(
"https://mlg-iris-7f3a9c21.onrender.com/predict",
data=json.dumps({"input_data": [[5.1, 3.5, 1.4, 0.2]]}).encode(),
headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=120) as response:
print(json.loads(response.read())["output"])15:11:12 [deploying] Server started on Python 3.12
15:11:14 [live] Version 3 is live
15:11:15 [live] Monitoring: reporting
https://mlg-iris-7f3a9c21.onrender.commlg_live_••••••••a3f1The full key is shown only once, when it’s created.
Calls, errors and answer times, reported by the model about once a minute.
| Version | Calls | Errors | Slowest 5% |
|---|---|---|---|
v3 answering now | 412 | 0.5% | 11 ms |
v2 | 236 | 1.7% | 14 ms |
Counts and answer times only: MLGatee never records what is sent to your model or what it answers.
The 3 newest versions are kept, so you can roll back to them.
| Version | File | Live | Actions |
|---|---|---|---|
v3 Answering now | scikit-learn · 3.1 KB | Live 2 h ago | |
v2 | XGBoost · 41 KB | 3 days ago, replaced 2 h ago | |
v1 | CatBoost · 88 KB | 5 days ago, replaced 3 days ago |
A rollback becomes a new version built from the earlier file. Same address, same key.
Send rows of input features to /predict, in the same order the model was trained on. Classifiers also answer /predict_proba.
export MLGATEE_KEY="paste-your-key-here"
curl -X POST https://mlg-iris-7f3a9c21.onrender.com/predict \
-H "Authorization: Bearer $MLGATEE_KEY" \
-H "Content-Type: application/json" \
-d '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'$env:MLGATEE_KEY = "paste-your-key-here"
$body = '{"input_data": [[5.1, 3.5, 1.4, 0.2]]}'
Invoke-RestMethod -Method Post -Uri "https://mlg-iris-7f3a9c21.onrender.com/predict" `
-Headers @{ Authorization = "Bearer $env:MLGATEE_KEY" } `
-ContentType "application/json" -Body $bodyset MLGATEE_KEY=paste-your-key-here
curl.exe -X POST "https://mlg-iris-7f3a9c21.onrender.com/predict" ^
-H "Authorization: Bearer %MLGATEE_KEY%" ^
-H "Content-Type: application/json" ^
-d "{\"input_data\": [[5.1, 3.5, 1.4, 0.2]]}"import json, os, urllib.request
KEY = os.environ.get("MLGATEE_KEY") or "paste-your-key-here"
request = urllib.request.Request(
"https://mlg-iris-7f3a9c21.onrender.com/predict",
data=json.dumps({"input_data": [[5.1, 3.5, 1.4, 0.2]]}).encode(),
headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=120) as response:
print(json.loads(response.read())["output"])const KEY = process.env.MLGATEE_KEY || "paste-your-key-here";
const response = await fetch("https://mlg-iris-7f3a9c21.onrender.com/predict", {
method: "POST",
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ input_data: [[5.1, 3.5, 1.4, 0.2]] }),
});
console.log((await response.json()).output);The sample body is the iris example (4 numbers); replace it with your own model’s features. On the free machine the model sleeps after 15 minutes without requests, and the next request can take about a minute.
Everything that happened to this model, newest last. Times are in your time zone.
15:09:02 [uploading] Upload link created (single use)
15:09:04 [uploading] model.pkl received · 3.1 KB
15:09:05 [inspecting] Reading the bytes, without loading the model
15:09:06 [inspecting] Found scikit-learn 1.9.1 · numpy 2.5.3
15:09:06 [inspecting] Nothing in this file runs when it loads
15:09:08 [deploying] Created its own service: mlg-iris-7f3a9c21
15:09:40 [deploying] Installing scikit-learn==1.9.1 numpy==2.5.3
15:10:52 [deploying] Fetching the model through a short-lived link
15:11:12 [deploying] Server started on Python 3.12
15:11:14 [live] Version 3 is live
15:11:15 [live] Monitoring: reporting
mlg_live_••••••••a3f1The full key is shown only once, when it’s created.
The model rebuilds with a new key. The old key keeps working until the rebuild is live.
Removes its service, its files and its record. The address stops answering.
Same address. Same key. Every version.
Roll back in one click, or one line of Python, to any of your three newest versions. Same address, same key, so nothing that calls it has to change.
>>> mlgatee.deploy(net, name="digits",
... example_input=X[:5], task="classifier")
converting PyTorch → ONNX (opset 18)
checking against the original… same answers
uploading · inspecting · building
✓ live https://mlg-digits-…onrender.com (version 1)
Sign in once with an access token, then call mlgatee.deploy(model). Keras and PyTorch models are converted in your own Python and checked against the original first.
Files up to 50 MB. Pickle, joblib, XGBoost .json and .ubj, .onnx and .tflite.
Exact versions. Packages are pinned from what the file itself says.
Notebook classes caught. A plain message explains the fix before anything builds.
Keys shown once. Stored only as a hash and the last four characters.
New key any time. The old key keeps working until the rebuild is live.
Probabilities too. Classifiers also answer /predict_proba.
Five things we won’t do, and what we do instead.
We read its bytes to find what it needs. It only ever runs inside its own service.
You see it once. We store a hash and its last four characters.
Monitoring counts calls and times them. What you send and what comes back is never recorded.
Every pin is checked against a strict pattern before it reaches a build.
Files up to 50 MB, a 15-minute nap on the free plan, frameworks that still need converting. They’re all written down.
Skip the upload page.
mlgatee.deploy(model, name="iris")Standard library only, Python 3.9 and newer. It saves your model, checks it, and sends it through the same pipeline as the web app.
import mlgatee mlgatee.login() # once: paste an access token
mlgatee.deploy(model, name="iris")MLGatee never loads your file on its own servers. Loading a pickle can run code hidden inside it, so the inspector only reads the raw bytes to find the libraries and versions it needs, and refuses files that would run commands when loaded. Your model then runs in its own isolated service, shared with no other model.
Upload the file if it’s scikit-learn, XGBoost, LightGBM, CatBoost, ONNX or TensorFlow Lite, up to 50 MB. Keras and PyTorch models go through the Python client, which converts them and checks the answers match before uploading; small Hugging Face text models are packed with their tokenizer. Native TensorFlow, PyTorch and full Hugging Face models don’t fit the free size yet.
Roll back in one click, or one line of Python, to any of your three newest versions. The rollback is built as a new version at the same address with the same key. And if a new version fails to build, the current one simply stays live.
The free plan runs one model, which naps after 15 quiet minutes. Starter is $19 a month for one model that’s always awake; Pro is $49 a month for three. Payments aren’t open yet, so there’s nothing to pay today.
At app.mlgatee.com, with GitHub, Google or an email link. For the Python client, create an access token in the app under Settings → Access tokens and paste it into mlgatee.login() once.
See all questions, or ask us anything.
Sign in, upload a file or deploy from your notebook, and send someone the address in about four minutes.
Free plan: one model, no card needed