backlog-md/flake.nix

148 lines
4.8 KiB
Nix

{
description = "Backlog.md - A markdown-based task management CLI tool";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
bun2nix = {
url = "github:baileyluTCD/bun2nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, flake-utils, bun2nix }:
flake-utils.lib.eachDefaultSystem (system:
let
# Use baseline Bun for x86_64-linux to support older CPUs without AVX2
# This fixes issue #412 where users with older CPUs (i7-3770, i7-3612QE)
# get "Illegal instruction" errors during the build process.
#
# The baseline build targets Nehalem architecture (2008+) with SSE4.2
# instead of Haswell (2013+) with AVX2, allowing builds on older hardware.
#
# Using an overlay to replace the Bun package maintains full compatibility
# with the standard Bun package structure (thanks to @erdosxx for this solution).
pkgs = import nixpkgs {
inherit system;
overlays = if system == "x86_64-linux" then
let bunVersion = "1.2.23"; in [
(final: prev: {
bun = prev.bun.overrideAttrs (oldAttrs: {
src = prev.fetchurl {
url = "https://github.com/oven-sh/bun/releases/download/bun-v${bunVersion}/bun-linux-x64-baseline.zip";
sha256 = "017f89e19e1b40aa4c11a7cf671d3990cb51cc12288a43473238a019a8cafffc";
};
});
})
]
else
[];
};
# Read version from package.json
packageJson = builtins.fromJSON (builtins.readFile ./package.json);
version = packageJson.version;
ldLibraryPath = ''
LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath [
pkgs.stdenv.cc.cc.lib
]}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
'';
backlog-md = bun2nix.lib.${system}.mkBunDerivation {
pname = "backlog";
inherit version;
src = ./.;
packageJson = ./package.json;
bunNix = ./bun.nix;
nativeBuildInputs = with pkgs; [ bun git rsync ];
preBuild = ''
export HOME=$TMPDIR
export HUSKY=0
export ${ldLibraryPath}
'';
buildPhase = ''
runHook preBuild
# Build the CLI tool with embedded version
# Note: CSS is pre-compiled and committed to git, no need to build here
bun build --compile --minify --define "__EMBEDDED_VERSION__=${version}" --outfile=dist/backlog src/cli.ts
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp dist/backlog $out/bin/backlog
chmod +x $out/bin/backlog
runHook postInstall
'';
meta = with pkgs.lib; {
description = "A markdown-based task management CLI tool with Kanban board";
longDescription = ''
Backlog.md is a command-line tool for managing tasks and projects using markdown files.
It provides Kanban board visualization, task management, and integrates with Git workflows.
'';
homepage = "https://backlog.md";
changelog = "https://github.com/MrLesk/Backlog.md/releases";
license = licenses.mit;
maintainers = let
mrlesk = {
name = "MrLesk";
github = "MrLesk";
githubId = 181345848;
};
in
with maintainers; [ anpryl mrlesk ];
platforms = platforms.all;
mainProgram = "backlog";
};
};
in
{
packages = {
default = backlog-md;
"backlog-md" = backlog-md;
};
apps = {
default = flake-utils.lib.mkApp {
drv = backlog-md;
name = "backlog";
};
};
devShells.default = pkgs.mkShell {
packages = with pkgs; [
bun
bun2nix.packages.${system}.default
];
buildInputs = with pkgs; [
bun
nodejs_20
git
biome
];
shellHook = ''
export ${ldLibraryPath}
echo "Backlog.md development environment"
echo "Available commands:"
echo " bun i - Install dependencies"
echo " bun test - Run tests"
echo " bun run cli - Run CLI in development mode"
echo " bun run build - Build the CLI tool"
echo " bun run check - Run Biome checks"
'';
};
});
}