A Discord and Fosscord client implemented directly without Discord API.
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
webcord.url = "github:fufexan/webcord-flake";
};
outputs = {self, nixpkgs, webcord, ...} @ inputs: {
# for NixOS
nixosConfigurations.HOSTNAME = nixpkgs.lib.nixosSystem {
specialArgs = {inherit inputs;};
# ...
};
# for Home Manager
homeConfigurations."USER@HOSTNAME" = home-manager.lib.homeManagerConfiguration {
extraSpecialArgs = {inherit inputs;};
# ...
};
};
}
Don't forget to replace
HOSTNAME
with your hostname, orUSER@HOSTNAME
with your profile name!
{pkgs, inputs, ...}: {
environment.systemPackages = [ # or home.packages
inputs.webcord.packages.${pkgs.system}.default
# ...
];
}
Overlays allow another set of packages or package scopes to be merged onto nixpkgs.
This means that when using an overlay provided by a Flake, its packages will be made
available at pkgs.<name>
.
In order for an overlay to be applied to nixpkgs early, you must import
nixpkgs manually in your flake.nix
, instead of using nixpkgs.legacyPackages
.
Usually where you have pkgs = nixpkgs.legacyPackages.${system};
,
you would instead use:
pkgs = import nixpkgs {
inherit system;
# config.allowUnfree = true;
};
A complete example for including the overlay in this manner follows.
outputs = {self, nixpkgs, webcord, ...}: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
# config.allowUnfree = true;
overlays = [
webcord.overlays.default
];
};
in {
# for NixOS
nixosConfigurations.HOSTNAME = nixpkgs.lib.nixosSystem {
inherit pkgs;
# ...
};
# for Home Manager
homeConfigurations."USER@HOSTNAME" = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
# ...
};
};
Don't forget to replace
HOSTNAME
with your hostname, orUSER@HOSTNAME
with your profile name!
Note that using specialArgs
and extraSpecialArgs
(to pass inputs
) can be avoided in this manner.
{config, pkgs, ...}: let
flake-compat = builtins.fetchTarball "https://github.com/edolstra/flake-compat/archive/master.tar.gz";
webcord = (import flake-compat {
src = builtins.fetchTarball "https://github.com/fufexan/webcord-flake/archive/master.tar.gz";
}).defaultNix;
in {
environment.systemPackages = [ # or home.packages
webcord.packages.${pkgs.system}.default
# ...
];
}
WebCord runs natively on Wayland, using the standard --ozone-platform=wayland
flag. This package comes with a wrapper that adds that flag automatically when
the NIXOS_OZONE_WL=1
environment variable is set, following the example of
popular packages in Nixpkgs, like VSCode.
environment.variables.NIXOS_OZONE_WL = "1";
home.sessionVariables.NIXOS_OZONE_WL = "1";
There are two methods of setting themes, one of them implemented directly by WebCord, the other uses a little help from Nix.
Themes
refers to the directory$XDG_CONFIG_DIR/WebCord/Themes
.- "the flag" refers to the shell command argument
--add-css-theme
(see next section).
You can import the Home Manager module to set themes declaratively (and reproducibly).
This is recommended over using the --add-css-theme
flag for several reasons:
- WebCord watches
Themes
and will reload itself when it detects changes to that directory.- If you use the flag, WebCord will need a restart, as well as some extra hand-holding (detailed later).
- When using the flag, WebCord copies specified stylesheets to
Themes
.- When using this module, there are fewer things for WebCord to do when starting up.
- WebCord does not delete "unused" files from
Themes
when they are removed from the launch flags. - WebCord will load all themes, unconditionally, from
Themes
.- This will lead to conflicts unless you manually clear the directory.
WebCord will spawn a dialog asking if really want to add a theme when passed via the flag.- This is fixed by a patch included with this Flake.
- When using the flag, only the first path specified will be copied.
- This means you have to manually merge themes, and pass them as a single file.
There is one major disadvantage however: loading themes from Themes
is stated to be deprecated soon™.
Currently WebCord loads CSS themes from
{userData}/Themes/
directory when they ends with.theme.css
extension, like most BetterDiscord themes does.However, in the future releases WebCord will encrypt themes with
safeStorage
in approach to prevent tinkering with it by third-party software after it is added to WebCord in order to improve the security especially in the future releases where it is planned that WebCord allow themes to modify its CSP in some way. This breaks with loading themes through.theme.css
files and adds--add-css-theme
flag as an alternative.
imports = [
inputs.webcord.homeManagerModules.default
];
programs.webcord = {
enable = true;
themes = let
catppuccin = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "discord";
rev = "159aac939d8c18da2e184c6581f5e13896e11697";
sha256 = "sha256-cWpog52Ft4hqGh8sMWhiLUQp/XXipOPnSTG6LwUAGGA=";
};
in {
CatpuccinMocha = "${catppuccin}/themes/mocha.theme.css";
};
};
You can set themes (non-reproducibly) by overriding the package.
Read about the option flag here.
{pkgs, inputs, ...}: let
catppuccin = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "discord";
rev = "159aac939d8c18da2e184c6581f5e13896e11697";
sha256 = "sha256-cWpog52Ft4hqGh8sMWhiLUQp/XXipOPnSTG6LwUAGGA=";
};
theme = "${catppuccin}/themes/mocha.theme.css";
in {
system.packages = [ # or home.packages
(inputs.webcord.packages.${pkgs.system}.default.override {
flags = ["--add-css-theme=${theme}"];
})
];
}
You can use the Cachix cache to download the binary directly instead of building it:
nix.settings = {
substituters = ["https://webcord.cachix.org"];
trusted-public-keys = ["webcord.cachix.org-1:l555jqOZGHd2C9+vS8ccdh8FhqnGe8L78QrHNn+EFEs="];
}