Journal / Open Source

Читательский дневник, который можно форкнуть

Gume открыт, работает и строится теми, кто приходит. Заметки рекламщика, который поставил базу данных.

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

В манифесте такое писать легко. Поэтому мы пошли и проверили.

Gume работает, и код открыт. Это читательский дневник: место, где записано, что вы прочли, что читаете и что ещё ждёт на полке. Он работает поверх каталога из почти 300 тысяч португалоязычных изданий. Лицензия AGPL-3.0. Он построен открыто, публично, рекламщиком, который не программист, в паре с AI-агентом.

И это, с большим отрывом, самая полезная вещь, на которой я когда-либо учился.

Что это, в один экран

Бразильские читатели пятнадцать лет сидели с разлагающимся Skoob, а все альтернативы иностранные, англоязычные в первую очередь, построенные вокруг неверного инстинкта. Итак:

Полка Gume: обложки книг на чёрном, у каждой оценка одним словом вместо балла.
Полка / обложки — единственный цвет на странице

Полка. Хочу прочесть, читаю, прочитано, брошено. Перечитывания. Бумага и цифра в одном месте. Владеть книгой и читать книгу — разные вещи, и здесь они считаются раздельно.

Оценка, которая — слово. Adorei, gostei, achei ok, não gostei, não terminei. Никогда не число. Звезда это шкала, шкала становится средним, среднее становится табло, а табло превращает чтение в спектакль.

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

Файлы, которые вы забираете с собой. Один клик, и файл скачан: JSON и CSV, с вашей полкой, датами чтения, оценками, рецензиями (включая приватные) и каждой правкой каталога, которую вы внесли. Без очереди, без письма, без "мы готовим ваш архив", которое есть трение, наряженное заботой. И CSV использует колонки экспорта Goodreads, формат, который Skoob, StoryGraph, Oku и Fable уже умеют читать. Экспорт становится выходом только тогда, когда другой сервис может его открыть. Проприетарный JSON, который никто не импортирует, это записка о выкупе в красивой типографике.

Открытый граф книг. Метаданные правят читатели, и намерение — опубликовать их обратно открытым датасетом. Если проект умрёт, данные должны его пережить.

Манифест — это список отказов

Интересное в продукте редко то, что у него есть. Интересное то, чего он не станет делать, намеренно, даже когда это сработало бы.

  • Без лайков, без счётчика подписчиков, без стриков. И без табло. В профиле есть знак чести, но нет списка, кто прочёл больше. Рейтинг по числу прочитанных книг — это машина, заставляющая людей лгать о чтении.
  • Честь никогда не падает и никогда не смотрит на часы. Без "книг месяца", без сезонов. Остановиться на год ничего не стоит. Приложение, роняющее ваш номер, когда жизнь тяжела, наказывает скорбящих, больных и человека с новорождённым, и заставляет открывать тонкую нелюбимую книгу лишь чтобы сохранить то, что и так было вашим.
  • Бросить ничего не стоит, и оценка не даёт очков. Прочесть и возненавидеть стоит ровно столько же, сколько прочесть и полюбить. Если бы "adorei" стоило больше, приложение покупало бы комплименты. Если бы отказ чего-то стоил, никто бы больше не бросил плохую книгу.
  • Без алгоритмической ленты. Ничего не ранжируется и не подмешивается. Ваша лента — выбранные вами люди, в порядке, в котором это происходило. А когда захочется незнакомцев, для этого есть вкладка, перетасованная, а не отсортированная. Открытие, в которое входишь ты, и открытие, которое входит в тебя, — разные объекты.
  • Без партнёрских ссылок. Без рекламы. Ваша история чтения никогда не продаётся.
  • Без уведомлений вовлечения. Мы скажем, когда друг что-то опубликует. Мы не будем говорить, что полка по вам скучает.

Каждый из этих пунктов — отказ от выручки. Именно это делает его обещанием, а не предпочтением.

А вот пункт, который я не стану приукрашивать, потому что это честный шов всей конструкции: лестница существует, и она считает книги. Железо, Бронза, Серебро и выше, за прочитанное вами за жизнь. Так что да: вещь, растущая когда вы читаете больше, существует в продукте, который говорит, что чтение не спектакль.

Мы сделали вот что: сняли с лестницы всё, что делает число жестоким. Нет табло, значит некого побеждать. Она не падает, значит год перерыва ничего не стоит. Она не смотрит на часы, значит нет месяца и сезона. Её нельзя отсортировать, значит она не может быть рейтингом. Остаётся медленная форма вашей читательской жизни, видимая только вам и тем, кто вас и так знает.

Чистая ли это победа? Нет. Лестницу, считающую книги, можно фармить тонкими книгами, и я это знаю. Это напряжение, которое мы несём осознанно, вместо того чтобы притворяться, что решили его. Если вы считаете, что мы ошиблись в размене, этому аргументу место в issue, и он получит настоящий ответ.

А лицензия — то, что делает обещание настоящим. Если размещённый экземпляр однажды перестанет чтить этот список, вы берёте код, берёте свои данные и запускаете свой.

Выход и есть смысл.

Именно выход придаёт смыслу оставаться.

Часть, которую инструмент не напишет

Вот что я на самом деле пришёл сказать.

AI обрушил стоимость написания кода. Он не обрушил стоимость ошибки. Это разные экономики, и почти все, кто говорит об этом в 2026-м, всё ещё оценивают их одинаково.

Один пример из этой сборки, тот самый, что до сих пор меня беспокоит.

Импортёр каталога прочёл два из трёх файлов дампа Open Library и не открыл третий. В третьем живут авторы. Десятки тысяч книг легли в базу без единого автора, и предложенным следующим шагом было удалить их как сирот. Флобер. Толстой. Torto Arado. Стёрты из библиотеки, потому что один файл остался непрочитанным.

Ни ошибки. Ни красной сборки. Ни падения. Все тесты прошли, инструкция была исполнена точно. Просто уверенный, быстрый, неверный ответ, доставленный за секунды, с аккуратным планом зачистки в придачу.

Его поймали, потому что кто-то спросил, что лежит в куче, прежде чем согласиться её сжечь.

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

Оба факта правдивы, и тот, кто продаёт вам лишь один из них, продаёт вам что-то ещё.

Так что дефицитный ресурс не код. Это вопрос, заданный перед записью. Это знание, что общая запись не твоя, чтобы её перезаписывать. Это внимание к тому, что ключ поставщика — происхождение, а не личность, потому что у Open Library три разных ключа для Толстого, и ни один из них не он.

Это суждение, и это единственное, что не подешевело.

Поэтому репозиторий защищает себя сам

Если мейнтейнер не программист, никакая защита не может опираться на то, что мейнтейнер прочтёт diff. Я не поймаю баг, читая его, и притворяться иначе было бы театром.

Поэтому защита должна была стать структурной. Вот метод, и он переносится на каждую компанию, которую мы ведём:

  • Решения записываются до кода. Каждый трудный выбор живёт в журнале решений, с рассуждением, на простом португальском. Его не пересматривают без нового аргумента. Агент с амнезией и репозиторий с памятью — рабочая пара. Два амнезика — нет.
  • Авторизация живёт ровно в одном файле, и скрипт ломает сборку, если проверка появляется где-то ещё. Не конвенция. Ворота.
  • Тестов больше 700, и важные не тестируют функции. Они сканируют кодовую базу. Один ломает сборку, если экран заговорит как разработчик ("schema", "endpoint", "Фаза 4"), потому что Gume говорит с читателями. Один ломает, если маршрут родился публичным без чьего-либо решения. Один ломает, если знак можно будет заработать чтением, или если один знак светится ярче другого. Один запрещает функцию даты без часового пояса везде, кроме файла, которому она разрешена, потому что этот баг однажды записал книгу не в тот год. А красная команда атакует систему, подменяя UUID, пытаясь читать и писать чужие строки.
  • CI и есть ревьюер. Ноль человеческих аппрувов. Зелёный значит едет. Это не слепое доверие, это его противоположность: отказ притворяться, что человеческий штамп — это контроль.

Урок шире читательских приложений. Когда генерация бесплатна, вся работа уходит вверх по течению: решить, что никогда не должно быть правдой, и закодировать это там, где оно не может забыться. Организации, которые выиграют это десятилетие, будут не с лучшими промптами. Это будут те, чьи ограничения исполняемы.

Что я хочу от этого

Скажу прямо, потому что притворяться, что это чистый альтруизм, был бы свой сорт театра.

Я веду студию, которая ставит AI на работу в инфлюенсе, науке, прикладном AI и кино. Я продаю суждение об AI. Нельзя продавать суждение о вещи, которую ты лишь поручал делать другим.

Поэтому я построил всю вертикаль сам, поначалу плохо, и публично. Дизайн схемы. Авторизация. Триграммный поиск по 300 тысячам строк и почему он был медленным (я поставил на debounce; я ошибся; агент измерил, и это внешний вызов блокировал нажатие). Миграции Postgres. Заголовки CSP. CI. Дизайн-система. Управление сообществом. Выбор лицензии. Деплой.

Форма, которую называют T-shaped, работает лишь когда вертикаль настоящая. Моя — реклама, позиционирование, вкус, чтение экрана. Мне не хватало горизонтали, которую это десятилетие требует на самом деле: достаточной беглости в машинерии, чтобы знать, когда машина уверенно мне лжёт, и достаточного вкуса к процессу, чтобы выстроить работу так, чтобы ложь ловило что-то кроме удачи.

Этому не учит курс про AI. Этому учишься в два часа ночи, когда фильтр по подстроке вот-вот удалит Юнга.

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

Приглашение

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

Вы можете внести вклад, не написав ни строки кода, и сегодня это самая ценная помощь. Каталог пришёл из открытого архива и пришёл неполным: почти 266 тысяч изданий без обложки, тысячи без года и без издательства. Само это не чинится, и программист для этого не нужен. Нужен человек, который держит книгу в руках.

Страница "o que falta": открытая работа над каталогом, начиная с книг на вашей собственной полке.
/ открытая работа, начиная с книг на вашей собственной полке

Откройте o que falta и начните с книг на вашей собственной полке. Вы единственный человек на Земле, кто может исправить их прямо сейчас, потому что достаточно перевернуть книгу. Каждая правка записывается с вашим именем, на странице книги, навсегда. И ваше имя попадает на страницу контрибьюторов, в тот же список, тем же размером, что и у людей, пишущих код.

Страница контрибьюторов: те, кто ухаживает за каталогом, и те, кто пишет код, рядом, с одинаковым весом.
Кто делает Gume / каталог и код, одна страница, один размер

Исправленная обложка стоит столько же, сколько коммит.

Если вы пишете код: метки good first issue настоящие. Каждая говорит, что это, почему важно, какой файл трогать и как проверить. Ни одна не требует понимать всё приложение.

  • Самая маленькая: ISBN-10 в ISBN-13. Чистая функция, новый файл, тест. И она закрывает настоящую дыру: каждая книга, изданная до 2007-го, сегодня проплывает мимо каталога в 300 тысяч изданий и становится дубликатом.
  • Самая ценная: импортёры. StoryGraph, Skoob, LibraryThing, Kindle, Kobo. Планка — без потерь: даты, оценки, текст рецензий, полки, ISBN. Полузаконченные миграции — главная причина, по которой люди никогда не уходят с платформы, из которой давно выросли.
  • Самая трудная и самая нужная: книжные данные. Матчинг, дедупликация, обложки, неанглийские каталоги. Никакого блеска. Это ров, и он решает, сработает ли первый поиск незнакомца.

Просить issue не нужно. Напишите в комментарии "peguei essa" и вперёд. Работайте в ветке, откройте PR, и CI решит: ноль человеческих аппрувов, зелёный значит едет. Скажите, если использовали AI-агента, без стыда, мы тоже используем: это лишь говорит тестам, куда смотреть пристальнее.

А если вы считаете один из отказов ошибкой, откройте issue. Схема, план и дизайн-система публичны ровно потому, что менять их потом дорого, а спорить о них сейчас дёшево.

Почему это компания 4/RL

Gume не зарабатывает и не пытается. Однажды появится способ его поддержать, и он будет опциональным и косметическим: отметка в профиле, не больше. Поддержка никогда не открывает функцию. Тот, кто платит, и тот, кто нет, пользуются ровно одним и тем же Gume.

Так зачем студии его выпускать?

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

Всё остальное, что мы строим, проходит через клиента, контракт, NDA. Это проходит через вас.

Gume — это имя лезвия клинка. Той части, что режет.

Клинок, который никто не точит, не ржавеет за ночь. Он теряет остроту медленно и продолжает выглядеть в точности как клинок. Узнаёшь только тогда, когда он не режет то, что резал всегда.

Умы устроены так же. Студии тоже.

Ум никогда не
теряет остроту.

Gume поддерживает 4/RL Co., размещён на gume.club. AGPL-3.0. Форкайте.