オープンソース活動の振り返り/GitHub Sponsorsの収入まとめ @ 2025
2025年のオープンソース活動の振り返りとGitHub Sponsorsでの収入をまとめた記事です。
今年はtextlintとJSer.infoにMCPサーバーを実装しました。 また、JavaScript PrimerをES2025に対応し、secretlintに新しい検出ルールを追加しました。 AI連携とECMAScript最新仕様への対応が中心の年でした。 TSKaigi 2025とYAPC::Fukuoka 2025では、継続的なメンテナンスについて発表しました。
サプライチェーン攻撃対策についてはZennに記事をまとめました。
今までの振り返り
- 2014年: https://efcl.info/2014/12/31/oss-in-2014/
- 2015年: https://efcl.info/2015/12/31/oss-in-2015/
- 2016年: https://efcl.info/2016/12/31/oss-in-2016/
- 2017年: https://efcl.info/2017/12/30/oss-in-2017/
- 2018年: https://efcl.info/2018/12/31/oss-in-2018/
- 2019年: https://efcl.info/2019/12/31/oss-in-2019/
- 2020年: https://efcl.info/2020/12/31/open-source-in-2020/
- 2021年: https://efcl.info/2021/12/31/open-source-in-2021/
- 2022年: https://efcl.info/2022/12/31/open-source-in-2022/
- 2023年: https://efcl.info/2023/12/31/open-source-in-2023/
- 2024年: https://efcl.info/2024/12/31/open-source-in-2024/
オープンソース活動の種類
自分のオープンソース活動の種類として、次のようなものがあります。
- ソフトウェア開発: textlint、Secretlint、HonKitなどの開発やメンテナンス
- ウェブサービス開発: philan.net、Komesan、Irodrなどの開発やメンテナンス
- ブログ: JSer.infoやECMAScript Dailyのブログの投稿
- 書籍: JavaScript PrimerやJavaScript Promiseの本の執筆
オープンソース関係の収入の種類
自分のオープンソース関係の収入は、ほぼGitHub Sponsors経由となっています。
GitHub SponsorsではMonthlyとOne-Timeでのサポートができます。 自分の場合は、GitHub SponsorsのMonthlyでの支援がベースとなっています。
また、JavaScript PrimerのOpen Collectiveからの収入もあります。
今年のjsprimer Contributorへの支払いもOpen Collectiveの予算から行なっています。
オープンソース関係の収入の合計金額
2025年のGitHub Sponsorsの収入は約229万円となりました。

月毎のGitHub Sponsorsの収入は次のようになります。
| Date | 金額(円) |
|---|---|
| 2025/01 | 365,934 |
| 2025/02 | 194,231 |
| 2025/03 | 165,227 |
| 2025/04 | 164,772 |
| 2025/05 | 175,487 |
| 2025/06 | 160,140 |
| 2025/07 | 176,382 |
| 2025/08 | 172,587 |
| 2025/09 | 162,930 |
| 2025/10 | 164,611 |
| 2025/11 | 169,251 |
| 2025/12 | 216,958 |
1月が多いのは、Thanks OSS Award presented by Toyokumoの2024年度(7月〜12月)分が入っているためです。 12月が多いのはスポンサーのアカウント移行に伴う一時的な重複によるものです。
継続的なサポートをしてくれている人の数
GitHub Sponsorsで継続的にサポートしてくれている人の推移は次のとおりです。
この人数は現在も継続している人数だけを出しています。
Monthly Estimated Income(単位は$)は次のようになっています。
GitHub Sponsorsは、2019年10月から始めています。 今までのGitHub Sponsorsでの収入の推移は、次のとおりです。

GitHub Sponsorsを始めた経緯については、次の記事にまとめてあります。
GitHub Sponsorsに感謝
GitHub Sponsors でご支援いただきありがとうございます!
Contributions/Issues/PR
- Contributions: 11082
- 作成したリポジトリ: 40
- 作成したIssue: 99
- 作成したPull Request: 371
今年は検証用のリポジトリをたくさん作りました。 pnpmやPanda CSS、Next.js、React Ariaなどのバグ再現リポジトリを作成して、Issueを報告していました。
textlint
今年のtextlintは結構大きな変更がありました。
textlint v15
6月にtextlint v15.0.0をリリースしました。
v14で非推奨にしていたTextLintEngineなどの古いAPIを削除して、createLinter() への移行を完了しました。
Node.js 20以上が必須となり、コードベースがかなり整理されました。
MCPサーバー
MCP(Model Context Protocol)サーバーをサポートしました。
v14.8.0で --mcp フラグを追加して、textlintをMCPサーバーとして起動できるようにしました。
AI Agentから直接textlintを呼び出せるようになりました。 テキストのチェックと修正を自動実行できるので、かなり便利になりました。
textlint-rule-preset-ai-writing
新しいプリセット@textlint-ja/textlint-rule-preset-ai-writingも作りました。
AI生成テキスト特有のパターンを検出するルール集で、機械的なリスト形式、誇張表現、コロン継続などを検出します。 AIがAI生成文章をチェックするというフィードバックループが実現できて面白いです。
インフラ改善
パッケージマネージャーをnpmからpnpmに移行して、テストフレームワークもMochaからVitestに変更しました。 CI時間が21分5秒から7分20秒に短縮されました。
npm Trusted Publishing(OIDC)対応も完了して、トークンレスでnpmへのリリースができるようになりました。
JavaScript Primer
今年のJavaScript Primerは、ES2025の対応がメインでした。
v7.0.0
8月にv7.0.0をリリースして、ECMAScript 2025に完全対応しました。
新章「イテレータとジェネレータ」を追加して、Iterator Helpersを詳細に解説しています。
Iterator.from().map()、.filter()、.take()、.drop()、.flatMap()
Set Methodsの解説も追加しました。intersection()、union()、difference()など7つのメソッドが使えるようになったので、Setの章を更新しています。
他にも RegExp.escape() やImport Attributesの解説を追加しました。
Contributing Expenses Policy
今年はContributing Expenses Policyを本格的に運用し始めました。
ES2025対応でコントリビュートしてくれた人には、Open Collective経由で報酬を支払うか、別のOSSプロジェクトへ寄付する仕組みにしています。 年間更新費用は約68万円と試算していて、これをどう継続的に回していくかが課題です。
secretlint
今年のsecretlintは、新しい検出ルールの追加とメジャーアップデートが中心でした。
v10とv11
6月にv10.0.0、8月にv11.0.0をリリースしました。
v10ではデフォルトでシークレットをマスク表示するようにしました。 AIエージェントがstdoutを読むケースが増えてきたため、デフォルトをマスク表示に変更しました(#1067)。
新しい検出ルール
v11で2つの新ルールを推奨プリセットに追加しました。
- @secretlint/secretlint-rule-anthropic
- Claude APIキー(
sk-ant-api0\d-...パターン)を検出
- Claude APIキー(
- @secretlint/secretlint-rule-database-connection-string
- MongoDB等のデータベース接続文字列を検出
v11.1.0では @secretlint/secretlint-rule-pattern に filePathGlobs オプションを追加しました。
ファイルパスのglob指定とコンテンツ検索を組み合わせられるようになっています。
インフラ改善
textlintと同様に、Yarn BerryからpnpmへのmigrationとMochaからVitestへのテストフレームワーク移行を完了しました。 npm Trusted Publishing対応も完了しています。
JSer.info
JSer.infoは今年で14周年を迎えました。
大体の週刊更新は継続していて、1月9日の#721号から12月末まで約40本の週刊記事を配信しました。(今年は結構ゆっくりペースでした)
来月で15周年です。
MCPサーバー
5月にJSer.info のMCPサーバーを公開しました。
jser_search_items、jser_search_posts、jser_weeksなどのツールを用意して、AIエージェントがJSer.infoのデータへアクセスできるようになりました。
npmパッケージ@jser/mcpとしても配布しています。
これは、JSer.infoの更新フローが結構楽になったので、今後も継続的にメンテナンスしていきたいです。
TSKaigi 2025
5月のTSKaigi 2025で「技術書をソフトウェア開発する - jsprimerの10年から学ぶ継続的メンテナンスの技術」という発表をしました。
- TSKaigi 2025で「技術書をソフトウェア開発する」という発表をしました | Web Scratch
- スライド: https://azu.github.io/slide/2025/tskaigi/jsprimer.html
- 動画: https://www.youtube.com/watch?v=r5CZdn8IQlc
jsprimerを10年間メンテナンスし続けてきた方法を話しました。 技術書もソフトウェアと同じように、CIでテストしたり、依存関係を管理したり、リリースサイクルを回したりすることで継続できるという内容です。
YAPC::Fukuoka 2025
11月のYAPC::Fukuoka 2025で「読む技術・書く技術・伝える技術 - 15年続けて分かった持続可能なオープンソース開発」という発表をしました。
- YAPC::Fukuoka 2025で「読む技術・書く技術・伝える技術 - 15年続けて分かった持続可能なオープンソース開発」という発表をしました | Web Scratch
- スライド: https://azu.github.io/slide/2025/yapc/opensource-15years.html
JSer.info(14年)、textlint(11年)、JavaScript Primer(9年)という長期プロジェクトを題材に、バーンアウトを防ぐ開発手法を話しました。 メインのテーマは「心理的負荷を技術的依存に転換する」ということです。
作ったリポジトリ
今年作ったリポジトリは40個です。
ツール・ライブラリ
- azu/confirm-pam
- AI Agentのコマンド実行にTouch IDを使った「人間の確認」を挟むCLIツール confirm-pam を作った | Web Scratch
- macOSのTouch ID認証をCLIから呼び出して、AIエージェントのコマンド実行前に人間の確認を求める「Human-in-the-loop」を実現するツール
- Rustで実装してcrates.ioで公開
- textlint-ja/textlint-rule-preset-ai-writing
- AI生成テキスト特有のパターンを検出するtextlintプリセット
- 機械的なリスト形式、誇張表現、コロン継続などを検出
- 反響があった
- textlint/vscode-textlint
- VS Code拡張をtextlint orgに移管してメンテナンスを継続
- azu/setup-npm-trusted-publish
- npm Trusted Publishing(OIDC)を簡単に設定するためのヘルパーツール
- READMEのみの初期パッケージを公開してOIDC設定できるようにする
- jser/mcp
- JSer.infoのMCPサーバー
- AIエージェントがJSer.infoのデータへアクセスできるようにする
- azu/intl-format-date
Intl.DateTimeFormatとformatToPartsを使った日付フォーマットライブラリ
- azu/madori
- 間取り図エディタ
- azu/humidifier-similator
- 加湿器シミュレータ
- azu/monorepo-npm-oidc-releases
- pnpm + GitHub Release + npm OIDCでのモノレポリリースフローのサンプル
- jser/jser-info-prompt
- JSer.infoのプロンプト用データ
セキュリティ関連
Next.jsのSecurity Issueやサプライチェーン攻撃について調べることが多かったです。
- azu/nextjs-cve-2025-29927-poc
- Next.jsのCVE-2025-29927(Middleware認証バイパス)のPoC
X-Middleware-Subrequestヘッダを使ったMiddlewareバイパスの再現
- azu/request-filtering-agent-https127-test
- request-filtering-agentの127.0.0.1脆弱性のテスト
バグ再現・検証リポジトリ
今年は検証用のリポジトリをたくさん作りました。
pnpm関連:
- azu/pnpm-10-with-postinstall-lifecyle - pnpm 10のpostinstall動作検証
- azu/pnpm–frozen-lockfile-bug -
--frozen-lockfileのバグ再現 - pnpm catalogとdependabotの連携検証用リポジトリ(複数)
Panda CSS関連:
- azu/panda-css-vscode-example
- azu/panda-css-eslint-demm - ESLintが数100回実行すると落ちるrace conditionバグの再現
- azu/pandacss-nested-condition-bug - Panda CSSのMixed conditionsバグ
- azu/no-physical-properties-text-align -
@pandacss/no-physical-propertiesがtext-align: leftを許可してしまう問題
Next.js関連:
- azu/next-prefetch-txt-bug - .txtファイルへのナビゲーションバグ
- azu/latest-next
- azu/react-server-example
React Aria関連:
- azu/react-aria-reading-target-error -
Cannot read properties of undefined (reading 'target')の再現 - azu/react-aria-table-execption - 数100回実行すると落ちる例外をPlaywrightで再現するリポジトリ。結構大変だった
その他:
- azu/textlint-mcp-example - textlint MCPサーバーのデモ
- azu/copilot-review-automerge - Copilotレビュー自動マージの検証
- azu/base64-research - Base64の調査。サプライチェーン攻撃で検知逃れのためにBase64を3回エンコードするケースがあったので調べていた
- azu/simple-oidc-example-package - npm Trusted PublishingでOIDCを使ってトークンレスでCIからnpmパッケージを公開するのサンプル
その他の更新
- ni.zsh v1.8.0
- ni.zsh v1.8.0リリース: Socket Firewallによるパッケージインストール時のチェック機能を追加 | Web Scratch
- Socket Firewallと連携して、パッケージインストール時のサプライチェーン攻撃対策機能を追加しました
- HonKit v6.1.4
- npm Trusted Publishing対応を完了しました
サプライチェーン攻撃対策
今年はサプライチェーン攻撃対策についてZennに記事をまとめました。
2024年後半から2025年にかけてサプライチェーン攻撃が増えてきていて、実際に影響を受けるケースも増えてきました。 自分が実際にやっている対策を紹介します。
利用側での対策
自分は主に次のような対策をしています。
- GitHub Actionsのfull-length commit SHA Pin: pinactを使ってハッシュ固定し、zizmorでセキュリティチェック
- pnpm 10でのLifecycle scriptsを無効化: デフォルトでオフになったので、
pnpm approve-scriptで必要なパッケージのみ許可。 - renovatebotの
minimumReleaseAge設定: パッケージ公開後すぐにはアップデートしない - ni.zshでSocket Firewallと連携: パッケージインストール時に自動でスキャン
tj-actions/changed-filesが侵害された件も調査していました。
SHA Pinをしていれば影響を受けなかったケースなので、SHA Pinは重要です。
git config --global core.hooksPathを使ってコミット時にデフォルトでpinactとzizmorを実行するようにしています。
他にも細かい話は多いですが、細かい個人プロジェクトは更新をしやすくするために設定を冪等にできるようにすることを心がけています。ちゃんとしたプロジェクトはちゃんとした設定をしています。
公開側での対策
textlint、secretlint、HonKitなどのプロジェクトでnpm Trusted Publishing(OIDC)対応を完了しました。
新規パッケージ公開時はazu/setup-npm-trusted-publishでOIDC設定をしています。
既存のnpmパッケージはnpm access set mfa=publishを実行するスクリプトで一括設定してtokenでpublishできないようにしました。そのため、publishできるnpm tokenは全部revokeしました。
ローカルではOIDC設定をほとんど自動化するスクリプトを作って回しています。
やり方が変わっていくので冪等に設定できるという点を意識して作っています。
secretlintでコミット時にシークレットをチェックし、ローカルには生tokenを置かずに1Passwordで管理しています。 GitHub Actionsのセキュリティチェックにはzizmorとactionlintを使っています。
2025年を振り返って
振り返ると3つの傾向がありました。
1つ目はAI連携です。 textlintとJSer.infoへのMCPサーバー導入、AI生成テキスト検出ルール、confirm-pamによるAIエージェント安全機構と、複数プロジェクトでAI連携が進みました。 MCPはLSPと異なりエディタ拡張を作る必要がなく、ツール提供側がツールとして実装できるのが良い点です。 YAPCでも話しましたが、利用者にAI Agentが増えたことで、ツール側の責任範囲がシンプルになりました。
2つ目はセキュリティです。 secretlintの新検出ルール、ni.zshのサプライチェーン攻撃対策、npm Trusted Publishing対応などを行いました。 GitHub/npm側もクラシックトークン作成の無効化やpull_request_targetのブランチ保護強化などbreaking changeな変更を入れています。 今年はセキュリティの基準が上がった年でした。
3つ目は継続的なメンテナンスです。 JavaScript Primer v7.0.0でES2025に対応し、日本語で最新JavaScript仕様を学べる環境を維持しています。 また、TSKaigi 2025とYAPC::Fukuoka 2025で、継続的なメンテナンスについて発表しました。 「持続可能性を意識した設計」が今年もプロジェクト群を支え続けていますし、来年も引き続きやっていきたいです。
YAPCの発表資料を作っているときにも感じましたが、こういった振り返りを書いておくと後で役立つので便利です。書くのは簡単になったけど、その土台になるデータやコンテンツはちゃんとメンテナンスして積み上げておく必要があるなと改めて思いました。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。