## PurpleI2P/i2pd — 2.59.0…2.60.0

_159+ commits._

### Features
- **[i18n] add Persian translation** (785e7de)
- **FS.h: add missing header** (7b07304)
- **removed MLDSA44 support for now** (855bf09)
- **fixed incorrect Poly1305 tag of chiper text block in next new session reply message** (a8e040e)
- **resume destination upon new incoming connection in HTTP and SOCKS proxy** (62c5a96)
- **close all session and regenerate static keys for new dest** (ae3de9e)
- **resume idling cleint tunnel upon accepting new connecton** (8bf34aa)
- **add missing I2PControl RouterInfo metrics** (2a63ce3)
- **post-quantum support for outgoing SSU2 session** (9285d2d)
- **removed support of gcc 8-9. Enabled c++20 for gcc 11+** (d23fb65)
- **call terminate for new streams on close** (8152012)
- **add null check for netdb.NewIdentity and check offset > len to ensure nothing bad happens** (1dc2e57)

### Fixes
- **fix segfault in WrapSignleMessage** (10e3ce5)
- **Merge pull request #2365 from majestrate/2026-04-03-i2cp-reconfigure-fix** (d3233cf)
- **fix typos** (2f15da3)
- **Merge pull request #2362 from Jercik/fix/i2pcontrol-buffer-overflow** (01cddbf)
- **Merge pull request #2357 from parsebulb/fix-exit-segfault** (8f61ff3)
- **Merge pull request #2352 from GBember01/fix-mold-underlinking** (4ef63d7)
- **Fix libi2pd underlinking on Linux causing runtime crashes with strict linkers like mold** (5cf92f6)
- **Merge pull request #2347 from bkmgit/patch-1** (08ea68a)
- **Fix reseed URL** (9de7a10)

### Backend
- **[i18n] change comment** (f618e41)
- **2.60.0** (336e41f)
- **check if RouterInfo was inserted to NetDb** (c353d71)
- **reset stuck session after 2 minutes** (b31dacf)
- **try to delete expired unacked datagrams if window is full on server side** (73e5003)
- **try to delete expired unacked datagrams if window is full** (ae52487)
- **Merge pull request #2359 from barracuda156/cstdint** (ab1afcc)
- **i2cp.closeIdleTime and i2cp.newDestOnResume params for httpproxy and socksproxy** (3598cfd)
- **ignore i2cp.closeIdleTime for tunnels on shared destinations** (eee3617)
- **ML-KEM-768 for NTCP2 by default if applicable** (bdb1432)
- **Merge pull request #2370 from parsebulb/sigsegv-in-wrap-single-message** (7ea8cc0)
- **publish higher key type first** (a1c3aa4)
- **https://bybyh.de reseed added** (38cec8f)
- **throw fatal error if storage failed to initialize** (e056eab)
- **detach remaining tunnels and close remaining streams if destination changes** (cc3d610)
- **read i2cp.closeIdleTime and i2cp.newDestOnResume with correct separator** (070adc8)
- **persist.netdbinterval param** (caf36cb)
- **replace destination's ident hash in client context** (776cf02)
- **impplemented i2cp.newDestOnResume** (c45b0ab)
- **Update libi2pd/Destination.cpp** (af8a3de)
- **Update libi2pd/Destination.cpp** (ac5ba2d)
- **Fixup i2cp option on reconfigure.** (1397c93)
- **fixed inverted value of i2cp.dontPublishLeaseSet** (975d3c6)
- **set only default receiver if port=0** (0fbf06d)
- **check for idle time. don't create and test tunnel if idling** (a683b98)
- **read i2cp.closeIdleTime param. set last update time** (7f4bfcc)
- **generate tags faster** (6be7391)
- **reduce send interval** (6dcfee0)
- **exclude routers from the same family from next hop** (e6d6699)
- **Merge pull request #2364 from Jercik/i2pcontrol-missing-metrics** (ea27bd2)
- **Merge pull request #2363 from rex4539/typos** (8267772)
- **fixed typo** (f7c33b3)
- **prevent buffer overflow on large I2PControl requests** (824f66f)
- **Merge pull request #2361 from Jercik/case-insensitive-http-headers** (96e14c8)
- **use case-insensitive HTTP header matching per RFC 7230** (6ef0221)
- **don't select non-connected peer for first hop if too many connection from that subnet** (54ea2be)
- **mutex for m_ConnectedNetworks** (8f24f00)
- **switch to non-PQ  with a probability of one in four** (e291943)
- **subnet for yggdrasil addreses** (a534168)
- **don't select peer for first hop if too many connection from that subnet** (7cfddc2)
- **show 'slow' and 'pq' for ipv6 connections** (326675c)
- **count sessions from same network** (ade3b45)
- **limit SessionRequest padding to 32 bytes and SessionCreated to 64** (eda4123)
- **print correct value** (d5d6af6)
- **show protocol version for post quantum transport sessions** (9a881e7)
- **upsteam handshake for all address types** (deb7f85)
- **fixed #2320. Removed NetDb::HandleNTCP2RouterInfoMsg** (50eccb8)
- **return value for ProcessRessionRequest and ProcessTokenRequest** (c05cf3c)
- **set version from TokenRequest** (0aa3d2e)
- **print endpoint if server tunnel connection failed** (d65c7f9)
- **correct MixHash after sending SessionCreated** (b4005a9)
- **adjust MTU after remote endpoint is known** (e5753ec)
- **set default MTU for ipv6 address** (4691974)
- **resend packets without extra loop** (64dc406)
- **Don't preserve session lifetime in handlers** (39de43d)
- **check if m_UnackedDatagrams is empty before access** (bb6d8d8)
- **adjust mtu before SessionRequest** (e62f504)
- **fixed typos** (44f174a)
- **send and handle incorrect version reason for retry message** (92c5d2b)
- **fallback to non-PQ crypto if MTU is too small** (1a237d3)
- **correct MixHash after SessionRequest** (6df4138)
- **read first value if pq contains multiple values for SSU2** (1a23e5a)
- **apply ML-KEM shared key in right order in SessionCreated** (461b703)
- **update published pq param from config** (bc2cdd6)
- **handle ssu2.version in config and pq in SSU2 address in RouterInfo** (eb5a808)
- **handle incoming post-quantum sessions** (772b046)
- **create noise state on demand depending on protocol version** (17f6e71)
- **Merge pull request #2349 from LLE8/fix_deb** (af9c014)
- **[debian] exclude obsolete dependencies** (b5d90a6)
- **fixed Debian 12 build** (3aa278e)
- **fixed typo** (f32c01b)
- **[cmake] Allow c++20 with boost 1.81.0** (b32be05)
- **fixed braces around scalar initializer clang warning** (872fd31)
- **DeepWiki Badge** (7fecfaa)
- **set default bandwidth=O for x86_64 and bandwidth=P for x86_64 if more than 4 cores** (60056fe)
- **init XK state with ML-KEM for SSU2** (009a66f)
- **fixed warnings** (25cccb2)
- **made GetName const** (9ecaffd)
- **recreate zero and one hop tunnels after being offline** (fdf174c)
- **replace std:atomic<book> by std::atomic_flag for m_Dead** (892743a)
- **don't set remote endpoint to client tunnel** (4604497)
- **check if socket is open before stream connect** (30a9f4a)
- **close I2P stream if socket got closed right after connect** (0ed8b47)
- **Merge pull request #2346 from bkmgit/deadline_timer** (1db38be)
- **Create GPL-2.0.txt** (b6fc71f)
- **Replace deadline_timer by steady_timer** (73623a4)
- **replace deadline_timer by steady_timer** (a3cafd3)
- **use std::atomic_flag instead std::atomic<bool> for saving to disk** (33e7ffa)
- **use own random number generator for tunnel selection** (8beb677)
- **atomic tunnel state** (cf80297)
- **limit receive queue size** (6701385)
- **own random numbers generator for each tunnel gateway** (d81b0b6)
- **use std::array for radom buffer** (84e48e1)
- **delete stream in shared destination's thread. steady_timer instead deadline_timer** (39ad36d)
- **GetSize returns size_t instead int** (4387e74)
- **set hidden mode only if trust is enabled** (00ceacd)
- **don't publish mtu=1500** (a02ef28)
- **don't check MTU from address if not specified** (3e62ec4)
- **read LeaseSet2 properties** (44658d0)
- **router elgibility is based on current tunnel build success rate** (3fe52ce)
- **Merge pull request #2338 from lunardoesdev/flumental_leaseset_fix1** (53c4722)
- **fixed potential race condition** (bcfba94)
- **max non-PQ message size 944 if peer >= 0.9.69** (3697499)
- **send local RouterInfo during longer sessions** (0c90bad)
- **avoid possible double termination. Use atomic swap. steady_timer instead deadline_time** (ef05aed)
- **avoid possible double termination. Use atomic swap** (085babd)
- **schedule RouterInfo resend time after session established** (6a859cd)
- **use failed/success rate instead difference for evaluation** (2f4e631)
- **max padding size is double message size for post-quantum crypto** (8ab7cfa)
- **send longer padding when applicable** (2724ed4)
- **moved destructor away from mutex** (0098877)
- **Merge pull request #2331 from LLE8/fix_reseed_url** (e052ff5)
- **assume tunnels dead if we are out of tunnels on one side and tunnels on other side were created long time ago** (e0abbca)
- **send RouterInfo block instead I2NP DatabaseStore after incoming connect** (42f07ad)
- **separate RNG for establisher thread** (7b311be)
- **don't rely on inbound/outbound tunnels if no peer tests for a long time** (3b388fb)
- **moved last repliable datagram time to UDPConnection** (4e11c3f)
- **correct private signing key size for offline signatures** (91e164d)
- **sequence reset upon restart** (cce94fb)
- **use DatagramDestination from UDPConnection in UDPTunnel** (2416390)
- **moved datagram destination and session to UDPConnection** (4ec9be5)
- **connect to reseed with timeout** (42f1396)
- **don't try same reseed twice** (74ff1f8)
- **count non replied tunnel requests per hop** (edb7d1c)
- **don't reset tunnel build stats. Randomly allow routers with low rate** (3bd30a9)
- **allow ipv6 through proxy even if local clearnet ipv6 is not available** (5860a09)
- **allow local ipv6  ULA address for clearnet connectivity** (1081670)
- **Merge pull request #2321 from LLE8/fix_html_tag_br** (7d7f563)

### Tests
- **test(HTTP): add case-insensitive header matching tests** (8df7509)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/PurpleI2P/i2pd?utm_source=github-action)._