summaryrefslogtreecommitdiff
path: root/nix/web.nix
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-07-30 20:12:09 +0200
committercashmere <cashmere@autistici.org>2026-07-30 20:12:09 +0200
commit465071d8232e74b1690280a38a86d435269fc35d (patch)
treef9ce8eb12cf87928eb9d528c1359e3fbb8e44b32 /nix/web.nix
parent01509b53c6bc6e891c55da7093e1fdf5d29499d7 (diff)
downloadopencut-465071d8232e74b1690280a38a86d435269fc35d.tar.gz
build: replace flake with npins, add Nix packages for web and desktop
- npins pins nixpkgs-unstable + Inter font tarball; shell.nix replaces the flake devshell - nix/bun-deps.nix: fixed-output bun install of the workspace (hash tied to bun.lock) - nix/web.nix: static Next.js export; next/font/google patched to local Inter for offline builds - nix/desktop.nix: tsc-built Electron app embedding the web export, wrapped with nixpkgs electron; ffmpeg-static satisfied by nixpkgs ffmpeg
Diffstat (limited to 'nix/web.nix')
-rw-r--r--nix/web.nix64
1 files changed, 64 insertions, 0 deletions
diff --git a/nix/web.nix b/nix/web.nix
new file mode 100644
index 00000000..eb464a2a
--- /dev/null
+++ b/nix/web.nix
@@ -0,0 +1,64 @@
+# Static export of the Next.js web app (apps/web/out).
+# Deps come from the bun-deps FOD; the Google-font fetch in next/font is
+# replaced by the npins-pinned Inter so the build runs offline.
+{
+ lib,
+ stdenvNoCC,
+ bun,
+ nodejs,
+ callPackage,
+ sources ? import ../npins,
+}:
+
+let
+ bunDeps = callPackage ./bun-deps.nix { };
+ webPkg = builtins.fromJSON (builtins.readFile ../apps/web/package.json);
+in
+stdenvNoCC.mkDerivation {
+ pname = "opencut-web";
+ version = webPkg.version;
+ src = lib.cleanSource ../.;
+
+ nativeBuildInputs = [
+ bun
+ nodejs
+ ];
+
+ postPatch = ''
+ mkdir -p apps/web/public/fonts
+ cp ${sources.inter}/web/InterVariable.woff2 apps/web/public/fonts/InterVariable.woff2
+ substituteInPlace apps/web/src/app/layout.tsx \
+ --replace-fail 'import { Inter } from "next/font/google";' 'import localFont from "next/font/local";' \
+ --replace-fail 'const siteFont = Inter({ subsets: ["latin"] });' 'const siteFont = localFont({ src: "../../public/fonts/InterVariable.woff2" });'
+ '';
+
+ configurePhase = ''
+ runHook preConfigure
+ cp -r ${bunDeps}/node_modules node_modules
+ cp -r ${bunDeps}/apps/web/node_modules apps/web/node_modules
+ chmod -R u+w node_modules apps/web/node_modules
+ patchShebangs node_modules apps/web/node_modules
+ runHook postConfigure
+ '';
+
+ buildPhase = ''
+ runHook preBuild
+ export HOME=$TMPDIR
+ export NEXT_TELEMETRY_DISABLED=1
+ export NODE_ENV=production
+ cd apps/web
+ bun run build
+ runHook postBuild
+ '';
+
+ installPhase = ''
+ runHook preInstall
+ cp -r out $out
+ runHook postInstall
+ '';
+
+ meta = {
+ description = "OpenCut web app (static export)";
+ license = lib.licenses.mit;
+ };
+}