about summary refs log tree commit diff
path: root/pkgs/by-name/ne
diff options
context:
space:
mode:
authorPol Dellaiera <pol.dellaiera@protonmail.com>2024-05-24 06:51:37 +0200
committerGitHub <noreply@github.com>2024-05-24 06:51:37 +0200
commitd9062cd5f9c3c32f2bd5a8e548d1cd7a0af1a3ec (patch)
tree07d58f439d15bc13896f53575434c835c4f743c1 /pkgs/by-name/ne
parent856ffff829c2479cf2fdc424ab20de719c507d25 (diff)
parent8a05b4f8d4bec7d1ae32c836c3cda8265689270b (diff)
Merge pull request #313146 from malteneuss/add-nextjs-ollama-llm-ui
Add nextjs ollama llm UI frontend for Ollama
Diffstat (limited to 'pkgs/by-name/ne')
-rw-r--r--pkgs/by-name/ne/nextjs-ollama-llm-ui/0001-update-nextjs.patch879
-rw-r--r--pkgs/by-name/ne/nextjs-ollama-llm-ui/0002-use-local-google-fonts.patch20
-rw-r--r--pkgs/by-name/ne/nextjs-ollama-llm-ui/0003-add-standalone-output.patch16
-rw-r--r--pkgs/by-name/ne/nextjs-ollama-llm-ui/package.nix101
4 files changed, 1016 insertions, 0 deletions
diff --git a/pkgs/by-name/ne/nextjs-ollama-llm-ui/0001-update-nextjs.patch b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0001-update-nextjs.patch
new file mode 100644
index 0000000000000..d904f04f73447
--- /dev/null
+++ b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0001-update-nextjs.patch
@@ -0,0 +1,879 @@
+diff --git a/package-lock.json b/package-lock.json
+index 11dfbf6..b9470d0 100644
+--- a/package-lock.json
++++ b/package-lock.json
+@@ -30,7 +30,7 @@
+         "framer-motion": "^11.0.3",
+         "langchain": "^0.1.13",
+         "lucide-react": "^0.322.0",
+-        "next": "14.1.0",
++        "next": "^14.2.3",
+         "next-themes": "^0.2.1",
+         "react": "^18",
+         "react-code-blocks": "^0.1.6",
+@@ -40,6 +40,7 @@
+         "react-resizable-panels": "^2.0.3",
+         "react-textarea-autosize": "^8.5.3",
+         "remark-gfm": "^4.0.0",
++        "sharp": "^0.33.4",
+         "sonner": "^1.4.0",
+         "tailwind-merge": "^2.2.1",
+         "tailwindcss-animate": "^1.0.7",
+@@ -139,6 +140,15 @@
+         "node": ">=6.9.0"
+       }
+     },
++    "node_modules/@emnapi/runtime": {
++      "version": "1.1.1",
++      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.1.tgz",
++      "integrity": "sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==",
++      "optional": true,
++      "dependencies": {
++        "tslib": "^2.4.0"
++      }
++    },
+     "node_modules/@emoji-mart/data": {
+       "version": "1.1.2",
+       "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.1.2.tgz",
+@@ -304,6 +314,437 @@
+       "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+       "dev": true
+     },
++    "node_modules/@img/sharp-darwin-arm64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz",
++      "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "darwin"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-darwin-arm64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-darwin-x64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz",
++      "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "darwin"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-darwin-x64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-libvips-darwin-arm64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz",
++      "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "darwin"
++      ],
++      "engines": {
++        "macos": ">=11",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-darwin-x64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz",
++      "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "darwin"
++      ],
++      "engines": {
++        "macos": ">=10.13",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linux-arm": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz",
++      "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==",
++      "cpu": [
++        "arm"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.28",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linux-arm64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz",
++      "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linux-s390x": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz",
++      "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==",
++      "cpu": [
++        "s390x"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.28",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linux-x64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz",
++      "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz",
++      "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "musl": ">=1.2.2",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
++      "version": "1.0.2",
++      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz",
++      "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "musl": ">=1.2.2",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-linux-arm": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz",
++      "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==",
++      "cpu": [
++        "arm"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.28",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linux-arm": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-linux-arm64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz",
++      "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linux-arm64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-linux-s390x": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz",
++      "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==",
++      "cpu": [
++        "s390x"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.31",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linux-s390x": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-linux-x64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz",
++      "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "glibc": ">=2.26",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linux-x64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-linuxmusl-arm64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz",
++      "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==",
++      "cpu": [
++        "arm64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "musl": ">=1.2.2",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linuxmusl-arm64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-linuxmusl-x64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz",
++      "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "linux"
++      ],
++      "engines": {
++        "musl": ">=1.2.2",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-libvips-linuxmusl-x64": "1.0.2"
++      }
++    },
++    "node_modules/@img/sharp-wasm32": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz",
++      "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==",
++      "cpu": [
++        "wasm32"
++      ],
++      "optional": true,
++      "dependencies": {
++        "@emnapi/runtime": "^1.1.1"
++      },
++      "engines": {
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-win32-ia32": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz",
++      "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==",
++      "cpu": [
++        "ia32"
++      ],
++      "optional": true,
++      "os": [
++        "win32"
++      ],
++      "engines": {
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
++    "node_modules/@img/sharp-win32-x64": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz",
++      "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==",
++      "cpu": [
++        "x64"
++      ],
++      "optional": true,
++      "os": [
++        "win32"
++      ],
++      "engines": {
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
++        "npm": ">=9.6.5",
++        "pnpm": ">=7.1.0",
++        "yarn": ">=3.2.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      }
++    },
+     "node_modules/@isaacs/cliui": {
+       "version": "8.0.2",
+       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+@@ -800,9 +1241,9 @@
+       }
+     },
+     "node_modules/@next/env": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz",
+-      "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw=="
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz",
++      "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA=="
+     },
+     "node_modules/@next/eslint-plugin-next": {
+       "version": "14.1.0",
+@@ -814,9 +1255,9 @@
+       }
+     },
+     "node_modules/@next/swc-darwin-arm64": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz",
+-      "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz",
++      "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==",
+       "cpu": [
+         "arm64"
+       ],
+@@ -829,9 +1270,9 @@
+       }
+     },
+     "node_modules/@next/swc-darwin-x64": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz",
+-      "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz",
++      "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==",
+       "cpu": [
+         "x64"
+       ],
+@@ -844,9 +1285,9 @@
+       }
+     },
+     "node_modules/@next/swc-linux-arm64-gnu": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz",
+-      "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz",
++      "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==",
+       "cpu": [
+         "arm64"
+       ],
+@@ -859,9 +1300,9 @@
+       }
+     },
+     "node_modules/@next/swc-linux-arm64-musl": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz",
+-      "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz",
++      "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==",
+       "cpu": [
+         "arm64"
+       ],
+@@ -874,9 +1315,9 @@
+       }
+     },
+     "node_modules/@next/swc-linux-x64-gnu": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz",
+-      "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz",
++      "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==",
+       "cpu": [
+         "x64"
+       ],
+@@ -889,9 +1330,9 @@
+       }
+     },
+     "node_modules/@next/swc-linux-x64-musl": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz",
+-      "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz",
++      "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==",
+       "cpu": [
+         "x64"
+       ],
+@@ -904,9 +1345,9 @@
+       }
+     },
+     "node_modules/@next/swc-win32-arm64-msvc": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz",
+-      "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz",
++      "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==",
+       "cpu": [
+         "arm64"
+       ],
+@@ -919,9 +1360,9 @@
+       }
+     },
+     "node_modules/@next/swc-win32-ia32-msvc": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz",
+-      "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz",
++      "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==",
+       "cpu": [
+         "ia32"
+       ],
+@@ -934,9 +1375,9 @@
+       }
+     },
+     "node_modules/@next/swc-win32-x64-msvc": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz",
+-      "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz",
++      "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==",
+       "cpu": [
+         "x64"
+       ],
+@@ -1810,11 +2251,17 @@
+       "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==",
+       "dev": true
+     },
++    "node_modules/@swc/counter": {
++      "version": "0.1.3",
++      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
++      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
++    },
+     "node_modules/@swc/helpers": {
+-      "version": "0.5.2",
+-      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
+-      "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
++      "version": "0.5.5",
++      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
++      "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+       "dependencies": {
++        "@swc/counter": "^0.1.3",
+         "tslib": "^2.4.0"
+       }
+     },
+@@ -2930,6 +3377,18 @@
+         "periscopic": "^3.1.0"
+       }
+     },
++    "node_modules/color": {
++      "version": "4.2.3",
++      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
++      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
++      "dependencies": {
++        "color-convert": "^2.0.1",
++        "color-string": "^1.9.0"
++      },
++      "engines": {
++        "node": ">=12.5.0"
++      }
++    },
+     "node_modules/color-convert": {
+       "version": "2.0.1",
+       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+@@ -2946,6 +3405,15 @@
+       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+     },
++    "node_modules/color-string": {
++      "version": "1.9.1",
++      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
++      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
++      "dependencies": {
++        "color-name": "^1.0.0",
++        "simple-swizzle": "^0.2.2"
++      }
++    },
+     "node_modules/combined-stream": {
+       "version": "1.0.8",
+       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+@@ -3152,6 +3620,14 @@
+         "node": ">=6"
+       }
+     },
++    "node_modules/detect-libc": {
++      "version": "2.0.3",
++      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
++      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
++      "engines": {
++        "node": ">=8"
++      }
++    },
+     "node_modules/detect-node-es": {
+       "version": "1.1.0",
+       "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+@@ -4677,6 +5153,11 @@
+         "url": "https://github.com/sponsors/ljharb"
+       }
+     },
++    "node_modules/is-arrayish": {
++      "version": "0.3.2",
++      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
++      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
++    },
+     "node_modules/is-async-function": {
+       "version": "2.0.0",
+       "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+@@ -6676,12 +7157,12 @@
+       "dev": true
+     },
+     "node_modules/next": {
+-      "version": "14.1.0",
+-      "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz",
+-      "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==",
++      "version": "14.2.3",
++      "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz",
++      "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==",
+       "dependencies": {
+-        "@next/env": "14.1.0",
+-        "@swc/helpers": "0.5.2",
++        "@next/env": "14.2.3",
++        "@swc/helpers": "0.5.5",
+         "busboy": "1.6.0",
+         "caniuse-lite": "^1.0.30001579",
+         "graceful-fs": "^4.2.11",
+@@ -6695,18 +7176,19 @@
+         "node": ">=18.17.0"
+       },
+       "optionalDependencies": {
+-        "@next/swc-darwin-arm64": "14.1.0",
+-        "@next/swc-darwin-x64": "14.1.0",
+-        "@next/swc-linux-arm64-gnu": "14.1.0",
+-        "@next/swc-linux-arm64-musl": "14.1.0",
+-        "@next/swc-linux-x64-gnu": "14.1.0",
+-        "@next/swc-linux-x64-musl": "14.1.0",
+-        "@next/swc-win32-arm64-msvc": "14.1.0",
+-        "@next/swc-win32-ia32-msvc": "14.1.0",
+-        "@next/swc-win32-x64-msvc": "14.1.0"
++        "@next/swc-darwin-arm64": "14.2.3",
++        "@next/swc-darwin-x64": "14.2.3",
++        "@next/swc-linux-arm64-gnu": "14.2.3",
++        "@next/swc-linux-arm64-musl": "14.2.3",
++        "@next/swc-linux-x64-gnu": "14.2.3",
++        "@next/swc-linux-x64-musl": "14.2.3",
++        "@next/swc-win32-arm64-msvc": "14.2.3",
++        "@next/swc-win32-ia32-msvc": "14.2.3",
++        "@next/swc-win32-x64-msvc": "14.2.3"
+       },
+       "peerDependencies": {
+         "@opentelemetry/api": "^1.1.0",
++        "@playwright/test": "^1.41.2",
+         "react": "^18.2.0",
+         "react-dom": "^18.2.0",
+         "sass": "^1.3.0"
+@@ -6715,6 +7197,9 @@
+         "@opentelemetry/api": {
+           "optional": true
+         },
++        "@playwright/test": {
++          "optional": true
++        },
+         "sass": {
+           "optional": true
+         }
+@@ -7928,13 +8413,9 @@
+       }
+     },
+     "node_modules/semver": {
+-      "version": "7.5.4",
+-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+-      "dev": true,
+-      "dependencies": {
+-        "lru-cache": "^6.0.0"
+-      },
++      "version": "7.6.2",
++      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
++      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+       "bin": {
+         "semver": "bin/semver.js"
+       },
+@@ -7942,18 +8423,6 @@
+         "node": ">=10"
+       }
+     },
+-    "node_modules/semver/node_modules/lru-cache": {
+-      "version": "6.0.0",
+-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+-      "dev": true,
+-      "dependencies": {
+-        "yallist": "^4.0.0"
+-      },
+-      "engines": {
+-        "node": ">=10"
+-      }
+-    },
+     "node_modules/seroval": {
+       "version": "1.0.4",
+       "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.0.4.tgz",
+@@ -8010,6 +8479,45 @@
+       "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+       "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+     },
++    "node_modules/sharp": {
++      "version": "0.33.4",
++      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz",
++      "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==",
++      "hasInstallScript": true,
++      "dependencies": {
++        "color": "^4.2.3",
++        "detect-libc": "^2.0.3",
++        "semver": "^7.6.0"
++      },
++      "engines": {
++        "libvips": ">=8.15.2",
++        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
++      },
++      "funding": {
++        "url": "https://opencollective.com/libvips"
++      },
++      "optionalDependencies": {
++        "@img/sharp-darwin-arm64": "0.33.4",
++        "@img/sharp-darwin-x64": "0.33.4",
++        "@img/sharp-libvips-darwin-arm64": "1.0.2",
++        "@img/sharp-libvips-darwin-x64": "1.0.2",
++        "@img/sharp-libvips-linux-arm": "1.0.2",
++        "@img/sharp-libvips-linux-arm64": "1.0.2",
++        "@img/sharp-libvips-linux-s390x": "1.0.2",
++        "@img/sharp-libvips-linux-x64": "1.0.2",
++        "@img/sharp-libvips-linuxmusl-arm64": "1.0.2",
++        "@img/sharp-libvips-linuxmusl-x64": "1.0.2",
++        "@img/sharp-linux-arm": "0.33.4",
++        "@img/sharp-linux-arm64": "0.33.4",
++        "@img/sharp-linux-s390x": "0.33.4",
++        "@img/sharp-linux-x64": "0.33.4",
++        "@img/sharp-linuxmusl-arm64": "0.33.4",
++        "@img/sharp-linuxmusl-x64": "0.33.4",
++        "@img/sharp-wasm32": "0.33.4",
++        "@img/sharp-win32-ia32": "0.33.4",
++        "@img/sharp-win32-x64": "0.33.4"
++      }
++    },
+     "node_modules/shebang-command": {
+       "version": "2.0.0",
+       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+@@ -8054,6 +8562,14 @@
+         "url": "https://github.com/sponsors/isaacs"
+       }
+     },
++    "node_modules/simple-swizzle": {
++      "version": "0.2.2",
++      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
++      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
++      "dependencies": {
++        "is-arrayish": "^0.3.1"
++      }
++    },
+     "node_modules/slash": {
+       "version": "3.0.0",
+       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+@@ -9369,12 +9885,6 @@
+         "node": ">=0.4"
+       }
+     },
+-    "node_modules/yallist": {
+-      "version": "4.0.0",
+-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+-      "dev": true
+-    },
+     "node_modules/yaml": {
+       "version": "2.3.4",
+       "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+diff --git a/package.json b/package.json
+index 4185096..4ab1c58 100644
+--- a/package.json
++++ b/package.json
+@@ -31,7 +31,7 @@
+     "framer-motion": "^11.0.3",
+     "langchain": "^0.1.13",
+     "lucide-react": "^0.322.0",
+-    "next": "14.1.0",
++    "next": "^14.2.3",
+     "next-themes": "^0.2.1",
+     "react": "^18",
+     "react-code-blocks": "^0.1.6",
+@@ -41,6 +41,7 @@
+     "react-resizable-panels": "^2.0.3",
+     "react-textarea-autosize": "^8.5.3",
+     "remark-gfm": "^4.0.0",
++    "sharp": "^0.33.4",
+     "sonner": "^1.4.0",
+     "tailwind-merge": "^2.2.1",
+     "tailwindcss-animate": "^1.0.7",
+-- 
+2.42.0
+
diff --git a/pkgs/by-name/ne/nextjs-ollama-llm-ui/0002-use-local-google-fonts.patch b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0002-use-local-google-fonts.patch
new file mode 100644
index 0000000000000..454e005284fe9
--- /dev/null
+++ b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0002-use-local-google-fonts.patch
@@ -0,0 +1,20 @@
+diff --git a/src/app/layout.tsx b/src/app/layout.tsx
+index 647ed68..b08088e 100644
+--- a/src/app/layout.tsx
++++ b/src/app/layout.tsx
+@@ -1,10 +1,10 @@
+ import type { Metadata } from "next";
+-import { Inter } from "next/font/google";
++import localFont from "next/font/local";
+ import "./globals.css";
+ import { ThemeProvider } from "@/providers/theme-provider";
+ import { Toaster } from "@/components/ui/sonner"
+ 
+-const inter = Inter({ subsets: ["latin"] });
++const inter = localFont({ src: './Inter.ttf' });
+ 
+ export const metadata: Metadata = {
+   title: "Ollama UI",
+-- 
+2.42.0
+
diff --git a/pkgs/by-name/ne/nextjs-ollama-llm-ui/0003-add-standalone-output.patch b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0003-add-standalone-output.patch
new file mode 100644
index 0000000000000..50d1611148960
--- /dev/null
+++ b/pkgs/by-name/ne/nextjs-ollama-llm-ui/0003-add-standalone-output.patch
@@ -0,0 +1,16 @@
+diff --git a/next.config.mjs b/next.config.mjs
+index dc34f1a..f6f90c4 100644
+--- a/next.config.mjs
++++ b/next.config.mjs
+@@ -1,6 +1,7 @@
+ /** @type {import('next').NextConfig} */
+ const nextConfig = {
+-    webpack: (config, { isServer }) => {
++  output: 'standalone',
++  webpack: (config, { isServer }) => {
+         // Fixes npm packages that depend on `fs` module
+         if (!isServer) {
+           config.resolve.fallback = {
+-- 
+2.42.0
+
diff --git a/pkgs/by-name/ne/nextjs-ollama-llm-ui/package.nix b/pkgs/by-name/ne/nextjs-ollama-llm-ui/package.nix
new file mode 100644
index 0000000000000..db6981a0c2403
--- /dev/null
+++ b/pkgs/by-name/ne/nextjs-ollama-llm-ui/package.nix
@@ -0,0 +1,101 @@
+{
+  buildNpmPackage,
+  fetchFromGitHub,
+  inter,
+  nixosTests,
+  lib,
+  # This is a app can only be used in a browser and starts a web server only accessible at
+  # localhost/127.0.0.1 from the local computer at the given port.
+  defaultHostname ? "127.0.0.1",
+  defaultPort ? 3000,
+  # Where to find the Ollama service; this url gets baked into the Nix package
+  ollamaUrl ? "http://127.0.0.1:11434",
+  ...
+}:
+
+let
+  version = "1.0.1";
+in
+buildNpmPackage {
+  pname = "nextjs-ollama-llm-ui";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "jakobhoeg";
+    repo = "nextjs-ollama-llm-ui";
+    rev = "v${version}";
+    hash = "sha256-pZJgiopm0VGwaZxsNcyRawevvzEcK1j5WhngX1Pn6YE=";
+  };
+  npmDepsHash = "sha256-wtHOW0CyEOszgiZwDkF2/cSxbw6WFRLbhDnd2FlY70E=";
+
+  patches = [
+    # Update to a newer nextjs version that buildNpmPackage is able to build.
+    # Remove at nextjs update.
+    ./0001-update-nextjs.patch
+    # nextjs tries to download google fonts from the internet during buildPhase and fails in Nix sandbox.
+    # We patch the code to expect a local font from src/app/Inter.ttf that we load from Nixpkgs in preBuild phase.
+    ./0002-use-local-google-fonts.patch
+    # Modify next.config.js to produce a production "standalone" output at .next/standalone.
+    # This output is easy to package with Nix and run with "node .next/standalone/server.js" later.
+    ./0003-add-standalone-output.patch
+  ];
+
+  # Adjust buildNpmPackage phases with nextjs quirk workarounds.
+  # These are adapted from
+  # https://github.com/NixOS/nixpkgs/blob/485125d667747f971cfcd1a1cfb4b2213a700c79/pkgs/servers/homepage-dashboard/default.nix
+  #######################3
+  preBuild = ''
+    # We have to pass and bake in the Ollama URL into the package
+    echo "NEXT_PUBLIC_OLLAMA_URL=${ollamaUrl}" > .env
+
+    # Replace the googleapis.com Inter font with a local copy from nixpkgs
+    cp "${inter}/share/fonts/truetype/InterVariable.ttf" src/app/Inter.ttf
+  '';
+
+  postBuild = ''
+    # Add a shebang to the server js file, then patch the shebang to use a nixpkgs nodejs binary.
+    sed -i '1s|^|#!/usr/bin/env node\n|' .next/standalone/server.js
+    patchShebangs .next/standalone/server.js
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{share,bin}
+
+    cp -r .next/standalone $out/share/homepage/
+    cp -r .env $out/share/homepage/
+    cp -r public $out/share/homepage/public
+
+    mkdir -p $out/share/homepage/.next
+    cp -r .next/static $out/share/homepage/.next/static
+
+    chmod +x $out/share/homepage/server.js
+
+    # we set a default port to support "nix run ..."
+    makeWrapper $out/share/homepage/server.js $out/bin/nextjs-ollama-llm-ui \
+      --set-default PORT ${toString defaultPort} \
+      --set-default HOSTNAME ${defaultHostname}
+
+    runHook postInstall
+  '';
+
+  doDist = false;
+  #######################
+
+  passthru = {
+    tests = {
+      inherit (nixosTests) nextjs-ollama-llm-ui;
+    };
+  };
+
+  meta = {
+    description = "Simple chat web interface for Ollama LLMs.";
+    changelog = "https://github.com/jakobhoeg/nextjs-ollama-llm-ui/releases/tag/v${version}";
+    mainProgram = "nextjs-ollama-llm-ui";
+    homepage = "https://github.com/jakobhoeg/nextjs-ollama-llm-ui";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ malteneuss ];
+    platforms = lib.platforms.all;
+  };
+}