# Usage: # - Shell: `nix develop` # - Direnv (https://direnv.net/): `.envrc` content of `use flake` # - Build: `nix build` # - Run: `nix run` { description = "Slack Local Reader"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self , nixpkgs , flake-utils , }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python312; # ── Python Dependency Overrides ────────────────────────────── # # dfindexeddb pins python-snappy==0.6.1 and zstd==1.5.5.1. # nixpkgs ships newer versions, so we build the exact pins # from PyPI source tarballs. pythonPackages = python.pkgs; python-snappy = pythonPackages.buildPythonPackage rec { pname = "python-snappy"; version = "0.6.1"; format = "setuptools"; src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/98/7a/44a24bad98335b2c72e4cadcdecf79f50197d1bab9f22f863a274f104b96/python-snappy-0.6.1.tar.gz"; hash = "sha256-tqEHqwYgasxTWdTFYyvZsi1EhwKnmzFpsMYuD7gIuyo="; }; buildInputs = [ pkgs.snappy ]; # Tests require snappy test fixtures not present in sdist doCheck = false; }; zstd-python = pythonPackages.buildPythonPackage rec { pname = "zstd"; version = "1.5.5.1"; format = "setuptools"; src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/source/z/zstd/zstd-1.5.5.1.tar.gz"; hash = "sha256-HvmAq/Dh4HKwKNLXbvlbR2YyZRyWIlzzC2Gcbu9iVnI="; }; # Bundled C sources — no external zstd library needed doCheck = false; }; dfindexeddb = pythonPackages.buildPythonPackage rec { pname = "dfindexeddb"; version = "20260210"; format = "setuptools"; src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/source/d/dfindexeddb/dfindexeddb-20260210.tar.gz"; hash = "sha256-4ahEe4Lpoh0oqGR6kI7J1HEGfvKVEzu3qQ+3ykgFd/Y="; }; propagatedBuildInputs = [ python-snappy zstd-python ]; doCheck = false; }; # ── Slack CLI Package ──────────────────────────────────────── slack-cli = pythonPackages.buildPythonApplication { pname = "slack-cli"; version = "0.1.0"; format = "pyproject"; src = let fs = pkgs.lib.fileset; in fs.toSource { root = ./.; fileset = fs.unions [ ./pyproject.toml ./slack_cli ]; }; build-system = [ pythonPackages.setuptools ]; dependencies = [ dfindexeddb ]; doCheck = false; meta = { description = "Read Slack messages from local Chromium IndexedDB cache"; mainProgram = "slack-cli"; }; }; in { packages.default = slack-cli; devShells.default = pkgs.mkShell { packages = with pkgs; [ python uv snappy ]; shellHook = '' export UV_PYTHON_PREFERENCE=only-system ''; }; } ); }