nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 stdenv,
3 fetchFromGitHub,
4 lib,
5 fetchYarnDeps,
6 yarn,
7 fixup-yarn-lock,
8 nodejs,
9 electron,
10 python3,
11 libx11,
12 xorgproto,
13 libxkbfile,
14 fontconfig,
15 node-gyp-build,
16 ripgrep,
17 pkg-config,
18 libsecret,
19 yarnBuildHook,
20 makeShellWrapper,
21 unstableGitUpdater,
22 xcbuild,
23 libtool,
24}:
25
26stdenv.mkDerivation (finalAttrs: {
27 pname = "marktext";
28 version = "0.17.0-unstable-2025-11-19";
29
30 src = fetchFromGitHub {
31 owner = "marktext";
32 repo = "marktext";
33 rev = "aa71e33e07845419533d767ad0d260a7c267cec7";
34 hash = "sha256-c/MxYGFFCfC5KcvtBYuxSqeZ4WuAq5zPuBfYqXczicU=";
35 postFetch = ''
36 cd $out
37 patch -p1 < ${./0001-update-electron.patch}
38 ''; # Need for offlineCache
39 };
40
41 offlineCache = fetchYarnDeps {
42 yarnLock = "${finalAttrs.src}/yarn.lock";
43 hash = "sha256-mr79FV/LHkoY3vX9B5yv95IQIJQ9akwfslKndKYmwCo=";
44 };
45
46 nativeBuildInputs = [
47 yarn
48 fixup-yarn-lock
49 makeShellWrapper
50 yarnBuildHook
51 (python3.withPackages (ps: with ps; [ packaging ]))
52 pkg-config
53 nodejs
54 node-gyp-build
55 ]
56 ++ lib.optionals stdenv.hostPlatform.isDarwin [
57 xcbuild
58 libtool
59 ];
60
61 buildInputs = [
62 libsecret
63 libx11
64 libxkbfile
65 fontconfig
66 xorgproto
67 ];
68
69 postPatch = ''
70 substituteInPlace src/common/filesystem/paths.js \
71 --replace-fail "process.resourcesPath" "'$out/opt/marktext/resources'"
72
73 substituteInPlace src/main/cli/index.js \
74 --replace-fail "process.argv.slice(1)" "process.argv.slice(2)"
75 '';
76
77 configurePhase = ''
78 runHook preConfigure
79
80 export HOME=$(mktemp -d)
81 yarn config --offline set yarn-offline-mirror ${finalAttrs.offlineCache}
82 fixup-yarn-lock yarn.lock
83
84 # set nodedir to prevent node-gyp from downloading headers
85 # taken from https://nixos.org/manual/nixpkgs/stable/#javascript-tool-specific
86 mkdir -p $HOME/.node-gyp/${nodejs.version}
87 echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion
88 ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version}
89 export npm_config_nodedir=${nodejs}
90
91 yarn --offline --frozen-lockfile install --ignore-scripts --no-progress --non-interactive
92
93 patchShebangs node_modules
94
95 substituteInPlace node_modules/node-gyp/gyp/pylib/gyp/input.py \
96 --replace-fail "from distutils.version import StrictVersion" "from packaging.version import Version as StrictVersion"
97
98 ./node_modules/.bin/electron-rebuild -f
99
100 substituteInPlace package.json \
101 --replace-fail "electron-rebuild -f" "echo 0" \
102 --replace-fail "&& yarn run lint:fix" ""
103
104 mkdir -p node_modules/vscode-ripgrep/bin
105
106 yarn --offline --frozen-lockfile install --no-progress
107 patchShebangs node_modules
108
109 substituteInPlace node_modules/node-gyp/gyp/pylib/gyp/input.py \
110 --replace-fail "from distutils.version import StrictVersion" "from packaging.version import Version as StrictVersion"
111
112 sed -i -e 's|path.join(.*);|"${lib.getExe ripgrep}";|' \
113 node_modules/vscode-ripgrep/lib/index.js
114
115 runHook postConfigure
116 '';
117
118 yarnBuildScript = "electron-builder";
119
120 yarnBuildFlags = [
121 "--dir"
122 "-c.electronDist=${electron.dist}"
123 "-c.electronVersion=${electron.version}"
124 ];
125
126 env = {
127 ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
128 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1";
129 };
130
131 preBuild = ''
132 node .electron-vue/build.js
133 ''; # From package.json
134
135 installPhase = ''
136 runHook preInstall
137
138 mkdir -p $out/opt/marktext $out/bin
139
140 install -Dm644 resources/linux/marktext.desktop $out/share/applications/marktext.desktop
141
142 pushd resources/icons/
143
144 find -maxdepth 1 -mindepth 1 -type d -exec install -DT {}/marktext.png $out/share/icons/hicolor/{}/apps/marktext.png \;
145
146 find -maxdepth 1 -mindepth 1 -type d -exec install -DT {}/md.png $out/share/icons/hicolor/{}/apps/md.png \;
147
148 popd
149
150 cp -r build/*-unpacked/{locales,resources{,.pak}} $out/opt/marktext
151
152 makeWrapper ${lib.getExe electron} $out/bin/marktext \
153 --add-flags $out/opt/marktext/resources/app.asar \
154 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
155
156 runHook postInstall
157 '';
158
159 passthru.updateScript = unstableGitUpdater {
160 tagPrefix = "v";
161 branch = "develop";
162 };
163
164 meta = {
165 description = "Simple and elegant markdown editor, available for Linux, macOS and Windows";
166 homepage = "https://www.marktext.cc";
167 license = lib.licenses.mit;
168 maintainers = with lib.maintainers; [
169 nh2
170 eduarrrd
171 bot-wxt1221
172 ];
173 badPlatforms = [
174 "x86_64-darwin"
175 "aarch64-darwin"
176 ];
177 platforms = lib.platforms.unix;
178 mainProgram = "marktext";
179 };
180})