Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/nim/Makefile,v
retrieving revision 1.28
diff -u -p -r1.28 Makefile
--- Makefile	17 Sep 2026 17:31:35 -0000	1.28
+++ Makefile	3 Oct 2026 11:40:07 -0000
@@ -2,9 +2,8 @@ ONLY_FOR_ARCHS =	amd64 arm64 i386
 
 COMMENT =		statically typed systems programming language
 
-DISTNAME =		nim-2.2.10
+DISTNAME =		nim-2.2.12
 EXTRACT_SUFX =		.tar.xz
-REVISION =		0
 
 CATEGORIES =		lang
 
@@ -13,20 +12,11 @@ SITES =			${HOMEPAGE}download/
 
 MAINTAINER =		Alfred Morgan <alfred@54.org>
 
-NIMBLE_CHECKSUMS_V =	f8f6bd34bfa3fe12c64b919059ad856a96efcba0
-NIMBLE_ZIPPY_V =	a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f
-NIMBLE_CHRONOS_V =	0646c444fce7c7ed08ef6f2c9a7abfd172ffe655
-NIMBLE_RESULTS_V =	df8113dda4c2d74d460a8fa98252b0b771bf1f27
-NIMBLE_STEW_V =	b66168735d6f3841c5239c3169d3fe5fe98b1257
+NIMBLE_CHRONOS_V =	536169b4ab6b7772f57993284331b7de716b6e99
 
-DIST_TUPLE =		github nim-lang atlas 0.14.7 .
-DIST_TUPLE +=		github nim-lang nimble 42ef70c2102a942c46f13eb76872326edd525cec .
+DIST_TUPLE =		github nim-lang atlas 0.16.3 .
+DIST_TUPLE +=		github nim-lang nimble v0.26.0 .
 DIST_TUPLE +=		github status-im nim-chronos ${NIMBLE_CHRONOS_V} .
-DIST_TUPLE +=		github arnetheduck nim-results ${NIMBLE_RESULTS_V} .
-DIST_TUPLE +=		github status-im nim-stew ${NIMBLE_STEW_V} .
-DIST_TUPLE +=		github nim-lang sat e63eaea8baf00bed8bcd5a29ffd8823abb265b39 .
-DIST_TUPLE +=		github nim-lang checksums ${NIMBLE_CHECKSUMS_V} .
-DIST_TUPLE +=		github guzba zippy ${NIMBLE_ZIPPY_V} .
 
 # MIT, BSD, Apache 2.0
 PERMIT_PACKAGE =	Yes
@@ -49,26 +39,16 @@ TEST_DEPENDS =		archivers/7zip,-main \
 SUBST_VARS +=		CFLAGS
 
 post-extract:
+	# Reuse bundled dependencies except for Nimble's updated Chronos revision.
+	rm -R ${WRKDIR}/nimble-*/vendor
+	mv ${WRKDIST}/dist/nimble/vendor ${WRKDIR}/nimble-*/
 	rm -R ${WRKDIST}/dist/nimble
-	rm -R ${WRKDIST}/dist/checksums
 	mv ${WRKDIR}/nimble-* ${WRKDIST}/dist/nimble
-	rm -R ${WRKDIST}/dist/nimble/vendor/{checksums,chronos,results,stew,zippy}
-	cp -r ${WRKDIR}/checksums-${NIMBLE_CHECKSUMS_V} \
-		${WRKDIST}/dist/nimble/vendor/checksums
-	mv ${WRKDIR}/nim-chronos-${NIMBLE_CHRONOS_V} \
-		${WRKDIST}/dist/nimble/vendor/chronos
-	mv ${WRKDIR}/nim-results-${NIMBLE_RESULTS_V} \
-		${WRKDIST}/dist/nimble/vendor/results
-	mv ${WRKDIR}/nim-stew-${NIMBLE_STEW_V} \
-		${WRKDIST}/dist/nimble/vendor/stew
-	mv ${WRKDIR}/zippy-${NIMBLE_ZIPPY_V} \
-		${WRKDIST}/dist/nimble/vendor/zippy
-	cp -r ${WRKDIR}/sat-*/* \
-		${WRKDIST}/dist/nimble/vendor/sat/
-	mv ${WRKDIR}/checksums-* ${WRKDIST}/dist/checksums
+	rm -R ${WRKDIST}/dist/nimble/vendor/chronos
+	mv ${WRKDIR}/nim-chronos-* ${WRKDIST}/dist/nimble/vendor/chronos
 	mv ${WRKDIR}/atlas-* ${WRKDIST}/dist/atlas
 	mkdir -p ${WRKDIST}/dist/atlas/dist
-	mv ${WRKDIR}/sat-* ${WRKDIST}/dist/atlas/dist/sat
+	cp -R ${WRKDIST}/dist/nimble/vendor/sat ${WRKDIST}/dist/atlas/dist/sat
 
 post-patch:
 	mkdir -p ${WRKSRC}/nimcache-port
Index: distinfo
===================================================================
RCS file: /cvs/ports/lang/nim/distinfo,v
retrieving revision 1.12
diff -u -p -r1.12 distinfo
--- distinfo	17 Jul 2026 00:54:38 -0000	1.12
+++ distinfo	3 Oct 2026 11:40:07 -0000
@@ -1,18 +1,8 @@
-SHA256 (arnetheduck-nim-results-df8113dda4c2d74d460a8fa98252b0b771bf1f27.tar.gz) = UtR71LY9UYHWk0Mwd0rx+nXxYH2YzGfLb0uIKjfc8Yc=
-SHA256 (guzba-zippy-a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f.tar.gz) = TmlLHmmbJYmlMcgfY/AWT1AKX1K9EF7PRXLeqYLx2ms=
-SHA256 (nim-2.2.10.tar.xz) = eVe37QBCBrzxC8xPO0dEFTh45i8kMVUqmo6dP0Do1dU=
-SHA256 (nim-lang-atlas-0.14.7.tar.gz) = rnH51fTA98LlbcUgkSiJniXh6gIPk9kt5N5ru6TadNk=
-SHA256 (nim-lang-checksums-f8f6bd34bfa3fe12c64b919059ad856a96efcba0.tar.gz) = nNBiWuiGDtHWogz/PauBMlqSPCd4n8K+2CYlp8V2OXU=
-SHA256 (nim-lang-nimble-42ef70c2102a942c46f13eb76872326edd525cec.tar.gz) = PyTiH5jxAkcigZIwV95spkEuIRqM9VJp8WEPrH5NdvA=
-SHA256 (nim-lang-sat-e63eaea8baf00bed8bcd5a29ffd8823abb265b39.tar.gz) = CEZgfiHMKYDOaDJfw7Ssvy6+THTLxe4cRZ+8Krr3KFY=
-SHA256 (status-im-nim-chronos-0646c444fce7c7ed08ef6f2c9a7abfd172ffe655.tar.gz) = 1ZtM8tzIA6Mz2c0pWwd5QFaAVj7CB5VqLmSNbzfrMTY=
-SHA256 (status-im-nim-stew-b66168735d6f3841c5239c3169d3fe5fe98b1257.tar.gz) = XDu+cFL6ktOZcIhLmhSVEHpQUB2Ikw5fqUPuuovssgM=
-SIZE (arnetheduck-nim-results-df8113dda4c2d74d460a8fa98252b0b771bf1f27.tar.gz) = 24169
-SIZE (guzba-zippy-a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f.tar.gz) = 29504190
-SIZE (nim-2.2.10.tar.xz) = 8287652
-SIZE (nim-lang-atlas-0.14.7.tar.gz) = 160612
-SIZE (nim-lang-checksums-f8f6bd34bfa3fe12c64b919059ad856a96efcba0.tar.gz) = 47503
-SIZE (nim-lang-nimble-42ef70c2102a942c46f13eb76872326edd525cec.tar.gz) = 772179
-SIZE (nim-lang-sat-e63eaea8baf00bed8bcd5a29ffd8823abb265b39.tar.gz) = 10245
-SIZE (status-im-nim-chronos-0646c444fce7c7ed08ef6f2c9a7abfd172ffe655.tar.gz) = 297162
-SIZE (status-im-nim-stew-b66168735d6f3841c5239c3169d3fe5fe98b1257.tar.gz) = 117078
+SHA256 (nim-2.2.12.tar.xz) = Jjmgal6np/z1ffHn4e9NGyvuWMesm9ANvSqlvqHlpWo=
+SHA256 (nim-lang-atlas-0.16.3.tar.gz) = pQG5wWgd2ZNn4vw7GUXeUTgiVKZa87kS8jhRNd0fBGs=
+SHA256 (nim-lang-nimble-v0.26.0.tar.gz) = p0fgqocZNg+Fj7Ady+cW91VHQmogtkzGv1mTTULSm10=
+SHA256 (status-im-nim-chronos-536169b4ab6b7772f57993284331b7de716b6e99.tar.gz) = 7tK1X7tOwzFHenM1O5wfLoBO5fMDnw8OkFZDRAFeO2Y=
+SIZE (nim-2.2.12.tar.xz) = 10259940
+SIZE (nim-lang-atlas-0.16.3.tar.gz) = 206062
+SIZE (nim-lang-nimble-v0.26.0.tar.gz) = 893733
+SIZE (status-im-nim-chronos-536169b4ab6b7772f57993284331b7de716b6e99.tar.gz) = 698219
Index: patches/patch-dist_nimble_src_nimblepkg_downloadnim_nim
===================================================================
RCS file: patches/patch-dist_nimble_src_nimblepkg_downloadnim_nim
diff -N patches/patch-dist_nimble_src_nimblepkg_downloadnim_nim
--- patches/patch-dist_nimble_src_nimblepkg_downloadnim_nim	17 Jul 2026 00:54:38 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,46 +0,0 @@
-Index: dist/nimble/src/nimblepkg/downloadnim.nim
---- dist/nimble/src/nimblepkg/downloadnim.nim.orig
-+++ dist/nimble/src/nimblepkg/downloadnim.nim
-@@ -114,25 +114,26 @@ proc isAppleSilicon*(): bool =
- 
- proc getPlatformString*(arch: int): string =
-   ## Returns the platform string used in releases.json (e.g., "linux_x64", "macosx_arm64")
--  let os =
--    when defined(windows):
--      "windows"
--    elif defined(linux):
--      "linux"
--    elif defined(macosx):
--      "macosx"
--    else:
--      # For other platforms, fall back to source
--      return "source_tar"
-+  when defined(windows) or defined(linux) or defined(macosx):
-+    let os =
-+      when defined(windows):
-+        "windows"
-+      elif defined(linux):
-+        "linux"
-+      else:
-+        "macosx"
- 
--  when defined(macosx):
--    if isAppleSilicon():
--      return os & "_arm64"
-+    when defined(macosx):
-+      if isAppleSilicon():
-+        return os & "_arm64"
-+      else:
-+        return os & "_x64"
-     else:
--      return os & "_x64"
-+      # For Windows and Linux
-+      return os & "_x" & $arch
-   else:
--    # For Windows and Linux
--    return os & "_x" & $arch
-+    # For other platforms, fall back to source
-+    return "source_tar"
- 
- proc getNightliesUrl*(parsedContents: JsonNode, arch: int): (string, string) =
-   let os =
Index: patches/patch-dist_nimble_vendor_bearssl_bearssl_abi_bearssl_ssl_nim
===================================================================
RCS file: patches/patch-dist_nimble_vendor_bearssl_bearssl_abi_bearssl_ssl_nim
diff -N patches/patch-dist_nimble_vendor_bearssl_bearssl_abi_bearssl_ssl_nim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-dist_nimble_vendor_bearssl_bearssl_abi_bearssl_ssl_nim	3 Oct 2026 11:40:07 -0000
@@ -0,0 +1,35 @@
+Match BearSSL's size_t output parameters instead of Nim's native uint.
+
+Index: dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim
+--- dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim.orig
++++ dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim
+@@ -823,25 +823,25 @@ proc sslEngineLastError*(cc: var SslEngineContext): ci
+   return cc.err
+ 
+ 
+-proc sslEngineSendappBuf*(cc: var SslEngineContext; len: var uint): ptr byte {.
++proc sslEngineSendappBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {.
+     importcFunc, importc: "br_ssl_engine_sendapp_buf", header: "bearssl_ssl.h".}
+ 
+ proc sslEngineSendappAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc,
+     importc: "br_ssl_engine_sendapp_ack", header: "bearssl_ssl.h".}
+ 
+-proc sslEngineRecvappBuf*(cc: var SslEngineContext; len: var uint): ptr byte {.
++proc sslEngineRecvappBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {.
+     importcFunc, importc: "br_ssl_engine_recvapp_buf", header: "bearssl_ssl.h".}
+ 
+ proc sslEngineRecvappAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc,
+     importc: "br_ssl_engine_recvapp_ack", header: "bearssl_ssl.h".}
+ 
+-proc sslEngineSendrecBuf*(cc: var SslEngineContext; len: var uint): ptr byte {.
++proc sslEngineSendrecBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {.
+     importcFunc, importc: "br_ssl_engine_sendrec_buf", header: "bearssl_ssl.h".}
+ 
+ proc sslEngineSendrecAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc,
+     importc: "br_ssl_engine_sendrec_ack", header: "bearssl_ssl.h".}
+ 
+-proc sslEngineRecvrecBuf*(cc: var SslEngineContext; len: var uint): ptr byte {.
++proc sslEngineRecvrecBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {.
+     importcFunc, importc: "br_ssl_engine_recvrec_buf", header: "bearssl_ssl.h".}
+ 
+ proc sslEngineRecvrecAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc,
Index: patches/patch-dist_nimble_vendor_chronos_chronos_sendfile_nim
===================================================================
RCS file: patches/patch-dist_nimble_vendor_chronos_chronos_sendfile_nim
diff -N patches/patch-dist_nimble_vendor_chronos_chronos_sendfile_nim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-dist_nimble_vendor_chronos_chronos_sendfile_nim	3 Oct 2026 11:40:07 -0000
@@ -0,0 +1,49 @@
+Implement OpenBSD file-to-socket transfers with bounded buffered I/O.
+Preserve the input file position and let Chronos retry partial writes.
+
+Index: dist/nimble/vendor/chronos/chronos/sendfile.nim
+--- dist/nimble/vendor/chronos/chronos/sendfile.nim.orig
++++ dist/nimble/vendor/chronos/chronos/sendfile.nim
+@@ -43,6 +43,33 @@
+   proc sendfile*(outfd, infd: int, offset: int, count: var int): int =
+     raiseAssert "sendfile() is not implemented yet"
+ 
++elif defined(openbsd):
++  import std/posix
++
++  proc sendfile*(outfd, infd: int, offset: int, count: var int): int =
++    let requested = count
++    count = 0
++    if requested < 0 or offset < 0:
++      errno = EINVAL
++      return -1
++    if requested == 0:
++      return 0
++
++    # pread preserves the file position. The caller retries unsent bytes.
++    var buffer: array[16384, byte]
++    let nread = pread(cint(infd), addr buffer[0],
++                      min(requested, buffer.len), Off(offset))
++    if nread < 0:
++      return -1
++    if nread == 0:
++      return 0
++    let written = send(SocketHandle(outfd), addr buffer[0], nread,
++                       MSG_NOSIGNAL)
++    if written < 0:
++      return -1
++    count = written
++    0
++
+ elif (defined(linux) or defined(android)) and not(defined(emscripten)):
+ 
+   type
+@@ -64,7 +91,7 @@
+       count = 0
+       -1
+ 
+-elif defined(freebsd) or defined(openbsd) or defined(netbsd) or
++elif defined(freebsd) or defined(netbsd) or
+      defined(dragonflybsd):
+   import oserrno
+   type
Index: patches/patch-dist_nimble_vendor_chronos_chronos_streams_tlsstream_nim
===================================================================
RCS file: patches/patch-dist_nimble_vendor_chronos_chronos_streams_tlsstream_nim
diff -N patches/patch-dist_nimble_vendor_chronos_chronos_streams_tlsstream_nim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-dist_nimble_vendor_chronos_chronos_streams_tlsstream_nim	3 Oct 2026 11:40:07 -0000
@@ -0,0 +1,60 @@
+Keep BearSSL buffer lengths in C size_t storage, including async captures.
+Nim's uint and C size_t have different underlying types on OpenBSD/amd64.
+
+Index: dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim
+--- dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim.orig
++++ dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim
+@@ -112,7 +112,7 @@ type
+     alpnProtosC: seq[cstring]
+     readFut: Future[int].Raising([CancelledError, AsyncStreamError])
+     writeFut: Future[void].Raising([CancelledError, AsyncStreamError])
+-    wlength: uint
++    wlength: csize_t
+     error: ref AsyncStreamError
+ 
+   SomeTLSStreamType* = TLSStreamReader|TLSStreamWriter|TLSAsyncStream
+@@ -276,7 +276,7 @@ proc runUntil(rws: TLSAsyncStream, target: cuint): Fut
+           await cancelAndWait(move(rws.writeFut))
+         break
+ 
+-      sslEngineRecvrecAck(engine[], uint(fut.value))
++      sslEngineRecvrecAck(engine[], csize_t(fut.value))
+       continue # re-read state / last error
+ 
+     if ((state and target) == target):
+@@ -290,7 +290,7 @@ proc runUntil(rws: TLSAsyncStream, target: cuint): Fut
+       if rws.eof: # We've already read EOF from the underlying stream
+         break
+ 
+-      var length = 0'u
++      var length: csize_t = 0
+       var buf = sslEngineRecvrecBuf(engine[], length)
+       rws.readFut = rws.rsource.readOnce(buf, int(length))
+ 
+@@ -342,9 +342,9 @@ proc readOnce(
+     if (state and SSL_RECVAPP) == SSL_RECVAPP:
+       # Unencrypted data is available from the engine - copy as much as possible
+       # to the user buffer
+-      var length = 0'u
++      var length: csize_t = 0
+       var buf = sslEngineRecvappBuf(engine[], length)
+-      let n = min(nbytes.uint, length)
++      let n = min(nbytes.csize_t, length)
+       copyMem(pbytes, buf, n)
+       sslEngineRecvappAck(engine[], n)
+       return n.int
+@@ -387,12 +387,12 @@ proc write(
+ 
+     if (state and SSL_SENDAPP) == SSL_SENDAPP:
+       # Application data can be queued for encryption
+-      var length = 0'u
++      var length: csize_t = 0
+       var buf = sslEngineSendappBuf(engine[], length)
+       let toWrite = min(int(length), nbytes - offset)
+       copyMem(buf, pbytes.offset(offset), toWrite)
+       offset += toWrite
+-      sslEngineSendappAck(engine[], uint(toWrite))
++      sslEngineSendappAck(engine[], csize_t(toWrite))
+ 
+       if offset == nbytes:
+         # Flushing is necessary for writes that only partially fill an SSL
Index: patches/patch-dist_nimble_vendor_chronos_chronos_transports_stream_nim
===================================================================
RCS file: patches/patch-dist_nimble_vendor_chronos_chronos_transports_stream_nim
diff -N patches/patch-dist_nimble_vendor_chronos_chronos_transports_stream_nim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-dist_nimble_vendor_chronos_chronos_transports_stream_nim	3 Oct 2026 11:40:07 -0000
@@ -0,0 +1,16 @@
+Complete OpenBSD buffered file transfers at EOF instead of retrying forever.
+
+Index: dist/nimble/vendor/chronos/chronos/transports/stream.nim
+--- dist/nimble/vendor/chronos/chronos/transports/stream.nim.orig
++++ dist/nimble/vendor/chronos/chronos/transports/stream.nim
+@@ -1397,7 +1397,9 @@
+         vector.size += nbytes
+ 
+         if res >= 0:
+-          if cast[int](vector.buf) == nbytes:
++          # The OpenBSD buffered fallback returns no bytes at end-of-file.
++          if cast[int](vector.buf) == nbytes or
++              (defined(openbsd) and nbytes == 0):
+             if not(vector.writer.finished()):
+               vector.writer.complete(vector.size)
+           else:
Index: patches/patch-koch_nim
===================================================================
RCS file: /cvs/ports/lang/nim/patches/patch-koch_nim,v
retrieving revision 1.4
diff -u -p -r1.4 patch-koch_nim
--- patches/patch-koch_nim	19 Mar 2026 23:43:39 -0000	1.4
+++ patches/patch-koch_nim	3 Oct 2026 11:40:07 -0000
@@ -1,3 +1,5 @@
+Use the bundled dependencies when building the compiler and tools.
+
 Index: koch.nim
 --- koch.nim.orig
 +++ koch.nim
@@ -24,3 +26,20 @@ Index: koch.nim
    # installer.ini expects it under $nim/bin
    nimCompile("dist/atlas/src/atlas.nim",
               options = "-d:release --noNimblePath -d:nimAtlasBootstrap " & args)
+@@ -181,7 +172,6 @@ proc bundleChecksums(latest: bool) =
+   cloneDependency(distDir, "https://github.com/nim-lang/checksums.git", commit, allowBundled = true)
+ 
+ proc bundleNimsuggest(args: string) =
+-  bundleChecksums(false)
+   nimCompileFold("Compile nimsuggest", "nimsuggest/nimsuggest.nim",
+                  options = "-d:danger " & args)
+ 
+@@ -344,8 +334,6 @@ proc boot(args: string, skipIntegrityCheck: bool) =
+   let useCpp = doUseCpp()
+   let smartNimcache = (if "release" in args or "danger" in args: "nimcache/r_" else: "nimcache/d_") &
+                       hostOS & "_" & hostCPU
+-
+-  bundleChecksums(false)
+ 
+   let usingLibFFI = "nimHasLibFFI" in args
+   if usingLibFFI and not dirExists("dist/libffi"):
Index: patches/patch-lib_system_sysstr_nim
===================================================================
RCS file: patches/patch-lib_system_sysstr_nim
diff -N patches/patch-lib_system_sysstr_nim
--- patches/patch-lib_system_sysstr_nim	17 Jul 2026 00:54:38 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,14 +0,0 @@
-Index: lib/system/sysstr.nim
---- lib/system/sysstr.nim.orig
-+++ lib/system/sysstr.nim
-@@ -223,8 +223,9 @@ proc addChar(s: NimString, c: char): NimString =
- proc appendString(dest, src: NimString) {.compilerproc, inline.} =
-   ## Raw, does not prepare `dest` space for copying
-   if src != nil:
--    copyMem(addr(dest.data[dest.len]), addr(src.data), src.len + 1)
-+    copyMem(addr(dest.data[dest.len]), addr(src.data), src.len)
-     inc(dest.len, src.len)
-+    dest.data[dest.len] = '\0'
- 
- proc setLengthStr(s: NimString, newLen: int): NimString {.compilerRtl.} =
-   ## Sets the `s` length to `newLen` zeroing memory on growth.
