# StickUp
> ๐ **Launch Note (v0.1.4)**
> StickUp just quietly launched and already hit over 120 downloads in the first few hours โ huge thanks to everyone checking it out!
> If youโre using it for sim gear, custom controllers, or input visualization, Iโd love to hear from you.
> Feedback, questions, or contributions? โ [belegrade@belegrades.gg](mailto:belegrade@belegrades.gg)
[](https://crates.io/crates/stickup)
[](https://crates.io/crates/stickup)
[](https://discord.gg/EKeBNYnaSh)
[](https://ko-fi.com/belegrades)
[](https://x.com/BelegradeOfRuin)
---
## ๐ Security Note
The name **`stickup`** was previously used in 2023 for a malicious crate which has since been removed from crates.io. (I wasn't aware of this at the time of publishing.)
This version โ authored by [Belegrade Studio](https://belegrades.gg) โ is a **clean and fully rewritten project**, unrelated to the original.
- โ
No `build.rs`
- โ
No network activity
- โ
100% open and auditable
Transparency and trust matter. You're welcome to inspect the source or reach out directly.
---
**StickUp** is a modular, high-performance input abstraction layer for Rust applications.
It handles physical and virtual devices with precision, persistence, and simplicity.
> Created by **Belegrade Studio**. Part of the **CelerisTech** suite.
---
## โจ Features
- ๐ Plug-and-play device management (`hidapi` + virtual devices)
- ๐ฎ Clean `Device` trait: axis + button abstraction
- ๐ง Persistent device identity โ robust rebinding & hotplugging
- ๐ Snapshot state or stream real-time `InputEvent`s
- ๐ง Flexible `BindingProfile` system to map inputs to actions
- โ๏ธ Feature flags (`hid`, `virtual`) to tailor backend support
- ๐ก Minimal dependencies. Built for tools, overlays, engines, and more.
---
## ๐ฆ Installation
```toml
stickup = { version = "0.1.4", features = ["hid", "virtual"] }
```
---
## ๐ Quick Start
```rust
use stickup::DeviceManager;
fn main() {
let mut manager = DeviceManager::new();
let snapshot = manager.snapshot();
for (id, state) in snapshot.iter() {
println!("Device: {}", id);
for (axis, value) in &state.axes {
println!(" Axis {} = {}", axis, value);
}
for (button, pressed) in &state.buttons {
println!(" Button {} is {}", button, if *pressed { "pressed" } else { "released" });
}
}
}
```
---
## ๐งฌ Device Identity
StickUp assigns a stable fingerprint to each device based on its hardware signature:
```text
vendor_id:product_id:serial_number
# Example: 044f:0402:ABCD1234
```
If the device provides a serial number, this ID is persistent across USB ports, reboots, and sessions โ perfect for rebindings, multi-device setups, and simulators.
---
## ๐ Examples
Run with `cargo run --example <name>`:
- `poll`: Print a snapshot of all connected device states
- `virtual_demo`: Feed manual input into a simulated device
---
## ๐ ๏ธ Optional Features
- `hid` (enabled by default): HID device support
- `virtual`: Simulated input devices
---
## ๐งญ Philosophy
StickUp isnโt just about input. Itโs about clarity, intentional systems, and persistent presence.
Built for tools that know what they're listening to.
---
## ๐ License
Licensed under the **Pact of the Amaranth Rite**. See `LICENSE` for terms.
Inspired by the MIT license, with deeper philosophical roots.
This crate uses `hidapi`, licensed under MIT or Apache-2.0.
---
## ๐ฌ Connect
- ๐ง Email: [belegrade@belegrades.gg](mailto:belegrade@belegrades.gg)
- ๐ฌ Discord: [Join Chat](https://discord.gg/EKeBNYnaSh)
- ๐ ๏ธ Got a weird sim setup or unique controller? Letโs talk.