npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@daemoniorum/qliphoth

v0.2.0

Published

Qliphoth - Reactive web framework for Sigil with evidentiality-driven state management

Readme

Qliphoth

A React-inspired web application framework built on Sigil's polysynthetic programming paradigm.

Overview

Qliphoth leverages Sigil's unique features to create a powerful, type-safe web framework:

  • Evidentiality-Driven State: Track data provenance (! computed, ? cached, ~ remote, untrusted)
  • Morpheme Components: Compose UI with pipe operators and Greek letter transformations
  • Actor-Based State Management: Predictable state updates via message passing
  • Zero-Cost Abstractions: Compile-time optimization for production builds

Quick Start

use qliphoth::prelude::*

// Define a component
component Counter {
    state count: i64! = 0

    fn render(self) -> Element {
        div {
            h1 { "Count: {self.count}" }
            button[onclick: || self.count += 1] { "Increment" }
        }
    }
}

// Mount to DOM
fn main() {
    App::mount("#root", Counter::new())
}

Core Concepts

Components

Components are the building blocks of Qliphoth applications:

// Functional component
fn Greeting(props: {name: String}) -> Element {
    h1 { "Hello, {props.name}!" }
}

// Stateful component
component Timer {
    state seconds: i64! = 0

    on Mount {
        interval(1000, || self.seconds += 1)
    }

    fn render(self) -> Element {
        span { "Elapsed: {self.seconds}s" }
    }
}

Evidentiality in UI

Sigil's evidentiality system naturally maps to UI data flow:

| Marker | Meaning | UI Context | |--------|---------|------------| | ! | Known/Computed | Local state, derived values | | ? | Uncertain | Optional props, nullable data | | ~ | Reported | API responses, external data | | | Paradox | User input, untrusted sources |

component UserProfile {
    state user: User~ = User::empty()  // Remote data
    state editing: bool! = false        // Local state

    fn render(self) -> Element {
        match self.user {
            User::empty() => Spinner {},
            user~ => ProfileCard { user: user~|validate‽ }
        }
    }
}

Pipe-Based Composition

Use Sigil's pipe operators for elegant component composition:

fn UserList(users: Vec<User>~) -> Element {
    users
        |φ{_.active}           // Filter active users
        |σ{_.name}             // Sort by name
        |τ{user => UserCard { user }}  // Map to components
        |into_fragment         // Collect into fragment
}

Hooks

React-inspired hooks with evidentiality tracking:

fn SearchBox() -> Element {
    let (query, set_query) = use_state!("")
    let results~ = use_fetch("/api/search?q={query}")
    let debounced? = use_debounce(query, 300)

    div {
        input[value: query, oninput: set_query]
        match results~ {
            Loading => Spinner {},
            Error(e~) => ErrorBanner { message: e~ },
            Data(items~) => ResultList { items: items~ }
        }
    }
}

Routing

Declarative routing with type-safe parameters:

use qliphoth::router::*

fn App() -> Element {
    Router {
        Route[path: "/"] { Home {} }
        Route[path: "/docs/:section"] { |params|
            Docs { section: params.section }
        }
        Route[path: "/api/:module/:function"] { |params|
            ApiReference {
                module: params.module,
                function: params.function
            }
        }
        Route[path: "*"] { NotFound {} }
    }
}

Cross-Platform Support

Qliphoth runs on multiple platforms from the same codebase:

| Platform | Target | Backend | UI Renderer | |----------|--------|---------|-------------| | Browser | wasm32 | LLVM→WASM | DOM via JS FFI | | Server | native | LLVM | HTML strings (SSR) | | Desktop | native | LLVM | GTK4 widgets |

Build for Different Platforms

# Web (WebAssembly)
sigil compile --target wasm32-unknown-unknown -o app.wasm

# Server (SSR)
sigil compile -o app-server

# Desktop (GTK4)
sigil compile --features gtk -o app-desktop

Platform-Specific Code

Use #[cfg(...)] for platform-specific behavior:

component App {
    fn render(self) -> Element {
        div {
            h1 { "Cross-Platform App" }

            #[cfg(target_arch = "wasm32")]
            { p { "Running in browser" } }

            #[cfg(feature = "gtk")]
            { p { "Running on desktop" } }
        }
    }
}

Platform Abstraction

The Platform trait provides a unified interface:

use qliphoth::platform::{Platform, detect};

fn main() {
    // Auto-detect platform
    let platform = detect();

    // Use platform-agnostic APIs
    let (width, height) = platform·window_size();
    platform·set_timeout(|| println!("Hello!"), 1000);
}

Architecture

qliphoth/
├── src/
│   ├── core/           # Core runtime and reconciliation
│   ├── components/     # Base component system
│   ├── hooks/          # React-style hooks
│   ├── router/         # Client-side routing
│   ├── dom/            # Virtual DOM implementation
│   ├── state/          # Actor-based state management
│   └── platform/       # Platform bindings (browser, SSR, GTK)
├── docs/               # Framework documentation
├── examples/           # Example applications
└── tests/              # Test suite

Installation

# Add to your Sigil project
sigil add qliphoth

# Or clone for development
git clone https://github.com/daemoniorum/qliphoth
cd qliphoth && sigil build

Documentation

Additional documentation coming soon:

  • Component API
  • Hooks Reference
  • Router Guide
  • State Management

Examples

License

Licensed under either of:

  • Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
  • MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

Copyright (c) 2025 Daemoniorum, LLC