Library / SDK
i2p/i2p.i2p avatar
i2p/i2p.i2p

i2p.i2p: the Java reference router behind the I2P anonymizing network

I2P is an anonymizing network, offering a simple layer that identity-sensitive applications can use to securely communicate. All data is wrapped with several layers of encryption, and the network is both distributed and dynamic, with no trusted parties.

2,708 stars359 forksJavaNOASSERTION

At a glance

What is it?
The i2p.i2p repository is the reference Java implementation of the I2P network, built with Ant or Gradle and shipped as a Docker image. It is the right starting point for people who want to run a router or embed I2P, and the wrong one for anyone expecting a single-binary install.
Who is it for?
Adopt i2p.i2p if you are running an I2P router, packaging it for a distribution, or building Java applications against the I2P API; skip it if you want a small embeddable anonymity library, since the repository is a full router and its subsystems.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What i2p.i2p is, and who ends up building it

This repository is not a library you drop into an application. It is the reference Java implementation of I2P, an anonymizing network where, in the project's own description, all data is wrapped with several layers of encryption and the network is both distributed and dynamic with no trusted parties. The codebase covers the router, the core, streaming and mstreaming, and i2ptunnel, and the top-level tree shows apps/, core/, router/, installer/, debian/, debian-alt/, Slackware/ and docker/ directories. That layout tells you the intended audience: people who run a router, people who package I2P for a distribution, and people who build Java software against the I2P API. If you want to write an application that sends traffic over I2P, you are here for the API and the router, not for a convenience wrapper. The README points developers at HACKING.md and the docs directory, and points API users at a Javadoc build rather than a published artifact.

How the build is put together: Ant, Gradle, and a single builder image

The repository carries two build systems. Ant is the full one: the README states that on x86 systems you run ant pkg, and on non-x86 you use ant installer-linux, ant installer-freebsd or ant installer-osx instead. Running ant with no arguments lists the other options. Gradle is partial, and the README is explicit that full builds of installers or updates are not yet possible with it; ./gradlew assemble compiles the code, and by default it downloads dependencies over the clearnet, including Gradle itself. That default is worth pausing on. A project whose entire purpose is anonymity defaults to fetching build dependencies in the clear, and the documented workaround is to route them through a SOCKS proxy by adding systemProp.socksProxyHost and systemProp.socksProxyPort lines to ~/.gradle/gradle.properties. The Dockerfile takes the other path: one Debian trixie-slim builder stage installs openjdk-21-jdk-headless, gettext, git and a pinned Apache Ant 1.10.18, writes javac.version=21, javac.release=21, build.built-by=Docker and a git revision into override.properties, then runs ant preppkg-linux-only. Separate runtime stages exist for amd64, arm64 and arm, each installing openjdk-21-jre-headless, fonts-dejavu and iproute2. The Dockerfile comment notes the per-architecture stages are kept separate for possible future architecture-specific changes and that this does not increase final image size.

Building and running i2p.i2p from source

Prerequisites come from the README: a Java SDK, preferably Oracle or OpenJDK, version 17 or higher; Apache Ant 1.9.8 or higher; the xgettext, msgfmt and msgmerge tools from GNU gettext; and a UTF-8 locale in the build environment. The README also notes that certain subsystems for embedded use (core, router, mstreaming, streaming, i2ptunnel) require only Java 6. Once those are in place, the x86 package build is one command.

bash
ant pkg

On a non-x86 machine the README directs you to a different target instead, for example ant installer-linux on Linux. If you only need the code compiled and would rather use Gradle, the README gives this:

bash
./gradlew assemble

Remember that this path pulls dependencies from the clearnet unless you configure the SOCKS proxy properties shown above. For a container, the repository ships a Dockerfile and a Docker.md, and the build is a plain docker build against the repository root; the builder stage copies the tree with COPY --exclude=docker . . and strips pkg-temp/osid and the wrapper libraries before the runtime stage. To read the API, the README says to run ant javadoc and then open build/javadoc/index.html. If you would rather not build at all, the README points at the download page and at per-system guides for Windows, macOS, Debian and Ubuntu, plus an Android build on Google Play.

Where i2p.i2p is the wrong tool

Two limitations are visible without running anything. First, the licence. The repository's licence field resolves to NOASSERTION, and the README simply says to see LICENSE.txt. GitHub cannot map it to a standard SPDX identifier, so anyone redistributing the router, bundling it into a product, or shipping a modified package has to read LICENSE.txt directly rather than assume a familiar licence applies. That is a real cost for downstream packagers, and it is not something a build file resolves. Second, the Gradle path. The README states plainly that full builds of installers or updates are not yet possible with Gradle, so if your CI is Gradle-only you still need Ant for anything beyond compilation, along with gettext and a UTF-8 locale. Third, scope. This is a router implementation, and the README's own note that some embedded subsystems need only Java 6 hints at how the code is partitioned: the parts are separable in principle, but the repository is organised and tested as a whole. If you wanted a small anonymity primitive to link into a JVM service, this is a large dependency to take on. The README does not document rollback for upgrades, and it does not describe an upgrade procedure in the repository itself; that material lives on the documentation site.

i2p.i2p compared with Tor's reference implementation

The natural comparison is Tor. Both are anonymity networks with a reference implementation, but they are built around different assumptions. Tor's reference implementation is C, and the usual way to use it is a client that connects out through a small number of directory-authority-listed relays and exits to the public internet through exit nodes. I2P's README describes a distributed and dynamic network with no trusted parties, and the repository is a Java router with its own streaming layer, i2ptunnel and an API for applications that communicate inside the network rather than out to the open web. Practically, that means the integration surface differs: with Tor you typically point an existing HTTP client at a SOCKS port, while with I2P you are more often building against the router's API or using i2ptunnel to reach a service inside the network. Neither approach is a superset of the other. If your goal is reaching clearnet sites anonymously, the Tor model fits that shape better; if your goal is hosting or consuming services that stay inside an anonymizing network, i2p.i2p is the reference implementation for that model. The build story differs too: this repository expects Ant, gettext and a UTF-8 locale before you get a package.

Maintenance, releases and what an upgrade costs you

The repository is not archived, and the last push was on 2026-09-24, four days before this writing, so the tree is being touched. Releases are frequent: 2.13.0 on 2026-07-24, 2.12.0 on 2026-06-18, and 2.11.0 on 2026-02-10. That cadence matters for operators, because it means the packaged router you installed will fall behind the source tree within months. The upgrade cost is not visible in the repository: the README does not document a rollback path, and INSTALL.txt is where installation is described, with the documentation site handling per-platform instructions. For a build-from-source deployment, the practical cost is re-running the Ant target and redeploying, plus keeping the JDK at the version the build expects. The Dockerfile pins javac.version=21 and javac.release=21 and installs openjdk-21-jdk-headless in the builder and openjdk-21-jre-headless at runtime, so a container-based deployment has a clear version contract. On licences, the only safe statement is that the repository does not declare a standard SPDX licence and the README defers to LICENSE.txt; treat that file as the authority and read it before you redistribute or modify anything. This is not legal advice, and the file is short enough to read in full.

Editorial conclusion

Adopt i2p.i2p if you are running an I2P router, packaging it for a distribution, or building Java applications against the I2P API; skip it if you want a small embeddable anonymity library, since the repository is a full router and its subsystems. Before committing, check INSTALL.txt against your JDK version, run the Docker build for your architecture, and read LICENSE.txt, because the repository declares no standard SPDX licence and the file is the only authority on redistribution terms.

Frequently asked questions

Is I2P a darknet?

The repository describes I2P as an anonymizing network offering a layer that identity-sensitive applications can use to communicate, with data wrapped in several layers of encryption and no trusted parties. It does not describe itself as a darknet, and the code here is a general-purpose router rather than a hidden service directory.

Can I2P be tracked?

The README states that all data is wrapped with several layers of encryption and that the network is distributed and dynamic with no trusted parties. It makes no claim about resistance to specific tracking techniques, so the repository does not answer this beyond that description.

Is I2P legal?

The repository does not discuss legality. It ships a LICENSE.txt for the code, and the README points to the project contact page for security and press inquiries; whether running a router is lawful in your jurisdiction is outside what the source tree states.

Is I2P better than a VPN?

The README does not compare I2P with VPNs. It describes a distributed, dynamic network with no trusted parties and layered encryption, which is a different model from a VPN that routes your traffic through a provider you trust; the repository gives no basis for a ranking.

Official sources

  1. i2p/i2p.i2p on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/i2p-i2p-i2p.svg)](https://hysenlabs.com/projects/i2p-i2p-i2p)