A Python library for sending data files to many devices: each device checks they came from you, downloads only what changed, and can search them offline.
Try it in a minute: pip install "edge-proc[bundles]", then run the commands under Try it. No server or account needed.
Say your app needs the same data on many devices you don't control: a product catalog, a search index, a price list, a small AI model. The usual way is to put the file on a web server and have each device download it. That has two problems. A device can't tell if the file was corrupted or swapped on the way, so it may quietly give wrong answers. And when one line changes, every device downloads the whole file again.
EdgeProc handles both. You publish a folder once, on your own machine: it cuts the files into small pieces and signs a list of them with your private key. You upload the result to any plain web server. Each device downloads only the pieces it doesn't have yet, checks them all against your public key, and refuses the whole update if anything is wrong. Once the data is on the device, EdgeProc can also search it there, with no network.
Technical docs: Architecture · Getting started for developers · Full walkthrough with search · Configuration · Operations and security
This uses local folders instead of a web server, so you can see every step. You need Python 3.13 or newer.
-
Install EdgeProc from PyPI in a fresh virtual environment. The
[bundles]extra adds signing and syncing; it is small.python3.13 -m venv .venv && source .venv/bin/activate pip install "edge-proc[bundles]"
-
Make a two-product catalog, a key pair, and publish it. Then pull it onto a "device" folder.
mkdir -p demo/src && cd demo echo '{"p1": "red running shoes", "p2": "waterproof hiking boots"}' > src/catalog.json edgeproc keygen --out keys edgeproc publish --src src --origin-dir origin --key keys/private.key --bundle-id catalog --version 1.0.0 --pretty edgeproc sync --base-url origin --cache-dir cache --key keys/public.key --materialize-to device --pretty cat device/catalog.json
wrote keys/private.key and keys/public.key key_id 87207cf94bb9c28b published v1.0.0 manifest=71d733a8dddb synced v1.0.0 manifest=71d733a8dddb chunks_fetched=1 chunks_reused=0 bytes_fetched=70 {"p1": "red running shoes", "p2": "waterproof hiking boots"}keys/private.keystays with you.keys/public.keyis what you give every device.origin/is what you would upload to a web server. Yourkey_idwill differ; the rest repeats exactly. -
Add one file and publish a new version. The device downloads only the new piece.
echo 'spring price list' > src/prices.txt edgeproc publish --src src --origin-dir origin --key keys/private.key --bundle-id catalog --version 1.0.1 --pretty edgeproc sync --base-url origin --cache-dir cache --key keys/public.key --materialize-to device --pretty
published v1.0.1 manifest=18499ab39ead synced v1.0.1 manifest=18499ab39ead chunks_fetched=1 chunks_reused=1 bytes_fetched=27 -
Try to sync without the public key. EdgeProc refuses; there is no "trust it this once" mode.
edgeproc sync --base-url origin --cache-dir other-device --pretty; echo "exit=$?"
[config.missing] no trust root: pass --key or set EDGEPROC_TRUST_ROOT_PUBKEY_PATH (refusing to sync) exit=1 -
Corrupt one piece on the "server" and sync onto a new device. The whole update is refused.
printf 'tampered' > "origin/chunk/$(ls origin/chunk | head -1)" edgeproc sync --base-url origin --cache-dir new-device --key keys/public.key --pretty; echo "exit=$?" ls cache new-device
[bundle.integrity_failed] sync failed: stored chunk failed to decompress exit=1 cache: active chunks manifests new-device: chunks manifestsThe good device in
cache/has anactivepointer file that marks the version it serves.new-device/never got one, so it has nothing to serve rather than bad data. The code in square brackets is a stable error code a script can check. SetEDGEPROC_ERROR_FORMAT=jsonto get it as JSON.
This is real output from edge-proc 0.5.0, installed from PyPI on 2026-09-25.
To see on-device search as well, clone the repo and run bash examples/run_loop.sh. It
builds a search index over a 15-product catalog, ships it together with the search model,
and searches on the "device" with no network. The query "trail running shoes for the
morning" returns the "Trailhead Pro running shoes" first. The first run downloads an 87 MB
search model and about 1 GB of dependencies (PyTorch and FAISS); it took about 2 minutes. The
full walkthrough does the same thing one step at a time.
edgeproc publish cuts each file into pieces of about 64 KB. Each piece is named by a
fingerprint of its contents (a SHA-256 hash), so a changed or damaged piece no longer
matches its name. A list of all the pieces is fingerprinted too, and one small file that
points to that list is signed with your private key. edgeproc sync checks that signature
against the public key the device was given, downloads only the pieces it is missing, and
checks each one. Only when every check passes does the new version go live; otherwise the
device keeps the last good version.
For search, EdgeProc turns text into vectors with a small model and looks them up in a FAISS index, optionally mixed with keyword search. Ship the model inside the same signed release and the device never needs to download it. Without a local model, search refuses to run rather than fetch one.
- edgeproc-core (Python, on PyPI) is a
smaller library underneath this one. EdgeProc uses two things from it: a common interface
for vector search indexes, which EdgeProc's FAISS index implements, and the stable error
codes, like
bundle.integrity_failed. It installs automatically with EdgeProc. You would only use it on its own to keep each customer's results apart in a shared search index. - @edgeproc/browser (TypeScript, for web
pages) does the checking half of EdgeProc inside a browser tab. It reads the same signed
format that
edgeproc publishwrites, so you can publish with this library and load the data in a web page. - edge-reco is a demo online store (edge-reco.com) that runs product search in the shopper's browser. It uses these libraries.
- privacy-core (published on npm as
@edgeproc/privacy-core) is a separate project despite the shared name. It hides card numbers and similar IDs from AI prompts in the browser, and does not use EdgeProc.
- It is not a service. There is nothing to sign up for. It is a library and a command-line tool that your app and your build machine run.
- Data flows one way. One publisher signs; many devices read. It is not a two-way folder sync like Dropbox.
- It can't protect a device or build machine that is already compromised, or a private key that was stolen. You can revoke a key, but each device only learns about it when you update its key ring. There is no online revocation list.
- The memory budget is not a hard memory limit. EdgeProc refuses new work when the declared budget is used up, but it does not cap what FAISS or PyTorch actually allocate.
- Search is heavy to install. The
[localvec]extra pulls in PyTorch and FAISS, about 950 MB. - CI tests on Linux only. It is used on macOS too, but Windows and macOS are not tested in CI.
- Search quality on your data is not measured. The default model is a small general one
(
all-MiniLM-L6-v2). Check it against your own data.
| If you need | Use |
|---|---|
| No code on the device, always-fresh data, and per-search cost is fine | A hosted search or vector database API |
| One small file that rarely changes, from a server you fully trust | A plain HTTPS download with a checksum |
| Several signing roles, threshold signing, or online revocation | A full software-update framework such as TUF |
| Two-way sync between machines you control | rsync or a file-sync tool |
| The same data on devices you don't control, checked before use, with small updates and offline search | EdgeProc |
EdgeProc is on PyPI as edge-proc. You import it as
edgeproc, and the command is also edgeproc. The heavy parts are optional extras:
pip install edge-proc # the command-line tool and the task router
pip install "edge-proc[bundles]" # + publish and sync (signing, checking, small updates)
pip install "edge-proc[localvec]" # + on-device search (FAISS and PyTorch, about 950 MB)
pip install "edge-proc[localvec,bundles]"This README documents EdgeProc 0.5.0. It needs Python 3.13 or newer and installs
edgeproc-core>=0.4.3 from PyPI. Release notes are in the CHANGELOG.
git clone https://github.com/hseshadr/edge-proc.git
cd edge-proc
uv sync --all-extras
uv run poe gateThe last command runs lint, type checks, the complexity limit, and the full test suite. It took about 3.5 minutes. Getting started for developers covers setup, a map of the code, a first change, and how to open a pull request.
- Getting started for developers: from a fresh clone to a green local build and your first change.
- Full walkthrough: build a search index, ship it with its model, and search it on the device, step by step. Also shows the Python API.
- Architecture: the modules, the bundle format, the security model, key rotation, and what the tests prove.
- Explore the interactive architecture map: the same, as a clickable diagram that works offline.
- Configuration: every setting and environment variable.
- Operations: threat model, privacy and data flow, recovery, the key rotation runbook, measured performance, and how releases are made.
- Roadmap: what is planned and not built yet.
- CHANGELOG: what changed in each release.
- CONTRIBUTING and SECURITY: how to contribute and how to report a vulnerability privately.
MIT. See LICENSE. To cite EdgeProc, use CITATION.cff.
EdgeProc (also written edge-proc and edgeproc) lives at
hseshadr/edge-proc, with a project page at
edge-reco.com/edgeproc. It is not affiliated with any other
product or company named "EdgeProc".