diff --git a/docs/texture_pipeline.md b/docs/texture_pipeline.md
new file mode 100644
index 0000000..7528794
--- /dev/null
+++ b/docs/texture_pipeline.md
@@ -0,0 +1,105 @@
+# Текстурные программы (TexturePipelineProgram)
+
+Текстурная программа — это строка, описывающая источник текстуры и цепочку операций
+над ней. Такие строки используются в `textures` моделей и компилируются
+`TexturePipelineProgram`.
+
+## Общая форма
+```
+[tex] [|> op(...)]*
+```
+`tex` в начале необязателен.
+
+## Базовые выражения
+- `name` или `"name.png"` — ссылка на текстуру из assets. Расширение .png/.jpg/.jpeg допустимо.
+- `anim(...)` — анимация из спрайт-листа (см. ниже).
+- `x <#RRGGBB|#RRGGBBAA>` — заливка цветом.
+
+Примеры:
+```
+stone
+tex "core:stone.png"
+32x32 "#FF00FF"
+```
+
+## Аргументы операций
+- Позиционные: `op(1, 2, "str")`
+- Именованные: `op(w=16, h=16)`
+- Значения: числа (uint32), строки в кавычках, либо идентификаторы.
+
+Цвета задаются `#RRGGBB` или `#RRGGBBAA`.
+
+## Операции пайплайна
+
+Операции без аргументов можно писать без `()`: `brighten` и т.п.
+В подвыражениях текстур (см. ниже) операции без аргументов нужно писать со скобками:
+`brighten()`.
+
+### Операции, принимающие текстуру
+- `overlay(tex)` — наложение с альфой.
+- `mask(tex)` — применение альфа-маски.
+- `lowpart(percent, tex)` — смешивание нижней части (percent 1..100).
+
+`tex` может быть:
+- именем текстуры: `overlay("core:stone")`
+- именованным аргументом: `overlay(tex="core:stone")`
+- вложенной программой: `overlay( tex stone |> invert("rgb") )`
+
+### Геометрия и альфа
+- `resize(w, h)` — ресайз до размеров.
+- `transform(t)` — трансформация (значение 0..7).
+- `opacity(a)` — прозрачность 0..255.
+- `remove_alpha` или `noalpha` — убрать альфа-канал.
+- `make_alpha(color)` — сделать альфу по цвету (цвет в `#RRGGBB`).
+
+### Цвет и яркость
+- `invert(channels="rgb")` — инверсия каналов (`r`, `g`, `b`, `a`).
+- `brighten()` — лёгкое осветление.
+- `contrast(value, brightness)` — контраст и яркость (-127..127).
+- `multiply(color)` — умножение на цвет.
+- `screen(color)` — экранный режим.
+- `colorize(color, ratio=255)` — тонирование цветом.
+
+### Анимация
+`anim` можно использовать в базе (с указанием текстуры) или в пайплайне
+над текущим изображением.
+
+База:
+```
+anim(tex, frame_w, frame_h, frames, fps, smooth, axis)
+```
+
+Пайплайн:
+```
+... |> anim(frame_w, frame_h, frames, fps, smooth, axis)
+```
+
+Именованные аргументы:
+- `tex` — имя текстуры (только для базового `anim`).
+- `frame_w` или `w`
+- `frame_h` или `h`
+- `frames` или `count`
+- `fps`
+- `smooth` (0/1)
+- `axis` — режим нарезки:
+ - `g` или пусто: по сетке (слева направо, сверху вниз)
+ - `x`/`h`: по горизонтали
+ - `y`/`v`: по вертикали
+
+Если `frames` не задан, количество кадров вычисляется автоматически:
+- сетка: `(sheet.W / frame_w) * (sheet.H / frame_h)`
+- ось X/Y: `sheet.W / frame_w` или `sheet.H / frame_h`
+
+Примеры:
+```
+anim("core:sheet", 16, 16, fps=8) # сетка по умолчанию
+anim("core:sheet", 16, 16, axis="x") # по горизонтали
+stone |> anim(16, 16, fps=10, smooth=1) # анимировать текущую текстуру
+```
+
+## Вложенные текстурные выражения
+Некоторые операции принимают текстуру в аргументах. Чтобы передать не только имя,
+но и полноценную программу, используйте префикс `tex`:
+```
+overlay( tex "core:stone" |> resize(16,16) |> brighten() )
+```