Библиотека
📄
Получить материал в Telegram Подпишись на канал и заполни короткую анкету — конфиги откроются в нашем приложении
Открыть в Telegram →
Гайд · Workflow · Клиентские отчёты

PDF-отчёты клиентам за 30 минут вместо 12 часов

Один раз сел и прописал структуру отчёта — Claude Code запомнил. Каждый месяц одна команда «собери отчёт за май». HTML → Playwright SCALE=3 → PDF. Кейс: клиент $3M в DeFi, от дня работы к 30 минутам.

Формат: Кейс + шаблоны + код Время: ~30 минут на чтение Стек: Claude Code · Playwright · HTML · Chart.js Бюджет: Free (CC за $120 — уже есть)

Что внутри гайда

1

Memory один раз, потом не объясняй

1 час на первого клиента — потом работает вечно

Самая большая трата времени при регулярных отчётах — не сбор данных. Это объяснения. Каждый раз заново: какие разделы нужны, откуда брать цифры, в каком формате считать доходность. CC не помнит — ты объясняешь. CC не помнит — ты объясняешь снова. Это заканчивается один раз.

Создаёшь файл в memory один раз. Например: memory/clients/client-M.md. Прописываешь всё — разделы, источники данных, формулы, форматирование, тон. После этого CC знает всё о клиенте. В следующем месяце — команда из 5 слов. Ни вводных вопросов, ни итераций туда-обратно.

Полный memory-template

Скопируй и адаптируй под конкретного клиента. Один раз заполняешь — потом работает всё время, пока клиент с тобой.

# Client: M — Monthly Report Configuration
<!-- Версия: 1.0 | Создан: 2025-01-01 | Обновлён: 2025-01-01 -->

## Identity

- **client_id:** M
- **full_name:** [имя/псевдоним]
- **capital_usd:** 3_000_000
- **profile:** Опытный DeFi-инвестор, понимает механизмы протоколов
- **risk_tolerance:** medium-high
- **investment_horizon:** долгосрочный (3-5 лет)
- **primary_language:** ru
- **report_frequency:** monthly
- **report_day:** 1-е число каждого месяца

## Wallet Addresses

- **EVM main:** `0x...` (основной, Ethereum)
- **EVM L2:** `0x...` (Arbitrum, Optimism)
- **Solana:** [если есть]

## Report Sections (ordered)

1. Title Page — клиент, период, дата генерации
2. Executive Summary — 4-5 KPI крупно + 3 ключевых события месяца
3. Portfolio State — текущие позиции по протоколам и чейнам
4. Performance — динамика за месяц + сравнение с бенчмарком
5. Risk Overview — концентрация, IL, ликвидность
6. Rebalancing — target vs actual с отклонениями
7. Recommendations — приоритеты HIGH/MED/LOW на следующий месяц

## Data Sources

- **DeBank MCP** → текущий снапшот позиций (вызывать в начале)
- **Etherscan API** → on-chain activity за период (транзакции, gas)
- **Dune Analytics** → APY по LP-позициям, impermanent loss в USD
- **CoinGecko** → исторические цены для расчёта benchmark

## Formulas

### PnL (месячный)
pnl_usd = portfolio_end_usd - portfolio_start_usd - deposits_usd + withdrawals_usd
pnl_pct = pnl_usd / portfolio_start_usd * 100

### Benchmark comparison (ETH+BTC 50/50)
benchmark_return = (eth_end/eth_start - 1) * 0.5 + (btc_end/btc_start - 1) * 0.5
alpha = pnl_pct - benchmark_return * 100

### Target allocation deviation
delta_pct = actual_pct - target_pct
# Подсветить красным если abs(delta_pct) > 5%

### Impermanent Loss
il_usd = initial_lp_value_usd * il_ratio
# il_ratio взять из Dune по пулу

## Target Allocation

| Category     | Target % | Rebalance threshold |
|--------------|----------|---------------------|
| ETH staking  | 30%      | ±5%                 |
| DeFi LP      | 25%      | ±5%                 |
| Stablecoins  | 20%      | ±3%                 |
| BTC          | 15%      | ±5%                 |
| Altcoins     | 10%      | ±7%                 |

## Number Formatting

- Суммы: `$1,234,567.89` (USD, 2 знака после запятой)
- Проценты: `+12.34%` / `-3.21%` (знак обязателен, 2 знака)
- Даты: `DD.MM.YYYY` (01.05.2025)
- Большие числа: тысячи через запятую ($3,000,000)
- Отрицательные PnL: красный цвет, знак минус

## Tone & Style

- Профессиональный, конкретный, без воды
- Цифры важнее слов — в каждом абзаце есть число
- Рекомендации: конкретные действия, не «возможно стоит рассмотреть»
- Пример плохо: «портфель показал умеренные результаты»
- Пример хорошо: «портфель вырос на 4.7%, ETH benchmark +3.2%, alpha +1.5%»

## Report File Naming

- HTML: `report-client-M-{YYYY-MM}.html`
- PDF: `report-client-M-{YYYY-MM}.pdf`
- Папка: `reports/client-M/`

Структура финального HTML-отчёта

Setup-промпт для нового клиента

Создай файл memory/clients/client-M.md для нового клиента.

Используй этот шаблон как основу:
[вставь шаблон выше]

Данные клиента:
- Капитал: $3,000,000
- Адреса: 0x...
- Профиль: опытный DeFi-инвестор
- Бенчмарк: ETH+BTC 50/50
- Целевое распределение: ETH staking 30%, DeFi LP 25%,
  Stables 20%, BTC 15%, Altcoins 10%

После сохранения подтверди: "Memory для клиента M готова.
Следующая команда: собери отчёт за [месяц]."
Memory hierarchy в Claude Code: memory/clients/client-M.md — это project-level memory. CC читает её при каждом запросе в рамках проекта. Отдельный файл на каждого клиента. Глобальная memory (~/.claude/CLAUDE.md) — для общих правил форматирования и стека; project-level — для специфики клиента. Никогда не смешивай: иначе CC начнёт переносить детали одного клиента в отчёт другого.
2

«Собери отчёт для клиента M за май» → HTML

15–20 минут, ты не участвуешь

Первое число месяца. Открываешь CC, пишешь один промпт. Дальше ждёшь — CC работает сам. В этом весь смысл.

Ниже — полный месячный промпт. Его можно параметризовать: {{client_id}}, {{month}}, {{year}} — подставляй и отправляй. Промпт рассчитан на то, что memory-файл уже написан.

Monthly prompt template

Собери ежемесячный отчёт для клиента {{client_id}} за {{month}} {{year}}.

# Конфигурация
Читай все параметры из memory/clients/client-{{client_id}}.md:
разделы, источники данных, формулы расчётов, форматирование, тон.

# Сбор данных (последовательно)
1. DeBank MCP — снапшот текущих позиций:
   все кошельки из memory, все чейны, все протоколы
2. Etherscan API — on-chain activity за {{month}} {{year}}:
   входящие/исходящие, gas-расходы, новые протоколы
3. Dune Analytics — LP-позиции за период:
   APY по каждому пулу, impermanent loss в USD
4. CoinGecko — исторические цены ETH и BTC:
   первое и последнее число {{month}} для benchmark

# Расчёты
- Считай PnL по формуле из memory (realized + unrealized)
- Считай alpha vs benchmark ETH+BTC 50/50
- Считай отклонения от target allocation
- Суммируй IL по всем LP-позициям

# Выход
Создай файл reports/client-{{client_id}}/report-client-{{client_id}}-{{year}}-{{month_num}}.html
Используй Chart.js CDN для графиков (pie chart + line chart).
Используй Tailwind CSS CDN — никакой локальной сборки.
Все числа форматируй по правилам из memory.
Разделы в порядке из memory: Title Page → Executive Summary →
Current State → Performance → Risk → Rebalancing → Recommendations → Appendix.

По завершении выведи:
- путь к HTML-файлу
- 3 ключевых числа: PnL USD, PnL %, Alpha
- список найденных аномалий (если есть)

MCP-источники данных

Workflow первого числа месяца

  1. Отправляешь месячный промпт → CC начинает работу
  2. CC параллельно дёргает DeBank + Etherscan + Dune (15–20 минут — можно идти за кофе)
  3. CC генерирует HTML-файл с графиками и таблицами → открываешь в браузере
  4. Читаешь Executive Summary, проверяешь ключевые числа (обычно 1–2 правки формулировок)
  5. Пишешь CC правку → он исправляет за 30 секунд → HTML готов к конвертации

Фрагмент сгенерированного HTML

<!-- Executive Summary block -->
<section class="exec-summary">
  <div class="kpi-grid">
    <div class="kpi-card">
      <div class="kpi-label">Стоимость портфеля</div>
      <div class="kpi-value">$3,141,200</div>
      <div class="kpi-delta positive">+$141,200 с начала года</div>
    </div>
    <div class="kpi-card">
      <div class="kpi-label">PnL за май</div>
      <div class="kpi-value positive">+$47,300</div>
      <div class="kpi-delta positive">+4.7% / Benchmark +3.2% / Alpha +1.5%</div>
    </div>
    <div class="kpi-card">
      <div class="kpi-label">Лучший протокол</div>
      <div class="kpi-value">GMX</div>
      <div class="kpi-delta positive">+12.4% за месяц</div>
    </div>
    <div class="kpi-card">
      <div class="kpi-label">IL за май</div>
      <div class="kpi-value negative">-$2,340</div>
      <div class="kpi-delta muted">Uniswap V3 ETH/USDC</div>
    </div>
  </div>
</section>
Где CC косячит чаще всего: (1) даты — может написать «май 2024» вместо «май 2025», всегда проверяй заголовок; (2) форматирование чисел — иногда пишет 47300 вместо $47,300, нужен явный форматтер в memory; (3) Dune-запросы — если пул нестандартный, CC может не найти IL и написать «данные недоступны» — нужно указывать конкретный address пула в memory.
3

Playwright скриншот SCALE=3 — не page.pdf

30 секунд до готового файла клиенту

HTML согласован. Одна команда — и через 30 секунд у тебя PDF. Но только если делаешь через screenshot, а не через page.pdf(). Разница принципиальная.

Ниже — полный Python-скрипт. Он делает ровно то, что нужно: открывает HTML, ждёт загрузки шрифтов и Chart.js, снимает полностраничный скриншот с device_scale_factor=3, конвертирует PNG → PDF через Pillow. Работает на любом HTML-отчёте.

html_to_pdf.py — полный скрипт

#!/usr/bin/env python3
"""
html_to_pdf.py — конвертация HTML-отчёта в PDF через Playwright screenshot.

Использование:
  python html_to_pdf.py report-client-M-2025-05.html
  python html_to_pdf.py report.html --out custom-name.pdf --scale 3

Зависимости:
  pip install playwright Pillow
  playwright install chromium
"""

import argparse
from pathlib import Path
from playwright.sync_api import sync_playwright
from PIL import Image
import io


def html_to_pdf(html_path: str, out_path: str | None = None, scale: int = 3) -> str:
    src = Path(html_path).resolve()
    if not src.exists():
        raise FileNotFoundError(f"HTML not found: {src}")

    dst = Path(out_path) if out_path else src.with_suffix(".pdf")

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)

        # Устанавливаем deviceScaleFactor — это и есть SCALE=3.
        # Даёт тройную пиксельную плотность: текст и цифры острые при печати.
        context = browser.new_context(
            viewport={"width": 1200, "height": 900},
            device_scale_factor=scale,
        )
        page = context.new_page()

        # Открываем локальный HTML-файл
        page.goto(f"file://{src}", wait_until="networkidle")

        # Ждём загрузки Chart.js и шрифтов — критично для корректного рендера
        page.wait_for_timeout(2000)

        # Полностраничный скриншот — снимает весь документ, не только viewport
        png_bytes = page.screenshot(full_page=True)

        browser.close()

    # Конвертируем PNG в PDF через Pillow
    img = Image.open(io.BytesIO(png_bytes))

    # Переводим в RGB (PDF не поддерживает RGBA)
    if img.mode in ("RGBA", "LA", "P"):
        img = img.convert("RGB")

    img.save(str(dst), "PDF", resolution=300, save_all=False)
    print(f"PDF сохранён: {dst}  ({dst.stat().st_size // 1024} KB)")
    return str(dst)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="HTML → PDF через Playwright screenshot")
    parser.add_argument("html", help="Путь к HTML-файлу")
    parser.add_argument("--out", help="Путь к выходному PDF (по умолчанию: рядом с HTML)")
    parser.add_argument("--scale", type=int, default=3, help="deviceScaleFactor (default: 3)")
    args = parser.parse_args()

    html_to_pdf(args.html, args.out, args.scale)

Почему scale=3, а не 1 или 4

НЕ используй page.pdf() для отчётов с CSS-тенями, градиентами, Chart.js/Recharts-графиками и Google Fonts. Результат непредсказуем: кривые блоки, съехавшие пропорции, слетевшие цвета, пропавшие шрифты. Это не баг — это by design: page.pdf() использует print-режим браузера, который намеренно упрощает рендер для A4. Playwright screenshot снимает то, что видит пользователь — ровно то, что ты согласовал в браузере. Один-в-один.

7 проблем page.pdf() — симптомы и фиксы

  1. box-shadow исчезает или становится резким. Симптом: карточки с тенями в браузере → в PDF тень пропала или превратилась в чёрную рамку. Причина: Chromium print-mode отключает некоторые CSS-эффекты для оптимизации печати. Фикс со стороны page.pdf(): @media print { .card { box-shadow: none; border: 1px solid #eee; } } — но это меняет дизайн. Фикс Playwright screenshot: проблемы нет, рендерит как браузер.
  2. Градиенты теряют плавность (ступеньки). Симптом: linear-gradient в заголовках → видны 8–16 полос вместо плавного перехода. Причина: page.pdf() использует ограниченное цветовое пространство для градиентов. Фикс Playwright screenshot: рендер через GPU, полный цветовой диапазон.
  3. Chart.js / Recharts — съехавший aspect-ratio. Симптом: горизонтальный bar chart в браузере → в PDF сжат вертикально или обрезан. Причина: page.pdf() задаёт другой viewport до рендера; Chart.js пересчитывает размеры. Фикс Playwright screenshot: Chart.js уже отрендерен в нужных размерах до скриншота.
  4. Межстрочные интервалы схлопываются. Симптом: таблицы с line-height: 1.5 → в PDF строки слипаются, текст нечитаем. Причина: page.pdf() применяет print-stylesheet поверх основных стилей. Фикс Playwright screenshot: проблемы нет.
  5. Шрифты заменяются системными. Симптом: Inter/JetBrains Mono в браузере → в PDF Times New Roman или Arial. Причина: page.pdf() иногда не ждёт полной загрузки Google Fonts CDN. Фикс Playwright screenshot: wait_until="networkidle" + wait_for_timeout(2000) — надёжно.
  6. Многостраничные разрывы ломают блоки. Симптом: таблица разрезана пополам между страницами; график разрывается посередине. Причина: page.pdf() делит на страницы, не учитывая CSS page-break-inside: avoid. Фикс Playwright screenshot: одна длинная страница → нет разрывов, клиент скроллит.
  7. Прозрачность и blur теряются. Симптом: backdrop-filter: blur() / rgba() фоны → в PDF сплошной цвет или артефакты. Причина: ограниченная поддержка CSS-фильтров в print-режиме Chromium. Фикс Playwright screenshot: проблемы нет.

Альтернативы — что ещё пробовали

4

Структура «который не выглядит как Word»

Разделы, библиотеки, брендинг — всё что нужно для premium-документа

Отчёт в Word или Figma → клиент видит, что это «шаблон». HTML-отчёт с Chart.js и правильной типографикой → клиент видит продукт. Разница не в цене стека (оба бесплатно), а в том, как сделан макет.

Секции HTML-шаблона в порядке рендера

Выбор библиотеки для графиков

Брендинг и переменные стиля

/* CSS-переменные бренда — меняй только здесь */
:root {
  --brand-primary: #1F4F86;    /* основной цвет */
  --brand-accent: #8B5CF6;     /* акцент (CTA, badges) */
  --brand-positive: #16A34A;   /* рост, зелёный */
  --brand-negative: #DC2626;   /* убыток, красный */
  --brand-gold: #F59E0B;       /* предупреждение, highlight */
  --brand-bg: #F8FAFC;         /* фон страницы */
  --brand-card: #FFFFFF;       /* фон карточек */
  --font-main: 'Inter', -apple-system, sans-serif;
  --font-mono: 'JetBrains Mono', Menlo, monospace;
}
PDF — это не мобильник. Проектируй для бумаги: ширина 1200px, вертикальный скролл, никакого адаптива (он не нужен — PDF статичен). @media (max-width: 640px) в отчёте — лишний код. Клиент открывает PDF в Adobe Acrobat, Preview или печатает на A4. Таблицы должны помещаться по ширине. Шрифт — минимум 13px (=10pt в печати при 96dpi). Числа — минимум 15px, лучше 17–18px.
5

Что замерять для разных DeFi-портфелей

Не все клиенты одинаковые — метрики должны соответствовать стратегии

Ошибка — делать один шаблон на всех. Пассивный LP-фармер и активный трейдер смотрят на разные вещи. Прописывай нужные метрики в memory-файле клиента — CC будет собирать именно их.

DeFi-инвестор (capital allocation, $500K+)

Фокус: сохранение капитала + стабильный доход. Горизонт 12–36 месяцев.

Активный трейдер (DeFi perpetuals, spot, leverage)

Фокус: краткосрочный P&L, управление рисками позиций, win rate.

Passive Yield (staking, LP, lending, yield aggregators)

Фокус: стабильный доход, минимизация IL, риск протокола.

DAO / Treasury Management

Фокус: подотчётность перед участниками, диверсификация казны, runway.

Главное: метрики не универсальны. Прежде чем брать клиента, спроси «как ты сам оцениваешь успех месяца?». Ответ — это и есть его метрики, которые надо вшить в memory.
6

Сколько стоит месячный отчёт

Как упаковать и продать услугу, которая занимает 30 минут

Когда отчёт делается за 30 минут — соблазн поставить низкую цену. Это ошибка. Клиент платит не за твоё время. Он платит за экспертизу, за надёжность, за то что кто-то следит за его $3M портфелем. Ценность не уменьшилась от того, что инструменты ускорились.

Три тира с экономикой

Позиционирование — как продать

Договорные пункты — что включить в оферту

7

От нуля до первого PDF — 7 шагов

Один вечер настройки — потом работает само

Первый клиент занимает больше всего времени — примерно 2–3 часа. Второй — час (копируешь структуру). Третий — 30 минут (уже всё знаешь). Вот точный порядок шагов.

  1. Kickoff с клиентом (~30 минут). Собери все EVM-адреса (кошельки, cold storage, все чейны). Узнай target allocation: сколько % в чём хочет держать. Согласуй разделы: что хочет видеть в отчёте, что лишнее. Договорись о дне delivery (обычно 3–5 число месяца). Результат: вся информация для memory-файла.
  2. Создаёшь memory-файл (~20 минут). Скопируй шаблон из Шага 1 в memory/clients/client-X.md. Заполни: адреса, capital, target allocation, тон. Пропиши формулы (PnL, benchmark, IL) — важно сделать один раз правильно. Результат: CC знает всё о клиенте.
  3. Устанавливаешь стек (~15 минут, один раз). pip install playwright Pillowplaywright install chromium → сохрани скрипт html_to_pdf.py из Шага 3. Результат: конвейер HTML → PDF готов.
  4. Тестовый запрос без данных (~20 минут). Дай CC команду: «собери структуру отчёта для клиента X за тестовый период, данные не нужны — сделай заглушки». Проверь HTML: разделы на месте, форматирование правильное, Chart.js рендерится. Результат: шаблон HTML валидирован, можно запускать с реальными данными.
  5. Первый реальный отчёт (~30–45 минут CC + 10 минут ревью). Отправь месячный промпт из Шага 2. Дождись завершения, открой HTML в браузере. Проверь 5 точек: даты, ключевые числа (PnL, allocation), форматирование валют, Chart.js отображение, рекомендации. Результат: HTML-черновик.
  6. Review и правки (~10–20 минут). Отметь правки: обычно 1–3 (уточнить формулировку рекомендации, исправить число, добавить контекст). Скажи CC что править — он исправляет за 30–60 секунд. Результат: финальный HTML.
  7. Конвертация в PDF и отправка (~5 минут). python html_to_pdf.py report-client-X-2025-05.html → открой PDF, визуальная проверка (1 минута) → отправь клиенту (email/Telegram). Результат: отчёт у клиента, первый цикл закрыт.
Суммарно первый раз: 2–2.5 часа. Второй раз: 1 час. Третий и далее: 30–40 минут. Самый длинный шаг — kickoff с клиентом — он невыносим к автоматизации и это нормально: ты собираешь контекст, которого CC иначе никогда не узнает.
8

7 граблей с практики — и как их обойти

Большинство проблем решаются на этапе написания memory-файла

Ошибки в автоматизации отчётов делятся на два типа: те, что видит клиент (плохо), и те, что замечаешь только ты (терпимо). Ниже — оба типа, с фиксами.

  1. PDF разрывается посередине таблицы (клиент видит). Симптом: таблица в Reports разрезана между страницами — заголовок на одной странице, данные на другой. Причина: page.pdf() — или если используешь Playwright screenshot с жёстким разделением на A4. Фикс: Playwright screenshot = одна длинная страница без разрывов. Клиент скроллит PDF. Если нужны A4-страницы — добавь page-break-before: always вручную между разделами в HTML. Источник: feedback/pdf-one-page.md в памяти Тимура — именно про это.
  2. Дата в отчёте неправильная или локаль не та. Симптом: «May 2025» вместо «Май 2025», или «05/01/2025» вместо «01.05.2025». Причина: CC использует дефолтный locale, не следует правилам из memory. Фикс: прописать в memory явно: Dates: DD.MM.YYYY, no English month names, always Russian; в промпте всегда указывать месяц по-русски.
  3. Валюты без форматирования ($47300 вместо $47,300). Симптом: числа без разделителей тысяч, или смешанные форматы ($47,300 и 47300 в одном отчёте). Причина: CC генерирует числа без явного форматтера, особенно при расчётах. Фикс: добавить JS-форматтер в HTML-шаблон.
    // Вставить в <script> отчёта
    document.querySelectorAll('.currency').forEach(el => {
      const val = parseFloat(el.dataset.value);
      el.textContent = new Intl.NumberFormat('en-US', {
        style: 'currency', currency: 'USD', maximumFractionDigits: 0
      }).format(val);
    });
    Или: инструктировать CC через memory «форматируй все суммы через JS Intl.NumberFormat».
  4. Chart.js не отрисовался (пустой canvas). Симптом: в PDF — пустой белый прямоугольник вместо графика. Причина: Playwright сделал screenshot до загрузки Chart.js CDN или до инициализации canvas. Фикс: в html_to_pdf.py увеличить timeout: page.wait_for_timeout(3000) вместо 2000; добавить page.wait_for_function("typeof Chart !== 'undefined'").
  5. Google Fonts не загрузились — системный шрифт в PDF. Симптом: Inter/JetBrains Mono в браузере → Times New Roman или Arial в PDF. Причина: wait_until="networkidle" не всегда гарантирует загрузку шрифтов до render. Фикс: добавить page.wait_for_timeout(2000) ПОСЛЕ networkidle; или встроить шрифты как base64 в HTML (надёжнее, но увеличивает размер файла).
  6. Клиент получает «fo-case pattern» — отчёт без контекста. Симптом: правильные цифры, но Executive Summary написан без понимания ситуации клиента — «портфель вырос на 4.7%» без объяснения почему и что делать. Причина: CC генерирует механически по шаблону; в memory нет описания контекста портфеля. Фикс: в memory прописать «Recommendations must include: action + rationale + deadline. Never write generic statements like "consider rebalancing". Always name specific protocol, specific action, specific amount.» Источник: feedback/fo-case-pattern.md в памяти Тимура.
  7. Отчёт одностраничный — слишком компактный для клиента. Симптом: всё уместилось на 1–2 экрана в PDF, выглядит как краткая сводка, не как premium-документ. Причина: CC сгенерировал компактный HTML без структуры разделов; или все данные уместились в мини-таблицы. Фикс: в memory прописать минимальный объём: «Report must be 10–15 screens long when opened in browser at 1200px width. Each section on own screen. KPI cards must be large (min 80px height). Charts min 300px height.»; в промпте добавить «не сжимай». Источник: feedback/pdf-one-page.md в памяти Тимура.
Главный мета-урок: 80% проблем чинится не в коде и не в скрипте, а в memory-файле. Если CC косячит — значит чего-то в memory не хватает. Каждый косяк — это апдейт в memory/clients/client-X.md, который защищает от того же косяка на следующий месяц.

12 часов → 30 минут = 24× ускорение

Что меняется в экономике твоей работы

Маржа выросла не потому что ты поднял цену. Потому что ты перестал тратить время на работу, которую умеет делать машина. Твоё время теперь стоит в 16× дороже — при тех же деньгах от клиента.

Если взять $800 за Pro-отчёт и тратить 1.5 часа: $800 / 1.5 = $533/час. Добавь 10 таких клиентов ($8,000/мес) при суммарных 15 часах работы — это $533/час стабильного дохода без найма аналитиков и без ночных смен перед дедлайном.

Это не теория. Это арифметика: стоимость инструмента ($120/мес CC) несравнимо меньше добавленной стоимости ($8,000/мес возможный доход). Разницу — забираешь ты.

Бюджет на весь стек: Free. Claude Code $120/мес — уже есть, отдельных трат нет. Playwright — open source, бесплатно. Pillow — open source, бесплатно. DeBank/Etherscan/Dune — бесплатные планы покрывают ежемесячный отчёт по 1–3 клиентам. При масштабировании: Dune Pro ($349/мес) + Alchemy ($49/мес) = $398 при доходе $8,000+ = 5% overhead.

Забери memory-template + prompt + Playwright-скрипт + HTML-шаблон + пример PDF

Пришлю четыре файла: (1) полный memory-template клиента с заполненными разделами, (2) месячный prompt с переменными {{client_id}} {{month}}, (3) Python-скрипт html_to_pdf.py с SCALE=3, (4) HTML-шаблон отчёта с Chart.js — pie chart + line chart уже подключены. Забираешь и запускаешь на своём клиенте в тот же день.

Открыть в Telegram →
КОДОВОЕ СЛОВО · ПДФ