Methodology · Carrier Finder

How the Carrier Finder ranks carrier boards, systems and dev kits against your production needs.

Method version 1.7.0 · Dataset 2026-09-29 · Last updated: September 2026

The engine answers one question: for a given edge AI module (or module family) and a list of production requirements — camera connectors, Ethernet, PoE, M.2, Wi-Fi, fanless, industrial, operating temperature, DC input voltage, price — which carrier board, system, developer kit or host SBC in the production-carrier registry actually meets them, and how sure can you be? Every need becomes a per-carrier check with status PASS, FAIL or UNKNOWN; a field the vendor page does not state is UNKNOWN, never guessed and never counted as a failure. This page states every need, the UNKNOWN rule, the ranking rule, the verdict rule, the evidence classes and the full registry. If a fact on a result page cannot be traced back to something on this page, that is a bug.

Contents

  1. Purpose and scope
  2. Inputs
  3. Need catalogue
  4. The UNKNOWN rule
  5. Ranking rule
  6. Production constraint verdict rule
  7. Evidence classes
  8. The registry
  9. Limitations and gaps
  10. Versions
  11. Citation format
  12. Method changelog

1. Purpose and scope

Sizing an edge AI module (Jetson Orin, Hailo, Coral, RK3588, Raspberry Pi) tells you the compute — it does not tell you what to actually bolt it to. The Carrier Finder searches the production-carrier registry — carrier boards, complete systems, developer kits and host SBCs — for the module you picked and ranks every candidate against the production needs you give it: how many cameras it can take, how it talks to the network, how it is powered, whether it survives your enclosure's temperature range, and what it costs.

It does not estimate compute throughput, memory fit or power draw for the module itself — that is the Camera Stream Capacity, Model Memory Fit and Module Power Calculator engines' job. It also does not check flash/software compatibility — for Jetson modules, run the Jetson Configuration Checker against the JetPack release you plan to run.

2. Inputs

InputDefaultNotes
module—One of the 14 registry module ids, or an alias (orin_nano, agx_orin, thor_t5000, rk3588, rpi5, …) normalised to the registry id. Required unless family is given.
familyderived from moduleOne of jetson, hailo, coral, rockchip, rpi — searches every module in that family instead of one exact module.
typeanyRestrict to one product type: carrier, system, devkit, host_sbc.
needs (17 fields)noneAny subset of the need catalogue below. No needs given returns every carrier for the module, unranked by fit (still sorted by price/vendor).
max_results101–50; how many ranked candidates the response returns.

Inputs (WP-01). A field that is not stated takes its documented default and is listed in provenance.defaulted; a field that is stated but invalid — a count of 0, a negative, a fraction or a non-number, true in place of a count, an unknown value of an enumerated input, or an empty string — is rejected with VALIDATION_ERROR naming the field, never replaced by a default.

Input keys (WP-02). The engine accepts one list of input keys — the inputs documented here and their declared backward-compatible aliases. Unknown input keys are rejected with VALIDATION_ERROR naming the key: an invented or misspelt key is never silently ignored, a __ test hook never reaches the engine, and an alias sent together with the key it stands for is rejected too (the engine would read only one of them). export_json.inputs echoes every input the engine honoured, so replaying it reproduces the result.

3. Need catalogue

Every need has a kind that fixes how it is compared against the carrier's field, and a plain-English pass rule. min needs pass when the carrier's value is at least what you asked for; max needs pass when it is at most what you asked for; bool needs pass on an exact true/false match; present needs pass when the field is populated (or, if you asked for false, when it is empty); the two temp needs and the one range need have their own rule below the table because they compare against a range, not a single number.

NeedKindCarrier fieldPass rule
csi_minmincamera.csi_connectorscarrier's CSI connector count ≥ requested
gbe_minminnetwork.gbe_ports + gbe_2_5_ports + gbe_10_portstotal wired Ethernet ports (any speed) ≥ requested
gbe_2_5_minminnetwork.gbe_2_5_ports + gbe_10_ports2.5 GbE-or-faster ports ≥ requested
poe_ports_minminnetwork.poe_portsPoE output (PSE) ports ≥ requested
usb3_minminusb.usb3USB 3.x ports ≥ requested
max_price_usdmaxprice.usdlist price ≤ requested ceiling
poe_pdboolnetwork.poe_pd_inputpowered-by-PoE flag matches exactly (true or false)
fanlessboolenvironment.fanlessfanless flag matches exactly
industrialboolenvironment.industrialindustrial-grade flag matches exactly; registry rows set environment.industrial when the stated operating range spans ≤ −20 °C and ≥ 70 °C (class E derivation from vendor temperature text)
module_includedboolmodule_included, per module"module bundled with this SKU" flag matches exactly. A developer-kit listing includes only the module its kit ships; for another module its carrier accepts, the listing does not include it and the board is not sold on its own, so the need FAILs whichever value you ask
m2_key_mpresentexpansion.m2_key_mrequested true: slot description is non-empty; requested false: it is empty
storage_interfaceany_ofparsed storage interfaces from the carrier row (interfacesFromCarrierRow — M.2 Key-M text, SATA when stated)required value is an array of drive-registry interface ids (for example sata, nvme_m2_2280); PASS when the carrier's parsed set intersects it; empty parsed set → UNKNOWN
m2_key_epresentexpansion.m2_key_esame rule as m2_key_m
wifipresentnetwork.wifisame rule, applied to the Wi-Fi field
gmslpresentcamera.gmslsame rule, applied to the GMSL field
min_temp_ctemp_minenvironment.operating_temp_range.mincarrier's rated floor ≤ your requested floor — i.e. the carrier is rated to run at least as cold as you need
max_temp_ctemp_maxenvironment.operating_temp_range.maxcarrier's rated ceiling ≥ your requested ceiling — rated to run at least as hot as you need
dc_input_vrangepower.input_v_rangeyour DC supply voltage falls between the carrier's stated min and max input voltage, inclusive

min_temp_c and max_temp_c are independent — give both to require a full range (e.g. min_temp_c: -20, max_temp_c: 60) and the carrier must clear both ends. Validation rejects min_temp_c greater than max_temp_c, a dc_input_v outside 1–100 V, and a temperature outside −60 to 120 °C.

4. The UNKNOWN rule

A need is UNKNOWN whenever the carrier's field for it is null — the vendor page or datasheet used to build the registry did not state that fact — or, for the range need (dc_input_v), when either the minimum or the maximum of the range is missing. UNKNOWN is not a failure: it does not lower a candidate's fails count, and it never blocks a PASS verdict on its own. It is tracked separately as unknowns and used only to break ties in ranking (below) and to set the REQUIRES_VALIDATION verdict. The rule exists because a missing figure on a vendor page means "not published," not "unsupported" — guessing either way would be worse than saying so plainly. Every result names which needs were UNKNOWN so you know exactly what to confirm on the datasheet before ordering.

5. Ranking rule

Every candidate for the module (or family) is sorted by this key, in order:

1. fails ascending (fewest missed needs first) 2. unknowns ascending (fewest unverified fields first) 3. completeness descending (temperature range, industrial flag, price, power input, CSI and Ethernet counts on record) 4. price known prices first, then ascending by price 5. vendor alphabetical 6. product alphabetical

Fewest misses always wins first — a carrier with one FAIL never outranks one with zero, regardless of price. Among candidates with the same number of fails, fewer UNKNOWNs wins — a fully documented carrier beats a cheaper one you cannot fully verify from the vendor page alone. Among those, the better-documented record ranks first (a price on record counts as one of the six facts). Only after that does price break the tie, and a carrier with no published price ranks behind one that has a price, however low. Vendor and product name are the final, deterministic tie-breakers so the order never depends on registry insertion order.

Priced first (method 1.4.0). When Hardware Match composes Carrier Finder for a deployment, it sets prefer_priced, and a known price moves ahead of record completeness (step 4's known-first test runs before step 3): among carriers that miss and leave unknown the same number of needs, one the bill of materials can price ranks ahead of a better-documented one it cannot. A request that does not set it, including this engine's own page and the carrier pages, keeps the order above.

The response fields best and closest pick carriers for production attachment, not just display order. best is the top ranked row whose verdict is MEETS — every stated need is sourced and passes — or null when no candidate is a clean MEETS. closest is the row that would have been best under the earlier rule: the top MEETS_UNVERIFIED row when one exists, otherwise the first row in the full ranking (fewest fails, then unknowns, then price). It is null when there are no candidates. Warnings name closest when nothing fully meets; the production constraint cites best when it is set, otherwise closest, and records which in detail.cited (best or closest). Downstream orchestrators (Hardware Match) attach a priced carrier only from best — a row that is only closest stays planning-only until every need is verified.

6. Production constraint verdict rule

A port count summed over several fields (Ethernet ports of any speed, 2.5 GbE or faster) is a lower bound when one of those fields is unstated. A carrier that misses a need only on such a partial count has not been shown to miss it, so the search-wide FAIL is established only when every candidate misses a need on a stated figure; otherwise the production row is REQUIRES_VALIDATION (planning-only evidence cannot eliminate — see elimination authority).

Every result carries one production constraint whose status summarises the whole search, computed from the ranked candidate list:

PASS at least one candidate meets every stated need with zero UNKNOWNs (verdict MEETS) REQUIRES_VALIDATION no candidate is a clean MEETS, but the closest candidate (MEETS_UNVERIFIED — zero FAILs, ≥ 1 UNKNOWN) is named on the constraint as cited: closest FAIL every evaluated candidate fails at least one stated need on a figure its page states (verdict MISSES) REQUIRES_VALIDATION the same, but some candidate misses only on a port count summed over fields its page leaves unstated (a partial count cannot prove the miss) UNKNOWN the registry has no carrier at all for the requested module or family

Confidence follows the same evidence used for the top candidate: HIGH when the verdict is PASS and the best candidate's evidence is class A, MEDIUM when the verdict is REQUIRES_VALIDATION with class-A evidence (or any PASS resting partly on class-C evidence), and LOW when no candidate was found or the best candidate is backed only by class-C sources. A single per-need UNKNOWN never lowers confidence on its own — it is what drives the REQUIRES_VALIDATION verdict in the first place.

7. Evidence classes

Every carrier row, and every field on it, traces to one of two evidence classes used in this registry.

ClassMeaningUsed here for
AVendor product page or datasheetThe great majority of rows — NVIDIA, Seeed Studio, Connect Tech and other vendors' own specification pages and PDF datasheets.
CReseller or community sourceUsed when the vendor's own page returned an error or blocked automated fetch (e.g. some Waveshare product pages returned HTTP 403), or when only a third-party listing (CNX Software, a distributor's product page) publishes the figure.

A carrier's overall evidence_class is A if any of its sources is class A, otherwise C. Each field's provenance is still the specific source it was quoted from — see the sources list on every per-carrier page.

8. The registry

36 carrier boards, systems, developer kits and host SBCs across 14 edge AI modules (NVIDIA Jetson Orin/Thor, Hailo-8/8L, Google Coral, Rockchip RK3588, Raspberry Pi 5), 16 vendors. 20 of 36 rows state a full operating temperature range; 16 of 36 have a public list price. 33 rows carry at least one class-A (vendor) source; 3 rows rest on class-C sources only.

TypeCountMeaning
Carrier board16Bare board; module and enclosure sold separately (or module pre-mounted, no case).
System13Enclosed, ready-to-deploy unit with the module included.
Developer kit4NVIDIA-branded developer kit (reference carrier), the module vendor's own evaluation platform.
Host SBC3A general-purpose single-board computer (e.g. Raspberry Pi 5) hosting an accelerator module as an add-on, not a Jetson-class carrier.

A developer-kit row lists every module its carrier accepts, but the kit ships one module, and its price is the kit's. NVIDIA states that the Jetson Orin Nano developer-kit carrier supports all Jetson Orin Nano and Orin NX modules; the kit ships the Orin Nano 8GB development module, so the row names the modules it takes but does not ship (modules_not_included: Orin Nano 4GB, Orin NX 16GB, Orin NX 8GB). For a module the kit does not ship, the listing does not include it and has no price for it: the candidate shows module_included: false, no price and available_separately: false (NVIDIA does not sell the carrier on its own), so it never reads as a $399 answer for an Orin NX. The original Jetson Nano Developer Kit carrier (P3449, for the first Jetson Nano) is a different board: NVIDIA states the Orin Nano and Orin NX modules are not supported on it. It is not in the registry, and no module name, alias or search reaches the Orin Nano kit carrier through its names: “Jetson Nano Developer Kit”, “Jetson Nano” or its part number is refused as an unknown module.

Full browsable tables: the Production Carriers hub (all 36 rows and the module coverage table), a page per module, and a full spec sheet per carrier with every source quoted. Machine-readable copy with the complete provenance record for every field: production-carriers.json.

9. Limitations and gaps

  • 20 open research gaps remain on individual rows — mostly unconfirmed operating-temperature ranges, USD prices only available from a reseller (not the vendor), or a spec that could not be quoted verbatim from a fetchable page. Every gap is listed with the specific product and field on the registry hub and repeated on the affected carrier's own page.
  • A field left null is reported as UNKNOWN by every need that reads it — this is deliberately conservative. A carrier may in fact meet an UNKNOWN need; the registry just does not have a citable figure for it yet.
  • Prices are a single list price as of the date shown, not live pricing — most industrial-channel vendors quote on request and their rows are UNKNOWN on max_price_usd.
  • The registry does not track stock/lead-time, minimum order quantity, or regional distribution — only the vendor's own published specification and (where stated) list price.
  • Camera capability is recorded as connector count and lane width where published; exact sensor compatibility (which CSI sensors a given carrier's ISP/driver stack actually supports) is out of scope.
  • The engine does not check module × carrier electrical/mechanical compatibility beyond the registry's own modules[] list for each row — always confirm form factor and connector pinout against the datasheet before ordering.

10. Versions

ComponentVersionDate
Method1.02026-09-08
Dataset2026-09-082026-09-08

Every result URL carries mv (method version) and dv (dataset version); when either differs from the current values, the result page flags that the data has changed since the link was made.

11. Citation format

Cite a Carrier Finder result or a registry row as:

Edge AI Stack, "Carrier Finder" (method 1.5.0, dataset 2026-09-29), <permalink or /production/carriers/... URL>, accessed <date>.

Every result and per-carrier page names its own sources — cite the underlying vendor page or datasheet directly for a specific spec, and cite the URL above for the ranking/verdict itself. The sources[] array in the API response and in production-carriers.json gives publisher, document, URL and the date each fact was last verified for every field.

12. Method changelog

MethodDatasetDateChange
1.7.02026-09-292026-09-30Structured storage_interfaces on every carrier registry row (#282): the storage_interface need reads sourced interface ids and an assumed list (class E) instead of parsing expansion text at runtime. A miss that rests only on assumed interfaces is partial and planning-only.
1.6.02026-09-292026-09-29elimination authority (#263, owner ruling 2026-09-29). A port count summed over fields a vendor page leaves unstated is a lower bound: when some candidate misses a need only on such a count, the search-wide production row is REQUIRES VALIDATION instead of FAIL. Every row publishes elimination_authority.
1.5.02026-09-292026-09-29Orin NX on the Jetson Orin Nano developer-kit carrier (bug #252, owner ruling 2026-09-29): the registry lists Orin NX 16GB and 8GB on it, citing NVIDIA’s carrier specification, with the carrier’s module-power limit for them (5 V only; Orin NX 40W / MAXN_SUPER not supported). A developer-kit row now carries modules_not_included, and each candidate is shown for the requested module: a kit listing that does not ship it has module_included: false, no price and available_separately: false, and its module_included need FAILs either way. The original Jetson Nano Developer Kit carrier (P3449) is not a registry row, and no module name or alias reaches the Orin Nano kit carrier through its names.
1.4.12026-09-082026-09-28Input rules (WP-01 remainder, WP-02): a need that is stated but malformed ("abc", true or "" as a count, a non-boolean flag) is rejected instead of dropped; port counts are integers ≥ 0; dc_input_v below 1 V is rejected, matching its message; max_results outside 1–50 is rejected instead of clamped; type and max_results defaults are listed in provenance.defaulted. ambient_max_c is a declared alias of max_temp_c and lands in its slot. Unknown input keys are rejected (needs keys included). No formula changed.
1.4.02026-09-082026-09-19prefer_priced: with it, a known price ranks ahead of record completeness among equally met needs. Hardware Match sets it on its composed call, so the carrier a deployment prices is a priced one when one qualifies. The standalone ranking is unchanged.
1.02026-09-082026-09-08First release. 36 carriers across 14 modules and 16 vendors, 17 needs, UNKNOWN-never-guessed rule, fails/unknowns/price ranking, and the PASS / REQUIRES_VALIDATION / FAIL / UNKNOWN production constraint, every fact sourced from a vendor product page or datasheet (class A) or a reseller/community page (class C).

Method changes bump the method version; registry updates (new carriers, corrected specs, newly confirmed fields) bump the dataset version. Both appear in every result's citation block and in the dataset_version / method_version fields of every API response.

Find a carrier for your exact needs.

Browse the precomputed tree at /production/carriers/, the raw registry at production-carriers.json, or open the live engine below.

OPEN CARRIER FINDER →