[](https://github.com/redberrythread/weave/actions/workflows/ci.yml)
[](https://github.com/redberrythread/weave/blob/main/LICENSE)
[](https://www.rust-lang.org)
# Weave
Graph analysis, image processing, and content DSL tools for OSINT knowledge graphs.
Weave is a Cargo workspace that publishes Rust crates to [crates.io](https://crates.io) and an Elixir NIF package to [hex.pm](https://hex.pm).
## Packages
| Package | Registry | Version | Description |
| ------- | -------- | ------- | ----------- |
| `weave-graph` | [crates.io](https://crates.io/crates/weave-graph) | [](https://crates.io/crates/weave-graph) | Conflict-of-interest pattern detection |
| `weave-image` | [crates.io](https://crates.io/crates/weave-image) | [](https://crates.io/crates/weave-image) | Thumbnail download, resize, WebP conversion |
| `weave-content` | [crates.io](https://crates.io/crates/weave-content) | [](https://crates.io/crates/weave-content) | Content DSL parser, validator, and builder |
| `rbt_weave` | [hex.pm](https://hex.pm/packages/rbt_weave) | [](https://hex.pm/packages/rbt_weave) | Elixir NIF bridge (graph + image) |
## Conflict Detection
`weave-graph` detects six conflict-of-interest patterns (COI-001 through COI-006) using three algorithms:
- **Cycle detection** -- directed simple cycles matching edge-type sequences (e.g. donation-appointment kickbacks)
- **Path detection** -- constrained DFS matching edge types and node labels (e.g. family appointments, donor influence chains)
- **Hub detection** -- Actor-Institution pairs with concentrated influence edges exceeding a threshold
All algorithms operate on in-memory subgraphs extracted from Neo4j with O(1) adjacency lookups. Detection completes in <50ms for subgraphs up to 10K nodes / 50K edges.
## Thumbnail Processing
`weave-image` handles thumbnail generation for entity images:
- Download from URL with 5 MB size limit and 15s timeout
- Center-crop and resize to 256x256 lossless WebP
- Deterministic storage keys via SHA-256 of source URL
- Output capped at 50 KB
## Content DSL
`weave-content` parses, validates, and builds Markdown case files into JSON for database seeding.
```bash
cargo install weave-content
```
```bash
weave-content validate --root content/
weave-content verify --root content/
weave-content build --root content/
```
## Elixir Usage
Add `rbt_weave` to your dependencies:
```elixir
def deps do
[
{:rbt_weave, "~> 0.2.7"}
]
end
```
A Rust toolchain (1.88+) is required to compile the NIF.
```elixir
# Verify NIF is loaded
"ok" = Weave.Graph.health_check()
# Detect conflicts (JSON-in, JSON-out)
{:ok, results_json} = Weave.Graph.detect_conflicts(subgraph_json, opts_json)
```
## Rust Usage
Add crates to your `Cargo.toml`:
```toml
[dependencies]
weave-graph = "0.2"
weave-image = "0.2"
```
```rust
use weave_graph::graph::{Subgraph, IndexedSubgraph};
use weave_graph::detect::{detect_conflicts, DetectOpts};
let subgraph = Subgraph { nodes: vec![/* ... */], edges: vec![/* ... */] };
let indexed = IndexedSubgraph::from_subgraph(&subgraph);
let results = detect_conflicts(&indexed, &DetectOpts::default());
```
## Development
```bash
# Run Rust tests
cargo test
# Run clippy
cargo clippy --workspace -- -D warnings
# Run Elixir tests
mix deps.get && mix test
# Format
cargo fmt --all --check
mix format --check-formatted
```
## License
MIT -- see [LICENSE](LICENSE) for details.