Skip to content

Repository files navigation

Nixcord

Nixcord

One Nix config for your Discord mods, themes, and clients.

Manage Vencord, Equicord, Vesktop, Dorion, and Legcord from your Nix config.

Flake Checks Docs MIT License GitHub stars Built with Nix

Quickstart | Without Flakes | Configuration | Settings Converter | Options | User Plugins

Important

Nixcord is declarative, so changes made in the client's in-app "Plugins" menu are not persistent. Update your .nix file to make settings stick.

Quickstart

Add to flake.nix:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
    nixcord.url = "github:4evy/nixcord";
    # ...
  };

  # ...
}

Then import the module

Home Manager (Recommended)

Most people should use this. It handles paths and permissions for you

# home.nix
{ inputs, ... }: {
  imports = [ inputs.nixcord.homeModules.nixcord ];
  # ... config
}

NixOS (System-wide)

If you don't use Home Manager

# configuration.nix
{ inputs, ... }: {
  imports = [ inputs.nixcord.nixosModules.nixcord ];

  programs.nixcord = {
    enable = true;
    user = "your-username"; # Needed for system-level config
    # ... config
  };
}

nix-darwin (macOS)

If you are managing your Mac system-wide

# darwin-configuration.nix
{ inputs, ... }: {
  imports = [ inputs.nixcord.darwinModules.nixcord ];

  programs.nixcord = {
    enable = true;
    user = "your-username"; # Needed for system-level config
    # ... config
  };
}

Without Flakes

Nixcord has a native default.nix; using it does not enable flakes or evaluate flake.lock. npins is the recommended way to pin both Nixpkgs and Nixcord.

Run these commands from the root of your Nix configuration. They create an npins directory, pin the same Nixpkgs release used in the flake quickstart, and pin Nixcord's main branch:

nix-shell -p npins --run 'npins init --bare'
nix-shell -p npins --run 'npins add github NixOS nixpkgs --branch nixos-26.05 --name nixpkgs'
nix-shell -p npins --run 'npins add github 4evy nixcord --branch main'

Commit the generated npins/default.nix and npins/sources.json files so every machine evaluates the same revisions.

Import the pinned sources, create your package set, and pass that package set to Nixcord. For example, in a Home Manager configuration:

let
  sources = import ./npins;
  pkgs = import sources.nixpkgs {
    config.allowUnfree = true;
  };
  nixcord = import sources.nixcord { inherit pkgs; };
in
{
  imports = [ nixcord.homeModules.nixcord ];

  programs.nixcord = {
    enable = true;
    discord.vencord.enable = true;
  };
}

If your configuration already provides pkgs, reuse it instead of importing Nixpkgs again. For NixOS or nix-darwin, select the corresponding module just as in the flake examples above:

# NixOS
imports = [ nixcord.nixosModules.nixcord ];

# nix-darwin
imports = [ nixcord.darwinModules.nixcord ];

System-wide NixOS and nix-darwin configurations must also set programs.nixcord.user to the user whose Discord configuration Nixcord should manage.

Update the pins explicitly when you want newer revisions, then review and commit the changes to npins/sources.json:

nix-shell -p npins --run 'npins update nixpkgs nixcord'

The same import interface works if the Nixcord source comes from a channel, fetchTarball, or another pinning tool:

nixcord = import path-to-nixcord { inherit pkgs; };

The imported source exposes homeModules, nixosModules, darwinModules, packages, overlay, and overlays.default. Package derivations are also available directly, so a source checkout supports:

nix-build -A vencord
nix-build -A docs
nix-shell

The overlay keeps Nixcord packages namespaced under pkgs.nixcord:

let
  nixcord = import sources.nixcord { inherit pkgs; };
  pkgsWithNixcord = pkgs.extend nixcord.overlay;
in
pkgsWithNixcord.nixcord.vencord

Configuration

You can configure Vencord, Equicord, Vesktop, Dorion, or Legcord

Tip: Launch your client once manually to look through the plugins list so you know what you actually want to enable

{
  programs.nixcord = {
    enable = true;

    # Choose your Discord mod client (enable at most one of these two)
    discord.vencord.enable = true;      # Standard Vencord
    # discord.equicord.enable = true;   # Equicord (has more plugins)

    # Or these
    vesktop.enable = true;
    # dorion.enable = true;
    # legcord.enable = true;

    # Theming
    quickCss = "/* css goes here */";
    config = {
      useQuickCss = true;
      themeLinks = [
        "https://raw.githubusercontent.com/link/to/some/theme.css"
      ];
      frameless = true;

      plugins = {
        hideMedia.enable = true;
        ignoreActivities = {
          enable = true;
          ignorePlaying = true;
          ignoredActivities = [
            { id = "game-id"; name = "League of Legends"; type = 0; }
          ];
        };
      };
    };
  };
}

Check the online docs for the full list of options

Settings Converter

Already have Vencord or Equicord configured? The docs include a browser-side settings converter that turns an exported settings.json into Nixcord config.

Legcord

Legcord is a lightweight Discord client. Enable it with:

{
  programs.nixcord.legcord = {
    enable = true;

    # Optionally bundle Vencord or Equicord (also installs userPlugins)
    vencord.enable = true;
    # equicord.enable = true;

    settings = {
      channel = "stable";
      tray = "dynamic";
      minimizeToTray = true;
      mods = [ "vencord" ];
      doneSetup = true;
    };
  };
}

Third-Party User Plugins

You can load custom Vencord/Equicord plugins that aren't in the upstream plugin list using userPlugins. Any plugin you add also needs to be enabled in extraConfig.plugins:

{
  programs.nixcord = {
    # GitHub repo at a specific commit
    userPlugins = {
      someCoolPlugin = "github:someUser/someCoolPlugin/abc123def456...";

      # Local path (requires --impure with flakes)
      myLocalPlugin = "/home/user/projects/myPlugin";

      # Nix path literal
      anotherPlugin = ./plugins/anotherPlugin;
    };

    extraConfig.plugins = {
      someCoolPlugin.enable = true;
      myLocalPlugin.enable = true;
      anotherPlugin.enable = true;
    };
  };
}

A Note on Dorion

Dorion can read its Nix-managed config.json immediately, but Vencord settings live in Discord's WebKit LocalStorage. That SQLite database is only created after Dorion has successfully loaded Discord once, so Nixcord cannot patch VencordSettings on a completely fresh profile.

  1. Run Dorion once before enabling Nixcord's Dorion module: nix run nixpkgs#dorion
  2. Log in, wait for Discord to finish loading, then close it.
  3. Enable dorion.enable = true in your config and rebuild.

Warning

Upstream Dorion still marks Linux voice as unsupported because WebKitGTK WebRTC support is incomplete. Voice/video may fail even after Nixcord is configured.

Docs

Caution

Vencord & Equicord violate Discord ToS. You probably know this already, but use at your own risk!