Фулстек-инженер с физико-математическим образованием. Довожу продукты до конца и целиком: инструмент для знаний с древовидной структурой, работающий на пяти платформах; плагин для Obsidian, установленный тысячами людей; плагины, которые заставляют Claude Code работать с настоящими репозиториями, — и библиотеки с сервисами на Python под всем этим.
20проектов в портфолио
7из них — законченных продуктов
10+лет в разработке
01
Продуктовая разработка
Одна модель данных — и сразу все поверхности. Веб, десктоп, мобильные и чат-клиенты, которые остаются синхронными и продолжают работать офлайн.
02
Инфраструктура для AI-агентов
Обвязка, которая позволяет кодовым агентам работать с настоящими репозиториями и ничего в них не ломать: изоляция, точки проверки и след, по которому всё можно перечитать.
03
Бэкенд и инструменты
Неромантичная половина работы: типизированные API, миграции схем, упаковка пакетов и библиотеки, которые ставят себе другие люди.
Языки
TypeScript / JavaScript · Python · Dart / Flutter · Go · C++ · SQL
Древовидные заметки на пяти платформах, с агентом внутри
Веб-приложениеДесктоп-приложениеМобильное приложениеTelegram Mini AppТелеграм-бот
→
Инструмент для заметок, в котором всё — узел одного дерева: планы, декомпозиция задач, канбан-доски, структурированные поля. Одно и то же дерево работает в вебе, в десктопной сборке на Tauri, в мобильном приложении на Flutter, в Telegram Mini App и в телеграм-боте — остаётся редактируемым офлайн и сходится, когда сеть возвращается.
Что учить и в каком порядке — университетские лекции как карта
Веб-приложениеPWAКонвейер данных
→
Бесплатный каталог университетских лекционных курсов с YouTube, разложенный по тому, что должно идти раньше. Каждый курс знает, от чего он зависит и что открывает, поэтому предмет превращается в маршрут вместо кучи ссылок: выбираете, куда хотите прийти, и сайт выкладывает путь — предпосылка за предпосылкой, с записями к каждому шагу. 236 курсов в 39 областях, 12 500 лекций из 309 университетов и каналов, переобход каждую ночь.
Маркетплейс плагинов, который сажает кодового агента за настоящий репозиторий
Плагин Claude CodeCLI
→
Два опубликованных плагина Claude Code за одной командой маркетплейса. make-better проходит по существующей кодовой базе по девяти темам и сам вносит правки; feature собирает каждое изменение в изолированном git worktree со своим портом и доводит его до pull request. Оба настраиваются под проект.
claude — /make-better
$ /make-better# picks the oldest subsystems, reviews each across nine topicsTotal: 104 findings across 5 systems. - 13 bug fixes (applied automatically) - 14 DRY refactors - 11 architecture cleanups - 13 consistency fixes - 6 efficiency wins - 16 tests added - 18 doc-sync updates - 10 completeness fixes - 3 securityeach system on its own branch, merged back with --no-ff. nothing pushed.
make-better — флаги
/make-better
Разумные умолчания — обычно три самые давно не читанные системы.
/make-better 8
Разобрать восемь систем вместо трёх.
/make-better flutter 4
Четыре системы, в именах которых встречается «flutter».
--no-discover
Пропустить discovery и сразу перейти к ревью.
--rebuild
Сначала принудительно пересобрать реестр подсистем.
--yes
Без присмотра — ни plan mode, ни вопросов, работает до конца.
Живая диаграмма Ганта по всем сессиям Claude Code, прямо из локальных транскриптов
CLI-инструментВеб-панель
→
Браузерная панель, которая укладывает все сессии Claude Code на одну общую ось времени — когда работал агент, когда читал человек, каждый вызов инструмента и каждый запуск субагента. Она читает транскрипты, которые и так лежат на диске, поэтому ставить хуки, менять конфиги и проверять зависимости не нужно.
Путеводитель по социальному графу — вставьте профиль, получите структуру за ним
Веб-приложениеHTTP APIФлот воркеров
→
Исследовательская платформа, которая превращает открытые данные социальной сети в то, по чему можно ходить: обходит связи профиля через официальные API, выясняет, на какие сообщества распадается граф, и ранжирует признаки, общие для этих сообществ. Шесть сервисов — фронтенд на React, API на Flask, доменный слой, распределённый воркер запросов, аналитический сервис на FastAPI и пул токенов — построены за три года и опубликованы одним репозиторием.
ntrail — граф друзей
строка запроса
GET vk.user <id> friends
Список друзей профиля как множество, с которым можно работать дальше
GET vk.community <id> members
Все участники группы, готовые к пересечению с другим множеством
split clusters
Разбить текущее множество на сообщества по структуре графа
interesting properties
Ранжировать то, что есть общего у текущего множества, — школа, вуз, город, возраст
сервисы
frontend
React 16 + Redux; sigma / vis для графа, recharts для распределений
backend
API на Flask поверх PostgreSQL — объекты запросов, выборочное исполнение, кеширование
Один объект Config поверх всех мест, где Python-проект прячет настройки
Python-библиотека
→
Библиотека конфигурации, которая убирает шаг настройки целиком. Создаёте Config() — и он поднимается от текущего файла к корню проекта, находит по пути файлы YAML, JSON, INI, .env и Python-конфиги, подмешивает переменные окружения и отдаёт результат через один типизированный доступ.
python
$ pip install bestconfig# app/main.py — config.yaml and .env live two levels upfrom bestconfig import Configconfig = Config("myconfig.json")# that was the entire configuration stepmode = config.logger.mode # 'WARNING'port = config.int('PORT') # 5050pw = config.get('DATABASE_PASSWORD')config.to_dict() -> every source, merged
источники, которые он читает без подсказки
.yaml / .yml / .json
Разбирается с родными типами — `port: 5050` приходит как int.
.ini / .cfg
Стандартные конфиги с секциями.
.py
Python-модули конфигурации; пропускаются, если сами создают Config(), чтобы не было рекурсии.
.env / env_file
Файлы KEY=VALUE, включая значения, разбираемые как литералы Python.
Environment variables
Уже существующие и только что заданные, слитые с файловыми источниками.
dict
Обычные словари, вставленные в рантайме через `config.insert(...)`.
способы доступа
config.name
Доступ через атрибут для обычного случая.
config['name']
Доступ как к словарю — бросает KeyError, если ключа нет.
config.get('a.b.c', default)
Путь с точками любой глубины, с умолчанием вместо исключения.
config.int / float / str / list / dict
Типизированные геттеры, возвращающие None, если приведение не удалось.
config.get_raw('key')
Полностью отключить интерпретацию типов.
config.assert_contains('key')
Громко упасть на старте, если обязательная настройка так и не загрузилась.
Общая сеть заметок внутри Obsidian, живущая в тысячах хранилищ
Плагин для ObsidianВеб-сервис
→
Плагин для Obsidian, добавляющий к приватному хранилищу публичный слой, который редактируют совместно. Любую заметку можно опубликовать в общей сети, связать по URL, найти через автодополнение прямо в редакторе и отредактировать — а изменения разойдутся по хранилищам всех участников.
Obsidian — палитра команд
Create note
Опубликовать новую заметку в общей сети.
Update note
Подтянуть последние изменения из облака для текущей заметки.
Upload current note
Перенести существующую локальную заметку в общий слой.
Sync base
Свести локальную копию с облаком.
Copy obsidian url
Сделать ссылку obsidian://netwik?id=… — её откроет любой, у кого есть плагин.
Delete remote note
Удалить заметку из сети целиком, а не только из этого хранилища.
как открывается общая ссылка
# a link to a note this vault has never seen$ open "obsidian://netwik?id=6f2c…"plugin intercepts the URL schemefetches the note from the shared storewrites it into w/ as ordinary markdownnote opens in the editor, fully linkable