All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 33s
				
			Test / Sandbox (push) Successful in 1m58s
				
			Test / Sandbox (race detector) (push) Successful in 3m47s
				
			Test / Hpkg (push) Successful in 3m54s
				
			Test / Hakurei (race detector) (push) Successful in 4m32s
				
			Test / Hakurei (push) Successful in 2m10s
				
			Test / Flake checks (push) Successful in 1m19s
				
			Planterette is now developed in another repository, so rename this proof of concept to avoid confusion. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			179 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
<p align="center">
 | 
						|
  <a href="https://git.gensokyo.uk/security/hakurei">
 | 
						|
    <picture>
 | 
						|
      <img src="https://basement.gensokyo.uk/images/yukari1.png" width="200px" alt="Yukari">
 | 
						|
    </picture>
 | 
						|
  </a>
 | 
						|
</p>
 | 
						|
 | 
						|
<p align="center">
 | 
						|
  <a href="https://pkg.go.dev/hakurei.app"><img src="https://pkg.go.dev/badge/hakurei.app.svg" alt="Go Reference" /></a>
 | 
						|
  <a href="https://git.gensokyo.uk/security/hakurei/actions"><img src="https://git.gensokyo.uk/security/hakurei/actions/workflows/test.yml/badge.svg?branch=staging&style=flat-square" alt="Gitea Workflow Status" /></a>
 | 
						|
  <br/>
 | 
						|
  <a href="https://git.gensokyo.uk/security/hakurei/releases"><img src="https://img.shields.io/gitea/v/release/security/hakurei?gitea_url=https%3A%2F%2Fgit.gensokyo.uk&color=purple" alt="Release" /></a>
 | 
						|
  <a href="https://goreportcard.com/report/hakurei.app"><img src="https://goreportcard.com/badge/hakurei.app" alt="Go Report Card" /></a>
 | 
						|
  <a href="https://hakurei.app"><img src="https://img.shields.io/website?url=https%3A%2F%2Fhakurei.app" alt="Website" /></a>
 | 
						|
</p>
 | 
						|
 | 
						|
Hakurei is a tool for running sandboxed graphical applications as dedicated subordinate users on the Linux kernel.
 | 
						|
It implements the application container of [planterette (WIP)](https://git.gensokyo.uk/security/planterette),
 | 
						|
a self-contained Android-like package manager with modern security features.
 | 
						|
 | 
						|
## NixOS Module usage
 | 
						|
 | 
						|
The NixOS module currently requires home-manager to configure subordinate users. Full module documentation can be found [here](options.md).
 | 
						|
 | 
						|
To use the module, import it into your configuration with
 | 
						|
 | 
						|
```nix
 | 
						|
{
 | 
						|
  inputs = {
 | 
						|
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
 | 
						|
 | 
						|
    hakurei = {
 | 
						|
      url = "git+https://git.gensokyo.uk/security/hakurei";
 | 
						|
 | 
						|
      # Optional but recommended to limit the size of your system closure.
 | 
						|
      inputs.nixpkgs.follows = "nixpkgs";
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  outputs = { self, nixpkgs, hakurei, ... }:
 | 
						|
  {
 | 
						|
    nixosConfigurations.hakurei = nixpkgs.lib.nixosSystem {
 | 
						|
      system = "x86_64-linux";
 | 
						|
      modules = [
 | 
						|
        hakurei.nixosModules.hakurei
 | 
						|
      ];
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
This adds the `environment.hakurei` option:
 | 
						|
 | 
						|
```nix
 | 
						|
{ pkgs, ... }:
 | 
						|
 | 
						|
{
 | 
						|
  environment.hakurei = {
 | 
						|
    enable = true;
 | 
						|
    stateDir = "/var/lib/hakurei";
 | 
						|
    users = {
 | 
						|
      alice = 0;
 | 
						|
      nixos = 10;
 | 
						|
    };
 | 
						|
 | 
						|
    commonPaths = [
 | 
						|
      {
 | 
						|
        src = "/sdcard";
 | 
						|
        write = true;
 | 
						|
      }
 | 
						|
    ];
 | 
						|
 | 
						|
    extraHomeConfig = {
 | 
						|
      home.stateVersion = "23.05";
 | 
						|
    };
 | 
						|
 | 
						|
    apps = {
 | 
						|
      "org.chromium.Chromium" = {
 | 
						|
        name = "chromium";
 | 
						|
        identity = 1;
 | 
						|
        packages = [ pkgs.chromium ];
 | 
						|
        userns = true;
 | 
						|
        mapRealUid = true;
 | 
						|
        dbus = {
 | 
						|
          system = {
 | 
						|
            filter = true;
 | 
						|
            talk = [
 | 
						|
              "org.bluez"
 | 
						|
              "org.freedesktop.Avahi"
 | 
						|
              "org.freedesktop.UPower"
 | 
						|
            ];
 | 
						|
          };
 | 
						|
          session =
 | 
						|
            f:
 | 
						|
            f {
 | 
						|
              talk = [
 | 
						|
                "org.freedesktop.FileManager1"
 | 
						|
                "org.freedesktop.Notifications"
 | 
						|
                "org.freedesktop.ScreenSaver"
 | 
						|
                "org.freedesktop.secrets"
 | 
						|
                "org.kde.kwalletd5"
 | 
						|
                "org.kde.kwalletd6"
 | 
						|
              ];
 | 
						|
              own = [
 | 
						|
                "org.chromium.Chromium.*"
 | 
						|
                "org.mpris.MediaPlayer2.org.chromium.Chromium.*"
 | 
						|
                "org.mpris.MediaPlayer2.chromium.*"
 | 
						|
              ];
 | 
						|
              call = { };
 | 
						|
              broadcast = { };
 | 
						|
            };
 | 
						|
        };
 | 
						|
      };
 | 
						|
 | 
						|
      "org.claws_mail.Claws-Mail" = {
 | 
						|
        name = "claws-mail";
 | 
						|
        identity = 2;
 | 
						|
        packages = [ pkgs.claws-mail ];
 | 
						|
        gpu = false;
 | 
						|
        capability.pulse = false;
 | 
						|
      };
 | 
						|
 | 
						|
      "org.weechat" = {
 | 
						|
        name = "weechat";
 | 
						|
        identity = 3;
 | 
						|
        shareUid = true;
 | 
						|
        packages = [ pkgs.weechat ];
 | 
						|
        capability = {
 | 
						|
          wayland = false;
 | 
						|
          x11 = false;
 | 
						|
          dbus = true;
 | 
						|
          pulse = false;
 | 
						|
        };
 | 
						|
      };
 | 
						|
 | 
						|
      "dev.vencord.Vesktop" = {
 | 
						|
        name = "discord";
 | 
						|
        identity = 3;
 | 
						|
        shareUid = true;
 | 
						|
        packages = [ pkgs.vesktop ];
 | 
						|
        share = pkgs.vesktop;
 | 
						|
        command = "vesktop --ozone-platform-hint=wayland";
 | 
						|
        userns = true;
 | 
						|
        mapRealUid = true;
 | 
						|
        capability.x11 = true;
 | 
						|
        dbus = {
 | 
						|
          session =
 | 
						|
            f:
 | 
						|
            f {
 | 
						|
              talk = [ "org.kde.StatusNotifierWatcher" ];
 | 
						|
              own = [ ];
 | 
						|
              call = { };
 | 
						|
              broadcast = { };
 | 
						|
            };
 | 
						|
          system.filter = true;
 | 
						|
        };
 | 
						|
      };
 | 
						|
 | 
						|
      "io.looking-glass" = {
 | 
						|
        name = "looking-glass-client";
 | 
						|
        identity = 4;
 | 
						|
        useCommonPaths = false;
 | 
						|
        groups = [ "plugdev" ];
 | 
						|
        extraPaths = [
 | 
						|
          {
 | 
						|
            src = "/dev/shm/looking-glass";
 | 
						|
            write = true;
 | 
						|
          }
 | 
						|
        ];
 | 
						|
        extraConfig = {
 | 
						|
          programs.looking-glass-client.enable = true;
 | 
						|
        };
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 | 
						|
```
 |