Compare commits

...

3 commits

9 changed files with 224 additions and 45 deletions

View file

@ -59,11 +59,29 @@ in {
};
config = lib.mkIf cfg.enable {
stylix.targets.noctalia-shell.enable = false;
home.packages = [pkgs.app2unit];
home.packages = [pkgs.app2unit pkgs.gpu-screen-recorder];
programs.noctalia-shell = {
enable = true;
systemd.enable = true;
plugins = builtins.fromJSON (builtins.readFile ./plugins.json);
pluginSettings = let
enabledPlugins = with lib;
flip pipe [
(filterAttrs (_name: settings: settings.enabled or false))
builtins.attrNames
]
config.programs.noctalia-shell.plugins.states;
staticSettings = lib.genAttrs enabledPlugins (name: let
pluginSettingPath = ./plugin + "/${name}.json";
in
if lib.pathIsRegularFile pluginSettingPath
then builtins.fromJSON (builtins.readFile pluginSettingPath)
else {});
in
lib.recursiveUpdate
staticSettings {
screen-recorder.directory = "${config.xdg.userDirs.videos}/records";
};
settings =
lib.recursiveUpdate
(builtins.fromJSON (builtins.readFile ./settings.json))

View file

@ -0,0 +1,15 @@
{
"hideInactive": false,
"iconColor": "none",
"filenamePattern": "recording_yyyy-MM-dd_HH:mm:ss",
"frameRate": "165",
"audioCodec": "opus",
"videoCodec": "hevc",
"quality": "ultra",
"colorRange": "full",
"showCursor": true,
"copyToClipboard": false,
"audioSource": "default_output",
"videoSource": "portal",
"resolution": "2560x1440"
}

View file

@ -2,15 +2,19 @@
"sources": [
{
"enabled": true,
"name": "Official Noctalia Plugins",
"name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins"
}
],
"states": {
"screen-recorder": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"timer": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
}
},
"version": 1
"version": 2
}

View file

@ -95,6 +95,9 @@
},
"id": "plugin:timer"
},
{
"id": "plugin:screen-recorder"
},
{
"displayMode": "onhover",
"iconColor": "none",
@ -490,7 +493,7 @@
"visualizerType": "mirrored",
"mprisBlacklist": [],
"preferredPlayer": "spotify, mpv",
"volumeFeedback": false
"volumeFeedback": true
},
"brightness": {
"brightnessStep": 1,

View file

@ -3,6 +3,7 @@
lib,
inputs,
outputs,
config,
...
}: {
imports =
@ -39,6 +40,19 @@
};
};
programs = {
miniserve = {
enable = true;
apps = let
cinny-template = config.youthlic.programs.miniserve.templates.cinny;
in {
cinny-1 = cinny-template {
port = 9093;
};
cinny-2 = cinny-template {
port = 9094;
};
};
};
bash.enable = true;
guix.enable = true;
dae.enable = true;

View file

@ -0,0 +1,27 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.youthlic.programs.caddy.cinny;
caddy-cfg = config.youthlic.programs.caddy;
in {
options = {
youthlic.programs.caddy.cinny = {
enable = lib.mkEnableOption "caddy.cinny";
};
};
config = lib.mkIf (cfg.enable && caddy-cfg.enable) {
services.caddy.virtualHosts = {
"cinny.${caddy-cfg.baseDomain}" = {
extraConfig = ''
root * ${pkgs.cinny}
encode gzip zstd
try_files {path} /index.html
file_server
'';
};
};
};
}

View file

@ -0,0 +1,16 @@
{
pkgs,
lib,
...
}: {
config.youthlic.programs.miniserve.templates.cinny = {port, ...} @ args:
{
inherit port;
directory = args.cinny or (toString pkgs.cinny);
defaultIndex = "index.html";
isSpa = true;
}
// (lib.optionalAttrs (args ? interface) {
inherit (args) interface;
});
}

View file

@ -0,0 +1,84 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.youthlic.programs.miniserve;
in {
imports = lib.youthlic.loadImports ./.;
options = {
youthlic.programs.miniserve = {
enable = lib.mkEnableOption "miniserve";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.miniserve;
};
templates = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = {};
};
apps = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({...}: {
options = {
port = lib.mkOption {
type = lib.types.port;
};
interface = lib.mkOption {
type = lib.types.str;
default = "127.0.0.1";
};
isSpa = lib.mkEnableOption "is spa";
directory = lib.mkOption {
type = lib.types.either lib.types.package lib.types.path;
};
defaultIndex = lib.mkOption {
type = lib.types.str;
default = "index.html";
};
};
}));
default = {};
};
};
};
config = lib.mkIf (cfg.enable && (cfg.apps != {})) {
systemd.services =
lib.concatMapAttrs (name: value: {
"miniserve-${name}" = {
description = ''
miniserve for ${name}
'';
after = ["network-online.target"];
wants = ["network-online.target"];
wantedBy = ["multi-user.target"];
serviceConfig = {
ExecStart = ''
${lib.getExe cfg.package} ${lib.optionalString value.isSpa "--spa"} --index ${value.directory}/${value.defaultIndex} --port ${toString value.port} --interfaces ${value.interface} ${value.directory}
'';
IPAccounting = "yes";
IPAddressAllow = value.interface;
IPAddressDeny = "any";
DynamicUser = "yes";
PrivateTmp = "yes";
PrivateUsers = "yes";
PrivateDevices = "yes";
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = "yes";
ProtectClock = "yes";
ProtectControlGroups = "yes";
ProtectKernelLogs = "yes";
ProtectKernelModules = "yes";
ProtectKernelTunables = "yes";
ProtectProc = "invisible";
CapabilityBoundingSet = [
"CAP_NET_BIND_SERVICE"
"CAP_DAC_READ_SEARCH"
];
};
};
})
cfg.apps;
};
}

View file

@ -1,46 +1,44 @@
{
perSystem = {lib, ...}: {
treefmt = {
programs = {
alejandra = {
enable = true;
excludes = ["_sources/*.nix"];
};
oxfmt = let
oxfmtConfig = with lib;
pipe ./.oxfmtrc.json [builtins.readFile builtins.fromJSON];
in {
enable = true;
includes = ["*.json" "*.md" "*.toml" "*.yaml"];
excludes = oxfmtConfig.ignorePatterns;
};
just = {
enable = true;
includes = [".justfile"];
};
typos = let
config = with lib;
pipe ./.typos.toml [builtins.readFile fromTOML];
in {
enable = true;
includes = ["*"];
excludes = ["assets/*"] ++ config.files.extend-exclude;
configFile = toString ./.typos.toml;
# Disable all extra option in treefmt module.
# Use config file.
sort = false;
isolated = false;
hidden = false;
noIgnore = false;
noIgnoreDot = false;
noIgnoreGlobal = false;
noIgnoreParent = false;
noIgnoreVCS = false;
binary = false;
noCheckFilenames = false;
noCheckFiles = false;
noUnicode = false;
};
treefmt.programs = {
alejandra = {
enable = true;
excludes = ["_sources/*.nix"];
};
oxfmt = let
oxfmtConfig = with lib;
pipe ./.oxfmtrc.json [builtins.readFile builtins.fromJSON];
in {
enable = true;
includes = ["*.json" "*.md" "*.toml" "*.yaml"];
excludes = oxfmtConfig.ignorePatterns;
};
just = {
enable = true;
includes = [".justfile"];
};
typos = let
config = with lib;
pipe ./.typos.toml [builtins.readFile fromTOML];
in {
enable = true;
includes = ["*"];
excludes = ["assets/*"] ++ config.files.extend-exclude;
configFile = toString ./.typos.toml;
# Disable all extra option in treefmt module.
# Use config file.
sort = false;
isolated = false;
hidden = false;
noIgnore = false;
noIgnoreDot = false;
noIgnoreGlobal = false;
noIgnoreParent = false;
noIgnoreVCS = false;
binary = false;
noCheckFilenames = false;
noCheckFiles = false;
noUnicode = false;
};
};
};