diff --git a/doc/doc-support/header.html b/doc/doc-support/header.html
new file mode 100644
index 000000000000..1c42f4adcf11
--- /dev/null
+++ b/doc/doc-support/header.html
@@ -0,0 +1,7 @@
+
diff --git a/doc/doc-support/package.nix b/doc/doc-support/package.nix
index f2c37df39132..728bbe334501 100644
--- a/doc/doc-support/package.nix
+++ b/doc/doc-support/package.nix
@@ -119,6 +119,8 @@ stdenvNoCC.mkDerivation (
--script ./anchor-use.js \
--sidebar-depth 3 \
--nav ./nav.json \
+ --header ${./header.html}\
+ --no-navheader \
manual.md \
out/index.html
diff --git a/doc/style.css b/doc/style.css
index 8b426e72de24..9410d39e54be 100644
--- a/doc/style.css
+++ b/doc/style.css
@@ -23,14 +23,14 @@ body {
@media screen and (min-width: 992px) {
.book,
.appendix {
- max-width: 60rem;
+ max-width: 55rem;
}
}
@media screen and (min-width: 1200px) {
.book,
.appendix {
- max-width: 73rem;
+ max-width: 55rem;
}
}
@@ -398,6 +398,7 @@ div.appendix .variablelist .term {
:root {
--sidebar-width: 20rem;
+ --header-height: 3rem;
--background: #fff;
--main-text-color: #000;
--link-color: #405d99;
@@ -528,7 +529,7 @@ nav.toc-sidebar summary {
min-height: 0;
display: grid;
grid-template-columns: minmax(0, 1fr);
- grid-template-rows: auto minmax(0, 1fr);
+ grid-template-rows: var(--header-height) auto minmax(0, 1fr);
}
body:has(> nav.toc-sidebar) {
@@ -537,7 +538,7 @@ nav.toc-sidebar summary {
.navheader {
grid-column: 1 / -1;
- grid-row: 1;
+ grid-row: 2;
}
nav.toc-sidebar {
@@ -548,7 +549,7 @@ nav.toc-sidebar summary {
/* */
margin: 0;
grid-column: 1;
- grid-row: 2;
+ grid-row: 3;
max-height: none;
overflow-y: auto;
border: none;
@@ -562,7 +563,7 @@ nav.toc-sidebar summary {
main.content {
grid-column: 1 / -1;
- grid-row: 2;
+ grid-row: 3;
overflow-y: auto;
padding: 0 1rem;
}
@@ -571,3 +572,73 @@ nav.toc-sidebar summary {
grid-column: 2;
}
}
+
+.manual-header {
+ background-color: var(--background);
+ border-bottom: 0.0625rem solid #d8d8d8;
+ display: flex;
+ flex-direction: column;
+}
+
+.manual-header--title {
+ order: -1;
+ padding: 0.5rem 1rem 0;
+ font-size: 0.875rem;
+ font-weight: 500;
+ color: var(--small-heading-color);
+ text-align: center;
+}
+
+.manual-header--tabs {
+ display: flex;
+ align-items: stretch;
+ justify-content: space-around;
+ margin: 0;
+ padding: 0;
+}
+
+.manual-header--tab {
+ display: flex;
+ align-items: center;
+ padding: 0 1rem;
+ font-size: 0.875rem;
+ font-weight: 500;
+ color: var(--main-text-color);
+ text-decoration: none;
+ border-bottom: 0.1875rem solid transparent;
+ border-top: 0.1875rem solid transparent;
+ transition: border-bottom-color 0.15s ease;
+}
+
+.manual-header--tab:hover {
+ border-bottom-color: var(--heading-color);
+ color: var(--main-text-color);
+}
+
+.manual-header--tab-active {
+ border-bottom-color: var(--heading-color);
+ color: var(--heading-color);
+ font-weight: 700;
+}
+
+@media screen and (min-width: 768px) {
+ .manual-header {
+ height: var(--header-height);
+ flex-direction: row;
+ align-items: stretch;
+ grid-column: 1 / -1;
+ grid-row: 1;
+ }
+
+ .manual-header--title {
+ order: 0;
+ margin-left: auto;
+ padding: 0 1rem;
+ align-self: center;
+ }
+
+ .manual-header--tabs {
+ justify-content: flex-start;
+ padding: 0 1rem;
+ }
+}
diff --git a/nixos/doc/manual/default.nix b/nixos/doc/manual/default.nix
index cf5c28358097..78f44ad9ad74 100644
--- a/nixos/doc/manual/default.nix
+++ b/nixos/doc/manual/default.nix
@@ -202,6 +202,8 @@ rec {
--script ./anchor.min.js \
--script ./anchor-use.js \
--sidebar-depth 2 \
+ --header ${./header.html}\
+ --no-navheader \
./manual.md \
$dst/${common.indexPath}
diff --git a/nixos/doc/manual/header.html b/nixos/doc/manual/header.html
new file mode 100644
index 000000000000..acc029f5c3e4
--- /dev/null
+++ b/nixos/doc/manual/header.html
@@ -0,0 +1,7 @@
+
diff --git a/pkgs/applications/emulators/libretro/cores/play.nix b/pkgs/applications/emulators/libretro/cores/play.nix
index f777c18941ff..26b3d48ea660 100644
--- a/pkgs/applications/emulators/libretro/cores/play.nix
+++ b/pkgs/applications/emulators/libretro/cores/play.nix
@@ -14,13 +14,13 @@
}:
mkLibretroCore {
core = "play";
- version = "0-unstable-2026-06-22";
+ version = "0-unstable-2026-07-11";
src = fetchFromGitHub {
owner = "jpd002";
repo = "Play-";
- rev = "1e4f393f3c52581cdec7867ddadc47f6b4d20cec";
- hash = "sha256-a02AsJg7mm/fUBN/5IC2Q6NexLYsBYp74bfqfJosaxc=";
+ rev = "50aedca2639521bc498ace0b2be1ea012801a86a";
+ hash = "sha256-ywqwy8HwxigRG/2GfvfpewNjTIeunXH9NtyAH5iUfa8=";
fetchSubmodules = true;
};
diff --git a/pkgs/by-name/bi/bisq1/package.nix b/pkgs/by-name/bi/bisq1/package.nix
index 8895ec305994..e5ca6ad35ec8 100644
--- a/pkgs/by-name/bi/bisq1/package.nix
+++ b/pkgs/by-name/bi/bisq1/package.nix
@@ -36,7 +36,10 @@
}:
let
- version = "1.10.2";
+ # This is separated into its own file so it's easier for `update.sh`.
+ sources = import ./sources.nix;
+
+ version = sources.version;
# JDK 21 is the toolchain required by docs/build.md. enableJavaFX is not
# strictly required (Bisq bundles its own JavaFX jars), but mirrors the
@@ -86,17 +89,17 @@ let
publicKey = {
"E222AA02" = fetchurl {
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/E222AA02.asc";
- hash = "sha256-Ue/UmS6F440/ybEEIAR+pdPEIksAt6QSMN6G5TZVWzc=";
+ hash = sources."key-E222AA02-hash";
};
"4A133008" = fetchurl {
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/4A133008.asc";
- hash = "sha256-UijG3DkJNNTakVJd2wl30mDepa27n6R/Xxfl4sjt0sk=";
+ hash = sources."key-4A133008-hash";
};
"387C8307" = fetchurl {
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/387C8307.asc";
- hash = "sha256-PrRYZLT0xv82dUscOBgQGKNf6zwzWUDhriAffZbNpmI=";
+ hash = sources."key-387C8307-hash";
};
};
@@ -133,7 +136,7 @@ stdenv.mkDerivation (finalAttrs: {
src = fetchurl {
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb";
- hash = "sha256-e7rPUhA6KF3Tz3zlYqEfM9G0owe9hAUFDifKseRvb6A=";
+ hash = sources."deb-hash";
# Verify the upstream Debian package's detached PGP signature prior to use.
# This ensures that a successful build of this Nix package requires the
@@ -158,7 +161,7 @@ stdenv.mkDerivation (finalAttrs: {
signature = fetchurl {
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb.asc";
- hash = "sha256-kBRaOXuP22DvXMkJ1XQatwvTmu/Ds8FvmUgYnRT7Vg0=";
+ hash = sources."sig-hash";
};
nativeBuildInputs = [
@@ -241,6 +244,8 @@ stdenv.mkDerivation (finalAttrs: {
runHook postInstall
'';
+ passthru.updateScript = ./update.sh;
+
meta = {
description = "Decentralized bitcoin exchange network (Bisq 1)";
homepage = "https://bisq.network";
diff --git a/pkgs/by-name/bi/bisq1/sources.nix b/pkgs/by-name/bi/bisq1/sources.nix
new file mode 100644
index 000000000000..8b9f276e8cf1
--- /dev/null
+++ b/pkgs/by-name/bi/bisq1/sources.nix
@@ -0,0 +1,9 @@
+# Generated by ./update.sh - do not update manually!
+{
+ version = "1.10.3";
+ deb-hash = "sha256-kzLtadq8gfX6j9XU3PD5kNV43wLDoICPlXdJqULkAWE=";
+ sig-hash = "sha256-+51j+SBp7buukop1T4Gz0YDUga6540BVxDRoU2YE3pY=";
+ key-E222AA02-hash = "sha256-Ue/UmS6F440/ybEEIAR+pdPEIksAt6QSMN6G5TZVWzc=";
+ key-4A133008-hash = "sha256-UijG3DkJNNTakVJd2wl30mDepa27n6R/Xxfl4sjt0sk=";
+ key-387C8307-hash = "sha256-PrRYZLT0xv82dUscOBgQGKNf6zwzWUDhriAffZbNpmI=";
+}
diff --git a/pkgs/by-name/bi/bisq1/update.sh b/pkgs/by-name/bi/bisq1/update.sh
new file mode 100755
index 000000000000..c162a4e6190b
--- /dev/null
+++ b/pkgs/by-name/bi/bisq1/update.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash --pure --keep GITHUB_TOKEN -p nix git curl cacert jq
+
+set -euo pipefail
+
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+# Fetch the latest release version from GitHub
+payload=$(curl -sL https://api.github.com/repos/bisq-network/bisq/releases/latest)
+version=$(jq -r .tag_name <<< "$payload" | sed 's/^v//')
+
+echo "Updating bisq1 to version $version"
+
+# URLs for the new version
+deb_url="https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb"
+sig_url="https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb.asc"
+
+# Fetch and compute hashes using nix-prefetch-url and convert to SRI format
+echo "Prefetching .deb package..."
+deb_hash_raw=$(nix-prefetch-url "$deb_url" 2>/dev/null)
+deb_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "$deb_hash_raw")
+echo " deb hash: $deb_hash"
+
+echo "Prefetching signature..."
+sig_hash_raw=$(nix-prefetch-url "$sig_url" 2>/dev/null)
+sig_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "$sig_hash_raw")
+echo " signature hash: $sig_hash"
+
+# Fetch and compute hashes for public keys (these may not exist in all releases)
+get_key_hash() {
+ local key_name=$1
+ local url="https://github.com/bisq-network/bisq/releases/download/v${version}/${key_name}.asc"
+ local hash_raw
+ if hash_raw=$(nix-prefetch-url "$url" 2>/dev/null); then
+ nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "$hash_raw"
+ else
+ echo "" # Return empty if key doesn't exist
+ fi
+}
+
+echo "Prefetching public keys..."
+key_E222AA02_hash=$(get_key_hash "E222AA02")
+if [ -n "$key_E222AA02_hash" ]; then
+ echo " E222AA02 hash: $key_E222AA02_hash"
+else
+ echo " E222AA02: not found in this release, keeping old hash"
+ key_E222AA02_hash=$(grep 'key-E222AA02-hash' sources.nix | sed 's/.*= "\(.*\)".*/\1/')
+fi
+
+key_4A133008_hash=$(get_key_hash "4A133008")
+if [ -n "$key_4A133008_hash" ]; then
+ echo " 4A133008 hash: $key_4A133008_hash"
+else
+ echo " 4A133008: not found in this release, keeping old hash"
+ key_4A133008_hash=$(grep 'key-4A133008-hash' sources.nix | sed 's/.*= "\(.*\)".*/\1/')
+fi
+
+key_387C8307_hash=$(get_key_hash "387C8307")
+if [ -n "$key_387C8307_hash" ]; then
+ echo " 387C8307 hash: $key_387C8307_hash"
+else
+ echo " 387C8307: not found in this release, keeping old hash"
+ key_387C8307_hash=$(grep 'key-387C8307-hash' sources.nix | sed 's/.*= "\(.*\)".*/\1/')
+fi
+
+# Write sources.nix (only include keys that exist)
+cat >sources.nix <'
next_a = f'Next'
- if toc.prev or toc.parent or toc.next:
+ # nav_header is not disabled
+ if not self._html_params.no_navheader and (toc.prev or toc.parent or toc.next):
nav_html = "\n".join([
'