#dioxus #cokit #component #high #applications #encryption

co-dioxus

High level components for using COKIT in dioxus applications

1 unstable release

0.1.0 Apr 8, 2026

#12 in #cokit

AGPL-3.0-only

1MB
28K SLoC

CO Dioxus

High level components for using COKIT in dioxus applications.

Usage

Initialize the application

To initialize COKIT create a new CoContext and provide it to the app as context.

use co_dioxus::{CoContext, CoSettings};
use dioxus::prelude::*;

fn main() {
	// co
	let context = CoContext::new(co_dioxus::CoSettings::cli("my-todo-app"));
	
	// dioxus
	LaunchBuilder::desktop().with_context(context).launch(App);
}

Select data from a CO

Most interactions with COKIT are done using hooks.

use co_dioxus::{use_co, use_did_key_identity, use_selector, CoContext};

#[component]
pub fn App() -> Element {
	// open the "local" CO.
	let local_co_id = use_signal(|| CoId::new(CO_ID_LOCAL));
	let local_co = use_co(local_co_id.into());
	
	// read memberships from the local co
	let memberships = use_selector(&local_co, move |storage, co_state| async move {
		Ok(state::memberships(storage, co_state.co())
			.try_filter(move |item| ready(item.0.as_str() != CO_ID_LOCAL))
			.try_collect::<Vec<_>>()
			.await?)
	}).suspend()?;
	
	// use a identity
	let identity = use_did_key_identity("my-identity")?;
	
	// render
	rsx! {
		"..."
	}
}

Push actions to a CO

To change a CO just push actions into it. This will cause all selectors to update once the action is applied.

use co_dioxus::{use_co, use_did_key_identity, use_selector, CoContext};

#[component]
pub fn MyComponent(co_id: ReadonlySignal<CoId>) -> Element {
	// use the co
	let co = use_co(co_id);
	
	// use a identity
	let identity = use_did_key_identity("my-identity")?;
	
	// render
	rsx! {
		button {
			onclick: {
				let identity = identity.clone();
				let co = co.clone();
				move || {
					co.dispatch(identity, "my-core", MyCoreAction::Increment(1));
				}
			},
		}
	}
}

Dependencies

~31–59MB
~1M SLoC