ZeroNet Blogs

Static ZeroNet blogs mirror

Adding images to posts

- Posted in Geekless.Blog by with comments

Just noticed, that adding images on ZeroBlog can be somewhat unobvious for new users.

1. Enter the post editing mode. 2. Press Enter to get to an empty line. 3. The blue plus sign appears. Press it. add-image-1.png (477x213) 4. Press the rightmost icon on the bar to add an image. add-image-2.png

Cleaning up ZeroNet spam

- Posted in Kaffie's Blog by with comments

Yesterday ZeroNet was hit by quite a few chinese spammers, who intended to clutter ZeroNet with junk and attempt to smear/slander it. Naturally there's built in support to mute users, but it can take time for everyone to do that (or to ban them from the sites).

So instead I went ahead and set up a list you can follow to automatically mute any spammers and clean up your ZeroNet experience. You can find that here.

As always thanks for following and supporting my work!

<3 Kaffie

Using CJDNS with ZeroNet

- Posted in Kaffie's Blog by with comments

Noticed people haven't really been setting up cjdns for use with ZeroNet, despite the fact that it's now supported fully. Perhaps due to lack of awareness, or just general ignorance on how to set it all up. I think some are hesitant because they believe you need ipv6 support (which is untrue). So without further ado, here's a walkthrough on how to do it.

1. Install CJDNS

First things first is that you actually need cjdns installed. There's no need to worry about whether you have native ipv6 support, as cjdns doesn't use it (unless that's your chosen option for connecting to peers).

For windows, just download and install this. Following the steps in the guide should make it very easy to set it up.

For Mac use either brew install cjdns or sudo port install cjdns depending on whether you use homebrew or macports. If you have neither, you can set up homebrew by running:

/usr/bin/ruby -e "$(curl -fsSL <">

Generate a new config file by running ./cjdroute --genconf >> cjdroute.conf this will create a configuration file that you can edit. When you finish editing, you can use sudo ./cjdroute < cjdroute.conf to launch and run cjdns.

You'll want to add a peer that's connected to the hyperboria network already, though if you just want private use you can connect to a friend or whoever is on the cjdns network you want to use ZeroNet on. LAN peers are auto-configured.

One such public peer that you can use is:

"": {
                       "login": "default-login",

You'll want to put this in the section of the config where it says "connectTo":, inside of the brackets.

For more details you can see the cjdns github page.

Be sure to note down your cjdns ipv6 which is located under the ipv6 field at the top of the config file.

2. Configure ZeroNet

This part is pretty straight forward. If you wish to become a tracker/bootstrapped node (very needed as we don't have cjdns trackers), then go into the ZeroNet plugins folder and rename disabled-bootstrapper to bootstrapper.

In ZeroNet.conf you'll want to add your ipv6 to the ip_external section. It might be good to change fileserver_ip_type over to ipv6 as well, though that step may be optional. You can also do this on the config page if a gui is more your speed. When all is said and done your config file should look something like this:

ip_external =
fileserver_ip_type = ipv6
trackers = 
fileserver_port = 15441
optional_limit = 1.83

And that's it! Just restart ZeroNet and you should be set up, with your ZeroNet now working with cjdns peers. Be sure to share your cjdns ipv6 if you decided to set up a bootstrapped node so that others may connect to it. It also might be a good idea to look around and find other cjdns peers (and share peering info here on ZN). You can find other cjdns nodes (and try to see if they have a cjdns site hosted) on this site.

To test to ensure cjdns is connected properly you can visit cel's hyperboria site or ping the ip directly using ping6 fc56:8313:1e14:1a50:c01:850:a53e:7127

There's a bootstrapped cjdns node at zero://fc2a:e8f2:3f9c:52e5:5c2f:da95:9213:7bd7:15441 but it's not on 24/7 and more bootstrappers would be greatly appreciated.

zero://fc18:e736:105d:d49a:2ab5:14a2:698f:7021:15441 is now up and works.

Enjoy using cjdns!

<3 Kaffie

Version 0.6.5

- Posted in ZeroBlog by with comments


  • IPv6 support in peer exchange, bigfiles, optional file finding, tracker sharing, socket listening and connecting (based on tangdou1 modifications)
  • New tracker database format with IPv6 support
  • Refactored port open checking with IPv6 support
  • Display notification if there is an unpublished modification for your site
  • Consider non-local IPs as external even is the open port check fails (for CJDNS and Yggdrasil support)
  • Listen and shut down normally for SIGTERM (Thanks to blurHY)
  • Check the length of master seed when executing cryptGetPrivatekey CLI command
  • Only reload source code on file modification / creation
  • Add IPv6 tracker and change unstable tracker
  • Support tilde ~ in filenames (by d14na)
  • Detection and issue warning for latest no-script plugin
  • Don't correct sent local time with the calculated time correction
  • Support map for Namecoin subdomain names (Thanks to lola)
  • Add log level to config page
  • Don't show meek proxy option if the tor client does not supports it
  • Quick check content.db on startup and rebuild if necessary
  • Only support CREATE commands in dbschema indexes node and SELECT from storage.query
  • Support {data} for data dir variable in trackers_file value
  • Disable CSP for Edge

  • Fix site cloning before site downloaded (Reported by unsystemizer)

  • Fix queryJson for non-list nodes (Reported by MingchenZhang)

  • Fix multi-line parsing of zeronet.conf (Reported by xx)

  • Fix site deletion from users.json
  • Fix sql queries with lots of variables and sites with lots of content.json (Reported by xx)
  • Fix atomic write of a non-existent file


  • Add separate IPv6 and IPv4 port open status
  • Fix display of IPv6 trackers
  • Hint about search in sites
  • Wait longer delay after typing if you have many sites in your client
  • Display paused/active status of optional files in the Files tab

Python3 support is still in the works (and it's no.1 priority now), but it requires more modifications, than I originally thought, so I prioritized IPv6 over it.

I received a mail today from a person who wrote he or she registered a .bit domain for me. I am grateful to that person for wanting to help, but I have to refuse that gift.

I am pretty okay with the usage of the plain cryptographic keys for addressing sites, and I'm not going to use the Namecoin domains for my sites. Actually, the cryptographic keys are the only sound way to address sites in ZeroNet now, and Namecoin domains don't seem reliable for me at all.

However, the mail made me think about the potential abuse of the names. So I have to make a statement:

I've never registered and not going to register any .bit domains for my ZeroNet sites. All my zites are available by their plain cryptographic addresses only. And even if some of them are available by .bit domains, it is not me who owns the domains.

Rest in Peace Roman Karshiev

- Posted in Geekless.Blog by with comments

Roman Karshiev, one of the most active ZeroNet users and activists, known as balancer73@zeroid.bit, has passed away.

He was the owner of a lot of zites and also ran a popular Russian forum in the Clearnet. Here are his zites (and maybe I missed some):



Blogs (En):

Blogs (Ru):

Clearnet sites:

He believed in the future of the P2P technologies, that can bring more freedom to the people all over the world. And in particular, he was a great Zeronet promoter. He was a nice person as well. His enthusiasm and optimism were really inspiring for people around.

He criticized some P2P solutions for being too unreliable, and he saw a great advantage of ZeroNet in being able to keep the data forever. No matter, how many years passed, in which planet people live, and what kind of internet they use, zites will probably still able to work fine.

"When I die, my ZeroNet blog will be the only digital trace of mine, that doesn't depend on any 3rd party services, companies or persons, and will have been surviving for many years. If my work is worthy of something, people will keep, read and use my zites." - that is what he and I both agreed in. When we talked about ZeroNet, we both often admired that feature. But I couldn't even imagine that this idea would become the real fact so soon.

A few months ago, Roman started posting memories and stories in his blogs. He seemed to have a premonition and tried to write down as much as possible. One of his blogs has a subtitle: Буду записывать, пока ещё память жива — "I'm going to write, while my memory is alive yet". Now those words sound so... unspeakably sad.

I only hope, his private keys will not fall into the wrong hands, and his zites'll keep running. Unfortunately, ZeroNet doesn't yet have the archiving/snapshot feature implemented, so the content is still vulnerable for being erased by a person, who stole the private key.

Aged 45. He left a wife and 2 young children. And so many things left unfinished.

Rest in Peace, Roman. We miss you so much.

roman-karshiev.jpg (400x400)

ZN vs Firefox

- Posted in Микроблог Balancer'а by with comments

Печалька. ZN не работает в Firefox 20.0 :)

Lucid_Lynx_29_12_2018_00_03_49.png (1280x919)

Привет! Эта запись пишется в Haiku, установленной на ноутбуке. ZeroNet взят из git. Для его запуска понадобилось поставить пару модулей через pip, с указанием библиотеки сетевых функций:

-> LIB=-lnetwork pip install msgpack gevent

zeronet-haiku.png (1366x768)

Сам текст набирается в консольной версии emacs, с включённым flyspell-mode. Правда, чтобы это стало возможным, мне пришлось внести правки в порты aspell и emacs.

В общем, как вы видите, я продолжаю играть с "гайкой", поэтому я решил поделиться опытом, который я получил с этой ОС. В качестве формата, чтобы долго не думать, я выбрал стиль "бортового журнала". Я просто примерно опишу то, что я делал всё это время, и это наверное будет своеобразной демонстрацией ОС.


Зачем? Если ответить лаконично, то я чувствую, что как программист я давно не нужен Linux'у. Linux уже продолжительное время не испытывает недостатка ни в фичах, ни в разработчиках. Haiku напротив, остро нуждается в поддержке.

Я не буду пытаться убеждать читателя, что Haiku лучше какой-то другой операционной системы и рассказывать чем именно. С моей стороны это было бы лукавством. Но дело в том, что меня не очень интересует "потребительская" сторона вопроса, когда я занимаюсь ИТ.

Например, я пользуюсь Emacs (а до этого -- Vim) не потому, что это лучший редактор на свете (хотя наверное, это близко к действительности). А просто потому, что изучение таких вещей как Vim и Emacs не даёт расслабиться. Хотя, если вы ищете прагматической пользы, то и она при желании, конечно же, найдется. Но для меня необходимости в таком поиске -- нет.

screenshot2.png (1366x768)

Итак, моя апология проста -- Haiku интересная ОС!

Меня заинтересовала система и я начал её изучать. В этом смысле, какие-то проблемы и ошибки воспринимаются не как препятствие, а как лишний повод помочь проекту.


Haiku обладает изяществом. На моём далеко не новом ноутбуке установлена Ubuntu и Haiku. Давайте замеряем скорость загрузки.

-> shutdown -r
# прошло немного времени...

Ubuntu загружалась 30 секунд до GDM и еще где-то 7 секунд до рабочего стола. Haiku загрузилась до рабочего стола примерно за 20 секунд.

У меня есть второй древний ноутбук на Pentium. Haiku стартует на нём примерно за те же 20 секунд.

Haiku не поддерживает никакого режима сна. Но скорость загрузки (и моментальное выключение) это частично компенсирует.

Я уже писал, что исходные коды системы занимают пару сотен мегабайт.

Я был не вполне прав. Часть редко изменяемых компонентов (например, WebKit) поставляются в виде готовых собранных пакетов, что сильно ускоряет сборку. Тем не менее, как и в случае с BSD, вся система представляет из себя единый проект, что упрощает её изучение.

Несмотря на лаконичность, система все-таки поддерживает основное оборудование. По крайней мере на ноутбуке заработал звук, wifi, проводная сеть. Можно установить яркость подсветки (на intel).

Итак, система миниатюрна. Но ей вполне можно пользоваться на реальном железе (если, конечно, заработает ваше оборудование). Откровенно говоря, я всё еще испытываю проблемы с некоторым железом. Что, правда, не мешает мне пользоваться этой ОС.

Однопользовательская система

Да, система однопользовательская. Да, можно написать rm -rf / и я думаю, это приведёт к проблемам, так как сотрёт пакеты и на следующей загрузке они не подмонтируются. С другой стороны, в Unix можно стереть свой домашний каталог, а это ведь и есть самые важные файлы в системе. :)

Зато это, в каком то смысле, упрощает жизнь. По крайней мере, я это ощутил. Просто запустил и работаешь. Никаких sudo, никакой мороки с правами. Никаких авторизаций. :) Пишу это и прямо вижу как трясёт бывалого Unix-оида. Понимаю, и мне даже нечем вас утешить, кроме того, что я сам Unix-оид. :)

Впечатления от использования

Пользоваться системой можно. Типовые программы, которыми я пользуюсь чаще всего:

  • терминал;
  • emacs (flyspell, w3m);
  • Браузеры Qupzilla и Dooble (в целом, адекватны современному интернету);
  • Telegram клиент;
  • Vision (irc клиент);
  • LibreOffice;
  • ZeroNet;
  • qbittorrent;
  • MediaPlayer;
  • Mail;

Чего нет, и я это заметил:

  • gimp (вообще, нет ничего gtk-шного, так как этот тулкит не перенесён. Но есть Krita);
  • inkscape;
  • darktable;
  • firefox.

В плане энергопотребления, система ест точно не больше Ubuntu.

Пакеты и обновление системы

Я переключился на ночные сборки репозиториев. Это можно сделать через GUI или прямо в консоли. После этого, обновление делается просто:

-> pkgman update
-> shutdown -r # если обновилась система

Я уже писал, что установка пакета -- это его монтирование. Это, кроме красоты, несёт и полезное свойство -- возможность откатываться к прошлым состояниям. Например, после одного из обновлений системы, мой второй ноутбук стал виснуть на загрузке. Чтобы вернуться к рабочему состоянию, я просто нажал "пробел" в момент работы загрузчика и выбрал предыдущее состояние из списка... То-есть, система поддерживает журнал состояний системы в смысле установленных пакетов. Правда, если этот журнал разростётся, это начнёт замедлять работу загрузчика.

Состояния записываются в /boot/system/packages/administrative и вы можете их почистить.

Часто бывает нужно заменить какой-то один из компонентов пакета. Например, драйвер. Для этого предусмотрен каталог /boot/system/non-packaged. Например, таким образом я отлаживал драйвер wifi. Чтобы не пересобирать всю систему, я собирал только драйвер и клал его в non-packaged.

Разработка портов

sopwith.png (1366x768)

Я внёс несколько изменений в некоторые порты. В частности, одно из изменений позволило мне писать этот текст в emacs. На самом деле, для разработки портов порог вхождения совсем не высок.

Вы забираете дерево haikuports и haikuporter из github. Читаете инструкцию и вот, вы уже готовы собирать пакеты из исходников.

Если нужно изменить какой-то пакет, то к вашим услугам функции haikuporter по автоматическому созданию патчсетов. Добавить новый порт -- тоже не проблема. Дальше -- делаем PR и ждем...

Есть, конечно, свои нюансы и вопросы:

  • как должна выглядеть структура каталогов пакета;
  • как создать векторную иконку;
  • где хранить настройки программы;
  • и т.д.

Но во всём этом несложно разобраться, а описание процесса создания пакета -- отдельная история.

В качестве примера, вот как выглядит рецепт для INSTEAD.

К счастью, когда я писал эту статью появилась подробная статья по портам от EXL. Вы можете прочитать её здесь.

Сборка системы

Систему очень просто собрать. Причём сделать это можно как изнутри самой Haiku, так и на Linux-машине. Во втором случае вам придётся собрать сначала тулчейн. Но сделать это нужно будет один раз. Сборка на Debian не вызвала проблем. На i7 она прошла довольно быстро. Для собрки образа, который можно записать на флешку используйте цель @nightly-anyboot.

-> jam -q @nightly-anyboot

Вообще, система сборки очень простая. Например, когда я что-то исправляю в системе, я собираю на самой системе только то, что нужно:

-> jam -q iprowifi4965
-> cp objects/haiku/x86_64/release/add-ons/kernel/drivers/network/wlan/iprowifi4965/ipro
wifi4965 /system/non-packaged/add-ons/kernel/drivers/bin/iprowifi4965

Вот и весь цикл разработки. В общем, это всё создаёт приятное ощущение того, что ты владеешь системой. То чувство, которого почти не осталось в Linux. Я приведу пару примеров.

Пример 0: xhci

Когда я только поставил систему на ноут и сделал:

-> tail -f /var/log/syslog

То увидел постоянные сообщения от ядра системы... Мне это не понравилось. Я скачал исходный код и нашёл сообщения в коде. После этого я собрал haiku.hpkg с отладочными сообщениями xhci и начал искать проблему. Довольно быстро удалось найти ошибку и исправить её.

Кстати, это не тот syslog, что используется в Unix. Например, в него сохраняются сессии из отладчика ядра KDL.

Пример 1: iprowifi2100

После того, как я поигрался с гаечкой на своем основном ноутбуке, я попробовал поставить её на другой древний ноутбук. К сожалению, система намертво зависала на загрузке. Покопавшись несколько дней, я нашёл несколько проблем и исправил их. Интересно, что одна из проблем оказалась регрессией в кодовой базе FreeBSD. Драйвер iprowifi210, как и остальные сетевые драйверы, работает в Haiku через прослойку совместимости.

Теперь адаптер iprowifi2100 снова работает во FreeBSD и в Haiku.

Пример 2: почта

Встроенная в Haiku почта работает довольно занятным образом. Почта забирается специальным демоном mail_daemon:

~> launch_roster info

Почтовые сообщения складываются в виде отдельных файлов в свои каталоги. Дальше, вы открываете файловый менеджер и смотрите сообщения.

mail-attr.png (832x436)

Если вы выберете какое-то из сообщений -- откроется программа просмотра (и написания) почты. Красиво и просто.

К сожалению, почта у меня не работала с и частенько валилась. После марафона отладки появилась серия патчей, которая позволяет мне пользоваться почтой на постоянной основе.


Если ядро по какой-то причине упадёт, то вы попадаете в отладчик уровня ядра. Вы можете вызвать его и без ожидания падения, конечно. Для этого нажмите: alt+PrtSc+d. Для продолжения работы наберите cont. Я не буду подробно описывать отладчик. Если вы разработчик уровня ядра, то разберётесь. Я просто упоминаю сам факт наличия этого отладчика из коробки. Это здорово!

Для отладки пользовательского режима (процессы, службы и т.д.) есть свой отладчик. Он запускается при падении приложений, а также вы можете запустить его из меню приложений и поотлаживать какой-нибудь процесс, прицепившись к нему.

segfault-mail.png (1366x768)

В общем, установив систему, вы сразу готовы к полезной деятельности. ;)

Рассмотрение патчей

Патчи для Haiku (ядро и окружение) принимаются через систему gerrit по адресу:,

screenshot4.png (1366x768)

Признаюсь, сначала я не был в восторге от gerrit. Я просто его не знал и не мог ничего сделать. Мне показалось даже, что это искусственно завышенный порог вхождения.

Но на самом деле gerrit оказался удобной и полезной штукой. Кратко, алгоритм действия такой:

  • Регистрируетесь на
  • Добавляете свой открытый ssh ключ
  • Забираете проект git clone ssh://
  • Далее, можно пустить бранч и делать изменения
  • $ git commit
  • $ git push origin HEAD:refs/for/master

Далее, вам могут написать замечания, которые вы отрабатываете.

  • Отработали замечания
  • $ git commit -a --amend
  • Убедиться что в комментариях к коммиту есть "Change-Id: ID тикета в gerrit"
  • $ git push origin HEAD:refs/for/master

Вы можете прочитать о правилах добавления своих изменений здесь.

Также будет полезен Development FAQ.

Вместо заключения

Эта статья -- долгострой. Она планировалась совсем другой. Более подробной и интересной, но... Идеальная статья, написанная никогда все-таки хуже несовершенной, но написанной сейчас. Поэтому я собрал волю в кулак и дописал статью до более-менее завершённого состояния.

Мы живём в мире, где ценность принято мерить коммерческой эффективностью. Я лично не разделяю такого взгляда на мир. История развития ИТ знает много примеров, когда отличные, красивые решения были вытеснены громоздкими и уродливыми продуктами. Похожие вещи можно найти и в других сферах человеческой деятельности... Так или иначе, Haiku -- очень интересная система, которой не хватает внимания свободных разработчиков. И кто знает, может быть, вы и есть такой разработчик? :) И если моя статья вас заинтересовала -- я достиг своей цели.

Changelog: December 13, 2018

- Posted in ZeroBlog by with comments


  • Multilanguage, self hosted documentation with ongoing Fr/Zh translation + ZeroNet mirror: [Thanks to Lola, blurHY]
  • Fix sandbox escape vulnerability [Thanks, reported by ivanq/ZeroLSTN]
  • Restrict script execution by using Content security policy: It prevents code execution in case of sandbox escape/html injection.
  • Make Sidebar, Multiuser, UiConfig, UiPassword plugin compatible with hardened security changes.
  • Use chromedriver for testing as phantomjs does not supports sites with new content security policy.
  • Auto escape variables in template underscore helper
  • Cleanup entries older than 6 month from charts.db
  • New certList admin API call
  • Don't delete optional files from owned sites
  • Fix signing when --data_dir contains window-style path separators.
  • Fix setLocalStorage call before websocket connection is created
  • Fix saving user mutes
  • ZeroFrame.js 1.3.0: Support monkey patching Fetch API

I started the modifications that will be necessary to move ZeroNet codebase to Python 3. This will also include other major changes:

  • Move sqlite database connection to separate thread: make the UI more responsive and avoid blocking on db heavy operations (eg. rebuilding)
  • New database sync mode: Avoid db corruption on power loss or hw error
  • Support libsecp256k1: ~10x speed boost in file and certificate validation
  • Remove included third-party Python libraries (src/lib)
  • Update source code from ZeroNet by default

If everything goes well, then ETA: 2-3wk