This text is also available for direct download here.

Posted late Wednesday morning, March 12th, 2014

The fourth development release (0.9.10-3_b4-API8) is out. This is a release candidate! I am working through the required-for-release TODO list so I can push these changes out in the official release builds, because the best way to find all the bugs and issues is to increase the userbase. Please test this build and report any problems you have, so I can fix them in the next release candidate.

The main changes:

  • The main console has been completely revamped for simplicity.
    • An image based on the I2P logo clearly shows the current router status.
    • A list of running tunnels is displayed so users can see what is ready.
    • The in-depth router status is hidden by default. There is a config option in the "Advanced" section to optionally display it.
  • There is an AIDL interface from which the router status can be queried. This allows any Android app to include support for checking if the I2P router is running or not.
    • This interface should NOT be considered stable yet. If you want to use it in your app, keep watch for changes.
  • The inbuilt web browser has been disabled for security. Web links now open the standard Android picker for choosing a web browser.
  • The navigation drawer first-use mechanics now match the Android design pattern. The drawer will always open when the app is started, until the user opens the drawer themselves with a swipe. From then, the drawer will never open itself.

Other changes:

  • Subscriptions can be manually reloaded from the Addressbook menu
  • Fixed a crash in the Addressbook
  • Fixed a NPE in the NetDB view
  • Reworked the notification bar, shows more info in "bigText" mode
  • Reworked Log views
  • Default log level can now be configured in settings
  • Added Nameless IRC to default tunnel lists
  • Various improvements to two-pane view for tablets
  • Added an About page to the main console menu
Posted terribly early Monday morning, January 27th, 2014 Tags:

The third alpha release ( is out. It took some time, but the results are good! Please test and report back :-)

The main changes:

  • Graphs!
    • The stats to be graphed can be configured in settings.
  • NetDB!
    • The stats page and the entry lists can be refreshed from the action bar.
    • Routers and LeaseSets can be searched.
  • Addressbook now shows private hostnames, and new hostnames can be added.
    • The B64 for a new hostname can be loaded from a text file. The first line should be the B64 (later lines are ignored). You will need to have a File Manager installed.

Other changes:

  • A bug causing the tunnel details page to crash has been fixed.
  • The Peers screen does not crash intermittently, thanks zzz!
  • The app icon quality has been improved, and the notification bar icons have been changed to match the Android design guide.
  • The Log views are now combined in a single Activity, and can be displayed by the drop-down menu.
  • More pages save their state when the screen is rotated.
  • More pages fail gracefully when the router is not running (instead of crashing).
  • The settings menu has been migrated to use preference headers, which should improve usability on tablets.
  • Exploratory tunnels settings show the current value in the settings menu.
    • This is not updated when the setting is changed, only when the menu is closed and reopened. To be fixed.
Posted late Sunday evening, November 17th, 2013 Tags:

The second alpha release ( is out. I didn't expect to release a new build so quickly, but zzz and sponge pointed out that I had messed up the router control code when I migrated to Fragments. The router control code needs to be in every single Activity, in case the router crashes or stops temporarily and needs to be restarted from whatever Activity is visible. This puts it right alongside the nav drawer code, and should make the router service as stable as the current release. Please test and report back :-)

Other changes in this dev build:

  • The version naming fix from the stable branch has been pulled in (four-digit versions are now supported, and the API version refers to the minimum version needed, not the target version).
  • The router start/stop actions have been removed from the action bar (there is no need for them because the main control page is easily accessible through the nav drawer).
  • The remaining button links on the main page have been moved temporarily to the nav drawer, until better homes are prepared.
  • The WebFragment is now encapsulated in a WebActivity (again).
    • Selecting a domain in the Addressbook now opens the domain in a separate Activity instead of in the same Activity, which fixes the two-pane issue.

/!\ There is a known problem with the Peers screen: while rendering the status HTML, the UPnP manager tries to talk to the network. Starting in API 11 (Honeycomb), Android doesn't allow network calls on the main thread, and kills the app. This will not be a problem once the dedicated router stats Activity is created. I am leaving the Peers screen link in for older devices, but users with newer devices should treat it as broken.

Posted at midnight, September 6th, 2013 Tags:

I have started working on an overhaul of the UI for I2P Android. I will post here whenever I have a new release for testing.

The latest release will always be available here.

This first alpha release (0.9.7-20_b1-API18) contains a large initial overhaul of the UI. The main changes:

  • The target API is now API 18 (Android 4.3). The minimum required API is still API 8 (Android 2.2) - the Android Support Library is used to provide newer features.
  • The action bar has been implemented and provides direct access to most previous menu items.
  • A navigation drawer has been implemented as the main navigation system.
  • The Addressbook now uses a SearchView in the action bar to search the list of domains.
  • An I2PTunnel interface has been implemented. Tunnels can be viewed, created (via a tunnel creation wizard), started and stopped.
  • Addressbook and I2PTunnel support two-pane view for tablets.
  • Licenses and Release Notes are now accessible from the Help Activity, which can be reached through the action overflow.

There are many other small changes as well. There are also many parts that are unfinished. To name a few:

  • There is no detail pane for the Addressbook.
  • Tunnels cannot be edited (the detail/edit page needs to be designed).
  • The Help Activity is just a blank screen.

The SHA1 sum for this release is 259dafcddb38ee8dcc691896145aae6237a2945d

Please post feedback on the dev forum topic page.

Posted Sunday night, September 1st, 2013 Tags:

As part of an ongoing effort to improve the router console, I've been trying to work out how to get the IP:port for a tunnel created with i2ptunnel to be shown on the summary bar. This wasn't as simple as I originally thought: the router console only has access to information it receives over the I2CP connection.

The destination nickname is passed specifically through I2CP as a known option, and originally I was contemplating appending data to that; but then I discovered that net.i2p.router.TunnelPoolSettings (which is where the config options end up after going through I2CP) has a getUnknownOptions() method.

Perfect! Except for one little hurdle that I subsequently discovered after many hours tracing the options through the code - on the router side, any extra options are allocated into separate inbound and outbound tunnel settings, and these require that the custom option be prefixed with inbound. or outbound. while anything else is ignored.

So, to sum up: to get custom options through I2CP, add the options on the client side of I2CP (i2ptunnel or whatever) in the form inbound.foobar=baz, and then fetch them back (minus the inbound.) from the Properties object returned by _context.tunnelManager().getInboundSettings(destHash).getUnknownOptions(). Also note that if you are setting the option in code, it may need to be in the form option.inbound.foobar=baz.

Posted in the wee hours of Sunday night, June 4th, 2012 Tags:

I run a Seedless server (and if you have an I2P router with good uptimes, you should too), and it generates A LOT of log entries. I'm sure some people would be interested to know which routers are running a Seedless client or server, but for me it just takes up extra log space and hides the more interesting requests (in my case, any request at all).

I run this site using the Jetty webserver that comes with I2P, So I went looking for a way to stop logging certain request paths, and it turns out that there is a method for doing so. Calling the method is slightly convoluted due to the syntax of the jetty.xml file, but it does make sense... kind of.

Anyway, if you look in the jetty.xml file for your eepsite, you will see a section like the following which controls the request logging:

<Ref id="RequestLog">
  <Set name="requestLog">
    <New id="RequestLogImpl" class="net.i2p.jetty.I2PRequestLog">
      <Set name="filename">/path/to/eepsite/logs/yyyy_mm_dd.request.log</Set>
      <Set name="filenameDateFormat">yyyy_MM_dd</Set>
      <Set name="retainDays">90</Set>
      <Set name="append">true</Set>
      <Set name="extended">false</Set>
      <Set name="logCookies">false</Set>
      <Set name="LogTimeZone">GMT</Set>

To prevent logging of the Seedless-related paths, a new setter method is inserted at the end as follows:

      <Set name="logCookies">false</Set>
      <Set name="LogTimeZone">GMT</Set>
      <Set name="IgnorePaths">
        <Array type="java.lang.String">

Then just restart your I2P router! If you want to ignore other request paths, simply add extra Item sections below the Seedless ones. Note that the ignore paths have are matched in their entirety, so for example, /Seedless/ won't be matched by the above (but the Seedless servers that cause all the spam fetch /Seedless/index.jsp). /Seedless/search won't be matched as well, but that is more interesting to log ^_^

Posted in the wee hours of Wednesday night, May 24th, 2012 Tags:

Right, so I figure it would be useful to have some sort of blog here to keep track of the things I'm doing, so at least I don't forget them! Luckily, ikiwiki makes it rather trivial to include such a section, so here it is. Don't expect a weekly feature-length article - it's more of an archived status update. Plus there might be interesting snippets here from time-to-time, or maybe mini-guides if I find something useful that I can't be bothered (or isn't big enough) to turn into a proper guide - I'll tag them as appropriate.

And to all of you out in I2P-space who are actually taking the time to visit my eepsite and have a look around: thanks for stopping by, and hopefully you find something of use here - that's what it's for! Info requests or inquiries or whatever are always welcome; feel free to contact me, and I'll try to reply in a semi-timely manner :-P

Posted terribly early Tuesday morning, May 22nd, 2012