Skip to main content
Glama
ddyy

tokenarchive

by ddyy

tokenarchive

Ежедневные снимки вашего использования ИИ при написании кода — хранятся вечно.

Панель: состояние по устройствам, итоги и ежедневная стоимость с течением времени

ccusage может рассказать, сколько вам обходятся Claude Code, Codex, Gemini и другие, — но лишь настолько, насколько хватает логов на вашей машине, а эти логи ротируются. tokenarchive делает снимок отчёта ccusage раз в день, хранит каждый снимок как JSON-архив только на добавление и строит по нему панель. При желании Cloudflare Worker хранит копию архива вне вашей машины, под защитой passkey.

Всё здесь построено на двух принципах:

  • Ничто никогда не стирается. Снимки и есть архив; любая база данных — производная копия, которую можно пересобрать из них.

  • Отсутствие никогда не сообщается как ноль. День без снимка сам говорит об этом. Значение $0.00 утверждало бы, что мы посмотрели, а вы ничего не потратили.

Быстрый старт (macOS)

npx tokenarchive

Установщик запрашивает имя устройства и опциональный URL Worker, размещает среду выполнения в ~/.local/share/tokenarchive/app, планирует ежедневное задание (23:50, плюс при каждом входе в систему — скрипт идемпотентен), позволяет security запросить ingest-токен, так что тот никогда не попадает в руки установщика, и проверяет всё одним реальным запуском. Повторный запуск перенастроит его в любое время; --uninstall удаляет всё, кроме вашего архива.

Снимки попадают в ~/.local/share/tokenarchive/{device}/{date}.json. Чтобы попробовать один раз, ничего не устанавливая:

git clone https://github.com/ddyy/tokenarchive && cd tokenarchive && ./snapshot.sh

Другие платформы: переносимо всё, кроме связующего кода для планировщика. sync.js, импортёр и панель — это обычный Node; перенесите snapshot.sh на systemd-таймер или cron-задание, и остальное последует.

Related MCP server: opencode-export

Панель

generate-dashboard.js создаёт один самодостаточный HTML-файл — без фреймворка, без сервера, без внешних запросов. Сначала он импортирует новые снимки в локальную модель чтения SQLite (import-snapshots.js), так что перегенерация инкрементальна.

Каждая панель — это фильтр: щёлкните или проведите по моделям, устройствам, агентам, дням или биллинговым окнам — и остальная часть страницы последует (⌘ добавляет к выделению, ⇧ расширяет его). Фильтры сочетаются между измерениями по И и живут во фрагменте URL, так что вид можно добавить в закладки.

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

Детали при наведении на строку

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

Полоса покрытия

Несколько устройств

Архив разделён по устройствам уже на уровне файловой системы: снимки лежат в {data}/{device}/{date}.json, каждая строка базы данных несёт устройство, а импорт работает только через upsert. Поэтому машины никогда не сливаются и не затирают друг друга, а всё, что помещает файлы обеих машин в один каталог данных, даёт объединённый архив — Worker, синхронизируемая папка или скопированный каталог работают одинаково.

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

Worker ниже — это способ сделать это без перемещения файлов вручную.

Worker (опционально, рекомендуется)

Каталог worker/ — это Cloudflare Worker, который принимает отправку снимков и отдаёт ту же панель из D1, под защитой WebAuthn-passkey. Исходные снимки хранятся в R2 без изменений — именно это делает его резервной копией, а не представлением: /admin/replay может пересобрать D1 из бакета без вашего ноутбука. Инструкции по развёртыванию из пяти команд см. в worker/README.md.

После развёртывания зарегистрируйте passkey на /auth/ — первый passkey закрепляет архив за собой; для добавления passkey другого устройства требуется вход в систему. Затем создайте на /admin ingest-токен для устройства (при показе токена приводятся инструкции по настройке), и ежедневное задание снимков будет отправлять данные автоматически. Машина, которая никогда не синхронизировалась, ничего не потеряла: файлы на диске и есть архив, а следующая успешная синхронизация всё наверстает. Устаревшие отправки не могут затереть новые данные — ingest сохраняет самый новый снимок.

/admin управляет остальным: ingest-токенами и токенами MCP только для чтения (показываются один раз, отзываются по каждому устройству), ротацией сессионных ключей, перечнем снимков и /admin/replay, который пересобирает D1 из оригиналов в R2.

Чтобы добавить вторую машину, запустите там установщик с тем же URL Worker и выпустите для неё собственный ingest-токен — токен принимает данные только от имени того устройства, для которого был выпущен, поэтому одна машина не может писать как другая, и отзыв одного токена никогда не затрагивает остальные.

MCP

Спросите своего агента о вашем собственном использовании. Два сервера, одни и те же четыре инструмента только для чтения (usage_summary, usage_by_project, usage_by_day, archive_health), одна общая реализация:

  • Локальный, поверх SQLite-архива на этой машине:

    claude mcp add tokenarchive node /path/to/tokenarchive/mcp-server.js
  • Удалённый, обслуживается Worker на /mcp для машин, у которых нет архива. Выпустите токен mcp на /admin, затем:

    claude mcp add --transport http tokenarchive https://YOUR-WORKER/mcp \
      --header "Authorization: Bearer YOUR-TOKEN"

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

Конфигурация

Всё можно переопределить переменной окружения, ничего не требуется:

Variable

Default

TOKENARCHIVE_DATA

~/.local/share/tokenarchive

TOKENARCHIVE_DB

{data}/tokenarchive.db

TOKENARCHIVE_DEVICE

короткое имя хоста

TOKENARCHIVE_URL

не задана — без синхронизации

TOKENARCHIVE_TOKEN

не задана — читается из связки ключей входа (tokenarchive-ingest)

Тесты

bash test/run.sh

Большинство наборов тестов изолированы. Три набора (static, interaction, tooltip) запускаются против панели, которую вы сгенерировали последней, в ~/.local/share/tokenarchive/index.html, поэтому им нужен настоящий архив на машине — сначала один раз выполните снимок.

Лицензия

MIT

Related MCP Connectors

Related MCP Servers