Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Seify

Rust SDR hardware abstraction for applications that want one API over multiple radio backends.

What Seify Provides

A clear path towards a great Rust SDR driver ecosystem.

  • One API for probing, opening, configuring, and streaming from SDR devices.
  • Typed devices when an application wants a concrete backend.
  • Type-erased devices when an application wants runtime driver selection.
  • Capability-oriented channel APIs, so backends expose the controls they support.
  • Feature-gated drivers, so each binary only includes the SDR backends it needs.
  • SoapySDR support for broad hardware coverage and native Rust drivers where available.

The native Rust drivers are still experimental. For production use and the widest set of stable hardware integrations, prefer the SoapySDR backend.

Features

The default feature set is soapy.

Enable drivers explicitly in Cargo.toml or on the command line:

cargo check --no-default-features --features rtlsdr
cargo check --no-default-features --features hydrasdr,hackrf

Available features:

FeatureDriver argumentNotes
dummydriver=dummyDriver for unit tests.
soapydriver=soapySoapySDR backend. Enabled by default. Requires SoapySDR system libraries.
aaronia_httpdriver=aaronia_httpAaronia HTTP backend.
bladerf1driver=bladerfbladeRF 1 backend.
hackrfdriver=hackrfHalf-duplex HackRF RX/TX backend; async WebUSB support on wasm32-unknown-unknown.
hydrasdrdriver=hydrasdrHydraSDR backend; async WebUSB support on wasm32-unknown-unknown.
rtlsdrdriver=rtlsdrRTL-SDR backend.
smol / tokion/aPick one for async nusb runtime integration.

For native async use with nusb-based drivers, enable exactly one of smol or tokio. For example, native HackRF async support is enabled with hackrf,smol or hackrf,tokio. WebAssembly uses WebUSB and needs only the corresponding driver feature.

WebUSB

HackRF and HydraSDR are available on wasm32-unknown-unknown. Only AsyncHackRf, AsyncHydraSdr, AsyncRegistry, and the async device/streamer APIs are connected to those drivers on wasm; their synchronous backends remain native-only.

Build it with:

cargo check --target wasm32-unknown-unknown --no-default-features --features hackrf,hydrasdr

WebUSB's web-sys bindings require --cfg=web_sys_unstable_apis; this repository supplies it for wasm32-unknown-unknown in .cargo/config.toml. Applications consuming Seify as a dependency must add the same target setting to their own Cargo configuration. A browser only probes HydraSDRs already authorized for the page. Call AsyncRegistry::request_permission from a browser user gesture, then probe or open the authorized device in the window or a Web Worker. Without a driver argument, the chooser includes devices supported by all registered WebUSB backends. Opening itself never displays the chooser.

A framework-free, driver-agnostic browser example with discovered receiver controls and a finite-capture magnitude plot lives in examples/webusb. Run it with:

cd examples/webusb
trunk serve --open

The HackRF backend exposes RX channel 0, the single ANT port, 1 MHz–6 GHz tuning, 2–20 Msample/s rates, and physical AMP, LNA, and VGA gain elements. Its baseband-filter bandwidth follows the selected sample rate and is not a separate Seify capability.

Use the generic API with an argument string to select a backend at runtime:

cargo run --no-default-features --features rtlsdr --example probe -- --args driver=rtlsdr
cargo run --no-default-features --features rtlsdr --example rx_generic -- --args driver=rtlsdr

Additional driver-specific arguments can be passed in the same string:

cargo run --no-default-features --features soapy --example probe -- --args driver=soapy,soapy_driver=rtlsdr

Example

use num_complex::Complex32;use seify::DynDevice;pubfnmain() -> Result<(),Box<dyn std::error::Error>>{let dev = DynDevice::new()?;let rx0 = dev.rx(0)?;letmut samps = [Complex32::new(0.0,0.0);1024];letmut rx = rx0.streamer()?;
rx.activate()?;let n = rx.read(&mut[&mut samps],200000)?;println!("read {n} samples");Ok(())}

About

Seify: A Rusty SDR Hardware Abstraction Library

Topics

Resources

Stars

54 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages