Skyshare 更新履歴

1.5.5

Patch Changes

  • SkyThrowの紹介ページの作成・リンクの追加
    • Bluesky投稿専用クライアント「SkyThrow」の紹介をトップページおよび個別紹介ページを作成しました。
    • 「SkyThrow」の更新に合わせてアプリページでの案内通知、および内容の更新をしていきます。

1.5.4

Patch Changes

  • WebShareAPIが使えなかった場合に備え、本文をクリップボードにコピーする処理を追加しました。
    • Android環境で画像とテキストが同時に利用できない暫定対処として、共有時に本文をクリップボードへコピーする処理を追加しました。
    • 原因の特定・問題の対処が終了するまでは、お手数ですがXアプリへテキストの貼り付けをお願いいたします。
  • WebShareAPIをBluesky投稿前に実行するように変更しました。
    • 共有メニューでアプリ版Xを開いて投稿するをONにした際、共有が完了してからBlueskyへ投稿するように変更しました。
    • これにより、共有をキャンセルした場合にBlueskyにのみ投稿される事象が起こらなくなります。
  • メッセージラベルをオーバーレイで表示するようにしました。
    • 処理ステータスがよりわかりやすいよう、ステータスをオーバーレイして表示するように修正しました。
    • エラー時のトラブルシュートに役立てるため、従来の位置のラベルも残しています。

1.5.3

Patch Changes

  • 共有メニュー(アイコン)でアプリ版Xへ投稿をコピーするから共有メニュー(アイコン)でアプリ版Xを開いて投稿するに変更しました。
    • 説明の際は共有メニューでアプリ版Xを開いて投稿すると表記します。
  • 共有メニューでアプリ版Xを開いて投稿するオプションのON/OFF時、ブラウザで利用可能かを判定するようにしました
    • 共有メニューでアプリ版Xを開いて投稿するオプションを実行する際、トグルスイッチを押した時点で可能であるかどうかを判定、不可能な場合はエラーを出力するように修正しました。
    • WebShareAPIが無効ではないが、一部の機能が使えない場合(具体的にはnavigator.share !== undefined && navigator.canShare({...}) == false、エラーログを出した上でオプション自体は有効になるようになっています。
      • Android上で画像添付時は本文が抜け落ちるといった事象が発生しており、これに対しての切り分けとしての対応になります。
        • Android端末をご持参の方のフィードバック協力に感謝いたします。
  • Xの投稿はアプリを強制的に起動するの削除予定を解除し、名称を変更しました。
    • 共有機能によるXアプリの実行では一部オプションが使用できず、これまで通りアプリを起動するオプションはあったほうが良いとのフィードバックを受け、削除予定を解除しました。
    • Xの投稿はアプリを強制的に起動するからデバイス固有URLを用いてポップアップを実行するに名称を変更しました。

1.5.2

Patch Changes

  • トグルの内容を改善しました
    • 共有メニューからXへを開くから共有メニュー(アイコン)でアプリ版Xへ投稿をコピーするに変更しました。
    • Xを自動でポップアップするからブラウザ版Xを自動でポップアップするに変更しました。

1.5.1

Patch Changes

  • 画像やURL添付がない場合、skyshareのURLが添付されてしまう問題を修正しました
    • WebShareAPIを利用する際に、URLの設定や画像の添付がない場合にskyshareのURLが入ってしまっていました。
      • テスト漏れです。画像添付送信のチェックしかできていませんでした。ご不便おかけしました。

1.5.0

Minor Changes

  • オプション名を変更しました。
    • Xを自動で開くXを自動でポップアップする
  • WebShareAPIに対応し、Xへの画像データの直接受け渡しが可能になりました!
    • 共有メニューからXを開くオプションが選択可能になりました。
      • 共有メニューが開くのでXを選択してください。
      • この方法で対応をした場合、画像をXアプリへ直接転送可能になります。
    • これをONにすると以下のオプションが強制的に変更されます。
      • Xを自動でポップアップする(Xを自動で開く)がOFFになります。共有メニューからXアプリを起動してください。
      • Xへの画像は自身で添付するがONになります。
        • 共有をキャンセルした場合、Xへの画像は自分で添付するがオフの状態の投稿プレビューが開きます。
    • 動作確認状況は以下です。
      • iOS 17.4.1/MacOS Sonoma(実機)にて投稿までの動作を確認しています。
      • Android 14.0(Emulator)にて、共有メニューが表示される箇所まで確認しています。
      • Windows 11のChrome/Edgeにて、共有メニューが表示される箇所まで確認しています。
        • Windowsブラウザについては共有のキャンセルを検知できないため、共有をキャンセルした場合プレビュー画面が開きません。
      • WindowsのfirefoxWebShareAPIに非対応なので、利用できません。
  • Xの投稿はアプリを強制的に起動するオプションが削除予定になりました。
    • WebShareAPIの採用により、今後はXアプリでの投稿はWebShareAPI、Xアプリ非導入環境の場合はintentという棲み分けを行います。
  • 当サイトについての必須環境(最低限の動作確認が可能な環境)を更新しました。
    • バグ対応する体力が残っていないため、申し訳ありませんが推奨環境での利用をご検討ください。
    • 検証自体は上記でも行っているように、実施可能な範囲で実施していきます。

【Collaborator/Contributor向け情報】

1.4.13

Patch Changes

  • 一部のウェブサイトで、特定のユーザーエージェントのためにOGP画像が取得できないことがあるバグの修正しました。
    • 一部のウェブサイトではユーザエージェントによってはOGP画像の取得に関して取得ができなくなるといった仕様があるようです。
      • 一方X.comなどでは、特定のユーザエージェントを指定しなければOGP画像の取得ができません。
    • 本修正では、リクエスト先のオリジンによってユーザエージェントを変更する処理を追加しました。
    • ZEKE/じーく氏(@zeke320.bsky.social)が発見・対応してくれました!ありがとうございます!
    • 利用者のユーザエージェントを利用することに関して、プライバシーポリシーへ内容を追記しました。

1.4.12

Patch Changes

  • Androidでのみ、Skyshareを共有先に選べるようになりました。
    • Android上でPWAインストールをした場合、Skyshareを共有先に選べるようになったようです。
      • Androidシミュレータ上では動作しなかったため、コラボレータによる実機検証を行っていただきました。
      • 自動で共有対象のタイトル・URLの差し込み、OGPの取得処理もinvokeするようにしました。
    • 実装はおなじみZEKE/じーく氏(@zeke320.bsky.social)に実装していただけました!ありがとう!
    • iOSについては、本技術の基盤となっているWebアプリマニフェストのshare_targetメンバに非対応であるため使えません。

【Collaborator/Contributor向け情報】

  • OSSとしてのSkyshareのフロントエンドのコード品質が大きく向上しました!
    • コードルールに沿ってにプログラムは修正され、フォーマッタによって一定の規則に基づいた整形がされました!
      • また、フォーマッタをビルダーに統合し、ある程度のコードを自動で整形・ブランチを修正するようになりました。
    • こちらも8割9分ZEKE/じーく氏(@zeke320.bsky.social)に実装していただけました!感謝....
    • 一方バックエンドのコードについてはまだ無法地帯なため、今後、同様にルールの制定を行い修正をしていきたいと考えています。
      • また、現在のアーキテクチャ自体を改修することも検討・調査中です。

1.4.11

Patch Changes

  • iOSからリンクカードの添付が出来なくなってしまっていた不具合を修正しました。
    • v1.4.10においてfirefox対応した部分がiOSと相性が悪かったため、MimeTypeの設定方法について条件分岐を追加することで対応しました。
    • BlobMimeTypeが設定されているブラウザではこの値を、設定されていない場合はContent-typeヘッダを利用するという動作になりました。

1.4.10

Patch Changes

  • Firefoxにてリンク埋め込みが正しく投稿できない問題を解消しました。
    • Firefoxでは、ChromeやSafariと異なりRespose headerに含まれるContent-typeからBlobへMimeTypeは設定されない仕様となっていました。
    • APIの実行後、Respose headerからContent-typeを取得し、明示的にMimeTypeをセットしたBlobを返却するよう修正しました。

1.4.9

Patch Changes

  • フランス語・ヒンディー語の言語コードを追加しました。
    • Now you can use Français or हिन्दी language code for post.
  • 水面下でコードの改善を粛々と進めています。

1.4.8

Patch Changes

  • ポルトガル語・ポーランド語・ドイツ語の言語コードを追加しました。
    • Now you can use Portuguese, Polski or Deutsch language code for post.

1.4.7

Patch Changes

  • Bluesky上でのメンションのURL変換機能を実装しました。

    • Blueskyに所属するアカウントへのメンションを本文上で実施した際、X向け投稿においてはBlueskyのURLに置き換える機能を実装しました。
  • richTextParserに致命的なバグがあったため修正しました。

    • matchEndによるtextの切り取り範囲が過剰に広かったことが原因で、正常にテキストを処理できない場合がありました。
      • タグの入力・タグ候補の保存、および外部URL利用を三件以上設定した場合に発生していました。
    • このコードの元になったdetectFacets.tsは、この値はあくまでfacetsの作成にのみ用いており、処理範囲の決定に対して影響なかったため、Bluesky側に影響が起きていませんでした。

【Collaborator/Contributor向け情報】

  • atproto_api/resolveHandle.tsにおけるエラーハンドリングを改善しました。
    • これまではatproto_api配下の関数自体もatprotoの返り値に合わせて{error,message}を含むリスポンスを行っていましたが、この応答を作成するため、Typescriptの型として不適切な設定(正常リスポンスと異常リスポンスの交差型)を行っていました。
    • ESLintの指摘に対応するためこれをやめ、関数自体がErrorをスローすることが正とするように変更しました。
      • そのため、今後は関数の呼び出し側にエラーハンドリングを委ねる形をとります。エラーメッセージなどの取得については、これまでの直接の返り値ではなくスローされるe: Error型で取得可能です。
    • この変更方針は、atproto_api配下のコードにも適応していきたいと考えています
    • そもそもatproto_apiのコード自体、公式クライアントへ置き換えたいと考えています: Issue #15
  • その他、関連箇所のコードにnpm run fixをかけました。
    • 許容した方がいいかな、と考えている@typescript-eslint/no-misused-promisesルール以外のwarning/errorについては取り除きました。

1.4.6

Patch Changes

  • 画像のドラッグ&ドロップに対応しました。
    • テキスト入力箇所への画像ファイルのドラッグ&ドロップでメディアを追加できるようにしました。
    • So Asano氏(@so-asano.com)に対応していただきました!ありがとうございます!

1.4.5

Patch Changes

  • OGPメタデータの取得周りの改善を実施しました!
    • これまでHTMLコードを取得した内容を正規表現を用いていましたが、これをHTML Parserライブラリcheerioを採用しました。
    • X.comなど、メタデータが正しく正規表現にマッチしないサイトについても対応できるようになり、設定可能範囲がひろがりました。
    • So Asano氏(@so-asano.com)が対応してくれました!計画よりずっと楽に実装していただけて助かりました。ありがとう!

【Collaborator/Contributor向け情報】

  • ブランチの管理をGithub Actionsを用いてより厳格化しました。ZEKE/じーく氏(@zeke320.bsky.social)、ありがとう!
    • PRリクエストのマージ先はdevelopに固定されます。追加機能を作成していただけた各担当者の変更がコンフリクトしていないか・デグレーションしていないかなどを、一度ステージング環境で確認したいためです。
    • PRリクエストはpreview系ブランチで実施する必要があります。実機環境上でビルドが可能であったという前提のもと、PRリクエストのレビューを行いたいためです。

1.4.4

Patch Changes

  • スマートフォン等のユーザビリティに試験的改善を加えました。
    • Postの入力スペースにカーソルをフォーカスした際、ヘッダーが隠れる位置まで自動的にスクロールするコードを追加しました。
      • 時々動作しないこともあり挙動不審であるため、試験的導入になります。
    • 根本的な解決については、UIの整理等で実施する予定です。
    • 今回の修正もSo Asano氏(@so-asano.com)が対応してくれました!ありがとう!
  • その他、各種ページのレイアウト調節を実施しました。

【Collaborator/Contributor向け情報】

  • Linter/Formatterを導入しました。
    • 現在は導入のみで、fixについては未実施の状態になります。
      • fix対応は各Contributorが対象のファイルを修正する際に実施していただき、少しずつ修正していければいいなと考えています。
      • また、各種設定についてはignoreするよう、設定値を更新しました。
    • npm run fix ./src/...により、フォーマッタとリンターが動作します。対応時はご活用ください。
      • PrettierについてはVSCode拡張を導入することでShift+Opt(Alt)+fで自動整形が可能です。
    • 導入にあたってルールの作成・設定値の定義をZEKE/じーく氏(@zeke320.bsky.social)が実施してくれました!ありがとうございます!品質のよいコードを作っていきましょう。

1.4.3

Patch Changes

  • 下書き機能が追加されました!
    • ポストの内容をブラウザへ保存可能になりました。文字のみ対応しています。
      • これはブラウザへのデータ保存領域であるLocalStorageへのデータ保管が最大5MBまでしか対応していないためです。
    • ブラウザ保存であるため、異なるデバイス上では下書きは共有されません。データベースを用いた下書きのクロスデバイス対応は検討中です。
  • ポストにXへの投稿時の文字数を表示する追加を実施しました。
    • Blueskyへの投稿文字数だけでなく、Xへのポストの文字数を表示しました。
    • XではURLは約11文字としてカウントされており、これも反映しています。
      • 0.5文字の扱いがわからなかったため、切り上げ処理を行ない文字数を少し多めに見積もっています。
  • 上記二件、So Asano氏(@so-asano.com) が提案・開発協力をしてくれました。ありがとうございます!!
    • Collaboratorとしても参加していただけました!みなさんが十分に活躍できるような場を作っていきたいと思っています。

【Collaborator/Contributor向け情報】

  • PostForm.tsxからおおよその関数を撤去し、基本的にコンポーネントに関数を持たせる設計に作り替えました。
    • 是非はわかりませんが、コンポーネントで処理が閉じている方が可読性は高いのかなと考えこのような方向に修正しています。
  • その他、commonコンポーネントとしてOverlayDialog.tsxを追加しました。
    • commonコンポーネントは汎用的に使用可能なコンポーネントです。

1.4.2

Patch Changes

  • 投稿ボタンのレイアウトの修正しました。
    • 公式クライアントのレイアウト修正に合わせて、ボタンの表示を修正しました。

【Collaborator/Contributor向け情報】

  • 内部コンポーネントの配置替えを行いました。
    • utilsに集約されていた内容をenvlibなどに再配置しました。
      • utilsは本プロダクトや本プロダクト環境に依存せず使える関数で、基本的にブラウザ上で実行する関数です。
        • NodeJSCloudflare Workerバックエンドなどに依存せず、トランスパイルができる前提で実装されます。
      • libは本プロダクトに関する内容や、本プロダクト環境に依存する関数です。
        • 現在はブラウザ上で動かす内容・バックエンドのみで動作する内容が混同しています。これは改善予定です。
      • envには本プロダクトに関する固定値や環境依存変数が格納されています。
        • 現在はブラウザ上で動かす内容・バックエンドのみで動作する内容が混同しています。これは改善予定です。
  • 上記の情報は未解決部分の整理実施後Readmeへの記載予定です。

1.4.1

Patch Changes

  • URL入力時、http(s)://の直後にスペースキーが挿入された場合にURLとして検知されてしまう問題を修正しました。
    • テキストのfacet検出の仕組みで、誤った正規表現が用いられていたことが原因で、スペース文字や改行文字が//直後も検出対象に含まれてしまっていました。
    • ハッシュタグの記録についても同様の動作となっていたため、これを修正しました。
  • レイアウトの微修正を実施しました。
    • リンクカードの取得時、タイトルや説明などのメタ情報は、リンクカード画像の外に表示されるように修正しました。
  • よく使うタグ機能の使い勝手を改善しました。
    • テキストが何も入力されていない場合および、テキストの文末にすでに改行記号・またはスペースが入力済みの場合はハッシュタグより前にスペースが入らないようにしました。
  • よく使うタグ機能のバグを修正しました。
    • タグの判定範囲に#が余分に含まれてしまっており、#hashtagの投稿を実施すると##hashtagがよく使うタグとして登録されてしまう事象が発生しており、これを修正しました。

1.4.0

Minor Changes

  • OGP取得の手動化に対応しました!
    • OGPの取得をポスト投稿前に確認・任意設定に対応しました。
    • http://もしくはhttps://から始まる文字をURLとして認識し、最後に検出したURLをリンクカード生成対象として認識します。
    • Blueskyにおいては、そもそもリンクカードとリンクを別々に扱うことが可能なため、URLを入力→リンクカードを取得→URLを削除 の手順を踏むことで、投稿にスマートにリンクカードを挿入できます。
      • この操作が行われた場合、X向け投稿には別途URLが差し込まれます。XはURLがないとリンクカードが設定できないためです。
  • その他、細かなレイアウトの調整を実施しました。
    • Xの投稿プレビューにおいて、リンクカードのアスペクト比が誤っていたため、これをXの仕様に乗っ取った設定に修正しました。

【Collaborator/Contributor向け情報】

  • 今回のアップデートにて、投稿フォームのプレビュー画面にOGP画像を表示させるため、データの扱いを大幅に改修しました。これまでArray<Files>: imageFilesと定義していた変数はMediaDataとしてより広い役割を持つようになりました。MediaData型はLinkCardImages、メディアが存在しない場合のnullのユニオン型で、以下のように定義されています。
export type MediaData = LinkCard | Images | null;
type LinkCard = {
  type: "external";
  images: Array<{
    blob: Blob | null;
  }>;
  meta: ogpMetaData & {
    url: string;
  };
};
type Images = {
  type: "images";
  images: Array<{
    alt: string;
    blob: Blob;
  }>;
};
  • これまでArray<File>型で定義していた変数はImages.images.blobに、Blob型として配置されています。これはプレビューの作成や実際のcreateRecordの際にFile型である必要がないためです。
    • 代わりに(画像の入力時に受け付けた)File型は即座にBlob型に変換され、このデータがそのままuploadBlobAPIに用いられます。かなりオーバーヘットを減らせたのではないでしょうか。
    • 画像の圧縮処理についても画像の入力時点ではなく、createRecordの直前に実行するようにしました。OGP画像がBlueskyのデータサイズの受付上限に到達する心配が、これにより無くなりました。
  • handlePostcomponents/Client/bsky/buttons/PostButton.tsxへ移動しました。
    • utils/recordBuilderについても、今後atprotoのフレームワークを採用したいという意志から廃止し、PostButton.tsx内部から直接utils/atproto_apiの関数を呼び出しています。
    • まだ最適化が済んでいないコンポーネントが多数存在しますが、特殊な事情がない限り、基本的には処理はこれを担当するコンポーネント内で閉じているべきであり、他のコンポーネントに値を渡す当を実現したい場合は、callback等を用いて疎結合にすべきだという方針で、作り替えていこうと考えています。
  • 一部のType型と連動する変数群をClass型に再定義しました。
    • A値が決定した時点でB値も決定するといった変数において、Type型でそれぞれを列挙するのはコードとして難解であると考えたためです(ただ、もっと上手いやり方があるかもしれません...)

1.3.5

Patch Changes

  • クリップボードから画像ファイルや、画像がペースト可能になりました!
    • PC(Windows/Mac)の場合に、ファイルのCtrl(Command)+C & Ctrl(Command)+Vによるペーストをサポートしました。
    • クリップボードに保存された画像データ(PrintScreenや、Command+Control+Shift+3などの結果)のペーストも可能です。
    • ZEKE/じーく氏(@zeke320.bsky.social)、今回もありがとう!PCユーザーの環境が良くなってるのはほぼ彼のおかげです。確認時間かかってすまんかった...

1.3.4

Patch Changes

  • AliexpressにおいてOPGが取得できない問題(Issue #43)に対処しました。
    • OGP取得先Webサイト上から情報を取得する際のHTTPヘッダを調節しました。
    • Cache-Controlno-cacheを付与しました。これが起因だったのかは不明ですが、少なくともOGP取得が成功しやすくなっているように思われます。
      • この変更によりMacOS/SafariとWindows/Chromeの違いが発生していた事象が解消したと思われます。※Githubコメント
    • サーバ側のキャッシュクリアの実施も影響しているかもしれません。残念ながらリダイレクトの根本原因がわからず、確たる情報として発信できませんでした。

1.3.3

Patch Changes

  • Spotifyで正しくOGPが取得できないバグを修正しました。
    • 原因はOGP取得時のHTTPリクエストのパラメータ不足でした。Spotifyではリクエストヘッダの"Allow-Language"パラメータを参照してロケーションを確定していました。
    • Spotifyではこのパラメータのないリクエストをreject(403 Forbiddenにしてしまう) する処理が行われている様子でした。
    • 上記に対して、一旦"ja"(日本語ロケーション)を固定値として指定し対応しました。
      • 本パラメータは今後、ポストに設定するlanguage情報を参照するよう改修する予定です。(Now avalable jp location only, but it will fix to refer language of your post.)

1.3.2

Patch Changes

  • PCブラウザ向けにCtrl+Enter(Command+Enter)での投稿に対応
    • Feature Request: 投稿ショートカットの追加に対応しました。フィードバック・リクエストありがとう!
      • 実装にあたってreact-useパッケージ(Unlicense)を採用しました。また、UserAgentを持いてOSを識別しています。Macの場合はMacのインターフェイスに合わせてCommandキーをショートカットに当てています。
    • ZEKE/じーく氏(@zeke320.bsky.social)、PCユーザは特に彼の多大な貢献に感謝するように!

1.3.1

Patch Changes

  • Xへの投稿プレビュー画面において添付画像が正しく表示されない不具合を解消しました
    • 原因はHTMLエスケープ処理によるものでした。HTMLは展開される際に、例えば&といった特殊記号は&amp;といった文字列にエスケープ処理が行われます。
    • 詳細な情報を確認したところ、Astroにてページを生成する際、レンダリングスペースで定義された変数は自動的にエスケープ処理が行われる仕様でした。
      • 検証したところ、データベース上やヘッダのコードブロックでの読み込み時点ではエスケープがされておらず、<meta>タグ内部のパラメータとして定義する際にエスケープされました。HTML要素の子要素としてもエスケープされなかったため、この挙動はAstro側がパラメータをよしなにしてくれた結果として解釈しました。
    • 以上よりページ側に責はない(他サイトでもエスケープがされている可能性が高い)とし、Metadataを取得する側でエスケープ処理を実施する旨のコードを追加し、不具合を解消しました。
  • CHANGELOG上のpreブロックが、枠を飛び出す表示の問題を修正しました。

1.3.0

Minor Changes

  • Youtubeを含むほとんどのWebサイトのリンクカード埋め込みに対応しました。

    • これまで、リンクカードの取得はブラウザ上で実施していました。この方法はクライアント側で完結する一方、CORS(外部サイトへのアクセスを許可するセキュリティの拡張)が未設定・または不許可であるWebサイトに対して、リンクカードが取得できないという仕様(SkyshareのIssue上ではこれをBugと定義しましたが、挙動としては想定内なため、仕様という表現をしています)がありました。
      • この機能は外部サイトが、自身のサイトの部分的なリソースへのアクセスを外部サイトから可能にするために存在しています。そのためOGPやHTMLメタデータのような外部公開するために設定されるコンテンツは、本来CORSが設定されるべき内容なのですが、多くのサイトがCORSを設定していない・直リンクを防ぐ等の意図によりあえて許可していない、というのが現状です。
    • 本アップデートでは、Skyshare側でAstro API RouterがCloudflare Workers上に構築され、バックエンドを介して情報を取得することで、CORSエラーを回避する実装が追加されました。
      • このCORSエラーの回避手法自体はBlueskyでも実施されていますが、BlueskyにおけるOGPメタデータやOGP画像取得APIは非公開エンドポイントとなっています。SkyshareはOSSであるため、基本的に公開されたAPIのみを使用するべきであるため、このエンドポイントを使うわけには行きませんでした。
    • 以上より、これまでリンクカードが取得できなかったほとんどのWebサイト上からリンクカード(OGP画像)を取得可能になりました
    • 本機能のほとんどはZEKE/じーく氏(@zeke320.bsky.social)によって提案・実装されました。
      • また、本件のマージにあたっての約1週間もの開発協力・レビューの実施により、非常によいコードを書くことができました。本当にありがとうございます!
      • 本件の対処の際に、今後の開発にもご協力いただけるとのことでCollaboratorとしてプロジェクトに参加していただきました。OSSとしてのSkyshare、プロダクトとしてのSkyshare、いずれも可能な限り品質を上げていくという点で、非常に強力な援助となるでしょう。この場を借りて改めてお礼申し上げます。どうぞよろしくお願いいたします!

1.2.1

Patch Changes

  • 投稿に対してNSFW等を含むラベルを付与できるようにしました。
    • Skyshareではとりあえず代表的だと思われるsexualnuditypornの他、spoiler(ネタバレ)、!warn(一般的な警告表示)に対応します。
    • lexiconの定義には多くのラベルが存在していますが、対象を絞っています。オプションが増えすぎると、選ぶ手軽さが減ってしまうためです。
  • 実験的機能のレイアウト箇所を変更しました。
    • 特に実験的機能のフラグは頻繁に変更するような項目でもないと思われるためです。添付画像プレビューの下あたりに移動しています。
  • 実験的機能にviaの付与が設定可能になりました。
    • viaは投稿がどのようなクライアントを使っているのかを示す識別子で、旧Twitterが過去非公式クライアントを多く受け入れていた時代に、via芸たる遊びが行われていました。
    • 現在Blueskyではviaは表示されませんが、例えばSkyshareを使ったポストをミュートしたり、逆にSkyshareを使ったポストのみを絞り込むなどに使えるかも知れません。
    • 現在Blueskyではこのパラメータの付与は必須ではないため、任意で付与できるようフラグを追加した形になります。

1.2.0

Minor Changes

  • 公式クライアントがハッシュタグに対応したため、これに追従しました。
    • ハッシュタグは正確にはfacetの一種で、リッチテキストの装飾記号としてBlueskyでは処理されます。 今回のアップデートにて、#または#️⃣を先頭に含む文字列パターンに対して、以下のfacetをRecord内に定義するようにしました。
index: {
    byteStart: number,
    byteEnd: number,
}
features: [
    {
        $type: "app.bsky.richtext.facet#tag",
        tag: string
    }
]
  • 現在、ハッシュタグの区切り文字について検討中の状態となっており、区切り文字に空白記号/改行記号のみを採用しています。
    • そのため、公式クライアントでは対応していない#C#Programingといったハッシュタグ自体を含むハッシュタグや、#0といった数字から始まるハッシュタグが許可されています。 これらは少なくともこの2種の記法はbsky.appでは許可されていません。
    • この仕様はX.comでのハッシュタグとの共通性を考慮すると不適切であるため、今後のパッチアップデート等で改善予定です。
  • ハッシュタグの履歴保存および入力補助機能を追加しました。
    • Skyshareから投稿したハッシュタグ付き投稿について、最大8個のタグがブラウザに保存されるようになりました。 ブラウザへの保存はJsonのlist型をBase64エンコードしています(以前追加したログイン情報保持の機能と根本的に同じ仕組みです。)
    • 保存されたタグは、投稿画面にてボタンで表示され、ハッシュタグ入力ショートカットとして利用することが可能です。

1.1.10

Patch Changes

  • OGPページ削除の際にページのみではなく、OGPカードも削除するようにしました。
    • これまでOGPページについては削除処理によってデータをデータベースから削除していましたが、OGP画像自体も削除対象に含めました。
  • 一部の関数にJSDocを設定し、コードの可読性を向上させました。
    • 今回対応した関数は主にOGPジェネレータに関する部分のみです。
    • Blueskyクライアント(atproto_apiディレクトリ関連)は、現在公式クライアント@atproto/common-webの採用検討中なため、保留にしています。
  • Xへの投稿にOGPリンクが含まれる場合、これを改行で追加するよう修正しました。

1.1.9

Patch Changes

  • AT Protocolの更新により、画像の投稿ができなくなっていた不具合を修正しました。
    • 原因はapp.bsky.embed.imageslexiconの型変更が、blueskyのPDSに適応されたためでした。
      • 2023/04のコミット7f008c0により、ポストに画像を添付する方法は以下のように変更されました。

2023/04/01以前:

image: {
    cid: string,
    mimeType: string
}

2023/04/01以降:

image: {
    $type: "blob",
    ref: {
        $link: string
    },
    mimeType: string,
    size: number
},
  • imageobject型の内容はUploadBlobが返却するblob型準拠となっており、当サイトで使用していた型は日本語のAT Protocol技術記事を参考にした古い内容だったため、古い情報をRecordへ登録していました(legacy blob refの根本原因)
  • しかし、本エラーは今日まで発生しませんでした。これは、BlueskyのPDS側がこの形式を受け入れていた(lexiconの定義は変わっていたが、PDSでは従来の形式に置き換えていた)ことが原因だと考えられます。
    • 2023/02/23朝7時ごろに 6dfc899 がマージされました。新しいlexiconの型情報でPDSが検証されるようになったことから、従来のObject型がエラー判定とされました。(Legacy blob ref at ...の出力の正体)
  • 以上より、Skyshare側も新しい形式に追従し、createRecordのエラーを解消しました。

1.1.8

Patch Changes

  • 投稿へ画像を一枚ずつ画像を追加できるように改修しました。
    • 画像をポストに添付すると一枚ずつ追加されます。4枚以上追加される場合は、既存の画像を残し、超過分を無視します。
      • また、追加画像を一枚ずつ除去できるようにしました。画像のプレビューの (✖️) ボタンを押していただくと、その投稿から添付画像を撤去できます。
    • 今回の改修により画像を1枚ずつ処理できるようになり、個別の画像に情報を差し込めるようになったため、機能リクエストIssue#8(画像へのAlt付与の要望)の対応を実施しました。Thanks to contribute!
      • Altは画像プレビューの (Altを設定) を押していただくと、ダイアログが開き設定が可能です。

1.1.7

Patch Changes

  • サイトマップを改修しました。当サイトが対応可能な環境について明記しました。
    • これまでのAboutページをFeatureページに分断し、詳しいサービスの仕様のみをAboutページに記載しました。
  • ID/APWをブラウザへ保存するオプションを追加しました。
    • オプションをONにした状態でログインを行うと、ブラウザのLocalStorageにID/APWをBase64 encodeしたデータが保存されます。
      • これによりセッションが終了しても、ブラウザに保存された上記の情報を用いることでログインを簡略化します。
    • 挙動としては ブラウザに保存されたリフレッシュトークンが有効な場合はセッションを再開 → ID/APWがブラウザに存在する場合はこれを用いて新規セッションを開始 という動作をします。
      • ログイン画面以外では従来通り、セッションの利用可能判定のみを実施します。投稿画面を開くことにより、初めてブラウザに保存されたログイン情報を参照し、ログインを試みます。
    • オプションがOFFの場合にブラウザに保存する情報は従来通り、セッションの再開を行うためのリフレッシュトークンのみ保持します。

1.1.6

Patch Changes

  • 実験的な機能に「Xの投稿はアプリを強制的に起動する」フラグを追加しました。
    • Android環境などでBlueskyへの投稿後、Xの投稿画面を開く際に、アプリケーションが開く場合と内部ブラウザが開く場合があるという事象が発生していたようです。
    • これまでXの投稿画面を開く場合は、twitter.com/intentに一括でアクセスしていましたが、Android端末ではこのURLが正しく機能しない場合がある様子でした。
    • 上記に対してintentの機能をWebではなく、OS側で処理する分岐を追加しました。本対応は「Xの投稿はアプリを強制的に起動する」フラグをONにすることで動作します。
      • アプリがインストールされていない環境で「Xの投稿はアプリを強制的に起動する」フラグがONになっている場合、正常に動作しません。本フラグは必ずアプリがある場合のみ使用してください。
      • 本フラグがOFFの場合も、アプリがインストール済みの場合は基本的にはアプリが優先して開かれます。アプリがインストールされていない場合はブラウザ上でポップアップが開きます。

1.1.5

Patch Changes

  • 投稿時、ポストに言語のメタデータを付与するオプションを追加しました
    • とりあえず日本語・English・中文・한국어に対応しました。
    • これはあくまで投稿に対してメタデータを含め、Feedなどに表示できるようにするための情報であり、今後の当サイトの多言語対応に関するロードマップとは関係ありません。
  • iOS16.4以前の端末で、Skyshareが一切動作をしなくなる問題を解消しました。
    • 原因となった関数はversion 1.1.0から追加された外部URLの埋め込みを行うための二種の関数getMeta.tsおよびgetOgp.tsでした。
    • 外部URLの埋め込みのため、埋め込み先へアクセスを行い、クライアント内でHTMLの構文解析を行うのですが、この処理にあたって正規表現を使用しており、「肯定後読み」と呼ばれる処理(?<=)がiOS16.4以前では使えないという状況でした
    • そのため、正規表現から本処理を別の同等の処理に置き換えることで対処しました。
    • なお、上記の処理ではYoutube等特定のWebサイトのリンクカードの取得ができないためv1.2.0以降に予定しています。
    • 今回の問題解決にあたり anon氏(@anon5r.com)So Asano氏(@so-asano.com) の情報提供により、エラー箇所に当たりを付けることができました
      • また、これまで最新版しか検証ができなかった当サイトの開発環境が更新され、ブラウザの下位互換対応が可能になりました
      • お二人には感謝してもしきれません。心よりの感謝を申し上げます
  • その他、UIを調整しました。
    • 高度な設定としていた項目を展開し、通常状態で表示するようにしました。

1.1.4

Patch Changes

  • 入力文字数がXの上限を超えた際、文字数表示箇所に警告表示を行うようにしました。
    • 141文字以上の入力を行うと、Blueskyへは投稿可能ですがTwitterは投稿不可なため、アプリ起動またはポップアップ後に自力で編集していただく対応とさせていただきます。
  • URL埋め込みについて、Youtubeなど、一部のサイトにまだ対応できていないことをQAへ追記しました。
    • 他サイトと構造や状況が異なり、主にCORSが原因でフロントエンド側から情報の取得ができないサイトについては、バックエンドを交えた情報取得が必須になり、パッチリリースのレベルでは対応できないため、現在の仕様としては不具合ではなく不可な状況です。アップデートをお待ちください。
  • トップページにアプリ化に対応している旨を記載しました。

1.1.3

Patch Changes

  • Xへの投稿の際にURLの挿入位置を変更しないようにしました。
    • Xへの投稿で、intentを用いてURLを投稿する場合、URLクエリに&urlパラメータを指定すると通説では言われていましたが、本文に直接記載した場合も正しく動作したため、URLクエリを廃止し、Blueskyと同様の箇所にURLを差し込めるように変更しました。
  • ヘッダメニューを非表示にする長さを長く設定し、メニューの折り返しが発生しないよう修正しました。
  • Xでポストするボタンを押した後表示を変更し、ポストしたかどうかを一目でわかるように改修しました。
    • あくまでボタンを押した場合に表示を変更しています。Xを自動で開くオプションをONにしている場合の、ボタンによらないXのアプリ起動(ポップアップ)については、ボタンの表示は変わりません。

1.1.2

Patch Changes

  • Xへの投稿プレビュー画面にて、改行処理が正常でない問題を修正しました。
    • Reactが取り扱うstring型をJSX.Elementに展開する際、改行が削除されてしまっていたため、エスケープして正しく表示するよう修正しました。

1.1.1

Patch Changes

  • ローディングにエラーハンドリングを追加しました。
    • いくつかの環境でローディングが終わらず、投稿画面が開けないという症状の報告を受けています。
    • 原因が不明なため、エラーハンドリングを追加し、ステータスメッセージを出力するよう改修しました。
      • 開発者環境では再現困難な状況です。引き続きフィードバックのご協力をお願いします。
  • OGPカードの生成とリンクカード埋め込みの概念を切り離し、「OGPを生成しない(埋め込みURL有効化)」から 「Xへの投稿画像は自身で添付する」 へオプション名を変更しました。
    • 「Xへの投稿画像は自身で添付する」オプションのON/OFFにかかわらず、画像が添付されていない場合は外部URLのリンクカードの埋め込みを試みます
      • 複数のURLが記載されている場合の動作は、最も最後に検出したURLを用います(v1.1.0と同様の動作)
    • 「Xへの投稿画像は自身で添付する」オプションのON/OFFにかかわらず、 画像が添付されている場合は外部URLのリンクカードの埋め込みを試みません。
      • 画像の添付とURLの付与は共存可能ですが、画像の添付とリンクカードの埋め込みは共存できないためです。
    • 「Xへの投稿画像は自身で添付する」オプションがONであり、画像が添付されている場合、OGPジェネレータを実施しません。
      • Blueskyへは画像付きポストが投稿されます。このオプションをONにした場合は、Twitterへの画像添付は手動にてお願いします。
  • 「キャンセル」ボタンを「下書きを消す」に改善しました。

1.1.0

Minor Changes

  • OGPを生成しないオプションを追加しました!
    • 待たせたな@uitemasen.bsky.socialとその他クリエイター!自分で画像を貼るがよいぞ!
    • 高度な設定として、画像からOGPカードが付与されたページのURLを停止するオプションを追加しました。
  • Blueskyへの投稿に対して、(外部URL含む)リンクカードの埋め込みが行われるようになりました!
    • 待たせたな@chinjuh.bsky.socialとその他クリエイター!好きなだけ外部サービスを埋め込むがいい!
    • この機能はOGPを生成しないオプションと入れ替わりで有効になります。OGPジェネレータと同時に使用することはできません。
    • 文章で最も最後に検出されたURLをOGPカードに用いますので、複数URLを記載した投稿を予定されているユーザは挙動についてご注意ください。
  • 投稿画面を大きく改善しました。
    • @tooon.bsky.social氏、改善案をありがとう!
    • UI/UXの改善として、投稿画面自体をBlueskyに寄せた作りにし、Xへポストについては投稿後に画面遷移するように改善しました
    • Xへポストを行う画面にプレビュー機能を設けました。ただし、当サイトから直接ポストを行うわけではないため、あくまで目安として活用ください。
  • Xへのポストをより簡略化するオプションを追加しました。
    • Xへポストを行う画面(プレビュー画面)を表示すると同時に直接Xへのポップアップ(またはアプリの起動)が行われます。
    • ブラウザへ事前にポップアップの許可をお願いします。拒否した場合、オプションをオンにしていてもオフの場合と同じ挙動になります。

Patch Changes

  • OGPページの生成中にXへポストボタンが押せるようになってしまう不具合を修正しました。

1.0.11

Patch Changes

  • Firefoxにて文字数カウントが表示されない問題の対処および、textareaの入力制限が想定より小さい状態となっていた問題の対処
    • textareaエレメントは300字の制限を設けていましたが、絵文字の入力を行った際、正しくエレメントが文字数を認識していませんでした。
      • 以上より、文字数の制限はエレメントではなく、投稿プロセスの中で実施する方針で対処しました。
    • firefoxではIntl.Segmenterが対応されておらず、絵文字の文字数を正常に計上できませんIntl.Segmenterはfirefoxにおいてもv125に対応予定とされているため、本バージョンに至るまではfirefoxは非推奨ブラウザとさせていただきます
  • Twitterと混同しないよう、当サイト上で投稿を共有する先がXであることを修正しました。
  • 画像投稿時のエラーハンドリング誤りを修正しました。
    • 画像添付でのポスト時、Unexpected Errorと出力されていた原因に対して対処しました。
    • 解決したのはエラーハンドリングのみであり、一部の画像の投稿に関してまだ何らかのエラー原因があると思われます。これについては根本原因について調査・対応中です。
    • 追記: 以上により特定環境下で発生していた画像を含む投稿ができない不具合が解消されました。
      • 画像を格納する変数に対しての項目の問い合わせ箇所 value.blob.ref?.$link としていた箇所が、環境によるJavascriptの厳格度の違いで、TypeErrorとなる環境とそうではない環境が存在していたと考えられます。
      • これを uploadBlob 関数のエラー時の戻り値である value?.error を参照するように修正したことで、 TypeError が発生しなくなりました。
    • 問題の発見、および 三日間にも渡るテスト作業に付き合ってくださった@gapashu0603.bsky.social氏には盛大な感謝を! ありがとうございました!!
  • ログアウトボタンのUIが崩れていたため修正しました。

1.0.10

Patch Changes

  • Unexpected Errorの報告事例が相次ぐため、エラーハンドリングを強化しました。
    • これまでUnexpected Errorだった内容が、どのAPIが・どういった内容のエラーなのかをステータスメッセージとして詳細に報告するようになります。フィードバックのご協力に感謝します!
  • Statusメッセージの表示を改善しました。
    • spanタグではなく、divタグに置き換え、改行した際も見た目が崩れないように設定しました。

1.0.9

Patch Changes

  • Changelogをページ化実施しました。
  • Changeset導入によるバージョン管理を採用しました。Changelogが自動で作られて、便利。
  • ログイン時、右上のログアウトボタンが押せなくなっていた不具合を修正しました。
    • 原因はDisableフラグを逆に指定していました。つまりログアウト時に有効になり、ログイン時に使えないという、矛盾した設定内容となっていました。
  • 各ページの開発者アカウントのURLを修正しました。新handleはnekono.devです。
  • QAへ項目を追加しました。
  • ログイン画面のhandleおよびpasswordフォームに初期値を追加し、入力内容をわかりやすくしました。
  • その他tailwindCSS関連の設定値を整備しました。
    • 具体的には本Changelogページの整形のため、markdown-itによりHTML化、これに対してtailwindCSSがスタイルを適応できるよう、tailwind-variantsの一部のコードをtailwindCSSの機能(adding-base-style)に置き換えました。

1.0.8

Patch Changes

  • 末尾に改行コードを含むほとんどのメンション・リンクが投稿できない不具合を修正しました。
    • 原因は区切り文字で、1.0.7以前ではスペース文字を区切り文字として設定していましたが、改行文字は通常の文字種と同様に扱ってしまっていました。改行コードは明らかにURLとURLではない箇所を分割するため、区切り文字として判定するように修正しました。
    • 他にも区切り文字はあるかもしれませんが、いったんはBluesky公式が準じているだろう、上記の区切り文字(スペースまたは改行コード)を対象とします。発見ありがとうございました!@tooon.bsky.social氏!

1.0.6

Patch Changes

  • 誤解を招く表現だったため、トップページの文言を少し変えました
  • Q&Aページを作成しました。

1.0.5

Patch Changes

  • 日本語を含む文章にリンクまたはメンションを含む場合に、正常にリンクされない不具合を修正しました。
    • 原因はcreateRecordの際に、リンクを含む場合はRecordのfacetsとしてテキスト中のどこからどこまでを数値で指定してあげる必要があり、この数値の単位が文字ではなく、文字のバイト数を示していました。
    • これにより日本語は1文字3バイト換算にもかかわらず、処理上では1バイトとして扱っていたため、これを修正し、範囲ずれが起こらないようにしました。発見ありがとうございました!@cpro.bsky.social氏!
  • これより前までのPatch Changesは記録していませんでした...

1.0.0

Major Changes

  • 初リリース!よろしくお願いいたします。