Modular IPC-based desktop launcher service

Overview

Pop Launcher

Modular IPC-based desktop launcher service, written in Rust. Desktop launchers may interface with this service via spawning the pop-launcher process and communicating to it via JSON IPC over the stdin and stdout pipes. The launcher service will also spawn plugins found in plugin directories on demand, based on the queries sent to the service.

Using IPC enables each plugin to isolate their data from other plugin processes and frontends that are interacting with them. If a plugin crashes, the launcher will continue functioning normally, gracefully cleaning up after the crashed process. Frontends and plugins may also be written in any language. The pop-launcher will do its part to schedule the execution of these plugins in parallel, on demand.

Plugin Directories

  • User-local plugins: ~/.local/share/pop-launcher/plugins/{plugin}/
  • System-wide install for system administrators: /etc/pop-launcher/plugins/{plugin}/
  • Distribution packaging: /usr/lib/pop-launcher/plugins/{plugin}/

Plugin Config

A plugin's metadata is defined pop-launcher/plugins/{plugin}/plugin.ron.

(
    name: "PluginName",
    description: "Plugin Description: Example",
    bin: (
        path: "name-of-executable-in-plugin-folder",
    )
    icon: Name("icon-name-or-path"),
    // Optional
    query: (
        // Optional -- if we should isolate this plugin when the regex matches
        isolate: true,
        // Optional -- Plugin which searches on empty queries
        persistent: true,
        // Optional -- avoid sorting results from this plugin
        no_sort: true,
        // Optional -- pattern that a query must have to be sent to plugin
        regex: "pattern"
    )
)

Script Directories

  • User-local scripts: ~/.local/share/pop-launcher/scripts
  • System-wide install for system administrators: /etc/pop-launcher/scripts
  • Distribution packaging: /usr/lib/pop-launcher/scripts

Example script

#!/bin/sh
#
# name: Connect to VPN
# icon: network-vpn
# description: Start VPN
# keywords: vpn start connect

nmcli connection up "vpn-name"

JSON IPC

Whether implementing a frontend or a plugin, the JSON codec used by pop-launcher is line-based. Every line will contain a single JSON message That will be serialized or decoded as a Request, PluginResponse, or Response. These types can be referenced in docs.rs. IPC is based on standard input/output streams, so you should take care not to write logs to stdout.

Frontend JSON IPC

The frontend will send Requests to the pop-launcher service through the stdin pipe. The stdout pipe will respond with Responses. It is ideal to design your frontend to accept responses asynchronously. Sending Interrupt or Search will cancel any active searches being performed, if the plugins that are still actively searching support cancellation.

Plugin JSON IPC

Plugins will receive Requests from pop-launcher through their stdin pipe. They should respond with PluginResponse messages.

Request

If you are writing a frontend, you are sending these events to the pop-launcher stdin pipe. If you are writing a plugin, the plugin will be receiving these events from its stdin.

pub enum Request {
    /// Activate on the selected item
    Activate(Indice),
    /// Activate a context item on an item.
    ActivateContext { id: Indice, context: Indice },
    /// Perform a tab completion from the selected item
    Complete(Indice),
    /// Request for any context options this result may have.
    Context(Indice),
    /// Request to end the service
    Exit,
    /// Requests to cancel any active searches
    Interrupt,
    /// Request to close the selected item
    Quit(Indice),
    /// Perform a search in our database
    Search(String),
}

JSON Equivalent

  • { "Activate": number }
  • { "ActivateContext": { "id": number, "context": id }}
  • { "Complete": number }
  • { "Context": number }
  • "Exit"
  • "Interrupt"
  • { "Quit": number }
  • { "Search": string }

PluginResponse

If you are writing a plugin, you should send these events to your stdout.

pub enum PluginResponse {
    /// Append a new search item to the launcher
    Append(PluginSearchResult),
    /// Clear all results in the launcher list
    Clear,
    /// Close the launcher
    Close,
    // Additional options for launching a certain item
    Context {
        id: Indice,
        options: Vec<ContextOption>,
    },
    // Notifies that a .desktop entry should be launched by the frontend.
    DesktopEntry {
        path: PathBuf,
        gpu_preference: GpuPreference,
    },
    /// Update the text in the launcher
    Fill(String),
    /// Indicoates that a plugin is finished with its queries
    Finished,
}

JSON Equivalent

  • { "Append": PluginSearchResult },
  • "Clear",
  • "Close",
  • { "Context": { "id": number, "options": Array }}
  • { "DesktopEntry": { "path": string, "gpu_preference": GpuPreference }}
  • { "Fill": string }
  • "Finished"

Where PluginSearchResult is:

{
    id: number,
    name: string,
    description: string,
    keywords?: Array<string>,
    icon?: IconSource,
    exec?: string,
    window?: [number, number],
}

ContextOption is:

{
    id: number,
    name: string
}

GpuPreference is:

"Default" | "NonDefault"

And IconSource is either:

  • { "Name": string }, where the name is a system icon, or an icon referred to by path
  • { "Mime": string }, where the mime is a mime essence string, to display file-based icons

Response

Those implementing frontends should listen for these events:

pub enum Response {
    // An operation was performed and the frontend may choose to exit its process.
    Close,
    // Additional options for launching a certain item
    Context {
        id: Indice,
        options: Vec<ContextOption>,
    },
    // Notifies that a .desktop entry should be launched by the frontend.
    DesktopEntry {
        path: PathBuf,
        gpu_preference: GpuPreference,
    },
    // The frontend should clear its search results and display a new list
    Update(Vec<SearchResult>),
    // An item was selected that resulted in a need to autofill the launcher
    Fill(String),
}

JSON Equivalent

  • "Close"
  • { "DesktopEntry": string }
  • { "Update": Array }
  • { "Fill": string }

Where SearchResult is:

{
    id: number,
    name: string,
    description: string,
    icon?: IconSource,
    category_icon?: IconSource,
    window?: [number, number]
}
Comments
  • feat(service): prefer recently/often used applications in search

    feat(service): prefer recently/often used applications in search

    This PR was intended to address #22, but as of writing this I noticed that I might have misunderstood is issue: with this PR, the order of the search results is altered, so that recently or often used applications are listed higher than matches that are rarely used. It does not affect the order of the active windows in the list of results. Anyways, I am certain that the implemented mechanism is still useful and can easily be extended to reorder the active window entries.

    There are the following additions:

    • The struct RecentUseStorage is a part of the Service and keeps track how often applications are called from the launcher in total (called long term storage) and which applications were called recently (called short term storage).
    • When two search results are compared, two constants are added to the Jaro-Winkler-similarity to the item that was used more recently or more frequently, respectively. So those items will appear at a more favorable position in the search results. This comparison is implemented in a new struct Priority that keeps all relevant data needed for the ordering, including the plugin priority.
    • The long term storage of RecentUseStorage is serialized and stored in the cache dir. The short term storage is freshly initialized on each startup. I still feel quite unsure about the serialization into the cache file, which is called with each Activate/ActivateContext request. Maybe there is some more elegant solution?
    opened by truprecht 17
  • Add Installation instructions to README

    Add Installation instructions to README

    As the pop-launcher service has been separated from pop-shell, when you make a local install of pop-shell, you don't have the Launcher available anymore.

    Please, add detailed instructions of how to install pop-launcher service and integrate it with pop-shell.

    opened by nielsonrolim 15
  • Calculator plugin should display error when qalc is not installed

    Calculator plugin should display error when qalc is not installed

    I observed this with the calculator, find, scripts, .... e.g. searching for = 5 + 7 results into the output 5 + 7 x = ? without any calculation happening.

    I think the shell should also output stderr of the pop-launcher command, for easier debugging.

    System Config pop-launcher commit: pop-os/launcher@5cea11573dbb9180b144ac7420c0e6fba46aaefd pop-shell commit: pop-os/shell@522030336565badc6fd6068bd5e38328996aa4bf Gnome-Shell 3.36.9

    /etc/os-release

    NAME="Ubuntu"
    VERSION="20.04.3 LTS (Focal Fossa)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 20.04.3 LTS"
    VERSION_ID="20.04"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=focal
    UBUNTU_CODENAME=focal
    

    Pop-OS shell and launcher are compiled from scratch.

    The aforementioned plugins are all present in the ~/.local/share/pop-launcher/plugins/ directory and their corresponding binaries start into the JSON pipeline mode using e.g. ./calc without problems.

    opened by tyalie 11
  • Remove

    Remove "approx." keyword and improve decimal point/comma handling

    This changes the calculator behavior to stop showing "approx." in front of numbers when it has more decimal places than can be shown, by enabling qalc's Unicode support. It also explicitly sets the decimal mark to decimal points when that's preferred over commas.

    For issue #71

    opened by nathansgithub 9
  • [Feature request] - Per rule icon for web plugin

    [Feature request] - Per rule icon for web plugin

    I would be nice to have an optional per rule icon for the web plugin, falling back to the default one when not specified :

            (
                matches: ["arch"],
                queries: [(name: "Arch Wiki", query: "wiki.archlinux.org/index.php/" )],
                icon: Name("archlinux")
            ),
            (
                // Should fallback to the icon defined in plugins/web/config.ron
                matches: ["bc", "bandcamp"],
                queries: [(name: "Bandcamp", query: "bandcamp.com/search?q=")]
            ),
    
    opened by oknozor 9
  • Basic front end example : getting nothing from stdout

    Basic front end example : getting nothing from stdout

    Hello, I am planning to use pop launcher in a frontend application so I started to implement a simple example to test it. I don't understand why but it seems I am getting only stderr content. Am I missing something obvious here ?

    #[macro_use]
    extern crate tokio;
    
    use async_process::{Command, Stdio, ChildStdout, ChildStderr, ChildStdin};
    use pop_launcher::{Request};
    use futures_lite::{io::BufReader, prelude::*};
    use tokio::task::JoinHandle;
    
    #[tokio::main]
    async fn main() {
    
        let child = Command::new("pop-launcher")
            .stdin(Stdio::piped())
            .stdout(Stdio::piped())
            .stderr(Stdio::piped())
            .spawn()
            .unwrap();
    
        let stdout = child.stdout;
        let stderr = child.stderr;
        let stdin = child.stdin.unwrap();
    
        let read_handle = handle_stdout(stdout);
        let err_handle = handle_stderr(stderr);
        let write_handle = write_handle(stdin);
    
        let _ = join!(read_handle, err_handle, write_handle);
    }
    
    fn write_handle(mut stdin: ChildStdin) -> JoinHandle<()> {
        tokio::spawn(async move {
            let request = Request::Search("cal".to_string());
            let json = serde_json::to_string(&request).unwrap();
    
            // Dummy search request, we get nothing from pop-launcher stdout, why ??? 
            stdin.write(json.as_bytes()).await.unwrap();
            stdin.write(b"\n").await.unwrap();
            stdin.flush().await.unwrap();
    
            // Json format error
            stdin.write(b"\n").await.unwrap();
            stdin.flush().await.unwrap();
    
        })
    }
    
    fn handle_stdout(mut stdout: Option<ChildStdout>) -> JoinHandle<()> {
        tokio::spawn(async move {
            let mut lines = BufReader::new(stdout.take().unwrap()).lines();
    
            loop {
                if let Some(line) = lines.next().await {
                    println!("{}", line.unwrap());
                }
            }
        })
    }
    
    fn handle_stderr(mut stderr: Option<ChildStderr>) -> JoinHandle<()> {
        tokio::spawn(async move {
            let mut lines = BufReader::new(stderr.take().unwrap()).lines();
    
            loop {
                if let Some(line) = lines.next().await {
                    println!("{}", line.unwrap());
                }
            }
        })
    }
    

    Also I was wondering If you are planning to upload pop launcher on crates.io ? It would be nice to have the crate doc available somewhere.

    opened by oknozor 9
  • Fixed web plugin favicons, binary size reduction, perf optimizations

    Fixed web plugin favicons, binary size reduction, perf optimizations

    • Enable LTO, panic=abort, set strip-true by default to reduce binary size
    • Swap the default system allocator for mimalloc, which is 2.6x faster and more secure
    • Fixed the symbolic link names installed by the justfile
    • Fixed missing favicons on some websites, like Amazon
      • It seems Google isn't correctly checking the root of a domain for the favicon anymore

    Binary size should now be reduced from ~8MB to ~6MB, which is shared memory to all plugins.

    Closes #98

    opened by mmstick 8
  • Inform user if qalc or fdfind isn't installed

    Inform user if qalc or fdfind isn't installed

    • If attempting to use the calc plugin without qalc installed, the search result will be a message stating that it isn't installed.
    • Does the same for the find plugin with fdfind

    Closes #30

    opened by mmstick 8
  • feat: add 'plugin_trait' feature to pop-launcher-toolkit

    feat: add 'plugin_trait' feature to pop-launcher-toolkit

    This PR add a plugin_trait feature which provides a helper trait to write plugins.

    It reduces the boiler plate needed by wrapping the stdin message passing in a default run function, and the stdout messages in respond_with.

    Additionally it implement the same logging behavior the default plugins have.

    For a concrete example you can take a look at pop-launcher-mpd

    opened by oknozor 6
  • Not able to start flatpak VSCodium from launcher

    Not able to start flatpak VSCodium from launcher

    When I try to launch flatpak VSCodium using SUPER + /, the app launches but the app window is completely black. If I start VSCodium from Applications Menu, everything works just fine. I'm using the Nvidia 20.04 version of Pop!_OS.

    opened by 610th 6
  • Web plugin breaks http links

    Web plugin breaks http links

    I noticed that the web plugin always tries to use https even when supplied with a link that uses http. I have a situation where I want to use the launcher to quickly access a server on my local host, which uses http but the plugin adds https in front of it, thus, breaking the link. I would be thankful to see this issue fixed.

    opened by purrie 4
  • support directory search

    support directory search

    I like launcher very much. Most of my works need。 But I have many front-end projects. you now, with thousands of node_modules packages. They confuse me when I use launcher to find my project, (for example, I want to enter one of projects, but I cannot search my project name) So I need it very much.

    opened by jqhr 4
  • Allow scripts to define their interpreter

    Allow scripts to define their interpreter

    Howdie, thanks so much for sharing this project <3

    My scripts can be found via a launcher front-end just fine (I'm using onagre)

    However, if there is an error in a script or other useful output, there doesn't appear to be any feedback or log entries (I've checked journalctl -xb, I've checked the stderr/stdout from both onagre and pop-launcher)

    I noticed that we don't scripts are run in a way that throws away their stderr/stdout content: https://github.com/pop-os/launcher/blob/master/plugins/src/scripts/mod.rs#L62-L64

    I understand that the API for pop-launcher and its plugins is built around JSON lines in stdin/stdout, so it would break the API to allow script execution to write to stdin/stdout, but should it be okay to pipe through stderr?

    Should there be a way for pop-launcher to signal to the front-end that there was an error with an activation?

    Cheers!

    enhancement 
    opened by jokeyrhyme 7
  • Use placeholder icon when no icon is defined

    Use placeholder icon when no icon is defined

    I've just installed pop-shell and pop-launcher in Archlinux, but the category icons are missing.

    image

    Are there any icon package dependencies that I should also install? Or could the category icons be deactivated altogether?

    enhancement 
    opened by tilacog 0
  • Justfile installs pop-launcher binary in wrong location

    Justfile installs pop-launcher binary in wrong location

    First of all, I would like to thank all contributors involved in this project. Both the Launcher and Shell are truly amazing tools and significantly improved my workflow.

    The problem: I noticed on my laptop that before installing ZSH, I installed pop-shell and pop-launcher and they were working fine. However, once ZSH is installed, the launcher stops working. Is there anything I can do to make it work again? (This behavior was successfully replicated in a VM)

    OS: Fedora 36

    Thank you!

    bug 
    opened by joaopfonseca 5
  • Scrollable find results

    Scrollable find results

    I often use the find command to locate documents and it works great, but sometimes the file I am looking for is not in the 8 results that the launcher shows. However, if I run fdfind <filename> in a terminal I can see the result in the next 10 items. It would be great if find command also displays all results in a scrollable fashion, similar to how the navigation results of the launcher work.

    opened by dakontiva 0
Releases(1.2.1)
  • 1.2.1(Mar 30, 2022)

    What's Changed

    • Fixed web plugin favicons, binary size reduction, perf optimizations by @mmstick in https://github.com/pop-os/launcher/pull/97
      • Enable LTO, panic=abort, set strip-true by default to reduce binary size
      • Swap the default system allocator for mimalloc, which is 2.6x faster and more secure
      • Fixed the symbolic link names installed by the justfile
      • Fixed missing favicons on some websites, like Amazon
        • It seems Google isn't correctly checking the root of a domain for the favicon anymore

    Full Changelog: https://github.com/pop-os/launcher/compare/1.2.0...1.2.1

    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Mar 28, 2022)

    What's Changed

    • chore(plugins-web): Change aliases to address complaints by @mmstick in https://github.com/pop-os/launcher/pull/66
    • IPC Client API by @mmstick in https://github.com/pop-os/launcher/pull/65
    • feat(desktop-entries): Nix application paths support by @mmstick in https://github.com/pop-os/launcher/pull/74
    • fix(pop_shell): Implement 'Quit' request handler by @ningvin in https://github.com/pop-os/launcher/pull/75
    • fix(terminal): Do not invoke read command on shell execution by @mmstick in https://github.com/pop-os/launcher/pull/80
    • Remove "approx." keyword and improve decimal point/comma handling by @nathansgithub in https://github.com/pop-os/launcher/pull/70
    • chore: Update dependencies by @mmstick in https://github.com/pop-os/launcher/pull/87
    • fix: Show context for graphics only if switchable graphics found by @mmstick in https://github.com/pop-os/launcher/pull/91
    • feat(web): add arxiv prefixes to launcher web config by @wash2 in https://github.com/pop-os/launcher/pull/88
    • 1.2.0: Launcher improvements by @mmstick in https://github.com/pop-os/launcher/pull/95

    New Contributors

    • @ningvin made their first contribution in https://github.com/pop-os/launcher/pull/75
    • @nathansgithub made their first contribution in https://github.com/pop-os/launcher/pull/70
    • @wash2 made their first contribution in https://github.com/pop-os/launcher/pull/88

    Full Changelog: https://github.com/pop-os/launcher/compare/1.1.0...1.2.0

    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Oct 31, 2021)

    Changelog

    Bug Fixes

    • c330552c Extract value from output expression on activate
    • be7438fe Extract value from last occurrence of assignment operator
    • 857acd1e Fallback to fd if fdfind is not found

    Features

    • e7e6007e Add isolate_with plugin query config
    • b8192e1d Show calculations globally if query is a math expression

    Miscellaneous Tasks

    • ac4ff8b7 Add VS Code devcontainer
    • e3a14f7f Set podman as default docker container tool
    • f26f67f3 Use clippy by default with rust-analyzer
    • 5a4b829e Update dependencies
    • e6a2babc Apply Clippy lint fixes

    Full Changelog: https://github.com/pop-os/launcher/compare/1.0.2...1.0.3

    Automatically generated with git-cliff.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Oct 31, 2021)

    What's Changed

    • fix(calc): Update description from JS to Rust dependency by @friday in https://github.com/pop-os/launcher/pull/18
    • Add arm64 builds by @jackpot51 in https://github.com/pop-os/launcher/pull/32
    • Launcher Improvements by @mmstick in https://github.com/pop-os/launcher/pull/27
    • fix(terminal): resolve terminal symlink once by @oknozor in https://github.com/pop-os/launcher/pull/34
    • Inform user if qalc or fdfind isn't installed by @mmstick in https://github.com/pop-os/launcher/pull/36
    • feat(web): fetch and cache favicon by @oknozor in https://github.com/pop-os/launcher/pull/42
    • fix(launcher): Exclude GNOME Initial Setup by @mmstick in https://github.com/pop-os/launcher/pull/45

    New Contributors

    • @friday made their first contribution in https://github.com/pop-os/launcher/pull/18
    • @jackpot51 made their first contribution in https://github.com/pop-os/launcher/pull/32
    • @oknozor made their first contribution in https://github.com/pop-os/launcher/pull/34

    Full Changelog: https://github.com/pop-os/launcher/compare/1.0.1...1.0.2

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Sep 10, 2021)

    What's Changed

    • Update references to scripts and plugins directories in readme by @hverlin in https://github.com/pop-os/launcher/pull/4
    • fix(desktop-entries): Invalid launcher for extensions app by @mmstick in https://github.com/pop-os/launcher/pull/9
    • fix(service): Stale search results after interrupt by @mmstick in https://github.com/pop-os/launcher/pull/14

    New Contributors

    • @hverlin made their first contribution in https://github.com/pop-os/launcher/pull/4

    Full Changelog: https://github.com/pop-os/launcher/compare/1.0.0...1.0.1

    Source code(tar.gz)
    Source code(zip)
    launcher-1.0.1.tar.zst(19.70 MB)
Owner
Pop!_OS
An Operating System by System76
Pop!_OS
An experimental IPC interface definition language for Hubris.

Idol: interface definitions for Hubris This is an experimental interface definition language for defining IPC interfaces between tasks in a Hubris app

Oxide Computer Company 8 Oct 19, 2022
Rust-native IPC broker

elbus - Rust-native IPC broker Note: the project is under development and in alpha stage https://elbus.bma.ai/ What is elbus elbus is a rust-native IP

Altertech 66 Dec 31, 2022
The best open source remote desktop software

The best open-source remote desktop software, written in Rust. Works out of the box, no configuration required. Great alternative to TeamViewer and AnyDesk! You have full control of your data, with no concerns about security. You can use our rendezvous/relay server, set up your own, or write your own rendezvous/relay server.

RustDesk 35.4k Jan 4, 2023
Filen.io is a cloud storage provider with an open-source desktop client.

Library to call Filen.io API from Rust Filen.io is a cloud storage provider with an open-source desktop client. My goal is to write a library which ca

Konstantin Zakharov 5 Nov 15, 2022
Sanzu is a graphical remote desktop solution

Sanzu Sanzu is a graphical remote desktop solution. It is composed of: a server running on Unix or Windows which can stream a X11 or a Windows GUI env

CEA IT Security 95 Dec 23, 2022
ZeroNS: a name service centered around the ZeroTier Central API

ZeroNS: a name service centered around the ZeroTier Central API ZeroNS provides names that are a part of ZeroTier Central's configured networks; once

ZeroTier, Inc. 327 Dec 20, 2022
Open Internet Service to store transaction history for NFTs/Tokens on the Internet Computer

CAP - Certified Asset Provenance Transaction history & asset provenance for NFT’s & Tokens on the Internet Computer CAP is an open internet service pr

Psychedelic 42 Nov 10, 2022
Cover is an open internet service for canister code verification on the Internet Computer

Cover Cover (short for Code Verification) is an open internet service that helps verify the code of canisters on the Internet Computer. Visit our webs

Psychedelic 14 Oct 31, 2022
Prometheus instrumentation service for the NGINX RTMP module.

nginx-rtmp-exporter Prometheus instrumentation service for the NGINX RTMP module. Usage nginx-rtmp-exporter [OPTIONS] --scrape-url <SCRAPE_URL> O

kaylen ✨ 2 Jul 3, 2022
Simple CLI to manage your systemd clash.service and config subscriptions on Linux.

clashrup Simple CLI to manage your systemd clash.service and config subscriptions on Linux. Setup, update, apply overrides, and manage via systemctl.

Spencer (Shangbo Wu) 44 Jan 29, 2023
Futures-based QUIC implementation in Rust

Pure-rust QUIC protocol implementation Quinn is a pure-rust, future-based implementation of the QUIC transport protocol undergoing standardization by

null 2.6k Jan 8, 2023
A simple message based networking library for the bevy framework

Spicy Networking for Bevy bevy_spicy_networking is a solution to the "How do I connect multiple clients to a single server" problem in your bevy games

Cabbit Studios 67 Jan 1, 2023
Fullstack development framework for UTXO-based dapps on Nervos Network

Trampoline-rs The framework for building powerful dApps on the number one UTXO chain, Nervos Network CKB. This is an early-stage, currently very incom

TannrA 2 Mar 25, 2022
A multiplayer web based roguelike built on Rust and WebRTC

Gorgon A multiplayer web-based roguelike build on Rust and WebRTC. License This project is licensed under either of Apache License, Version 2.0, (LICE

RICHΛRD ΛNΛYΛ 2 Sep 19, 2022
Dropping GFW DNS contaminated packets based on Rust + eBPF

Dropping GFW DNS contaminated packets based on Rust + eBPF

ihc童鞋@提不起劲 1k Jan 3, 2023
A Markov chain based Discord chat bot.

A Markov chain based Discord chat bot. Building It is recommended to use cargo.

Dominik Miedziński 1 Dec 26, 2021
Userspace libpcap-based tool to mirror your dns traffic

DNS traffic mirroring tool (dns-mirror) Description Userspace libpcap-based tool. dns-mirror sniffs dns packets on the given interface and proxies it

Timofey 1 Mar 15, 2022
A rust-based command line tool to serve as a gateway for a Internet Computer replica.

icx-proxy A command line tool to serve as a gateway for a Internet Computer replica. Contributing Please follow the guidelines in the CONTRIBUTING.md

DFINITY 25 Sep 6, 2022
A minimalistic encryption protocol for rust async streams/packets, based on noise protocol and snow.

Snowstorm A minimalistic encryption protocol for rust async streams / packets, based on noise protocol and snow. Quickstart Snowstorm allows you to se

Black Binary 19 Nov 22, 2022