Licensing Infrastructure for Developers

Sell YourSoftware.Own Everything.

A complete self-hosted licensing system — VPS-based license API, machine binding, plan enforcement, heartbeat locking, Python SDK, and a one-command installer — for under $10/month. Deploy in an afternoon. Own it forever.

install.sh
$ curl -sSL https://cdn.zenworks.co.za/zlf/install.sh | sudo bash   License key validated Package downloaded from CDN File integrity verified Python virtualenv created SQLite database initialised Systemd services installed Apache + SSL configured   ── Smoke Tests ────────────────────── /api/health → {"ok":true} /api/validate → 403 for invalid key Portal → 200 OK   Portal: https://zlf.yourdomain.com API: https://zlf.yourdomain.com/api   $
~2hfrom zero to selling
$10total monthly cost
products, one infra
0%revenue cut
01

The problem
with selling software

Most developers spend more time on licensing plumbing than on the product itself.

💸

SaaS Tax

Gumroad, Paddle, Keygen, LemonSqueezy — each takes 5–10% of every sale, plus monthly fees, just to validate a key your customer already paid for.

Costs scale with your success
🔗

Vendor Lock-in

Your license logic lives in someone else's database, behind someone else's API. When they raise prices, change terms, or go down — your app goes with them.

You don't own the keys
🏗️

Build From Scratch

Rolling your own means weeks of work — key generation, machine binding, plan limits, heartbeat threads, integrity checks, download gating, email sending.

Months of undifferentiated work
02

Built-in.
Not bolted on.

Every feature you'd eventually need, already wired together.

License Server

Your VPS. Your Rules.

The license API runs as a Flask service on your own VPS — same server as your admin portal. SQLite database, no external dependencies, no third-party accounts required. Everything lives inside your infrastructure.

Anti-Piracy

Machine Binding That Actually Works.

The first server to activate a key owns it. The machine ID is stored in your SQLite database on first activation. Every subsequent validation must match — making license sharing structurally impossible without contacting you to reset the binding.

🔒
Plan Limits

Enforced Remotely. Before Every Action.

Before a user can be added or a job started, the app calls /check/limits on your Worker. Not client-side. Not in a config file. The plan tiers are enforced on your VPS, against your database, every time.

Heartbeat Enforcement

Revoke a License. App Locks in 10 Minutes.

The SDK runs a background thread that pings your API every 10 minutes. Revoke a license from the portal — on the next heartbeat, the app calls sys.exit(1). No valid license, no running app.

Tamper Detection

Know Immediately if Code Is Modified.

Register SHA-256 checksums for every release file. The SDK sends actual file hashes on every heartbeat. If anything is modified — the app locks and the Worker logs exactly which files changed. Works for cracked copies running on different servers.

Customer Installer

One Command. Everything Installed.

Your customer runs a single curl command. The installer validates their license key, downloads the package from your CDN gate, creates the virtualenv, writes the systemd service, configures Apache, gets SSL, and starts the app. Zero manual steps.

Admin Portal

Issue. Revoke. Reset. Search.

A Flask admin portal lets you manage all licenses across all products from one place. Issue a key and it's emailed to your customer automatically via Resend. Reset a machine binding, revoke a key, or extend an expiry — all from the browser.

🖥
Python SDK

Three Lines to Enforce a License.

Drop zlf_sdk.py into your product. Call startup_validate() on boot. Call start_heartbeat(). That's it. The SDK handles validation, limit checking, heartbeats, and app locking with zero boilerplate in your product code.

🐍
03

Install in
two steps

One command on your VPS. Everything else is automatic.

Before you begin
🖥
VPS — Ubuntu 22+
1GB RAM min. Domain pointed at server.
Get a VPS at vpszen.com →
✉️
Resend
Free account. Optional — for license activation emails.
🔑
ZLF License Key
Purchase a ZLF key to unlock the installer.
On Your VPS

One Command.Everything.

Run this on your Ubuntu VPS — where a domain is pointed and SSH is ready. The installer validates your license, downloads ZLF from the CDN, and sets up the full stack automatically.

vps terminal
$ curl -sSL https://cdn.zenworks.co.za/zlf/install.sh | sudo bash

The script prompts for your license key, domain, and email password — then handles everything else. Flask API, admin portal, SQLite database, Apache vhost, SSL certificate, and systemd services all configured and started.

What gets installed: Flask license API on port 5001, admin portal on port 5002, SQLite database, Apache reverse proxy with SSL, and two systemd services — all running as a dedicated zlf user.

Step 2 — VPS
1
VPS Terminal
Run the installer
One command. Validates your license key, downloads ZLF from the CDN, installs everything.
$ curl -sSL https://cdn.zenworks.co.za/zlf/install.sh | sudo bash
2
Prompted during install
Enter your domain + email
The installer configures Apache, obtains a Let's Encrypt SSL certificate, and starts both services under systemd automatically.
3
Prompted during install
Set your secrets
Choose a master secret, panel password, and optional Resend API key for email delivery. All written to /opt/zlf/.env.
4
Portal — one-time setup
Add your first product
Log into your portal, create a product and plan, and issue your first license key. Drop zlf_sdk.py into your product and you're selling.

✓ Portal live at https://zlf.yourdomain.com — ready to issue licenses

Need the full step-by-step?
Complete installation documentation with every command, all prompts explained, and a quick-reference section.
Installation Guide ↑

The whole
stack for$10/month.

Fixed infrastructure cost. Completely independent of how many customers you have, how many keys you issue, or how many products you ship. Keygen charges $39/month before your first sale. You pay $10, forever.

Component Service Monthly
License API + DatabaseFlask + SQLite on VPSincluded
Admin portalShares same VPS$0 extra
Email deliveryResend (3K/mo free)$0
CDN + download gateHetzner CX22 VPS~$5
SSL certificateLet's Encrypt (certbot)$0
Total — unlimited products & customers~$5–10

Compare: Keygen $39+/mo · Paddle 5% + fees · Gumroad 10% · LemonSqueezy 5%+.
With ZenWorks, $10 is your ceiling. Not your floor.

04

The honest
comparison

What you get with ZLF versus the alternatives.

Feature ZenWorks ZLF Keygen Gumroad Roll Your Own
You own the infrastructure
No Cloudflare account needed
Machine binding built-inBuild it
Plan limit enforcementBuild it
Heartbeat-based app lockingBuild it
File integrity / tamper detectionBuild it
One-command customer installerBuild it
Admin portal includedBuild it
Automated license emailsBuild it
Python SDK includedBuild it
Fixed cost (not % of revenue)
Monthly cost at 100 customers~$10$39+10% of salesYour time
Time to first deployment~2 hoursMinutesMinutesWeeks
You built the product. You should own the business model too.
— The ZenWorks Philosophy

Most licensing tools treat you like a user of their platform. You sign up, you pay monthly, you follow their schema — and if they ever change their pricing, you have no leverage.


ZLF flips that. The code is yours. The license API runs on your VPS. The database is a SQLite file you control. The CDN is a $5 server you own. Nobody can pull the rug.


When you get your first customer, you keep all of it. When you get your thousandth customer, you're still paying $10/month. The only thing that scales is your revenue.


And because it's a framework — not a product — every new thing you build runs on the same infrastructure. Deploy a second product in an afternoon. A third in an hour. The hard work is already done.

Ready to ship
your first license?

Two commands. An afternoon. $10/month forever. Your infrastructure, your rules.