⚠ Under heavy construction

As of July 11, 2026, Sorter V2 is not yet in a position to be built.

The documentation that exists is incomplete. Any given page may be accurate, inaccurate, present only as an example, or badly out of date. We do not yet recommend that anyone attempt to build Sorter.

For the most live updates on our progress, join our Discord ↗.

Sorter — Under the hood

What leaves the machine

Reference

Every network connection the backend can make, what each one carries, and which ones you can turn off.

The machine sorts fully offline except for piece recognition. Everything below is the complete list of outbound connections the backend can make — there is no other background traffic. Two connections happen without any setup on your part (piece recognition and the status ping); the rest only run once you configure them.

Brickognize — piece recognition (required)

During sorting, a cropped photo of each piece is sent to api.brickognize.com to identify the part and color. This is the core recognizer and there is currently no way to sort without it — no off switch. The request carries the image and nothing else — no account, no machine identifier.

Status ping — on by default

Once an hour (and shortly after the backend starts), the machine sends a small status report to hive.basically.website so we know how many machines exist, whether they're online, what software they run, and roughly how much they sort. It runs whether or not you've connected a Hive account.

To send it, the machine silently enrolls a device identity with hive.basically.website the first time: a random key generated on the machine, exchanged for a token. This is not an account and creates none — it only lets the server keep one record per machine instead of trusting self-reported ids. The report also carries a random install ID generated on the machine — that ID is your handle for viewing and deleting the data (below). Neither is derived from the machine's network details. We can tell one machine apart from another and see the IP it connected from (which gives an approximate country/region, the same as any web request).

If you've registered a Hive account, the ping additionally includes your account machine IDs — the same IDs you already gave Hive when you registered — so we can link this install to your account(s). This only happens once you've voluntarily created an account and registered the machine; an unregistered machine stays fully anonymous. Account tokens are never sent.

This is the complete payload — nothing else is collected:

FieldExampleWhat it is
install_ida1b2… random UUIDAnonymous per-install ID. Not your account.
created_at2026-07-13When this install first generated its ID (its "birthday").
reasonboot / periodicWhether this was a startup ping or the hourly one.
software.versionsorter/canary/v0.1.0-29-g…Software version + release channel + commit.
osDebian … / SorterOS 1.xOS name and SorterOS image version, if present.
hardwareOrange Pi 5, 8 GB, 47 °C, disk freeBoard model, RAM, CPU temperature, disk space.
configclassification_channel / pulse_perception_rev01 / two_piece_…Which machine setup and feeder / classification modes are running.
usagepieces seen/classified/distributed, hours powered/sorted, best rateCumulative counters — "how much it sorts."
uptimeprocess + system secondsHow long the software and the machine have been up.
registeredtrue / falseWhether a Hive account is configured.
machine_id, accountsUUIDsOnly if registered: your local machine ID and each account's machine ID, to link this install to your account(s). Never tokens. Absent on unregistered machines.

What is not in it: no images, no per-piece records, no part numbers, no account tokens, no serial numbers, MAC addresses, hostnames, or WiFi details. Only what's in the table above.

Turning it off: set SORTER_BASE_REPORTING_OFF=1 in the machine environment and restart the backend. The report thread then never starts.

Seeing exactly what your machine sends: open /telemetry on the machine's web UI (a hidden page — type the path). It shows your install ID, whether the ping is on or off, and the exact JSON that would be sent.

Deleting it: copy your install ID from /telemetry and paste it into hive.basically.website/forget. That erases all status-report data tied to that ID. (Turning the ping off stops future pings but doesn't delete what was already sent — use the form for that.) We also age old records out on our side over time; the form is there if you want it gone now.

basically color model — off until you select it

In Settings → Tuning → Classification Providers you can switch color prediction from Brickognize to the hosted color model at hive.basically.website. With it selected, the same cropped piece photos that go to Brickognize are also sent there (under the device identity above), and are stored on our side along with the prediction — that's what trains the next revision of the color model. Nothing else is sent: crops, camera channel numbers, and the piece's internal id. Switch the provider back to Brickognize and this traffic stops entirely.

Hive — optional, off until you connect it

The machine makes no connection to Hive unless you add a Hive target (URL + API token) in settings. Remove the target and all of the below stops.

With a target configured:

Heartbeat — every 30 seconds, a keep-alive so the UI can show whether the server is reachable. The server records when your machine was last seen and the IP it connected from. At most every 30 minutes the heartbeat also carries the machine specs snapshot (see the Machine specs field below).

Part dimension lookups — when a piece is classified, the machine asks Hive for that part's physical dimensions to route oversize pieces to the bottom bin. This is a download; the only thing sent is the part number.

Uploads — each kind of upload is gated by a per-target toggle in the Hive settings. A field that's off blocks the upload at send time, including jobs already queued.

FieldDefaultWhat it carries
Detection imagesonCropped pictures of individual pieces: live training samples and the per-piece image history.
Full camera framesonUncropped camera captures and detection overlay images attached to training samples.
Piece metadataonClassification results per piece (part, color, confidence, bin, timestamps) and set sorting progress.
Channel crops (C2/C3)offUnlabeled bbox crops of pieces on the upstream feeder channels, tagged with position for same-piece lookup. Experimental, high volume.
Machine specsonCamera, controller board, platform and OS details, plus per-camera calibration state: whether a color profile is calibrated, whether it applies, its matrix and bias, and the saved device/orientation/capture settings. No image data.

The field registry in hive_telemetry.py is the single choke point — no other code path can upload to Hive, and adding a new kind of upload requires adding a field to this list.

Firmware update check — GitHub

Opening the firmware page fetches the release list from api.github.com to show available firmware versions. Anonymous, standard GitHub API call. Only happens when you use that page.

If you configure your own BrickLink store credentials or an OpenRouter API key, the machine calls those services for store inventory and experimental detection features. Without keys, these paths never run.