For Developers · Kryptic Vault
Custom Obfuscation Use
Bring your own Lua obfuscator. Instead of (or alongside) the built-in engines, Kryptic Vault can hand your script to an HTTP API you control, then ship whatever Lua that API returns. Define the obfuscator once in Settings, then pick it for the Main script, the Init (2nd) script, or both. You're using your own infrastructure, so there's only a small 0.25 Panda Token storage fee per custom obfuscation.
How it works
A custom obfuscator is an HTTP callback. When you upload or edit a Kryptic Vault script and choose your custom obfuscator, the vault sends a single POST request to your API URL with the Lua source in the JSON body, then uses the Lua your endpoint returns as the obfuscated script body. Nothing else changes — the loader, telemetry, validation library and Panda Token economy all behave exactly as they do with the built-in engines.
0.25 Panda Token storage fee
Step 1 — Add an obfuscator in Settings
Go to Settings → Integrations → Custom Obfuscators and click Add Custom Obfuscator. Each entry has three fields:
NamestringrequiredA label you choose (1–80 characters). Shown in the obfuscator dropdown when you upload or edit a script. Purely organizational.
API URLstring (https)requiredThe endpoint Kryptic POSTs your script to. Must be https://. Internal, private and cloud-metadata hosts are rejected (see Security below).
ParametersJSON objectoptionalOptional JSON object merged into the request body on every call — the natural place for your own API token, preset name, or any flags your obfuscator expects. Stored encrypted-at-rest and never echoed back to the dashboard; leave the field blank when editing to keep the stored values.
You can save up to 10 obfuscators. Once saved, the obfuscator is reusable across all your scripts — update its URL or parameters here and the change applies the next time a script that references it is (re)obfuscated.
Step 2 — Pick it when uploading or editing
In the Kryptic Vault Upload form (or the Edit modal), the Main-script obfuscator selector now includes a Custom (BYO) card, and the Init (2nd) script selector includes a Custom option. Choose it and a dropdown of your saved obfuscators appears — select the one to use. If you haven't saved any yet, the form links you back to Settings.
The Main and Init scripts are independent: you can obfuscate the Main script with Luraph and the Init script with your custom callback, or any other combination.
The callback contract
Your endpoint receives a JSON POST. The body is your saved Parameters object with two fields added by Kryptic:
scriptstringrequiredThe full Lua source to obfuscate.
sourcestringrequiredIdentical to script — provided as an alias so endpoints that expect either field name work unchanged.
...your paramsanyoptionalEvery key from your saved Parameters object (e.g. apiKey, preset).
Example request body Kryptic sends:
{
"script": "print('hello from my script')",
"source": "print('hello from my script')",
"apiKey": "your-saved-token",
"preset": "max"
}Your endpoint must respond with the obfuscated Lua. Two response shapes are accepted:
- Raw Lua — return the obfuscated script as the plain response body (any content type).
- JSON — return an object with the Lua in any one of these keys:
obfuscated,result,code,output, orsource.
The output must actually change the script
ERROR rather than shipping unprotected code.Constraints
- HTTPS only — plain
http://URLs are rejected. - No redirects — a
3xxresponse is treated as a failure (it can't be followed to an internal host). - Port 443 only — the standard HTTPS port.
- Timeout — your endpoint must respond within ~30 seconds.
- Response size — the returned Lua is capped at ~5 MB.
- Non-empty, changed output — see the note above.
Example endpoint
A minimal obfuscator that prepends a marker comment. Replace the body with your real transformation; the request/response shape is all that matters.
import express from "express";
const app = express();
app.use(express.json({ limit: "40mb" }));
app.post("/obfuscate", (req, res) => {
// Authenticate using a value from your saved Parameters object.
if (req.body.apiKey !== process.env.MY_SECRET) {
return res.status(401).json({ error: "bad key" });
}
const source = req.body.script || req.body.source || "";
if (!source) return res.status(400).json({ error: "no script" });
// ...run your real obfuscation here...
const obfuscated = "-- obfuscated by my-obfuscator\n" + source;
res.json({ obfuscated });
});
app.listen(8080);Security
Because the URL is user-supplied, Kryptic makes the outbound request through a hardened client that defends against SSRF (server-side request forgery):
- The hostname is resolved and every resolved IP is checked — private, loopback, link-local and cloud-metadata ranges (e.g.
127.0.0.0/8,10.0.0.0/8,169.254.169.254) are blocked. - The validated IP is pinned for the connection, so a DNS record that flips to an internal address after the check can't be exploited (no DNS-rebind / TOCTOU window).
- Redirects are not followed; only HTTPS on port 443 is allowed.
- Your API URL and Parameters are never logged — only the request host and response length are recorded.
Keep your endpoint authenticated
apiKey) and check it on every request, as in the examples above.That's it