Перейти к содержимому
casty web на ноутбуке в тёмной теме и на телефоне в светлой теме

casty

Ваша собственная read-нода Farcaster и клиент, который читает из неё и пишет через неё. Три команды, без API-ключей, без газа.
Окно терминала
git clone https://github.com/castyfun/casty.git && cd casty
./scripts/0-provision.sh # (0) compute: a server with a 2 TB volume, or --host user@ip for your own
./scripts/1-node.sh # (1) a Snapchain read node: installed, synced, with a tunnel to it
./scripts/2-client.sh # (2) a client: casty, an app key for your account, your feed from your node

Три команды: (0) вычислительные ресурсы, (1) read-нода, (2) клиент. ./scripts/deploy.sh выполняет все три разом, а Весь путь объясняет каждый шаг и протокол, на котором он держится.

Вертикальная версия, 59 с

casty ставит read-ноду Snapchain, полную копию Farcaster, на хост, которым вы управляете, и даёт вам клиент, который ни с чем больше не общается: команду для терминала и страницу для браузера и телефона. Ваша лента, упоминания и треды читаются с вашей ноды; ваши касты, ответы, лайки, рекасты и подписки уходят через неё. Между вами и сетью нет хостингового API, поэтому не нужно получать API-ключ и не во что упираться по лимиту запросов.

Сервер с томом 2 ТБ и файрволом у Hetzner или AWS, Snapchain на нём, клиент на вашей машине и страница на хосте за HTTPS. Нода синхронизируется несколько часов.

Окно терминала
git clone https://github.com/castyfun/casty.git && cd casty
./scripts/deploy.sh --fid <your fid> --domain node.example.org

Уже есть машина с Linux и 2 ТБ свободного места? Добавьте -- --host user@ip.

Без сервера: casty подключается к любой ноде Snapchain, вашей на другой машине или публичной, и запоминает её. Готово за минуту.

Окно терминала
git clone https://github.com/castyfun/casty.git && cd casty
./scripts/2-client.sh --node https://snap.farcaster.xyz:3381 --fid <your fid>

Затем ./bin/casty web и в разделе «you» «add a key with your wallet».

Вставьте один промпт в Claude Code, Codex, Cursor или другой агент для программирования. Он читает llms.txt, спрашивает, какой из двух вариантов вам нужен, и никогда не просит вашу seed-фразу.

Set up casty for me: https://github.com/castyfun/casty.
Read https://castyfun.github.io/casty/llms-full.txt first.
...

Чтение идёт с вашей ноды, поэтому лента работает так быстро, как машина, на которой нода запущена. Записи подписываются на вашей машине ключом приложения, который есть только у casty, и ваша нода передаёт их валидаторам. Ключ добавляется одним подписанным сообщением, которое одобряет ваш кошелёк в браузере: без транзакции, без газа, без Ethereum RPC.

  • Три скрипта и одна команда. 0-provision.sh арендует сервер или проверяет ваш, 1-node.sh ставит Snapchain и ждёт его синхронизации, 2-client.sh ставит casty и добавляет ключ. deploy.sh запускает их по порядку и продолжает с того места, где запуск остановился.
  • Клиент для терминала. casty feed, casty cast, casty like 2: простой текст для вас, --json для скриптов, номера, которые переходят из одной команды в следующую.
  • Страница для браузера и телефона. Лента, треды, упоминания, профили и поле для нового каста, в светлой и тёмной теме, с сочетаниями клавиш на ноутбуке и установкой на домашний экран на телефоне.
  • Ваша нода откуда угодно. casty serve ставит страницу на хост ноды за HTTPS, с индексом ленты, который отвечает сразу, и push-уведомлениями об упоминаниях и ответах.
  • Ключи на виду. Каждый ключ приложения вашего аккаунта, что он может подписывать, когда он истекает, и отзыв из терминала или самим ключом.
  • Проверено без ноды. Mock-нода Snapchain проверяет каждую подпись, так что клиент, скрипты и страница проходят свои проверки офлайн в CI.
$ casty feed --limit 3
1 @casty-test · 0s · via casty
Reading the feed from my own node. No API key, no rate limit.
2 @user-2000000002 · 22d · via app-alpha
@casty-test thanks for the pointer, it worked.
https://example.com/2000000002/3
3 @user-2000000011 · 22d · via app-beta
Reading the Snapchain docs on a train. A good way to spend an hour.
$ casty like 2
liked 2000000002:0x973d398ad75e1f25fa780085f3c22d30b01d2504
  • Тестовый аккаунт Farcaster: fid хотя бы с одним storage unit и кошелёк, в котором есть адрес, на который он зарегистрирован, или seed-фраза этого адреса. casty использует фразу один раз, чтобы подписать запрос ключа, и никогда не записывает её на диск.
  • Хост. Либо учётные данные Hetzner Cloud (HCLOUD_TOKEN и CLI hcloud) или AWS (AWS CLI v2 и профиль или ключ доступа), либо SSH-доступ к уже имеющейся у вас машине, на которой работает Docker. Для последнего случая см. Нода дома.
  • Пара SSH-ключей, по умолчанию ~/.ssh/id_ed25519 и ~/.ssh/id_ed25519.pub.
  • На вашей машине: ssh, curl и jq. Node.js 22.12 или новее нужен, только чтобы собрать клиент самому (2-client.sh --from-source). Работают macOS и Linux; в Windows запускайте скрипты в WSL2.

Хосту ноды нужно то, что требует Snapchain: 16 ГБ RAM, 4 vCPU, 2 ТБ свободного диска и публичный IP (getting started). На арендованном хосте шаг 0 выбирает сервер и том, а шаг 1 проверяет хост, прежде чем что-либо ставить.

Дольше всего длится шаг 1: при первом запуске нода скачивает снимок в несколько сотен ГБ, затем догоняет блоки, вышедшие после этого снимка. Рассчитывайте на часы. 1-node.sh ждёт и после каждой проверки печатает, насколько нода отстаёт. Ctrl-C завершает только ожидание; нода продолжает синхронизацию, а ./scripts/1-node.sh status --wait снова начинает ждать.

casty не знает цен вашего провайдера. Настоящий запуск 0-provision.sh перечисляет сервер, том и файрвол, которые он собирается создать, сообщает, что за них выставляется счёт, пока вы их не удалите, и продолжает только после того, как вы введёте имя сервера. ./scripts/0-provision.sh --destroy удаляет все три.

В репозитории есть mock-нода Snapchain, которая отдаёт тот же HTTP API из фикстур и проверяет подписи каждого присланного ей сообщения. С ней весь клиент работает офлайн:

Окно терминала
pnpm install --frozen-lockfile
pnpm demo

pnpm demo запускает mock-ноду на свободном порту, добавляет ключ приложения с тестовой фразой BIP-39 test test test test test test test test test test test junk, читает ленту с кастами одного приложения и без них, публикует каст, ставит лайк одному и в конце удаляет свой временный конфиг. Fid в фикстурах начинаются с 2000000001 и никому не принадлежат.

pnpm demo:web делает ту же подготовку, а затем отдаёт casty web, страницу для браузера и телефона, на свободном порту, пока вы не нажмёте Ctrl-C.

Usage: deploy.sh [--domain <name> | --tailscale] [--read-only] [--fid <fid>] [--from-source]
[--env <file>] [--yes] [--dry-run] [-- <0-provision.sh options>]
Runs, in order: 0-provision.sh (unless --env's file already describes a host; with --domain,
again on that host to open 80 and 443), 1-node.sh (the node, the wait for its sync, the
tunnel), 2-client.sh (the client, an app key, the feed) and, with a front named, 1-node.sh
serve. Every step is safe to run again: the same command picks up where a run stopped.
--domain <name> serve the page on the host as https://<name> (Caddy; opens 80 and 443)
--tailscale serve it as the host's name on your tailnet instead
--read-only a page that reads only: no app key or passphrase leaves this machine
--fid <fid> no seed phrase: 2-client.sh --fid; add the key in ./bin/casty web with your
wallet, then run the same command again for the page on the host
--from-source build the client here with Node and pnpm instead of downloading it
--env <file> node.env to write or read (default: node.env)
--yes do not ask before creating anything
--dry-run print what provisioning and the node would run; the client is skipped
-- <options> passed to 0-provision.sh, e.g. -- --provider aws --region eu-west-1
Exit codes: 0 ok, 2 bad arguments, otherwise the code of the step that stopped.

Начните с 0. Подготовка хоста. Если хотите знать, что скрипты настраивают, прежде чем их запускать, прочитайте Read-ноды и валидаторы и Custody-адрес и ключи приложений. Безопасность перечисляет каждый задействованный секрет и как отозвать каждый из них.