The Most Efficient Gnutella Client
gtk-gnutella is a server/client for the Gnutella peer-to-peer network. It runs on Microsoft Windows, MacOS and every Unix-like system which supports GTK+ (1.2 or above). The GNOME desktop environment is not required. It is currently developed and tested under Linux (Debian) as well as NetBSD. It is known to run at least on Linux, FreeBSD, NetBSD, Darwin, Solaris, Tru64 UNIX (OSF/1), SGI IRIX, BeOS whereas CPU architectures include x86, AMD64, PowerPC, SPARC, MIPS. And of course Microsoft Windows (XP at least).
gtk-gnutella is free open-source software and released under the GNU General Public License (GPL-2).
gtk-gnutella is not finished yet, but it is fully functional: you may share, search, and download. And it is stable too, users usually just leave it run unattended for days.
This website is written in PHP, follows HTML5 and CSS3 web standards and does not use cookies.
All ideas and comments are welcome to the gtk-gnutella-devel mailing list. Bugs should be reported to the SourceForge.net Bug Tracker
We need additional contributors for C development, documentation, software translation and website translation.
News
9 March 2026, Version 1.3.1 Released
This is an urgent release fixing bugs.
Bug Fixes
- [GTK2] Removed "clock" icon in status bar, a left-over of the 1.3.0 edits.
- Was sometimes crashing at startup due to a bug in logfilter.
- Forgot an include of "mempcpy.h", causing compilation error on MacOs.
- Fixed compilation error on arm64.
6 March 2026, Version 1.3.0 Released
This is a maintenance release with minor bug fixes.
Improvements
- Removed expiration date: this version will now run forever.
Under the Hood
- Merged various enhancements from a side project reusing GTKG's library.
- Added experimental logfilter (see extra_files/logfilter.sample).
3 March 2024, Version 1.2.3 Released
This is a maintenance release with minor bug fixes.
Improvements
- Allow final address to be used as a search and sorting column in GUI.
- Do not hide the "random stats" shell command in the help.
- Shell "node add" now supports g2:IP:port for G2 nodes.
Bug Fixes
- Avoid assertion failure in
xmalloc()when the page size is not 4K - Fix build on NetBSD with SSP.
- Avoid conflicting symbol with NetBSD's powerpc/frame.h
- Force supervisor to quit if child gets a SIGKILL.
- Forgot to set te->ptid in discovered threads.
Under the Hood
- Add
aq_on_available()to hide waiter object. - Add debugging #define XMALLOC_DISABLED to remap
xmalloc()tomalloc(). - Add randomness every minute instead of 30 seconds.
- Dump held locks when suspending thread with locks.
- Fix
thread_lock_dump()logic. - Recent version of glib define G_NORETURN already.
- Use library
popcount()if it exists. - Use an integer for atomic_lock_t (or it fails on Darwin ppc32).
atio_get_lock(): no need to hash file descriptor.crash_hook_add(): watch out for early inits.crash_init(): ignore subsequent calls, loudly.crash_mode(): disable locking on concurrent crash.dump_hex_vec(): do not re-emit header if reached end.entropy_collect_gateway(): cache initial gateway information.entropy_harvest_many(): accelerate processing.evq_close(): forgot to free local callout queue.getgateway(): avoid endless warnings.- hashlist: avoid race condition for moveto operations.
random_double_generate(): ensure value is in [0, 1[.ripening_set_expire(): remove faulty assertion.rwlock_deadlocked(): trace locking thread owner.rwlock_lock_granted(): verify waiter presence.rwlock_readers_downto(): issue a memory barrier.shared_file_free(): give more details on assert failure.semaphore_emulate(): was not handling timeout properly.sig_get_pc_index(): also trap SIGBUS for OS/X.socket_tls_upgrade(): synchronous upgrade logged but no longer fatal.str_private(): must useNOT_LEAKING_Z()forwalloc().str_slice(): change semantics of `to'.thread_element_reset(): also clear lock stack overflow.thread_lock_dump(): can now omit details if necessary.thread_lock_released(): give more context on problems.thread_sig_handle(): add default handling of TSIG_TERM.vmm_mmap_anonymous(): optimize re-locking.walloc_get_zone(): do not keep lock whilst allocating zone.xmalloc_chunk_allocate(): validate chunk head is sound.- zalloc: do not keep lock whilst extending the zone.
zget(): limit scope of global spinlock to a minimum.
