Недавно я много писал о своих мыслях по поводу независимой разработки. Я хотел обобщить их, рассказав о пути Mole от Open Source CLI до платного Mac-приложения — о чем я думал в то время, что сработало на самом деле и, возможно, дать несколько советов друзьям, работающим над собственными проектами.
Официальный сайт Mole —
mole.fit , а CLI опубликован в Open Source на
GitHub . Можете сначала попробовать.
В прошлом году, во время празднования Национального дня, я написал несколько сотен строк кода у бассейна в Санье и создал утилиту для очистки Mac под названием Mole CLI, которую опубликовал в Open Source на GitHub. Изначально я планировал использовать её только сам и с коллегами. Как оказалось, менее чем за год она набрала 60 000 звезд, вышло более 50 версий, и 121 разработчик со всего мира прислал код, решив почти 800 запросов на функции и ошибок.
На самом деле, я не совсем осознавал, сколько людей её используют, пока однажды, из-за того, что в README было два изображения, ускоренных Vercel, трафик превысил лимит тарифа, и я задолжал Vercel $80. Тогда я понял, что пришло время сделать десктопную версию.
Раньше самые частые письма, которые я получал, были от международных пользователей, с общей мыслью: «Мои родители пользуются Mac, моя сестра тоже, но они не знают, как открыть терминал. Можете сделать версию, которая не требует ввода команд?» Я откладывал это какое-то время, в основном потому, что чувствовал, что сам CLI еще недостаточно зрелый. Позже я потратил два выходных на создание десктопной версии для Mac. Я выложил её в 10 вечера, и уведомления звенели всю ночь — французские, немецкие, всевозможные валюты. В конце концов я отключил уведомления по электронной почте, чтобы хоть немного поспать. Оглядываясь назад, та первая версия была довольно сырой; насколько полной может быть вещь, созданная за два выходных? Многие функции добавлялись понемногу в течение следующих месяцев. По сути, это была группа пользователей, которые сначала заплатили, а затем сопровождали меня в её завершении. CLI остался неизменным, всё так же Open Source и бесплатен, и будет продолжать обновляться; платной является только десктопная версия.

Три типа мусора, создаваемого ИИ
После создания десктопной версии самой используемой мной функцией была очистка, потому что мой Mac действительно был доведен до предела ИИ. Я держу Claude Code и Cursor открытыми весь день, чтобы писать код. Сначала я не обращал особого внимания, но позже обнаружил, что мусор, оставляемый ИИ, сильно отличается от традиционного ПО, и делится примерно на три категории.
Первая категория — это артефакты компиляции. Это не ново, но ИИ увеличил масштабы. Раньше я мог написать вручную несколько сотен строк кода и скомпилировать три-пять раз в день; теперь я позволяю агенту запустить десяток раундов за полдня, компилируя каждый раз. Папки Rust project targets, frontend .next и dist, а также DerivedData от Xcode растут очень быстро. Однажды я очистил 86 ГБ только этого. Вторая категория — это старые версии, оставленные самими инструментами ИИ. Инструменты командной строки, такие как Claude Code, Cursor Agent и GitHub Copilot, все обновляются автоматически. Они обновляются, загружая новую версию целиком в новую директорию — каждая версия около 250 МБ — а старые не удаляются. За несколько месяцев может накопиться дюжина бесполезных версий. Третья категория — это файлы моделей — модели, загруженные Ollama и LM Studio, и кэш HuggingFace, которые часто занимают десятки гигабайт.

Mole очищает первые две категории, но не трогает ни байта из третьей. Позже я постепенно продумал это в виде трех уровней, категоризируя всё, что сканируется, прежде чем решить, должно ли оно быть отмечено по умолчанию. Первый уровень — возобновляемые: HTTP-кэш, кэш GPU, артефакты компиляции и большинство логов. Если соответствующее приложение закрыто и путь чист, его можно очистить. Второй уровень имеет высокую стоимость восстановления: кэш реестра менеджеров пакетов, локальные веса моделей и iOS DeviceSupport — всё это можно перестроить, но это требует трафика и времени, так что пользователь должен посмотреть сам. Третий уровень — незаменимые: история чатов, базы данных почты, библиотеки фотографий и состояние текущих проектов. Я считаю, что такие вещи никогда не должны попадать в список для очистки одним кликом.
Сжать эти три уровня в один список «безопасно для удаления» было бы проще, но цена — принятие решения за пользователя. Десять категорий на странице очистки расположены в таком порядке: возобновляемые кэши наверху, и чем дальше вниз, тем больше нужно проверять самостоятельно.

Такие вещи, как target, build, dist, __pycache__ и DerivedData, можно вернуть перекомпиляцией, ценой нескольких минут работы процессора. node_modules, Pods, venv и vendor тоже выглядят как директории зависимостей, но их удаление требует повторной загрузки из интернета. Если вы находитесь в скоростном поезде или самолете и хотите запустить проект, вам придется просто ждать. Эти две категории выглядят похоже и их легко очистить как мусор вместе. Mole CLI делал это раньше, но позже я специально удалил все директории для загрузки из списка очистки Mac-версии.
Модели — самая тяжелая категория здесь. Повторная загрузка десятков гигабайт — это катастрофа, и обычная утилита для очистки даже не удалит их правильно. Ollama разбивает модели на кучу блоков, названных по хешу; несколько моделей могут использовать один и тот же блок. ollama rm вычисляет, ссылается ли кто-то еще на блок, прежде чем решиться его освободить. Если вы вручную удалите большой блок из файловой системы, вы можете сломать другую модель. Только сам инструмент понимает эти ссылки.
Поэтому такие пути, как ~/.ollama/models и ~/.cache/huggingface, жестко закодированы в защитный список в коде. Они даже не появятся на этапе сканирования; они показывают только занимаемый размер в разделе анализа диска, оставляя управление самими моделями Ollama или LM Studio.

Есть еще одна категория вещей, еще более неприкосновенных, чем модели: сессии ИИ. ~/.codex/sessions, ~/.claude/projects и ~/.grok/sessions хранят ваши полные диалоги с ИИ за месяцы или даже год. Они содержат ваши мысли в тот момент, отвергнутые решения и причины каждого изменения. Если их удалить, они исчезнут навсегда, и в некотором смысле они ценнее самого кода. Поэтому эти пути никогда не будут очищены в Mole, независимо от того, как долго они там находятся. Также защищены воспоминания, планы, навыки и сгенерированные изображения.

Эти защитные списки не были продуманы с самого начала; в основном они были изучены методом проб и ошибок. Самая глупая ошибка была с com.apple.e5rt.e5bundlecache. В названии есть «Caches», и он находится в директории кэша, поэтому выглядит как кэш, но на самом деле это модель, скомпилированная нейронным движком Apple. Ранний CLI воспринимал его как кэш и очищал, что приводило к сбоям всех приложений, использующих функции распознавания, до перезагрузки. С тех пор у меня выработалась привычка: когда я вижу директорию с «cache» в названии, я задаю себе три вопроса: Кто это написал? Кто будет это читать после перезагрузки? Как мне это вернуть, если я случайно удалю? Если я не могу ответить хотя бы на один, я не трогаю это.
Смотри, прежде чем удалять
Я оцениваю качество такого инструмента не по тому, сколько он может очистить, а по тому, позволяет ли он вам ясно видеть перед удалением.
Когда Mole чистит, он сначала сканирует, выводит элементы один за другим и показывает, что именно представляет собой каждый элемент, где он находится и сколько места занимает. Элементы, в которых я не уверен, по умолчанию не отмечены. Вы подтверждаете перед удалением, а при удалении элементы сначала отправляются в Корзину, чтобы их можно было восстановить, если вы передумаете. Сканирование и очистка выполняются полностью локально; файлы и результаты никогда не загружаются. Цена — это более медленная работа и дополнительный шаг подтверждения, что может показаться утомительным, когда вы спешите, но я лучше пропущу удаление, чем удалю что-то по ошибке.

Удаление следует той же логике. Когда вы выбираете приложение, Mole находит всё, разбросанное по системе, помечая каждый элемент его путем и размером. На изображении выше само приложение Claude занимает всего 781 МБ, но ~/Library/Application Support/claude — 7,67 ГБ. Это никогда не сам пакет приложения занимает место по-настоящему. Элементы входа и фоновые службы также находятся на той же странице, так что вам не нужно искать их в Системных настройках.
Например, установщики обновлений macOS — директория /macOS Install Data — часто занимают более 10 ГБ и выглядят как идеальная цель для очистки. Но системе они могут все еще быть нужны для завершения обновления; удаление их слишком рано может помешать загрузке компьютера. Поэтому в Mole это непроверенный элемент для просмотра с тремя уровнями защиты: если ожидается установка обновления, вся строка скрыта; если к установщику обращались за последние 14 дней, он скрыт; если процессы, связанные с установкой, все еще работают, он скрыт. Если какой-либо сигнал не может быть прочитан, он считается риском и не отображается вовсе.
В момент выполнения скрипт с привилегиями root запускает эти проверки снова. Если они не пройдены, он завершается с ненулевым кодом. Вы не увидите ситуации, когда «отчет говорит, что очищено 12 ГБ, но не перемещено ни байта».
У меня есть очень простой способ оценить, хороша ли утилита для очистки. Установите два продукта от одного производителя, удалите только один и посмотрите, включает ли она общую родительскую директорию Application Support или групповой контейнер. Если да, это означает, что она сопоставляет по имени, а не по владельцу. Я не рискну доверить инструменту, который не может даже прояснить право собственности, массовое удаление.

Она не будет вас беспокоить в обычном режиме
Очистка 86 ГБ за раз достигается не удалением нескольких логов; при удалении Claude можно найти вещи в десять раз больше самого приложения, разбросанные по системе. Она найдет то, что нужно найти, но не будет активно вас беспокоить.
После установки она не будет выскакивать с уведомлениями каждые несколько дней, напоминая вам почистить, и не будет выпрыгивать после сканирования, чтобы сказать, насколько опасен ваш компьютер. Открывайте её, когда хотите почистить; когда нет — её как будто не существует.
Интерфейс следует той же философии. Если сканирование не закончено, она не переходит на страницу результатов. Для вещей, которые будут готовы через мгновение, она даже не показывает индикатор загрузки; только через некоторое время появляется анимация «занято». На странице завершения также заранее зарезервировано место, чтобы окно не прыгало при появлении результатов. Все эти правила очень тривиальны, но вместе они создают ощущение стабильности в использовании.
Базовые задачи по своей сути непредсказуемы, поэтому добавление анимации не помогает; сам процесс должен быть надежным. Я не хочу, чтобы инструмент обслуживания требовал постоянного наблюдения. Запустите задачу, подождите, пока она завершится, а затем верните управление экраном — этого достаточно. Ему не нужно постоянно мигать огоньками, напоминая вам посмотреть на него.
Доступность также является частью этого. Порядок чтения, операции с клавиатуры и стабильность фокуса — все это часть одного и того же «тихого» опыта. Когда в системе включена опция «Уменьшение движения», планеты прекращают свое декоративное вращение, а изменения состояния уменьшают пространственное движение. Ни одна операция не зависит от понимания пользователем анимации.

Сделать так, чтобы ей мог пользоваться даже 70-летний
Раньше, когда я делал вещи, я в основном думал только о том, будет ли это удобно моим коллегам и друзьям. Переходя от CLI к десктопной версии, я понял, что сделать её удобной для 70-летнего дедушки требует гораздо большего, и это гораздо интереснее. Ниже приведены выдержки из писем пользователей за последние три месяца; мои самые большие достижения почти все здесь.
Почти 70-летний пользователь из Великобритании сказал, что у него был «старческий провал», и он купил Mole снова. «Считайте второй платеж подарком вам; спасибо за этот отличный инструмент, он сэкономил мне гораздо больше фунтов, чем CleanMyMac». Я предложил ему вернуть деньги или подарить лишнюю лицензию. Он подумал и ответил на следующий день: «Ни у кого из моих соседей нет Mac, как и у моих подписчиков в Bluesky. Этот раз за мой счет». Получение таких писем заставляет меня чувствовать, что я должен сделать продукт еще лучше, чтобы быть достойным этого доверия.
Американский пользователь исправил мое заблуждение относительно региональных привычек. Я всегда думал, что американцы должны использовать Фаренгейт для температуры, поэтому по умолчанию установил Фаренгейт для региона США. Он сказал: «Американцы используют Цельсий во всех технических контекстах; только погода и температура тела являются исключениями. Я был поражен, увидев 110, когда установил Mole. Технические характеристики, которые Apple показывает американцам, также в Цельсиях, и fastfetch/neofetch по умолчанию используют Цельсий в американских системах. Я предлагаю оставить переключатель Фаренгейта, но по умолчанию использовать Цельсий для всех регионов». Позже я изменил это на Цельсий по умолчанию с переключателем на Фаренгейт. Он также прислал последующее письмо о ценообразовании, сказав, что указанное мной число не выглядело как намеренно установленная цена, а скорее как конвертация из другой валюты. Он добавил: «Под „иностранным“ я не имею в виду антикитайское, но люди хотят чувствовать, что автор их понимает». Честно говоря, я просто взял эту цену с потолка; я никогда серьезно не думал о ценообразовании до создания продукта. Быть уличенным незнакомцем было довольно неловко — оказывается, цена также влияет на решения пользователей.
Пользователь с легкими нарушениями зрения сказал: «Это выглядит как очень хорошее приложение, но, к сожалению, я не могу им пользоваться; похоже, в нем жестко закодирован темный режим. Моя система настроена на светлый режим, и я использую только приложения со светлым режимом». Сделать Mole только темным было осознанным решением; панель меню плавает на обоях как HUD, и темное стекло дает меньше бликов, устраняя необходимость в переключении темы. Но эта причина не была для него убедительной. Я всегда думал, что серьезно отношусь к доступности, но полностью упустил из виду, что светлый режим сам по себе является требованием доступности. Прошло уже некоторое время с тех пор, как я получил это письмо, а Mole все еще только в темном режиме; светлый режим все еще в списке, не завершен. Я чувствую себя немного виноватым, что продукт, претендующий на заботу о доступности, заставил пользователя, который прямо сказал, что не может им пользоваться, ждать так долго.
Лектор из немецкого университета подал заявку на образовательную лицензию, сказав, что это «не только поддержка для меня лично, но и значимая поддержка на образовательном уровне». Оказывается, есть международные преподаватели, использующие мой продукт в классе — сценарий, который я не предвидел. Венгерский врач дал самый честный отрицательный отзыв: «Честно говоря, цена немного высока для того, что может сделать и бесплатное приложение». Я не счел это резким; покупательная способность сильно различается между странами. Он не жаловался; он помогал мне локализовать проблему.
Мои любимые функции в Mole на самом деле не были моими идеями. Уведомление о низком заряде AirPods было добавлено, когда я работал над состоянием батареи; я не сталкивался с этим сценарием, пока однажды днем не получил его — это было очень продуманно и ненавязчиво. Я добавил три различных варианта поведения для удержания экрана включенным после напоминания пользователя; когда я внезапно ухожу на выходные, ИИ-кодинг может продолжать работать, экономя мне много асинхронного времени. Возможность видеть уровень заряда iPhone в строке состояния сначала была трудной в реализации, но в конце концов я нашел способ. Все это были вещи, которые пользователи просили меня добавить, и в итоге я получил от них наибольшую пользу.
На самом деле я отвечал на письма вручную
Вопросы и ответы, возвраты средств и сброс кодов активации составляют менее 1% пользовательской базы. Я мог бы написать скрипт за полчаса, чтобы автоматизировать всё это, но я этого не сделал. Только обрабатывая их один за другим, я могу почувствовать, чего на самом деле хотят пользователи, почему они возвращают деньги и что их беспокоит — и это часто не то, о чем они спрашивают в первую очередь. Мой порог для автоматизации — когда выполняются три условия: проблема повторяется, ответ стабилен и все исключения понятны. До тех пор я лучше буду отвечать по одному. Это все еще эффективно; я не тратил деньги на маркетинг, и рост в основном происходит из уст в уста. Уровень возврата средств ниже 0,8%. Многие покупатели являются давними пользователями CLI.
Перед выпуском я не настраивал систему тикетов, платформу поддержки клиентов или базу знаний. Инженерам нравится сначала создавать эти системы поддержки, потому что это знакомая работа, и ИИ сжал это до половины дня, что облегчает начало слишком рано. Но хотя на создание уходит полдня, обслуживание — это долгосрочное обязательство, и в этом пока просто нет необходимости. В день, когда входящие начнут терять запросы, время ответа станет неясным или на один и тот же вопрос будут даваться разные ответы — вот тогда действительно понадобится новая система. ИИ делает возможными многие части этого продукта, но общение с людьми нельзя заменить ИИ; иначе это было бы неинтересно. Он может повысить эффективность, но трудно улучшить взаимные чувства и доверие. Возможно, это также способ для продуктов, рожденных из ИИ-кодинга, сохранить человеческое лицо.
Вещи, которые я нашел полезными
В создании продукта я чувствую, что навыки программирования составляют только около 30%. Больше усилий уходит на соединение ваших собственных болевых точек с болевыми точками большинства пользователей, создание чего-то, что легко использовать без инструкции, и продвижение этого перед нужными людьми, чтобы они почувствовали, что это решило большую проблему. Инженер продукта — это примерно сочетание исследователя, продакт-менеджера, инженера, оператора, аналитика данных и бизнес-стратега.
То, что вы не делаете, гораздо важнее того, что вы делаете. Для инструмента, который удаляет ваши файлы, это становится тем, что вы не удаляете. Эти жестко закодированные защитные списки все появились из этого правила. Мне повезло прочитать много книг по инженерной культуре, когда я начинал как новичок; фразы вроде «сущности не должны быть умножены без необходимости» и «простота — это высшая степень изысканности» постепенно проникли в мою жизнь, работу и код. Я чувствую это еще сильнее после создания продуктов. Разница между хорошим продуктом и средним во многом заключается в способности решить, что не делать. Некоторые функции сами по себе хороши, но если они не на главном пути, я их не включаю; иначе это легко превращается в кучу функций, которые трудно поддерживать.
Еще одно ощущение — у вас должен быть план на следующие шесть месяцев в голове, четко зная, что добавить в каждой версии, какие из них являются ложными потребностями и какие функции следует разместить там, где они будут удобны для пользователей. Для обычных пользователей тот, которым можно пользоваться без чтения инструкции, и есть хороший. Позиционирование Mole — это тихий страж обслуживания системы Mac. Многие друзья предлагали отличные функции, от которых я вежливо отказался. Моя цель проста: если один из ста пользователей Mac захочет оставить Mole, этого уже достаточно.
Теперь, прежде чем функция попадет в план, она должна пройти три ворот: не может быть постоянных таймеров, слушателей или накладных расходов на выборку, если пользователь не зашел в функцию; нельзя расширять привилегированные помощники или добавлять новые системные разрешения ради небольшого удобства; и нельзя добавлять настройки, когда есть разумные значения по умолчанию. Это не универсальные принципы для всего ПО, но правила, которые Mole установил для себя. Каждая дополнительная постоянная задача, привилегия и конфигурация требуют, чтобы пользователь доверял вам немного больше.

Я в основном не коплю на «большие релизы»; я стараюсь выпускать версию каждую неделю, чтобы проблемы пользователей решались своевременно и я мог вести диалог. Каждый релиз, обновление и продвижение — это отличная возможность для общения и позволяет людям, которые не видели новостей, узнать, чем вы занимаетесь.
В эпоху ИИ барьеры в коде становятся меньше. Нужно больше контролировать, как тратить Токены именно на решение проблем пользователей. Я не против тратить больше, но это должно быть эффективно — например, тщательно обсуждать требования, углубляться в данные, чтобы найти реальную проблему, и писать тексты, которые люди понимают с первого взгляда. Эти области стоят затрат. Я рассматриваю Токены как инвестиции, а инвестиции должны приносить прибыль.
Mole с самого первого дня был глобальным, и я публикую больше контента на английском, чем на китайском. Мое ощущение за это время — мир огромен, пользовательская база широка, и они готовы доверять вам с самого начала. Люди, которым вы помогаете мимоходом, часто становятся вашими пользователями позже, потому что было реальное взаимодействие. Я не тратил деньги на продвижение; всплески на X высоки, но недолговечны, тогда как вещи, опубликованные на YouTube, затухают очень медленно. Пока контент хорош и кто-то его рекомендует, он может жить там долгое время.
Я потратил больше времени на данные, чем предполагал. Просмотр продаж по измерениям и времени, в сочетании с данными о трафике, комментариями пользователей, всеми записями взаимодействий с пользователями, причинами возвратов и всеми проблемами в Open Source — все это ценные ресурсы. Они помогают мне обнаружить многие проблемы, о которых я не знал, и точно увидеть, где сломана воронка продаж.
Последний пункт больше касается моего собственного подхода. Создание аккаунта с глубоким утилитаризмом вызывает тревогу; я предпочитаю строить его как бренд, где я сам являюсь брендом. Мои мысли, идеи, обновления продуктов, инсайты, взаимодействия и комментарии — все это добавляет доверия этому бренду. Доверие особенно важно в сегодняшнем фальшивом, но процветающем мире ИИ. Вещи, которые звучат потрясающе, но кажутся средними, когда заходишь внутрь, уже снизили ожидания многих пользователей. Даже если у вас действительно хороший продукт, без доверия вы не получите внимания. Это можно делать очень долго; пока вы в интернете, этот бренд будет жить — это продукт с самым длинным жизненным циклом в вашей жизни.
Почему пять планет
В десктопной версии Mole в настоящее время пять модулей: Очистка, Удаление, Оптимизация, Анализ диска и Состояние оборудования. Каждый модуль соответствует планете в интерфейсе: Очистка — Земля, Удаление — Марс, Оптимизация — Меркурий, Анализ — Юпитер, Состояние — Солнце. Это связано с моей детской любовью наблюдать за орбитами планет, плюс с тем, что первым, чему я действительно хотел научиться после изучения фронтенда десять лет назад, был WebGL. Текстуры планет менялись не менее 10 раз; я скачал многие с официального сайта NASA, прежде чем остановиться на них. Направление вращения, скорость и эффекты полета после завершения следуют реальным небесным телам.

Эту часть можно было бы опустить; небольшой инструмент в строке меню, который чистит одним кликом, тоже сработал бы. Но цифрового мусора, генерируемого ИИ, уже достаточно. Вместо того чтобы тратить Токены на создание очередного интерфейса, который едва работает, я хотел сделать что-то более удобное — не тратить свои Токены впустую и не засорять вашу ленту.
Мне нравится, когда вещи происходят естественно, а не добиваться результатов в спешке за короткое время; эти три месяца укрепили это. Некоторое время назад я придумал фразу: Лучшая работа в мире, вероятно, для человека, который постоянно учится на свободном рынке, используя свое суждение, способности и эстетику, чтобы постоянно создавать ценность, за которую другие готовы платить.
CLI находится в Open Source и бесплатен на GitHub, а десктопная версия для Mac — на официальном сайте mole.fit.
Поскольку это мой первый платный продукт, возможно, есть моменты, которые я не продумал до конца. Я буду рад любым советам и рекомендациям от опытных коллег. Упомянутые выше изменения — не мои идеи; все они были предложены пользователями в письмах или issues. Поэтому никогда не упускайте возможность пообщаться с пользователями; слушайте их жалобы и предложения — это может очень помочь и позволит лучше понять свою аудиторию.





