おそらくはそれさえも平凡な日々

WebページをMarkdownクリップしてローカル管理する `mdhq`

WebページをMarkdown化してローカル管理するCLIを作りました。名前はmdhq。Markdownの md と、ghqhq からあやかっています。

その名の通り、WebページのURLからローカルパスをghqチックなルールで導出し、そこにMarkdownを保存してくれるものです。ファイルシステム完結のナレッジベースを作るために開発しました。

使い方

npmからインストールできます。

npm install --global @songmu/mdhq

ghq同様に mdhq get <url> でWebページをMarkdown化してローカルに保存します。$MDHQ_ROOT 環境変数や設定ファイルで保存先を変更できます。デフォルトでは画像類もダウンロードします。

$ mdhq get https://songmu.jp/riji/entry/2026-08-23-tagpr-documentation.html
${MDHQ_ROOT}/songmu.jp/riji/entry/2026-08-23-tagpr-documentation.md

標準入力経由で複数取得もできるので、他のツールとも組み合わせやすい。

$ cat urls.txt | mdhq get

mdhq list で一覧もできる。

$ mdhq list
blog.song.mu/entry/agents-md-and-agent-skills.md
songmu.jp/riji/entry/2026-08-23-tagpr-documentation.md

細かい使い方はドキュメントを参照して下さい。

作った動機

RSSの新着記事やWeb Clip管理を効率化したく、まずは保管システムを作ったという所。管理のためにSQLiteなどを使う手もあるけど、ファイルシステムで完結した方が並列での取得や、CIでの実行なんかもやらせやすいし、Git管理もやりやすいのでそれで良いのではないかと思った次第。

Markdown化すれば要約とかも作りやすい。WebページのMarkdown化は Defuddle というObsidian Web Clipper で使われているライブラリを利用している。これを使いたかったから今回はTypeScriptで書いた。

今後の展望

ghqがそうであるように、これはあくまで保管システムなので、取得管理や閲覧、検索などは別のツールを組み合わせて使うことを想定している。閲覧や検索については、僕の場合、ObsidianのVault内に保存するようにした。

取得管理などは、RSSリーダーなどとの連携ができると便利なので、今後取り組んで事例紹介したい。

Conditional Get管理とかもある程度ケアするようにしているつもりだが、余りちゃんと検証はできていない。

あとは、リダイレクトやCanonical、クエリー文字列などをケアしたURLの正規化などもある程度やってはいるのですが、仕様を調整するかも知れません。

相変わらずのニッチなオレオレツールですが、興味がある方は使ってみて下さい。

created at
last modified at

2026-09-06T22:51:10+0900

comments powered by Disqus