Пишите в настоящее время сейчас. Reedach подскажет, где лишнее.

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

Подключить GitHub npm i reedach · MIT

Здесь стиль проверяется прямо в вашем браузере, текст никуда не отправляется. Опечатки и морфологию находит сервер Reedach, его ставят у себя.

Всё, что мешает читать

Канцелярит

осуществляет доставку доставляет

Пустой глагол и отглагольное существительное заменяются одним глаголом.

Штампы

высочайшего качества

Фраза из рекламы звучит одинаково у всех. Заменить фактом: сколько, за какой срок, с какой гарантией.

Оценки и усилители

очень надёжный, уникальный

Оценка не даёт проверить утверждение. Назвать признак или цифру.

Паразиты времени

в настоящее время сейчас

Вступление о нынешнем времени ничего не добавляет. Убрать или назвать дату.

Тяжёлый синтаксис

который…, который…

Два «который» подряд, страдательный залог, длинные предложения и абзацы. Разбить, начать с того, кто действует.

Частые ошибки

согласно договора согласно договору

«Вообщем», «из за», «по приезду», «оплатить за». В подсказке сразу написано, как правильно.

Просторечия

ложит кладёт

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

Заимствования и жаргон

дедлайн срок

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

Паронимы

одел пальто надел пальто

Похожие слова с разным смыслом. Подсказка срабатывает только там, где ошибка однозначна: «одела ребёнка» не отмечается.

Плеоназмы

памятный сувенир сувенир

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

Типографика

"Стандарт" - модель «Стандарт» — модель

Прямые кавычки, дефис вместо тире и в диапазонах «10:00-18:00», лишние пробелы, «м2», «25-ый», непарные скобки и латинская буква внутри русского слова.

Опечатки

даволен доволен

Варианты исправления одним нажатием и свой словарь для слов автора.

У многих подсказок есть готовый вариант: нажмите на него, и слово заменится в тексте. Без нажатия текст не меняется. Для опечаток, морфологии и подбора формы слова в замене нужен сервер Reedach, остальное работает и в браузере.

Подсказка при наведении на подсвеченный оборот
Объяснение — при наведении на слово
Опечатка с вариантами исправления и кнопкой «Добавить в словарь»
Варианты для опечатки и свой словарь

Четыре способа подключить

Виджет на любую страницу

Подсветка ложится поверх текста в textarea, список замечаний обновляется, пока автор пишет. Нажатие на вариант заменяет слово в поле, Ctrl+Z отменяет замену. «Добавить в словарь» запоминает слово в браузере автора, а сайт может подключить своё хранилище. Интерфейс на русском и английском.

<script src="https://cdn.jsdelivr.net/npm/reedach-widget@0.6.2/dist/reedach.min.js"
        integrity="sha384-WC5xx+bGmCEZcBmEp0NXBYwuSuSL/M7jyMu4YGFh5km+xTxXMdgyAfhBN07jDnMs"
        crossorigin="anonymous" defer></script>

<textarea data-reedach
  data-reedach-endpoint="https://checker.example.ru/v1"
  data-reedach-key="ключ-сайта"
  data-reedach-format="markdown"
  data-reedach-panel="#hints"></textarea>
<div id="hints"></div>

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

Все атрибуты, кроме data-reedach, необязательны. Без data-reedach-endpoint проверка идёт только в браузере. Без data-reedach-panel список появится сразу под полем.

Ключ в коде страницы виден любому посетителю. Привяжите его на сервере к адресу своего сайта или отправляйте запросы через сервер сайта: тогда укажите в data-reedach-endpoint адрес своего посредника, а ключ не указывайте.

Из кода

import {attach} from 'reedach-widget';

const checker = attach(document.querySelector('textarea'), {
  endpoint: '/api/reedach',      // сервер Reedach или посредник; без него — только стиль
  format: 'markdown',            // 'text' (по умолчанию) или 'markdown'
  panel: document.querySelector('#hints'),
  disable: ['intensifiers'],     // выключить правила по id или целые категории
  dictionary: {                  // своё хранилище слов автора; по умолчанию — localStorage
    list: async () => ['Reedach'],
    add: async word => { /* сохранить у себя */ },
  },
  request: null,                 // своя функция запросов: вход по cookie, CSRF-токен и т. п.
});

checker.check();   // проверить сейчас
checker.stop();    // убрать подсветку и список

Оформление

Виджет не приносит своих цветов и шрифтов, оформление задаёт сайт:

::highlight(reedach-word)  { background-color: rgba(255, 61, 31, .15); }  /* слова и обороты */
::highlight(reedach-long)  { background-color: rgba(20, 20, 20, .06); }   /* длинные предложения и абзацы */
::highlight(reedach-spell) { text-decoration: underline wavy #ff3d1f; }   /* опечатки */
::highlight(reedach-active){ background-color: #ffc4b5; }                 /* место, куда перешли из списка */

Список и подсказка собраны из элементов с классами reedach-*. Готовый пример стилей для светлой и тёмной темы — в demo.css. Подсветка работает в Chrome и Edge 105+, Safari 17.2+, Firefox 140+, в старых браузерах будет только список замечаний. Все настройки — в README виджета.

Сервер с орфографией

docker run -d -p 3000:3000 \
  -e REEDACH_KEYS="длинный-ключ-сайта=https://ваш-сайт.ru; ключ-для-сервера-сайта" \
  ghcr.io/dimafaller-en/reedach

Образ собран для amd64 и arm64, весит 139 МБ, hunspell и словари уже внутри. Тексты не сохраняются и не пишутся в журнал. Страница-пример, как на скриншотах, открывается по адресу /demo/, если запустить сервер с -e REEDACH_DEMO=1.

Ключи: что это и откуда они берутся

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

  1. Сделайте два случайных ключа длиной от 16 символов. Подойдёт любой длинный набор букв и цифр, например:

    openssl rand -hex 24
  2. Передайте оба ключа серверу в REEDACH_KEYS через ;. К первому через = допишите адрес своего сайта, он будет для браузера. Второй оставьте без адреса, он для сервера сайта:

    REEDACH_KEYS="9f2c51d0e8a4b7c3f61e71a2=https://ваш-сайт.ru; 4b8de0a93c17f6b25d0c3f88"
  3. Ключ с адресом укажите виджету: data-reedach-key="9f2c51d0e8a4b7c3f61e71a2". Он будет виден в коде страницы, и это нормально: из браузера сервер примет его только со страниц ваш-сайт.ru.

  4. Ключ без адреса держите в секрете на сервере сайта и передавайте в заголовке Authorization: Bearer 4b8de0a93c17f6b25d0c3f88. С ним сервер не пустит запрос из браузера.

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

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

Запрос и ответ

curl https://checker.example.ru/v1/check \
  -H 'Authorization: Bearer ключ-для-сервера-сайта' -H 'Content-Type: application/json' \
  -d '{"text": "В настоящее время мы осуществляем доставку.", "ignore": ["Reedach"]}'
{"issues": [
  {"start": 0, "end": 17, "id": "time-parasite-start", "category": "time", "label": "Паразит времени",
   "message": "Вступление о нынешнем времени ничего не добавляет к предложению.", "fix": "…"},
  {"start": 21, "end": 42, "id": "weak-verb-noun", "category": "bureaucratese", "label": "Канцелярит",
   "message": "Пустой глагол плюс отглагольное существительное звучат казённо.",
   "fix": "Замените одним глаголом: не «осуществляем доставку», а «доставляем»."}
]}
ЗапросЧто делает
POST /v1/checkпроверить markdown, text или blocks; ignore — слова автора, disable — выключенные правила, checks — какие проверки запускать: spelling, morph, style
POST /v1/suggestварианты исправления: {"words": ["превет"]}, до 20 слов за раз
GET /v1/rulesвсе правила с категориями и объяснениями — для страницы настроек
GET /healthсервер работает; ключ не нужен

Ошибки: 401 — нет ключа, 403 — ключ не для этого сайта, 413 — слишком большой текст, 422 — неверные поля, 503 — сервер занят, повторить через Retry-After секунд.

Настройки

ПеременнаяПо умолчаниюЧто задаёт
REEDACH_KEYSобязательноключи доступа
PORT3000порт
HOST0.0.0.0адрес
REEDACH_MAX_BYTES200000максимальный размер запроса в байтах (200 КБ — около 100 тысяч знаков русского текста)
REEDACH_CONCURRENCY2сколько проверок идёт одновременно
REEDACH_QUEUE20сколько запросов может ждать; остальные получат 503
REEDACH_TIMEOUT20000сколько миллисекунд может идти одна проверка; дольше — 503
REEDACH_DEMO—1 — страница-пример по адресу /demo/

Полное описание полей и ответов — в README сервера.

Библиотекой в коде

Только стиль, без зависимостей, в браузере и Node:

npm i reedach
import {checkStyle, sourceBlocks, mergeIssues} from 'reedach';

const markdown = 'В настоящее время мы осуществляем доставку хлеба.';
const blocks = sourceBlocks(markdown);              // абзацы, пункты списков, заголовки
const issues = mergeIssues(blocks, {local: checkStyle(blocks)});

for (const it of issues)
  console.log(markdown.slice(it.start, it.end), '—', it.label, '—', it.message, it.fix);

start и end указывают на место в исходном тексте, поэтому замечание можно подсветить прямо в поле ввода. Блоки можно передать и без Markdown: checkStyle([{text: '…', kind: 'p'}]), где kind — p (абзац), li (пункт списка) или h (заголовок). Длину предложения и абзаца можно настроить: checkStyle(blocks, {maxSentenceWords: 25, maxParagraphWords: 120}).

Всё вместе — орфография, морфология и стиль — в Node, без отдельного сервиса. Нужен установленный hunspell:

npm i reedach-server
import {check} from 'reedach-server';

const {issues} = await check({
  markdown: 'В настоящее время мы осуществляем доставку.',
  ignore: ['Reedach'],            // слова автора: формы тоже принимаются
  disable: ['intensifiers'],      // выключить правило по id или целую категорию
});

Плагин для WordPress

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

Редактор WordPress: замечания подсвечены в тексте записи, справа панель Reedach со списком

В панели Reedach — список замечаний, нажатие выделяет фрагмент в тексте. Если у подсказки есть готовый вариант, под ней кнопка: она заменяет слово в записи, «Отменить» возвращает как было. Подсветка работает в заголовке записи, абзацах, подзаголовках, списках, цитатах и подписях. В «Настройках → Reedach» администратор выбирает, какие виды подсказок показывать авторам.

Установите из каталога WordPress: «Плагины → Добавить новый», поиск «Reedach». Или скачайте reedach-wordpress-X.Y.Z.zip из последнего релиза и загрузите в «Плагины → Добавить новый → Загрузить плагин». Нужны WordPress 6.5+ и PHP 7.4+. Лицензия плагина — GPL-2.0-or-later.

Опечатки ищет hunspell

Hunspell — открытая программа проверки орфографии, на которой работает проверка в LibreOffice и Firefox. Reedach не встраивает её в свой код, а запускает отдельной программой на вашем сервере, поэтому текст не уходит в чужие сервисы.

Словари

Русский — dictionary-ru на основе словаря Александра Лебедева, английский — dictionary-en на основе SCOWL. Оба подключены сразу, поэтому английские слова в русском тексте не считаются ошибками. Русскому словарю много лет: новых слов и заимствований в нём может не быть. Для них есть слова автора.

Что проверяется

Слова из букв, в том числе через дефис. Пропускаются ссылки, адреса почты, аббревиатуры заглавными буквами, слова с цифрами, однобуквенные слова и английские сокращения вроде isn't.

Слова автора

Список ignore в запросе или «Добавить в словарь» в виджете. Формы тоже принимаются: если у слова та же основа и после неё не больше пяти букв. У глаголов основа считается без -ть и -ться. Правило работает для слов от пяти букв. В hunspell эти слова не добавляются, поэтому сервер ничего не запоминает между запросами.

Как устроено

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

  • Ошибки находит короткий запуск hunspell -l на каждый запрос: тысячи слов за доли секунды.
  • Варианты подбирает один постоянно запущенный hunspell -a: примерно 0,3 секунды на слово, до пяти вариантов. Сразу они приходят только для первых десяти ошибок, на всё отводится не больше трёх секунд. Остальные можно запросить через /v1/suggest, когда автор нажмёт на слово. Готовые ответы запоминаются для 5000 слов.

Безопасность

В постоянный hunspell уходят только слова из букв, каждое отдельной строкой со служебным знаком в начале, поэтому никакой текст не станет командой. Слова идут по одному, и ответы разных запросов не перепутаются. Зависший процесс убивается и запускается заново, а после 2000 слов перезапускается в любом случае.

Установка

В Docker-образе hunspell уже есть. Для пакета reedach-server поставьте его сами: apk add hunspell в Alpine, apt install hunspell в Debian и Ubuntu, brew install hunspell на macOS. Словари ставятся вместе с пакетом из npm.

82 правила в 27 категориях

Правила лежат в packages/core/src/rules.js. У каждого есть категория, объяснение, совет и список слов:

{id: 'bureaucratese-verbs', category: 'bureaucratese',
 message: 'Канцелярский оборот звучит как отписка и скрывает суть.',
 fix: 'Заменить простым глаголом или словом: делать, для, чтобы, это.',
 words: ['осуществл*', 'имеет место', 'в рамках', 'в целях', 'с целью', /* … */]},

Звёздочка в конце слова означает «любое окончание»: осуществл* найдёт «осуществляет», «осуществление» и «осуществлять». Правило с start: true срабатывает только в начале предложения, как «В настоящее время». Любое правило или целую категорию можно выключить через disable.

Это простые подсказки. Проверка ищет по словарю и простым правилам, поэтому иногда ошибается и не заменяет редактора.

Источники и лицензии

Правила и формулировки подсказок написаны для проекта. Идеи взяты из открытых статей об информационном стиле: Максим Ильяхов, Бюро Горбунова и другие авторы. Тексты статей в проект не копировались.

Часть пар «англицизм → русское слово» выписана из открытого набора ru_anglicism (Apache-2.0), список паронимов сверен со словариком ФИПИ для ЕГЭ, идеи части проверок типографики взяты из typograf (MIT). Пояснения и регулярные выражения написаны для Reedach.

Ядро reedach не содержит сторонних зависимостей. Сервер использует их так:

КомпонентЛицензия
Az.js — морфологический анализMIT
Словари Az.js — данные OpenCorpora, сборка pymorphy2CC BY-SA
dictionary-ru — словарь hunspell, © 1997–2008 Alexander I. LebedevBSD-3-Clause
dictionary-en — словарь hunspell на основе SCOWLMIT AND BSD
hunspell — запускается как отдельная программаGPL-2.0 / LGPL-2.1 / MPL-1.1 на выбор

Шрифты этой страницы — Literata и Golos Text, логотип набран Instrument Serif; все три под лицензией SIL OFL.

Разработка

npm ci
npm test

Для тестов орфографии нужна программа hunspell. Если её нет, эти тесты пропускаются. Новая версия выходит по тегу vX.Y.Z: GitHub прогоняет тесты, публикует пакеты в npm и собирает образ.

История версий

Все пакеты Reedach выходят с одним номером версии: reedach, reedach-widget, reedach-server, Docker-образ и плагин для WordPress.

0.6.2 — 7 ноября 2026

Версии 0.6.0 и 0.6.1 в npm не публиковались (0.6.1 есть только на GitHub и в ghcr: публикацию в npm сорвал сбой журнала подписей). В 0.6.2 те же изменения и исправленные цвета меток в демо виджета.

0.5.0 — 7 ноября 2026

0.4.0 — 24 октября 2026

0.3.3 — 16 октября 2026

0.3.2 — 13 октября 2026

0.3.1 — 12 октября 2026

0.3.0 — 12 октября 2026

0.2.0 — 12 октября 2026

0.1.2 — 12 октября 2026

0.1.1 — 12 октября 2026

0.1.0 — 12 октября 2026

Релизы с архивом плагина — на GitHub.

A style checker for Russian text

Reedach checks Russian text for bureaucratese, clichés, filler and vague words, heavy syntax, common mistakes, typography and typos, and shows hints right in a textarea as you type. It runs in the browser or on your own server, and the text never leaves it.

MIT license. Source code on GitHub.