blog.bouzuya.net

2026-01-05 bouzuya/fubako 1.0.0 をつくった

bouzuya/fubako 1.0.0 をつくった。

fubako は Markdown 形式のメモを管理するツール。ファイルシステムを前提として、エディタで編集、ブラウザでプレビューする。ブラウザでは編集できない。画像は Google Cloud Storage と同期できる機能を持っている。

きっかけは zenn CLI を使っていて似たような CLI でもつくってみようかという思いつきから。

1.0.0 は機能的に完成したわけではなく、個人的に 2026 からは最大 1 ヶ月で 1.x にして区切りをつける方針を採るため。

現時点での機能は次のようなものになっている。

$ fubako --help
Usage: fubako <COMMAND>

Commands:
  edit   Edit the page
  get    Get the page
  image  Manage images
  new    Create a new page
  serve  Start the local server
  help   Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

$ fubako image --help
Manage images

Usage: fubako image <COMMAND>

Commands:
  add   Add new image to local images directory
  pull  Pull images from remote storage
  push  Push images to remote storage
  help  Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help
  • fubako edit <PAGE_ID> はエディタ (EDITOR 環境変数を参照) に指定されたページ ID のファイルパスを渡す (開く)
  • fubako get <PAGE_ID> は指定されたページ ID のファイルを出力する
  • fubako image add <PATH>${DATA_DIR}/images/ に画像ファイルを追加する
  • fubako image pull [NAME]${DATA_DIR}/images/${NAME} の画像ファイルを Google Cloud Storage から pull する
  • fubako image push [NAME]${DATA_DIR}/images/${NAME} の画像ファイルを Google Cloud Storage に push する
  • fubako new はページを新規作成する
  • fubako serve はページのプレビューのためのサーバーを起動する。ファイルシステムを監視し、ファイルの追加・更新・削除を追跡する

サーバーのパスは次のようなものになっている。

  • / …… ページ ID README があれば表示し、なければ /pages にリダイレクトする
  • /{PAGE_ID} …… ページ ID のファイルを表示する
    • そのページにリンクしているページへのバックリンクが表示される
  • /images/{IMAGE_NAME} …… 指定された名前の画像を表示する
  • /pages …… ページの一覧を表示する
    • ?q={QUERY} …… すべてのページから検索する。空白区切り、大文字小文字を無視
  • /pages/{PAGE_ID} …… /{PAGE_ID} にリダイレクトする
  • /scripts/index.js …… (すべてのページで使用されるスクリプト)
  • /styles/index.css …… (すべてのページで使用されるスタイル)
  • /titles …… タイトルの一覧を表示する
  • /titles/{PAGE_TITLE} …… そのタイトルを持つページ ID の /{PAGE_ID} にリダイレクトする

各ページは次のような解釈がされる。

  • ファイル名は YYYYMMDDTHHMMSSZ.md の形式。作成日時を表す ISO8601 basic format で timezone は Z 固定
  • 最初の # {PAGE_TITLE} はページタイトルとして解釈される
  • [{PAGE_ID}] などの形でページへのリンクを設定できる。壊れているリンクは ページ ID の形式に合致していれば補完される

設定ファイルは ${XDG_CONFIG_HOME}/fubako/config.json に JSON 形式で設定する。

  • data_dir …… データディレクトリのパス
  • image_sync.bucket_name …… fubako image pull/push で使用する Google Cloud Storage のバケット名
  • image_sync.google_application_credentials …… fubako image pull/push で使用する Google Cloud のキーのファイルパス
  • image_sync.object_prefix …… fubako image pull/push で使用する Google Cloud Storage のオブジェクトの prefix
  • port …… サーバーのポート番号

構成技術は次のようなもの。

  • プログラミング言語: Rust
  • HTTP サーバー: axum
  • テンプレートエンジン: askama
  • Markdown の解釈: pulldown-cmark
  • シンタックスハイライト: syntect
  • ファイル監視: notify

今日のコミット。