В браузере и на телефоне
./bin/casty webcasty web спрашивает пароль хранилища ключей, затем отдаёт страницу на http://127.0.0.1:3390,
которая читает из той же ноды и пишет через неё, что и другие команды. Она печатает ссылку с
токеном; откройте её, чтобы связать браузер.
casty web on http://127.0.0.1:3390open to pair a browser: http://127.0.0.1:3390/#token=<43 characters>Ctrl-C stops it; until then the app key stays unlocked in memoryЧтобы посмотреть на неё без ноды, pnpm demo:web запускает mock-ноду, добавляет ключ с тестовой
фразой, публикует один каст и отдаёт страницу на свободном порту, пока вы не нажмёте Ctrl-C.

Что делает страница
Заголовок раздела «Что делает страница»На странице есть команды CLI под теми же названиями.
| На странице | В терминале |
|---|---|
| Лента с номерами: ваши касты и касты аккаунтов, на которые вы подписаны, новые сначала | casty feed |
| mentions: касты, в которых вас упоминают, и ответы на ваши последние 25 кастов | casty mentions |
| Переключатели над ней: ответы вкл. или выкл. и по одному на приложение | --no-replies, --exclude-app |
| Нажатие на имя канала: только этот канал; повторное нажатие на фильтр: все | --channel |
| Нажатие на каст: каст, на который он отвечает, сам каст, ответы на него | casty thread |
| reply, recast, like, а в more: delete, open on farcaster.xyz, copy link | reply, recast, like, delete |
› cast something внизу: текст с @names как упоминаниями, необязательный канал, до двух ссылок |
cast --channel --embed |
| Нажатие на имя: касты этого аккаунта, приложения, через которые он публикует, подписка | clients --fid, follow, unfollow |
| Раздел о вас: ваш fid, custody-адрес, ключи приложений, хранилище, нода и часы | whoami, key list, storage, doctor |
| В разделе о вас «add a key with your wallet» (свёрнуто под «add another key», когда у этого casty уже есть ключ): новый ключ приложения, одобренный кошельком в браузере | casty init с seed-фразой |
| Подтверждённые адреса профиля, Ethereum или Solana, с копированием | |
| Поле поиска в разделе о вас: аккаунт по @name или fid | follow @name |
Черновик в поле нового каста переживает перезагрузку: браузер хранит его по тому, на что он отвечает, пока каст не уйдёт. Лента подгружает следующую страницу, когда её конец появляется в поле зрения, а кнопка «show more» остаётся для клавиатуры. На телефоне, если потянуть ленту вниз от её начала и отпустить, она обновится, поскольку у установленной страницы нет панели браузера, которую можно потянуть.
Каждый раз, когда страница рисует ленту или упоминания, она сохраняет их порядок, как это делает casty feed, так что
casty like 3 в терминале действует на каст с номером 3 на экране. Побеждает последний показанный список:
другой браузер или casty feed, casty mentions или casty thread в терминале перенумеровывают.
Ключ приложения от вашего кошелька
Заголовок раздела «Ключ приложения от вашего кошелька»Custody-адрес одобряет ключ приложения двумя подписями EIP-712, запросом ключа и
добавлением ключа; casty init подписывает их seed-фразой. Страница может вместо этого дать их подписать
кошельку: в разделе о вас «add a key with your wallet» просит у casty web новый ключ и два
сообщения, передаёт их кошельку в браузере (расширению-кошельку или странице, открытой во
встроенном браузере приложения-кошелька, eth_signTypedData_v4 поверх EIP-1193), проверяет, что аккаунт
кошелька — это custody-адрес, и отправляет подписи обратно; casty web проверяет их, отправляет
KEY_ADD через вашу ноду и сохраняет ключ, зашифрованным, как свой новейший. Seed-фраза
никогда не покидает кошелёк, а аппаратный кошелёк за расширением работает так же.
Чтобы начать вовсе без фразы, casty init --fid <fid> пишет конфиг по данным ноды, включая
custody-адрес, и не создаёт ключа; затем casty web спрашивает пароль для
хранилища, которое собирается создать, а страница добавляет первый ключ. Удаление ключа остаётся в
терминале (casty key revoke, с фразой или самим ключом).
Страница находит кошелёк так, как кошельки о себе объявляют (EIP-6963), поэтому несколько расширений
рядом не мешают, а window.ethereum служит запасным вариантом. Если кошелёк предлагает другой
аккаунт, а не custody, страница просит его дать вам выбрать нужный. Сообщения ключа
называют Ethereum mainnet, поэтому кошелёк в Base или OP Mainnet сначала просят переключиться (MetaMask
отказывается подписывать для другой сети, чем активная); переключение ничего не стоит. На телефоне без
кошелька в браузере страница предлагает ссылки, которые открывают её внутри MetaMask, Coinbase Wallet или
Trust Wallet, и кнопку, которая копирует ссылку для связывания, чтобы вставить её на странице там, и тогда
подписывает встроенный браузер кошелька. Ссылки не несут токена: каждая сначала идёт на сервер производителя
кошелька. Аккаунт, у которого custody —
это фраза восстановления Farcaster с farcaster.xyz, может один раз импортировать эту фразу в любой из этих
кошельков и никогда не вводить её в терминал.
Профиль показывает адреса, которые его аккаунт подтвердил как свои, Ethereum или Solana, по данным ноды: каждый ведёт на свой обозреватель (открывается только по нажатию) и копируется. Ваши тоже перечислены в разделе о вас. Ничего не читается из блокчейна.
Чтобы оставаться быстрой, страница переиспользует то, что прочитала с вашей ноды за последние 30 секунд, когда вы переключаете фильтр, показываете больше или возвращаетесь к виду. Всё, что вы пишете со страницы, сбрасывает это, как и refresh, перезагрузка страницы и нажатие на feed, mentions или you, пока они открыты; каст, сделанный в терминале, появляется при следующем refresh или при загрузке больше чем через 30 секунд. Перезагрузка страницы читает касты заново, но берёт ваш список подписок за последние десять минут; refresh читает и его, так что аккаунт, на который вы подписались в другом приложении, появляется сразу.
Пока страница открыта, она каждые две минуты и снова каждый раз, когда вы к ней возвращаетесь, спрашивает вашу ноду,
не упомянул ли вас кто-нибудь и не ответил ли на ваши последние 25 кастов с тех пор, как вы смотрели в последний раз.
Ответ показывается числом рядом с mentions, в заголовке вкладки и на значке страницы,
если вы установили её как приложение и браузер это позволяет. Открытие mentions сбрасывает его. Так же сбрасывает
casty mentions в терминале или mentions, открытые в другом браузере: casty помнит новейшее
показанное вам упоминание в своём каталоге конфига, а не в браузере. Первый счёт начинается с
момента, когда страница впервые спрашивает, так что упоминания до этого никогда не считаются новыми.
За неделю до того, как ключ приложения этого casty истечёт, об этом говорит уведомление под панелью; любой каст, лайк или подписка продлевает его. Поле нового каста считает байты. После 320 каст уходит как длинный каст, до 1024. Запись ждёт, пока у ноды не появится сообщение, как и в CLI; если она не удалась, страница показывает то же сообщение и подсказку, что напечатал бы CLI. Точка рядом с casty — это ваша нода: зелёная, когда синхронизирована, жёлтая, когда отстаёт, красная, когда не отвечает.
С клавиатуры: n новый каст, r обновить, j и k переход между кастами, l лайк, o или Enter
открыть, Esc закрыть, Ctrl-Enter или Cmd-Enter отправить.
Слово в правом верхнем углу задаёт тему: auto следует за системой, light и dark остаются такими, как выбраны в этом браузере. На телефоне на панели нет места ни для него, ни для refresh: тема находится в разделе о вас, а нажатие на feed, mentions или you, пока они открыты, перезагружает их.

Страница ничего не загружает с других сайтов. Она не показывает изображений и аватаров, а ссылка в касте открывается, только когда вы по ней переходите.
На телефоне
Заголовок раздела «На телефоне»./bin/casty web --listen 0.0.0.0:3390Это печатает ссылку для каждого IPv4-адреса, который есть у машины в сети, и QR-код
первой из них. Отсканируйте его телефоном в той же сети. Страницу можно добавить на домашний экран, и
тогда она открывается на весь экран; если там она показывает экран связывания, вставьте в него ссылку. Машина
должна оставаться включённой с запущенным casty web.
Соединение идёт по обычному HTTP. Любой, кто может наблюдать трафик в этой сети, может прочитать
токен и публиковать от вашего имени, пока вы не остановите casty web. Используйте сеть, которой доверяете, или подключите телефон и
машину к VPN, например WireGuard, и слушайте только на адресе VPN. Чтобы сделать недействительной каждую ссылку,
напечатанную раньше, остановите casty web и запустите его снова с --new-token.
Связанный браузер хранит токен для этого адреса и порта, скажем http://192.168.1.20:3390. В
другой сети тот же адрес может принадлежать чужой машине, и страница, открытая там
с домашнего экрана, передала бы ей токен. Если это могло случиться, запустите casty web с
--new-token.
Открытие ссылки помещает её, вместе с токеном, в историю браузера, а также в синхронизируемую историю, если браузер её синхронизирует. Удалите эту запись в браузере, которым вы пользуетесь не один.
--read-only пропускает пароль. Тогда страница читает и не может писать.
Ctrl-C останавливает casty web. Записи (касту, лайку, рекасту, удалению или подписке), которая ещё ждёт своего
сообщения, сначала дают завершиться, и терминал об этом сообщает; второй Ctrl-C останавливает сразу.
Чтобы открыть страницу из любой сети, а не только из той, в которой находится машина, запустите её вместо этого на хосте ноды за HTTPS, где упоминание или ответ могут ещё и прийти на телефон push-уведомлением: Из любой сети.
Как защищена страница
Заголовок раздела «Как защищена страница»- Она слушает на 127.0.0.1, если
--listenне говорит иного. - Каждый запрос к API несёт токен. Ссылка содержит его после
#, а эту часть браузер никогда не отправляет на сервер; страница переносит его в хранилище браузера и убирает из адресной строки, в том числе когда ссылка открыта во вкладке, где страница уже показана. - Токен лежит в
~/.config/casty/web-token, режим 0600, так что связанный телефон остаётся связанным между перезапусками. - Записи принимаются только как JSON, так что форма на другом сайте не может отправить данные на страницу.
- Запрос, у которого Host — не IP-адрес, не
localhostи не хост из--listen, отклоняется, так что сайт, который направляет свой домен на вашу машину, не может достучаться до страницы. - Страница выполняет только собственные скрипт и стили и вставляет текст каста как текст, никогда как HTML.
- Пока работает
casty web, ключ приложения расшифрован в памяти, как и на время одногоcasty cast.
Usage: casty web [options]
the feed, threads and a compose box in a browser, on this machine or a phone
Options: --listen <host:port> where to serve; 0.0.0.0:3390 lets a phone on the same network in (default: "127.0.0.1:3390") --new-token pair again; links printed before stop working --read-only do not unlock the app key; the page reads but cannot write --no-allow-fname-server look @names up with your node only; by default names it does not know are looked up on fnames.farcaster.xyz (public, no key) -h, --help display help for command