# Projects of Mad God Inc.

> Full detail for every project on madgodinc.net: what it is, how it works inside,
> how to install it, and where to download a build. Generated from the same data
> that renders the site, so it cannot drift from what a human sees.

Aurora, the assistant running on this site, has its own pages:
[ai.md](https://madgodinc.net/ai.md) for the test protocol and
[api.md](https://madgodinc.net/api.md) for the API.

## Аврора

> Отвечает со своего сервера и помнит собеседника. (Своё железо · без облака)

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

После разговора отдельный проход выбирает из него факты о человеке и складывает в его личную память, отсеивая повторы. Нужное потом достаётся по смыслу, а не по совпадению слов. Можно и прямо сказать «запомни», тогда сохранится дословно.

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

| | |
|---|---|
| Стек | Go, локальная модель, векторная память |
| Где живёт | собственный сервер, не облако |
| Память | общая для всех ваших разговоров, у каждого своя |
| Разговоры | хранятся на сервере, переживают перезагрузку |
| Ограничения | по времени работы карты, со ступенями вместо запрета |
| Вход | Telegram, сессия тридцать дней |
| Статус | работает, чат на соседней вкладке |

### How it works

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

Память разложена по двум ярусам. Неизменяемый хранит личность и правила, и записать в него из разговора нельзя в принципе: путь записи умеет адресовать только личные полки самого пользователя. Личный ярус у каждого свой и другим невидим.

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

Блок памяти подставляется в хвост запроса, перед новым сообщением, и остаётся в истории. Если положить его в начало, меняется префикс, и кэш модели обнуляется на каждом сообщении: замер показал падение скорости примерно в десять раз.

### Install

Готовый файл под свою систему лежит в
[последнем релизе](https://github.com/madgodinc/aurora-cli/releases/latest):
`aurora-windows-amd64.exe`, `aurora-linux-amd64`, `aurora-linux-arm64`,
`aurora-darwin-arm64`, `aurora-darwin-amd64`. Скачать, положить в PATH, запустить.

Linux, macOS и Git Bash могут одной строкой:

```sh
curl -sL https://raw.githubusercontent.com/madgodinc/aurora-cli/main/install.sh | bash
```

Скрипт определяет систему, скачивает нужный файл и сверяет его с опубликованной
контрольной суммой. Go нужен только там, где готовой сборки нет.

Первый запуск просит завести аккаунт: логин и пароль, регистрация открыта.

### Links

- [Клиент на Go](https://github.com/madgodinc/aurora-cli)
- [Все версии](https://github.com/madgodinc/aurora-cli/releases)
- [Манифест и whitepaper](https://github.com/madgodinc/aurora-project)
- [Инструкция для ИИ](https://madgodinc.net/ai.md)

## mgi-mind

> Держит память ИИ-агента и ищет по смыслу, а не по словам. (Rust · Qdrant · открытый код)

Хранит факты, решения и разборы ошибок и достаёт нужное по смыслу: гибридный поиск с переранжированием поверх Qdrant, эмбеддинги считаются на месте.

Подключается к ассистенту по протоколу MCP и работает полностью офлайн: ни ключей от чужих сервисов, ни телеметрии. Память этого сайта построена на нём же.

| | |
|---|---|
| Стек | Rust, Qdrant, ONNX |
| Поиск | плотные векторы + разреженный BM25 + cross-encoder |
| Модели | multilingual-e5-base 768, переранжирование bge-reranker-base |
| Протокол | MCP |
| Лицензия | Apache-2.0 |
| Статус | v2.5.0, открытый код, образ в Docker |

### How it works

Поиск идёт в три слоя. Сначала запрос превращается в вектор моделью multilingual-e5-base и ищется по близости в Qdrant. Параллельно работает разреженный поиск по словам, который ловит точные термины и имена, где векторная близость подводит.

Результаты обоих слоёв сливаются, и верхние два десятка отправляются на переранжирование cross-encoder-моделью: она сравнивает запрос с каждым кандидатом попарно и переставляет их по настоящей связности, а не по расстоянию между векторами.

Всё считается на машине пользователя через ONNX, поэтому база не покидает компьютер и не зависит от чужого API. Отсюда и требование к памяти: модели живут в процессе.

### Install

Docker:

```sh
docker run -p 8765:8765 madgodinc/mgi-mind
```

Linux и macOS:

```sh
curl -fsSL https://raw.githubusercontent.com/madgodinc/mgi-mind/main/install.sh | sh
```

Windows:

```sh
irm https://raw.githubusercontent.com/madgodinc/mgi-mind/main/install.ps1 | iex
```

Из исходников:

```sh
cargo build --release
```

### Download

- [Windows x86_64, 8.4 МБ](https://github.com/madgodinc/mgi-mind/releases/latest/download/mgimind-x86_64-pc-windows-msvc.zip)
- [Linux x86_64, 8.8 МБ](https://github.com/madgodinc/mgi-mind/releases/latest/download/mgimind-x86_64-unknown-linux-gnu.tar.gz)
- [macOS Apple Silicon, 7.9 МБ](https://github.com/madgodinc/mgi-mind/releases/latest/download/mgimind-aarch64-apple-darwin.tar.gz)
- [macOS Intel, 8.2 МБ](https://github.com/madgodinc/mgi-mind/releases/latest/download/mgimind-x86_64-apple-darwin.tar.gz)

### Links

- [Репозиторий](https://github.com/madgodinc/mgi-mind)
- [Все версии](https://github.com/madgodinc/mgi-mind/releases)

### Screenshots

- [Факт записан, а найден по смыслу: в запросе нет ни одного общего слова с исходной записью](https://madgodinc.net/assets/mgi-mind.gif)

## Crescendo

> Раздаёт задачу агентам, проверяет её и выкатывает сам. (Python · оркестрация агентов)

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

Собран под хакатон Band of Agents. Дашборд с журналом прогона открыт публично.

| | |
|---|---|
| Стек | Python |
| Агенты | Conductor, Soloist, Tuning Fork, Stage Tech, Archivist |
| Журнал | цепочка хешей SHA-256 с подписью автора |
| Лицензия | MIT |
| Статус | открытый код, дашборд живой |

### How it works

Роли разведены намеренно: тот, кто пишет, не проверяет сам себя, а тот, кто выкатывает, не решает, что выкатывать. Дирижёр разбирает бриф на задачи, исполнитель пишет, камертон проверяет результат воротами, техник сцены деплоит, архивариус хранит.

Доказуемость держится на цепочке хешей: каждая запись журнала включает хеш предыдущей, поэтому вырезать или подменить шаг задним числом нельзя, не сломав всю цепь. Авторство подтверждается подписью.

### Install

Docker:

```sh
git clone --recursive https://github.com/madgodinc/crescendo.git && cd crescendo && docker compose up
```

Из исходников:

```sh
cp .env.example .env && uv sync && uv run python maestro.py "ваш бриф"
```

### Links

- [Репозиторий](https://github.com/madgodinc/crescendo)
- [Живой дашборд](https://crescendo-dashboard.pages.dev)

### Screenshots

- [Пятеро агентов и журнал решений: кто, когда и на каком основании, вплоть до живого адреса выката](https://madgodinc.net/assets/crescendo.png)

## CreepiDota

> Разбирает реплеи Dota и ведёт игроков по карте заданий. (Rust · Node · creepidota.com)

Читает реплей, объясняет, что пошло не так, и ведёт игрока по карте ежедневных заданий и рангов. Прогресс считается по настоящей истории матчей из Steam, а не по самоотчёту.

Живёт на creepidota.com, там же телеграм-бот. Единственный проект в этом списке с закрытым кодом.

| | |
|---|---|
| Стек | Rust, Node |
| Заданий | 66 по восьми созвездиям, 370 целей |
| Ступени | от бронзы до алмаза |
| Вход | Telegram, затем привязка Steam |
| Статус | в проде |

### How it works

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

Задания не выдаются вручную: прогресс подтягивается из истории Steam, поэтому засчитать себе выполнение нельзя. Звёзды созвездия открываются, когда три задания ветви доведены до золота.

### Links

- [Открыть сайт](https://creepidota.com)

### Screenshots

- [Шестьдесят шесть заданий по восьми созвездиям, счёт по истории матчей из Steam](https://madgodinc.net/assets/creepidota.png)

## mgi-pulse

> Открывает лог на два гигабайта за 2.8 секунды. (Rust · терминал)

Открывает лог на два гигабайта за 2.8 секунды и режет его языком запросов. Понимает одиннадцать форматов, вытаскивает поля регулярками, умеет нативный follow и перемотку по таймлайну.

Сделан под одну задачу: читать логи в терминале, без вебморды, без сервера и без предварительной индексации.

| | |
|---|---|
| Стек | Rust, ratatui |
| Форматов | 11, среди них NDJSON, logfmt, syslog, logback |
| Умеет | regex-извлечение, follow, таймлайн, язык запросов |
| Проверено | 2 ГБ и 11 млн записей |
| Лицензия | Apache-2.0 |
| Статус | v0.3.0, открытый код |

### How it works

Формат не спрашивается у пользователя, а определяется по первым двум сотням строк. Дальше поля раскладываются в типизированные колонки, поэтому по ним можно фильтровать и сортировать, а не просто искать подстроку.

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

Режим слежения сделан не через tail, а по номеру файла в системе, поэтому переживает ротацию: когда лог подменяют новым файлом, чтение продолжается без перезапуска.

### Install

Linux, готовый файл:

```sh
curl -L https://github.com/madgodinc/mgi-pulse/releases/latest/download/mgi-pulse-v0.3.0-x86_64-unknown-linux-musl.tar.gz | tar -xz
```

Через cargo:

```sh
cargo install --git https://github.com/madgodinc/mgi-pulse mgi-pulse
```

Запуск:

```sh
mgi-pulse app.log
```

Слежение: mgi-pulse --follow live.log. Из потока: tail -F live.log | mgi-pulse -

### Download

- [Linux x86_64, 1.6 МБ](https://github.com/madgodinc/mgi-pulse/releases/latest/download/mgi-pulse-v0.3.0-x86_64-unknown-linux-musl.tar.gz)

### Links

- [Репозиторий](https://github.com/madgodinc/mgi-pulse)
- [Все версии](https://github.com/madgodinc/mgi-pulse/releases)

### Screenshots

- [Два гигабайта, одиннадцать миллионов записей: таймлайн, вкладки по важности, типизированные колонки](https://madgodinc.net/assets/mgi-pulse.png)
- [Язык запросов: из одиннадцати миллионов строк остаётся двести тысяч](https://madgodinc.net/assets/mgi-pulse-dsl.png)

## Схематика

> Рисуете каркас страницы, модель получает его словами. (Один файл · работает офлайн)

Объяснять модели вёрстку текстом долго и неточно: «шапка сверху, слева картинка, кнопка пониже» каждый раз читается по-разному. Здесь каркас рисуется мышью, а на выходе получается описание, где у каждого блока есть тип, размер, положение и подпись.

Движение и оформление выбираются из библиотеки, а не сочиняются заново. Сорок один приём разложен по двенадцати разделам: появление, наведение, фон, текст, границы. Рядом восемь наборов оформления — от скруглённого до срезанного и рваного; они меняют форму и обрамление, но не двигают блоки, так что каркас остаётся тем же.

Выгрузок две, потому что читатели разные. Схема для модели несёт рабочий код каждого применённого приёма прямо внутри: модель не догадывается, что означает «выплывание снизу», а видит готовые правила. Отдельной кнопкой те же приёмы уходят обычными файлами стилей и скрипта, для человека.

| | |
|---|---|
| Стек | один HTML-файл, без сборки и зависимостей |
| Размер | 123 КБ, 3303 строки |
| Библиотека | 41 приём в 12 разделах, 8 наборов оформления |
| Выгрузка | схема для модели и отдельно стили со скриптом |
| Языки | русский и английский |
| Где работает | любой браузер, интернет не нужен |
| Статус | работает, открывается по ссылке ниже |

### How it works

Файл один намеренно. Инструмент, который надо ставить, обычно не доживает до второго применения: его скачивают, откладывают и забывают. Здесь достаточно открыть файл, поэтому он переживает пересылку в мессенджере и запускается на чужой машине без спроса у администратора.

В выгружаемую схему попадает только то, что применено в макете, а не вся библиотека: иначе модель получала бы четыре десятка неиспользуемых правил и тратила на них внимание. Список приёмов у блока хранится именами вроде fade-up, а не номерами, поэтому схема читается человеком без словаря.

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

### Install

Любая система:

```sh
Скачайте schematica.html и откройте двойным щелчком
```

Ставить нечего: ни сборки, ни зависимостей, ни интернета. Файл работает и с рабочего стола, и с флешки.

### Download

- [Один файл, работает офлайн, 123 КБ](https://madgodinc.net/schematica.html)

### Links

- [Открыть в браузере](https://madgodinc.net/schematica.html)

### Screenshots

- [Каркас лендинга: у каждого блока тип, размер и подпись, справа дерево, движение выбрано из библиотеки](https://madgodinc.net/assets/schematica.png)

## mgi-stream

> Читает чат трансляции вслух, прямо в эфир. (Electron · TikTok LIVE · OBS)

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

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

То же, что делает TikFinity, только на своей машине. Ни входа в аккаунт TikTok, ни ключа от чужого сервиса: приложение подключается к публичному чату комнаты так же, как браузер обычного зрителя.

| | |
|---|---|
| Стек | Electron, Node 22 |
| Чат | tiktok-live-connector, протокол Webcast |
| Голоса | нейросетевые голоса Microsoft Edge, без ключа и бесплатно |
| Фильтр | аудитория, префикс, чёрный и белый списки, шум |
| Вход в TikTok | не нужен, ни пароля, ни куки |
| Языки интерфейса | русский и английский |
| Лицензия | MIT |
| Статус | v0.2.0, открытый код, установщик под Windows |

### How it works

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

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

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

### Install

Windows:

```sh
Скачайте mgi-stream-setup.exe ниже и запустите
```

Больше на машине ничего не нужно: Node, Chromium и все зависимости уже лежат внутри файла. Сборка не подписана, поэтому SmartScreen предупредит при первом запуске: «Подробнее», затем «Выполнить в любом случае». Рядом портативная версия, ей не нужен и установщик.

Из исходников:

```sh
git clone https://github.com/madgodinc/mgi-stream.git && cd mgi-stream && npm install && npm start
```

### Download

- [Windows, установщик, 96 МБ](https://github.com/madgodinc/mgi-stream/releases/latest/download/mgi-stream-setup.exe)
- [Windows, портативный, 96 МБ](https://github.com/madgodinc/mgi-stream/releases/latest/download/mgi-stream-portable.exe)

### Links

- [Репозиторий](https://github.com/madgodinc/mgi-stream)
- [Все версии](https://github.com/madgodinc/mgi-stream/releases)

### Screenshots

- [Слева фильтр озвучки, справа чат: серые строки с причиной отказа рядом с ником, снизу адрес источника для OBS](https://madgodinc.net/assets/mgi-stream.png)

## RITM

> Ритм-игра в браузере, которая строит чарты из вашей музыки. (TypeScript · Canvas · Web Audio)

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

Сервер игре не нужен. Уровни, пластинки, сборники треков, пропуск сезона, магазин, рулетка и таблица лидеров считаются прямо в браузере, поэтому свежая копия играется сразу после npm install. Переключатель отправляет те же запросы на настоящий сервер, если он у вас есть; контракт расписан по адресам отдельным документом.

Вся картинка в комплекте нарисована скриптом: восемьдесят девять заглушек, от плиток и иконок до фигуры за пультом. Они держат экран читаемым и меняются на свои файлы того же размера, без единой правки в коде. Музыка своя: в репозитории лежат два демо-трека Кевина Маклауда под Creative Commons, остальное вы приносите и прогоняете через генератор.

| | |
|---|---|
| Стек | TypeScript, React, Canvas, Web Audio |
| Режимы | два: три дорожки со звёздами и четыре с плитками |
| Генератор чартов | Python, librosa, demucs |
| Прогресс | уровни, пластинки, сборники, пропуск, магазин, рулетка |
| Сервер | не нужен, контракт на него описан |
| Картинка | 89 заглушек, рисуются скриптом |
| Лицензия | Apache-2.0 |
| Статус | открытый код, играется из коробки |

### How it works

Ритм-игра это задача про часы, а не про графику. Песня ведётся по времени звуковой карты, а не по кадрам: кадр опаздывает на десяток миллисекунд, и на слух это уже мимо доли. Задержку конкретного устройства игра не угадывает, а меряет калибратором, и судит попадание по музыке, а не по тому кадру, в котором плитку успели нарисовать.

Удар барабана отличается от басовой ноты тем, что он широкополосный. Читать бочку прямо из низкой полосы заманчиво и неверно: на одном треке такой способ насчитал 4.37 бочки в секунду там, где музыка идёт в 2.32, а промежутки размазались по трети и семи шестнадцатым доли. Так не играет ни один барабанщик. Кандидаты поэтому берутся из огибающей всего барабанного стема, а полосы только говорят, какой барабан ударил.

Одна дорожка на один барабан звучит логично и не играется. Бочка стоит на каждом уровне сложности, поэтому строгая раскладка сажает до 84% чарта на левую дорожку, сериями до сотни и по девять нажатий в секунду одним пальцем. Это замерено, а не предположено. Раскладка разводит нагрузку на 39/30/30 по трём дорожкам, и самая длинная серия подряд становится четыре.

### Install

Из исходников:

```sh
git clone https://github.com/madgodinc/mgi-game-ritm.git && cd mgi-game-ritm && npm install && npm run dev
```

Больше ничего не нужно: игра поднимается локально и играется без сервера и без аккаунта.

Свой трек:

```sh
cd tools/chart && pip install -r requirements.txt && python build_chart.py tracks/my-song.mp3 --level normal --auto-drums -o charts/my-song.chart.json
```

Перед этим стоит развести барабаны через demucs: именно на них держится то, что плитка попадает в бочку, а не в басовую ноту. Порядок расписан в tools/chart/README.md.

### Links

- [Репозиторий](https://github.com/madgodinc/mgi-game-ritm)

### Screenshots

- [Обычный режим: три дорожки, длинная нота слева зажата, две плитки на подходе](https://madgodinc.net/assets/mgi-game-ritm.png)
- [Казуальный режим: четыре ряда, плитки встык, одна ошибка и забег окончен](https://madgodinc.net/assets/mgi-game-ritm-casual.png)
- [Общий хаб: уровень, золото, ячейки под пластинки и карусель треков](https://madgodinc.net/assets/mgi-game-ritm-hub.png)

---

Contact: https://t.me/madgodinc, mad.god.inc@gmail.com
