<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vova Durcoin</title>
    <description>The latest articles on DEV Community by Vova Durcoin (@durcoin).</description>
    <link>https://dev.to/durcoin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3904223%2Feac1ea94-91da-43e1-9f58-70888d7c10d5.jpg</url>
      <title>DEV Community: Vova Durcoin</title>
      <link>https://dev.to/durcoin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/durcoin"/>
    <language>en</language>
    <item>
      <title>Я построил Web3-социальную сеть, NFT-маркетплейс и франшизу для запуска брендовых маркетплейсов. На одном кошельке.</title>
      <dc:creator>Vova Durcoin</dc:creator>
      <pubDate>Mon, 18 May 2026 01:32:49 +0000</pubDate>
      <link>https://dev.to/durcoin/ia-postroil-web3-sotsialnuiu-siet-nft-markietplieis-i-franshizu-dlia-zapuska-briendovykh-markietplieisov-na-37nm</link>
      <guid>https://dev.to/durcoin/ia-postroil-web3-sotsialnuiu-siet-nft-markietplieis-i-franshizu-dlia-zapuska-briendovykh-markietplieisov-na-37nm</guid>
      <description>&lt;p&gt;За 5% комиссии.&lt;br&gt;
Лонгрид о том, как один Python-файл превратился в платформу, которая ломает бизнес-модели Shopify, OpenSea и Telegram одновременно.&lt;/p&gt;

&lt;p&gt;🎬 Краткая суть для тех, кто не любит читать длинные тексты&lt;br&gt;
Представь, что твой криптокошелёк — это и есть твой аккаунт во всём интернете. Без регистрации, без email, без телефона. Просто seed-фраза.&lt;br&gt;
С одного логина ты получаешь:&lt;br&gt;
💬 Зашифрованный мессенджер, который физически невозможно выключить&lt;br&gt;
🎨 NFT-маркетплейс, где файлы хранятся ПРЯМО В БЛОКЧЕЙНЕ (не на IPFS, не на S3 — а буквально - в транзакциях)&lt;br&gt;
🔍 Публичный профиль и эксплорер всей твоей активности&lt;br&gt;
🌐 Кастомный домен (yourname.com) — бесплатно + если доп домен то около1$ в год &lt;br&gt;
А если ты предприниматель — ты можешь купить домен у любого регистратора (цены от 2 долларов в год) и запустить под. ним свой собственный NFT−маркетплейс, наполненный товарами уже существующих продавцов, под своим брендом. Без серверов, без разработчиков, без Shopify, без 30$/мес подписок. Только 5% комиссия с продаж — как у обычного эквайринга.&lt;br&gt;
Никто на рынке так не делает. Сейчас расскажу почему это важно.&lt;/p&gt;

&lt;p&gt;🧨 Часть 1. Проблема, которую я устал терпеть&lt;br&gt;
Несколько лет назад я начал замечать, что … интернет, которым мы пользуемся, на самом деле принадлежит горстке компаний.  Это очевидная мысль, но я хочу её проговорить максимально конкретно:&lt;br&gt;
Мой Telegram-аккаунт&lt;br&gt;
Пользуюсь много лет. Сотни контактов. Десятки чатов с важной перепиской. Если завтра Дуров проснётся в плохом настроении или какая-то страна надавит на компанию — я потеряю всё. (Однажды он решил, что я слишком активно пишу и много общаюсь и теперь на одном из акаунтов я не могу писать первым - ну спасибо что хоть вообще не удалил) Никакой "экспорт чатов" не вернёт мне социальный капитал — связи с людьми, которые писали мне годами.&lt;br&gt;
Мои NFT на OpenSea&lt;br&gt;
Я плачу 2.5% комиссии с каждой продажи. Покупатели приходят на сайт OpenSea, видят бренд OpenSea, и OpenSea может в любой момент скрыть мою коллекцию, добавить в "trust list" других, или просто закрыться. Что и происходит регулярно с крипто-биржами.&lt;br&gt;
Мой Instagram-профиль&lt;br&gt;
1,5М подписчиков, 8 лет работы. Один shadowban — и я невидимка. Никаких объяснений, никакой апелляции. Алгоритм решил.&lt;br&gt;
Мой бизнес на Shopify&lt;br&gt;
29$/мес базовый тариф + плагины + домен + SSL + маркетинг + плагин для крипты ещё 50$/мес.  И всё равно покупатели в первую очередь идут на Amazon и OpenSea, потому что там трафик.&lt;/p&gt;

&lt;p&gt;Я смотрел на всё это и думал:  есть ли способ построить интернет, где твоя цифровая личность принадлежит тебе на уровне математики, а не на уровне обещаний компании?&lt;br&gt;
И мне показалось что я нашел ответ:   Waves blockchain + criptographic identity + zero servers for user data.&lt;br&gt;
… И я начал кодить.&lt;/p&gt;

&lt;p&gt;🏗 Часть 2. Что я построил&lt;br&gt;
Платформа называется J.ONL. Это один Python-файл на ~3000 строк (плюс HTML-шаблоны), который работает поверх блокчейна Waves. Никакой базы данных. Никакого облака для пользовательских данных. Никакого OAuth.&lt;br&gt;
Вот что внутри:&lt;br&gt;
🔐 Мессенджер без серверов хранения&lt;br&gt;
Когда ты отправляешь сообщение в J.ONL, происходит следующее:&lt;br&gt;
Текст шифруется в браузере (XOR-stream с общим ключом)&lt;br&gt;
Шифротекст разбивается на кусочки (чанки) по 123 байта&lt;br&gt;
Каждый чанк отправляется как Waves-транзакция типа 4 (Transfer) с приложением (attachment)&lt;br&gt;
Транзакция стоит 2 DURCOIN (это собственный токен экосистемы, спонсорящий комиссию) - 1 Durcoin уходит получателю твоего сообщения, и 1 уходит в расходы блокчейна - J.onl - на этом вообще не зарабатывает&lt;br&gt;
Никто, кроме отправителя и получателя с правильным ключом, не может прочитать сообщение. Даже я как разработчик платформы. Сервер J.ONL — это просто красивая обёртка над блокчейном. Если завтра я уйду в монастырь и выключу сервер — все сообщения останутся в Waves навсегда, и любой желающий может написать новый фронтенд.&lt;/p&gt;

&lt;p&gt;Сравнение с Telegram:&lt;br&gt;
──────────────────────────────────&lt;br&gt;
                             Telegram        J.ONL&lt;br&gt;
──────────────────────────────────&lt;br&gt;
Серверы хранят             Да                 Нет&lt;br&gt;
Можно отнять акк          Да             Невозможно&lt;br&gt;
Метаданные у компа      Все               Только on-chain hashes&lt;br&gt;
Цензура                      Да                  Невозможна&lt;br&gt;
Подделка истории         Возможна       Невозможна (PoS)  &lt;br&gt;
🎨 NFT-маркетплейс с тремя уникальными фичами&lt;br&gt;
Фича №1: Файлы хранятся в блокчейне. Не "хэш в блокчейне", а сам файл.&lt;br&gt;
Большинство NFT-платформ работают так: картинка лежит на IPFS или Amazon S3, а в блокчейне только хэш SHA-256. Если IPFS-пина пропадёт или Amazon закроет аккаунт — NFT превратится в "сертификат на пустоту» (как карета в тыкву). Это известная проблема — Google "rug pulled NFTs IPFS gone".&lt;br&gt;
Я сделал так: можно хранить NFT файл прямо в Waves-транзакциях, разбив на чанки по 123 байта. До ~80 КБ файла = до 900 транзакций. Стоит ~2 DURCOIN за чанк. Но файл живёт в блокчейне навсегда — пока Waves существует, твой NFT доступен.&lt;br&gt;
Это работает для:&lt;br&gt;
🖼 Маленьких изображений (PNG/JPG до 80 КБ)&lt;br&gt;
📄 PDF-сертификатов (диплом, контракт)&lt;br&gt;
🎵 Звуковых сэмплов&lt;br&gt;
📝 Текстовых документов&lt;br&gt;
💾 Любых других мелких файлов &lt;br&gt;
Если файл больше 80кб - то для больших файлов (видео, hi-res фото, ZIP-архивы до 50 МБ) — гибридный режим: файл на нашем сервере + SHA-256 хэш в блокчейне. Если сервер умрёт — ты сможешь доказать подлинность любой копии файла, имея только хэш из блокчейна.&lt;br&gt;
Фича №2: Двойное подтверждение для опасных операций&lt;br&gt;
Сжечь NFT — это необратимо. В большинстве платформ это одна кнопка. В J.ONL:&lt;br&gt;
Жми "Burn NFT"&lt;br&gt;
Открывается модалка с предупреждением&lt;br&gt;
Введи название NFT точно как оно записано в блокчейне&lt;br&gt;
Поставь галку "Я понимаю, что это необратимо"&lt;br&gt;
Только тогда кнопка "Burn forever" становится активной &lt;br&gt;
То же самое для трансферов — если ты пересылаешь NFT кому-то, появляется confirm-prompt с адресом получателя.&lt;br&gt;
Фича №3: Распределённая модерация с архивом&lt;br&gt;
Любой пользователь может репортить NFT (минимум 5 символов причины). Очередь идёт модераторам. Модератор может:&lt;br&gt;
✅ Mark OK (убрать пометку о жалобе)&lt;br&gt;
🗑 Move to Trash (отдельная вкладка для всякой дичи)&lt;br&gt;
⊘ Hide (невидимо никому кроме админов - но прямые ссылки доступны)&lt;br&gt;
🚫 Ban (нельзя даже листить)&lt;br&gt;
Все репорты архивируются вместе с решением модератора. История полностью прозрачна — кто, когда, за что и с какой причиной. Это не "тайный shadowban Instagram'а", а публичный аудит.&lt;br&gt;
🌍 Эксплорер и публичные профили — Web3-LinkedIn&lt;br&gt;
Любой адрес Waves (3PBpv4XhHv...) автоматически получает страницу в J.ONL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://j.onl/u/3PBpv4XhHv" rel="noopener noreferrer"&gt;https://j.onl/u/3PBpv4XhHv&lt;/a&gt;...     ← по адресу&lt;br&gt;
&lt;a href="https://j.onl/u/@durcoin" rel="noopener noreferrer"&gt;https://j.onl/u/@durcoin&lt;/a&gt;            ← по алиасу&lt;/p&gt;

&lt;p&gt;На странице:&lt;br&gt;
💰 Все балансы (WAVES, DURCOIN, любые токены)&lt;br&gt;
🎨 NFT-коллекция с видео-превью при наведении&lt;br&gt;
📊 Объём продаж, минтов, транзакций&lt;br&gt;
📈 Лента активности — все 17 типов Waves-транзакций с фильтрами&lt;br&gt;
✏ Bio + ссылки (Twitter, Telegram, GitHub, Instagram, Discord)&lt;br&gt;
🎭 Cover emoji вместо аватара (изящный обход проблемы хостинга картинок)&lt;br&gt;
📤 Share-кнопка с авто-генерируемой OG-картинкой для соцсетей&lt;br&gt;
Самое важное: профиль создаётся автоматически для каждого Waves-кошелька. Никаких "Sign up". Открываешь свой адрес — там уже есть страница с твоими NFT, твоими транзакциями, твоим балансом. Bio можешь дописать, если хочешь.&lt;br&gt;
🌐 Кастомные домены — твой бренд на нашей инфраструктуре&lt;br&gt;
Любой пользователь может привязать свой домен к своей группе или профилю:&lt;br&gt;
Покупаешь yourbrand.com у обычного регистратора (от $2/год)&lt;br&gt;
Настраиваешь A-запись на наш IP + TXT-запись для верификации&lt;br&gt;
Платишь 100 DURCOIN/год (или бесплатно для первого домена)&lt;br&gt;
SSL автоматически через Let's Encrypt&lt;br&gt;
Готово — yourbrand.com работает как самостоятельный сайт&lt;br&gt;
Безлимит доменов на одну группу. Все они автоматически верифицируются по DNS-записи + ончейн-платёж.&lt;/p&gt;

&lt;p&gt;💎 Часть 3. Главная фича, которую я не сразу осознал&lt;br&gt;
Когда я тестировал кастомные домены, я заметил кое-что важное.&lt;br&gt;
Я открыл yourbrand.com/nft и увидел... полноценный NFT-маркетплейс под брендом yourbrand.com. Не маркетплейс конкретного бренда. Весь маркетплейс J.ONL — со всеми NFT всех продавцов — под брендом Домена.&lt;br&gt;
И тут до меня дошло: я случайно построил франшизу для запуска NFT-маркетплейсов.&lt;br&gt;
Что это значит на практике&lt;br&gt;
Представь, ты — художник или мелкий бренд. Ты хочешь продавать свои цифровые работы.&lt;br&gt;
Сейчас твои варианты:&lt;/p&gt;

&lt;p&gt;С J.ONL:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Купил домен mybrand.shop за $10&lt;/li&gt;
&lt;li&gt;Привязал DNS к нашему серверу (5 минут)&lt;/li&gt;
&lt;li&gt;Готово&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Что ты получаешь:&lt;br&gt;
✅ mybrand.shop работает как полноценный маркетплейс под твоим брендом&lt;br&gt;
✅ Витрина уже наполнена — на ней показываются NFT всех продавцов всей сети. Покупатель приходит и видит товары с дня 1, а не пустую витрину "scrolling, nothing here yet"&lt;br&gt;
✅ Твои NFT автоматически появляются на витринах ВСЕХ остальных партнёров. Это бесплатный cross-promotion. Каждый новый домен в сети = +трафик к твоим работам ЕСЛИ ХОЧЕШЬ НА СВОЁМ САЙТЕ ТОЛЬКО СВОИ NFT - делаешь на любом хостинге сайт визитку и эмбедишь со своего домена NFT - на свой сайт - и продвигаешь на своём сайте только свои продукты, при этом твои продукты всё равно продвигаются на всех прикрепленных доменах сервиса.&lt;br&gt;
✅ Чат + профили + эксплорер в комплекте — твои покупатели могут писать тебе, видеть твою историю, проверять подлинность&lt;br&gt;
✅ Auto-OG картинки для шеринга в Telegram/Twitter — с твоим доменом, не с j.onl&lt;br&gt;
✅ Локализация на 11 языков в подарок&lt;br&gt;
✅ Тёмная/светлая тема в подарок&lt;br&gt;
✅ Мобильный UI в подарок&lt;br&gt;
Бизнес-модель&lt;/p&gt;

&lt;p&gt;Shopify Plus      $29-$2000/мес + 2.9% + платные плагины + домен + SSL&lt;br&gt;
                         Покупатели приходят с твоего маркетинга&lt;br&gt;
                         Криптоплатежи — отдельный плагин, отдельная боль&lt;/p&gt;

&lt;p&gt;OpenSea           2.5% — но это OpenSea, не ты&lt;br&gt;
                          Ты конкурируешь с миллионами других продавцов&lt;br&gt;
                          Никакого контроля над брендом&lt;/p&gt;

&lt;p&gt;J.ONL Franchise       $10/год (домен у регистратора)&lt;br&gt;
                          + 100 DURCOIN/год (или 0 за первый домен)&lt;br&gt;
                          + 5% с продаж — твой эквайринг&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              Всё остальное — в подарок:
              • Готовый трафик от партнёров
              • Готовый каталог
              • Готовая социалка
              • Хостинг, SSL, бэкапы — на нас
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;5% — это не комиссия маркетплейса. Это плата за франшизу. Сравни с Stripe (2.9% + $0.30/транзакция за просто обработку платежа) или с любым другим SaaS-эквайрингом — у нас в эту цифру включена ВСЯ платформа, не только процессинг.&lt;/p&gt;

&lt;p&gt;🤔 Часть 4. Возражения и честные ответы&lt;br&gt;
Я знаю, что у тебя сейчас в голове куча вопросов. Давай по порядку.&lt;br&gt;
"Это всё круто, но кому это нужно? Крипта мертва"&lt;br&gt;
Крипта не мертва — мертв спекулятивный хайп 2021 года. То, что выжило и развивается:&lt;br&gt;
Stablecoins — реальный объём расчётов&lt;br&gt;
Tokenized real-world assets — диплом как NFT, недвижимость как токен&lt;br&gt;
Decentralized identity — DID, ENS, аналоги&lt;br&gt;
Web3 social — Lens Protocol, Farcaster, Nostr&lt;br&gt;
J.ONL попадает в три последние категории сразу. Это не про спекуляцию — это про инфраструктуру.&lt;br&gt;
"А почему именно Waves, а не Ethereum/Solana?"&lt;br&gt;
✅ Sponsored fees — пользователь может вообще не иметь WAVES (нативного токена), всё оплачивается через DURCOIN. Это убирает главный барьер входа в крипту "купи газ"&lt;br&gt;
✅ Низкая комиссия — ~0.001 WAVES за транзакцию ≈ доли цента&lt;br&gt;
✅ Простой протокол — Transfer-транзакции с attachment до 140 байт, можно строить кастомные протоколы поверх&lt;br&gt;
✅ АЛИАСЫ — Кошельки могут иметь красивые имена которые легко запомнить и на которые можно переводить токены и отправлять сообщения&lt;br&gt;
✅ Стабильность — сеть работает с 2016, без хардфорков ломающих обратную совместимость&lt;br&gt;
✅ Нет смарт-контрактов в основе — всё на стандартных TX. Это значит, что нет риска "контракт зависнет / будет взломан". Стандартные транзакции работают всегда &lt;br&gt;
"Если файлы в блокчейне — это же дорого, разве это масштабируется?"&lt;br&gt;
Это аргумент про "положу полнометражное видео в блокчейн". Я с этим согласен — это глупо.&lt;br&gt;
Но для сертификатов, дипломов, контрактов, мелких артов, OG-картинок профилей — это работает идеально. **80 КБ файл = ~ 5$ один раз и хранится навсегда. Сравни с подпиской на IPFS−pinning сервис (5-20/мес forever).&lt;br&gt;
Для больших файлов — гибридный режим: файл на сервере, хэш в блокчейне. Сервер можно сменить — хэш остаётся доказательством подлинности.&lt;br&gt;
"А что мешает кому-то запустить копию J.ONL и забрать вашу долю?"&lt;br&gt;
Ничего. И это прекрасно.&lt;br&gt;
Архитектура построена так, что все пользовательские данные живут в блокчейне Waves. Если завтра появится j.онл-clone.com — он сможет читать те же транзакции, те же чаты, те же NFT. Пользователи смогут пользоваться обоими сервисами одновременно.&lt;br&gt;
Это не баг — это фича. Мы строим протокол, а не walled garden. Наша монопольная ценность — не код (он простой), а первый mover advantage + наполненность экосистемы.&lt;br&gt;
"5% — много или мало?"&lt;br&gt;
Сравнение:&lt;/p&gt;

&lt;p&gt;Apple App Store        30%&lt;br&gt;
Google Play            30%&lt;br&gt;
Etsy                   6.5% + ads&lt;br&gt;
Amazon                 8-15%&lt;br&gt;
OpenSea                2.5%&lt;br&gt;
Stripe (just payment)  2.9% + $0.30&lt;br&gt;
Shopify Plus           2.5% (+ $2000/mo subscription)&lt;br&gt;
Cardano DEXes          0.3% (но это просто свап)&lt;/p&gt;

&lt;p&gt;J.ONL                  5% (ВСЁ включено)&lt;/p&gt;

&lt;p&gt;Если ты продаёшь NFT за 100$ — комиссия 5$. За эти $5 ты получаешь:&lt;br&gt;
Готовый брендовый магазин&lt;br&gt;
Готовый каталог чужих товаров для cross-sell&lt;br&gt;
Готовая аудитория всех остальных доменов сети&lt;br&gt;
Хостинг и SSL&lt;br&gt;
Криптоэквайринг&lt;br&gt;
Социальную надстройку (чат + профили + эксплорер)&lt;br&gt;
Я считаю, что 5% — это дёшево для франшизы такого масштаба. Сравни с McDonald's — 4% от выручки + ещё $1.5M вступительный взнос.&lt;br&gt;
"А ваш проект open source? Можно форкнуть?"&lt;br&gt;
Прямо сейчас код в приватном репозитории, но я планирую выложить его в open source под лицензией MIT рано или поздно. Идея в том, чтобы стать стандартом для Waves-социалки, а не монопольным сервисом.&lt;br&gt;
"Что если регулятор закроет вас?"&lt;br&gt;
Закрыть домен j.onl можно. Это бы убрало главную точку входа.&lt;br&gt;
Закрыть протокол J.ONL нельзя — он работает поверх Waves blockchain. Любой может поднять зеркало (например, j-mirror.org), читать те же транзакции, и всё будет работать. Чаты, NFT, профили — это просто данные в блокчейне, а наш сайт — один из возможных интерфейсов к ним.&lt;br&gt;
Это принципиально отличается от Telegram/Whatsapp/VK/insta, где закрытие компании = смерть данных.&lt;br&gt;
"Какие гарантии что DURCOIN не обвалится в ноль?"&lt;br&gt;
Никаких. Это утилитарный токен для оплаты комиссий, а не инвестиция. Если он обвалится — это плохо для нашей экономики, но хорошо для пользователя - ему все сервисы станут еще дешевле, при этом все NFT, чаты, профили продолжат работать не зависимо от цены на DURCOIN, потому что они в блокчейне Waves.&lt;br&gt;
DURCOIN не может технически умереть - если и когда я у умру - и не отдам никому секретную фразу от кошелька основателя, - любой желающий может закинуть пару монет WAVES на кошелек основатель DURCOIN и спонсорские транзакции продолжат существовать - просто снять с этого кошелька никто больше ничего не сможет.&lt;/p&gt;

&lt;p&gt;🚀 Часть 5. Что дальше&lt;br&gt;
Сейчас J.ONL работает в публичной бете. Я хочу:&lt;br&gt;
Привлечь первых 100/500 пользователей-художников для тестирования maker-сценариев&lt;br&gt;
Привлечь первых 100/500 франчайзи — людей, готовых купить домен и запустить свой маркетплейс под брендом&lt;br&gt;
Выложить код в open source через ХХХ месяцев после стабилизации&lt;br&gt;
Запустить bug bounty для аудита крипто-частей&lt;br&gt;
Добавить недостающие фичи:&lt;br&gt;
Follow/Followers система для социалки&lt;br&gt;
Off-chain лайки на NFT&lt;br&gt;
Push-notifications через Telegram bot&lt;br&gt;
Mobile PWA с install-prompt&lt;br&gt;
Аналитика для franchise-доменов&lt;/p&gt;

&lt;p&gt;🎯 Часть 6. Кому это может быть интересно прямо сейчас&lt;br&gt;
🎨 Художникам, фотографам, дизайнерам&lt;br&gt;
Запусти свой брендовый магазин за 10 минут и Получи cross−promo со всеми другими продавцами сети. Неплати 29/мес Shopify за пустой магазин.&lt;br&gt;
🏢 DAO и крипто-комьюнити&lt;br&gt;
Создай группу для своего комьюнити + кастомный домен + автоматический NFT-маркетплейс для членов. Готовая инфраструктура за $2 в год.&lt;br&gt;
📚 Образовательным платформам&lt;br&gt;
Выпускай дипломы как NFT с файлом в блокчейне. SHA-256 хэш = доказательство подлинности навсегда. Никакая фабрика дипломов не подделает.&lt;br&gt;
🎬 Музыкантам и креаторам&lt;br&gt;
Продавай сэмплы, биты, цифровые альбомы. Файл в блокчейне = твоё авторство доказано на уровне математики и без посредников.&lt;br&gt;
💼 Брендам&lt;br&gt;
Запусти community-channel + NFT-merch под своим доменом. Без подписок, без разработки, без хостинга. Только домен и 5% с продаж.&lt;br&gt;
👨‍💻 Разработчикам&lt;br&gt;
Изучи открытый протокол, форкни фронтенд, построй свой интерфейс. Архитектура спроектирована для federation.&lt;br&gt;
👨‍💻 Эвент Менеджерам&lt;br&gt;
Продавай NFT c рекламой своих мероприятий - и пусть они становятся автоматически билетами на эти сами мероприятия. - пример уже кстати на j.onl&lt;/p&gt;

&lt;p&gt;🔗 Часть 7. Как попробовать&lt;br&gt;
Зайди на j.onl&lt;br&gt;
Сгенерируй seed-фразу (одна кнопка) — это твой кошелёк&lt;br&gt;
Сохрани seed в надёжное место — без неё аккаунт не вернёшь&lt;br&gt;
Получи или купи немного DURCOIN (есть варианты залетать бесплатно - пишут в сети 100% инфа)&lt;br&gt;
Попробуй:&lt;br&gt;
Написать кому-то в личку&lt;br&gt;
Создать группу&lt;br&gt;
Сминтить NFT с файлом&lt;br&gt;
Cоздать Алиас&lt;br&gt;
Заполнить свой профиль на /u/&amp;lt;твой_адрес&amp;gt;&lt;br&gt;
Расшарить профиль в Telegram — увидишь auto-OG картинку&lt;br&gt;
Если ты хочешь запустить свой брендовый маркетплейс — просто пропиши в DNS А запись с нашим IP и начни пользоваться.&lt;/p&gt;

&lt;p&gt;📜 Эпилог&lt;br&gt;
Я не венчурный фонд. Я не корпорация. Я не делал ICO и не собираюсь.&lt;br&gt;
Я просто устал смотреть, как интернет всё больше становится феодальной системой, где Дуров, Цукерберг и Маск — твои сюзерены, а ты — холоп с правом аренды аккаунта до тех пор, пока их это устраивает.&lt;br&gt;
Я хочу интернет, где твой ключ = твоя идентичность. Где твои данные живут на математике, а не на чьём-то goodwill. Где бизнесы могут процветать без 30% налога Apple и без $29/мес платы Shopify за пустую витрину.&lt;br&gt;
J.ONL — это моя попытка показать, что такой интернет технически возможен прямо сейчас, в 2026 году, на существующих технологиях. Не "через 5 лет когда созреет инфраструктура". А сегодня.&lt;br&gt;
Если эта идея тебе резонирует — расскажи о проекте. Опубликуй этот текст на своих ресурсах. Скинь в чат, где люди обсуждают Web3. Покажи знакомым художникам, которым надоело платить дань OpenSea.&lt;br&gt;
Распространение идей — это последняя миля, которую крипта пока не выиграла. Помоги её пройти.&lt;br&gt;
🔗 j.onl — мессенджер, маркетплейс, эксплорер, франшиза. Всё в одном кошельке.&lt;/p&gt;

&lt;p&gt;P.S. Если ты разработчик и хочешь покопаться в коде — пиши в личку, всегда есть чем поговорить.&lt;br&gt;
P.P.S. Если ты журналист или блогер и хочешь интервью / эксклюзив — тоже пиши, расскажу больше про техническую сторону и про экономическую модель.&lt;br&gt;
P.P.P.S. Если ты юрист и видишь регуляторные риски — БУДЬ ДРУГОМ, напиши, чтобы я подготовился. Я знаю, что Web3-социалки — серая зона во многих юрисдикциях.&lt;/p&gt;

&lt;p&gt;🏷 Теги #Web3 #Blockchain #NFT #Waves #Decentralized #Marketplace #SocialNetwork #Crypto #OpenSource #Innovation #Startup #NoCode #Shopify #OpenSea #Franchise #WhiteLabel&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>python</category>
      <category>showdev</category>
      <category>web3</category>
    </item>
    <item>
      <title>I built a media host in one PHP file. Here's what 900 lines can do.</title>
      <dc:creator>Vova Durcoin</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:29:24 +0000</pubDate>
      <link>https://dev.to/durcoin/i-built-a-media-host-in-one-php-file-heres-what-900-lines-can-do-1dl7</link>
      <guid>https://dev.to/durcoin/i-built-a-media-host-in-one-php-file-heres-what-900-lines-can-do-1dl7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: One &lt;code&gt;index.php&lt;/code&gt; file. Zero dependencies. Zero database. &lt;br&gt;
Scales to 500k files. MIT licensed. &lt;a href="https://dev.toyour-link"&gt;Code on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The itch I was scratching
&lt;/h2&gt;

&lt;p&gt;I have a folder of MP3s I wanted to share with a small audience. &lt;br&gt;
Standard options were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plex / Jellyfin&lt;/strong&gt; → hours of Docker and configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3 + CloudFront&lt;/strong&gt; → 40 AWS IAM tabs later I give up
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SoundCloud / YouTube&lt;/strong&gt; → not self-hosted, algorithmic control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress + plugin&lt;/strong&gt; → bloat, database, security patches forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I just wanted: "upload files, visitors see them, done." So I wondered &lt;br&gt;
— how minimal can a media server actually be?&lt;/p&gt;
&lt;h2&gt;
  
  
  The constraints I gave myself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Single &lt;code&gt;.php&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;No database&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;composer.json&lt;/code&gt; or any package manager&lt;/li&gt;
&lt;li&gt;No build step (no webpack, no TypeScript compilation)&lt;/li&gt;
&lt;li&gt;Must handle 500k+ files without choking&lt;/li&gt;
&lt;li&gt;Must work on $3/month shared hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Six weeks later: &lt;strong&gt;900 lines of PHP&lt;/strong&gt;, and it actually does all of that.&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture: JSON index cache
&lt;/h2&gt;

&lt;p&gt;The trick to scale a single-file script is avoiding filesystem scans &lt;br&gt;
on every request. On first load:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;rebuildIndex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nv"&gt;$dh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;opendir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;readdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dh&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'n'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'s'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;filesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'c'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;categorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;pathinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PATHINFO_EXTENSION&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'_index.cache.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subsequent requests read &lt;code&gt;_index.cache.json&lt;/code&gt; instead. Cache TTL is &lt;br&gt;
1 hour. Tested with 500k dummy files — response times stay under 50ms.&lt;/p&gt;
&lt;h2&gt;
  
  
  The hardest part: Ed25519 verification in PHP
&lt;/h2&gt;

&lt;p&gt;I wanted users to authenticate via Waves blockchain wallet &lt;br&gt;
(Keeper extension). Waves uses &lt;strong&gt;Curve25519&lt;/strong&gt; public keys but &lt;br&gt;
signs with &lt;strong&gt;Ed25519&lt;/strong&gt;. You can't verify Ed25519 signatures with &lt;br&gt;
a Curve25519 key directly.&lt;/p&gt;

&lt;p&gt;The birational map between the two curves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y = (u - 1) / (u + 1) mod p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;u&lt;/code&gt; is the Montgomery x-coordinate (Curve25519) and &lt;code&gt;y&lt;/code&gt; is &lt;br&gt;
the Edwards y-coordinate (Ed25519). Plus reconstructing the sign bit &lt;br&gt;
from byte 63 of the signature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;curve25519ToEd25519&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$curvePk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$signBit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gmp_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2^255 - 19'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gmp_mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gmp_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bin2hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strrev&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$curvePk&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$uPlus1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gmp_mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gmp_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$inv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gmp_invert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$uPlus1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gmp_mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gmp_mul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gmp_sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$inv&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ... encode back to 32 bytes, set sign bit&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then feed to &lt;code&gt;sodium_crypto_sign_verify_detached()&lt;/code&gt;. Works reliably &lt;br&gt;
once you get the byte-order and sign-bit handling right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other things I crammed into 900 lines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP byte-range streaming&lt;/strong&gt; for audio/video (&lt;code&gt;Accept-Ranges: bytes&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MediaSession API&lt;/strong&gt; so mobile lock-screen controls work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infinite scroll&lt;/strong&gt; via IntersectionObserver with cancelable fetches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 language translations&lt;/strong&gt; including RTL (Arabic)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark + grayscale light themes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile-first responsive&lt;/strong&gt; (row layout on phones, grid on desktop)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shareable URLs&lt;/strong&gt; that auto-start playlists: 
&lt;code&gt;#play=audio&amp;amp;list=a.mp3|b.mp3&amp;amp;from=a.mp3&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with constraints, not features.&lt;/strong&gt; The "one file" rule &lt;br&gt;
forced every decision to justify itself in bytes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTTP-range streaming is underrated.&lt;/strong&gt; MediaSession + byte-range &lt;br&gt;
on a static file gives you 90% of what "proper" streaming services do.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSON cache &amp;gt; database for read-heavy workloads.&lt;/strong&gt; For this use &lt;br&gt;
case, filesystem metadata in JSON is faster than any SQL query &lt;br&gt;
because there's no query — just &lt;code&gt;json_decode()&lt;/code&gt; once.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this is NOT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a Plex replacement. It doesn't transcode, scrape metadata, 
manage libraries.&lt;/li&gt;
&lt;li&gt;Not for shared multi-user servers. One deployment = one creator.&lt;/li&gt;
&lt;li&gt;Not secure by itself — put it behind Cloudflare or nginx with 
rate limiting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://dev.tolink"&gt;https://github.com/vekuz/durcoin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://dev.tolink"&gt;https://djdurcoin.ru/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Fork it, break it, rewrite it. If you find a cleaner &lt;br&gt;
way to do the Ed25519 dance in PHP — please tell me.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building minimalist tools is a discipline. Every feature has to &lt;br&gt;
justify its bytes. Turns out: most web apps can be 10× smaller than &lt;br&gt;
they are. Maybe yours too.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>selfhosted</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
