neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
EdgeProc is the open-source substrate behind EdgeReco: signed bundles, fail-closed verification, and local keyword and vector search.
Developer toolsPythonGitHub @gainratioOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
For Python apps that ship data to devices: each one checks it's genuine, downloads only changes, and searches offline.
Taken from the repository README
Loading the full README.
Read the full README ↗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.key stays with you. keys/public.key is what you give every device.
origin/ is what you would upload to a web server. Your key_id will 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
manifests
This is real output from edge-proc 0.5.1, 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.
If you publish a SQLite database (.sqlite, .sqlite3, or .db), edgeproc publish first
checks it, compacts it onto 4 KB pages, and zeroes the header counters that SQLite changes on
every write. That way, changing one row in a 10 MB SQLite catalog changes only the affected
piece instead of shifting the whole file.
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.
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) does the checking half of EdgeProc inside a browser
tab. It reads the same signed format that edgeproc publish writes, so you can publish a
folder or a .sqlite database with this library and load it in a web page (for example, an
offline product catalog or a local reference database).@gainratio/privacy-core; previously @edgeproc/privacy-core) is a separate project despite
the old shared scope. It hides card numbers and similar IDs from AI prompts in the browser,
and does not use EdgeProc.[localvec] extra pulls in PyTorch and FAISS, about
950 MB.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.1. 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/gainratio/edge-proc.git
cd edge-proc
uv sync --all-extras
uv run poe gate
The 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.
MIT. See LICENSE. To cite EdgeProc, use CITATION.cff.
EdgeProc (also written edge-proc and edgeproc) lives at
gainratio/edge-proc, with a project page at
edge-reco.com/edgeproc. It is not affiliated with any other
product or company named "EdgeProc".
The good device in cache/ has an active pointer 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. Set
EDGEPROC_ERROR_FORMAT=json to get it as JSON.