WebページをMarkdownクリップしてローカル管理する `mdhq`
WebページをMarkdown化してローカル管理するCLIを作りました。名前はmdhq。Markdownの md と、ghqの hq からあやかっています。
その名の通り、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の正規化などもある程度やってはいるのですが、仕様を調整するかも知れません。
相変わらずのニッチなオレオレツールですが、興味がある方は使ってみて下さい。