Перейти к содержимому

В браузере и на телефоне

Окно терминала
./bin/casty web

casty web спрашивает пароль хранилища ключей, затем отдаёт страницу на http://127.0.0.1:3390, которая читает из той же ноды и пишет через неё, что и другие команды. Она печатает ссылку с токеном; откройте её, чтобы связать браузер.

casty web on http://127.0.0.1:3390
open 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