External Publication
Visit Post

オープンソース活動の振り返り/GitHub Sponsorsの収入まとめ @ 2025

Home [Unofficial] April 15, 2026
Source

2025年のオープンソース活動の振り返りとGitHub Sponsorsでの収入をまとめた記事です。

今年はtextlintとJSer.infoにMCPサーバーを実装しました。 また、JavaScript PrimerをES2025に対応し、secretlintに新しい検出ルールを追加しました。 AI連携とECMAScript最新仕様への対応が中心の年でした。 TSKaigi 2025とYAPC::Fukuoka 2025では、継続的なメンテナンスについて発表しました。

サプライチェーン攻撃対策についてはZennに記事をまとめました。

  • npmパッケージ/GitHub Actionsを利用する側/公開する側でサプライチェーン攻撃を防ぐためにやることメモ

今までの振り返り

オープンソース活動の種類

自分のオープンソース活動の種類として、次のようなものがあります。

  • ソフトウェア開発: textlint、Secretlint、HonKitなどの開発やメンテナンス
  • ウェブサービス開発: philan.net、Komesan、Irodrなどの開発やメンテナンス
  • ブログ: JSer.infoやECMAScript Dailyのブログの投稿
  • 書籍: JavaScript PrimerやJavaScript Promiseの本の執筆

オープンソース関係の収入の種類

自分のオープンソース関係の収入は、ほぼGitHub Sponsors経由となっています。

  • @azuのGitHub Sponsors

GitHub SponsorsではMonthlyとOne-Timeでのサポートができます。 自分の場合は、GitHub SponsorsのMonthlyでの支援がベースとなっています。

また、JavaScript PrimerのOpen Collectiveからの収入もあります。

  • 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の募集を始めてから2年が経ったので振り返る | Web Scratch

GitHub Sponsorsに感謝

GitHub Sponsors でご支援いただきありがとうございます!

  • Sponsor @azu on 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をリリースしました。

  • textlint v15.0.0をリリースしました。非推奨APIの削除とNode.js 20+サポート/MCPサーバの改善 | Web Scratch

v14で非推奨にしていたTextLintEngineなどの古いAPIを削除して、createLinter() への移行を完了しました。 Node.js 20以上が必須となり、コードベースがかなり整理されました。

MCPサーバー

MCP(Model Context Protocol)サーバーをサポートしました。 v14.8.0で --mcp フラグを追加して、textlintをMCPサーバーとして起動できるようにしました。

  • textlint v14.8.0をリリースしました - MCP(Model Context Protocol)をサポート | Web Scratch

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へのリリースができるようになりました。

  • npm Trusted PublishingでOIDCを使ってトークンレスでCIからnpmパッケージを公開する | Web Scratch

JavaScript Primer

今年のJavaScript Primerは、ES2025の対応がメインでした。

v7.0.0

8月にv7.0.0をリリースして、ECMAScript 2025に完全対応しました。

  • JavaScript Primer v7.0.0リリース: ES2025対応とIterator Helpersの新章追加 | Web Scratch

新章「イテレータとジェネレータ」を追加して、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万円と試算していて、これをどう継続的に回していくかが課題です。

  • JavaScript Primer - Open Collective

secretlint

今年のsecretlintは、新しい検出ルールの追加とメジャーアップデートが中心でした。

v10とv11

6月にv10.0.0、8月にv11.0.0をリリースしました。

  • Secretlint v10.0.0リリース: デフォルトでシークレットをマスク表示するように変更、Node.js 20+のサポート | Web Scratch

v10ではデフォルトでシークレットをマスク表示するようにしました。 AIエージェントがstdoutを読むケースが増えてきたため、デフォルトをマスク表示に変更しました(#1067)。

新しい検出ルール

v11で2つの新ルールを推奨プリセットに追加しました。

  • @secretlint/secretlint-rule-anthropic
    • Claude APIキー(sk-ant-api0\d-...パターン)を検出
  • @secretlint/secretlint-rule-database-connection-string
    • MongoDB等のデータベース接続文字列を検出

v11.1.0では @secretlint/secretlint-rule-patternfilePathGlobs オプションを追加しました。 ファイルパスのglob指定とコンテンツ検索を組み合わせられるようになっています。

インフラ改善

textlintと同様に、Yarn BerryからpnpmへのmigrationとMochaからVitestへのテストフレームワーク移行を完了しました。 npm Trusted Publishing対応も完了しています。

JSer.info

JSer.infoは今年で14周年を迎えました。

  • JSer.info 14周年

大体の週刊更新は継続していて、1月9日の#721号から12月末まで約40本の週刊記事を配信しました。(今年は結構ゆっくりペースでした)

来月で15周年です。

MCPサーバー

5月にJSer.info のMCPサーバーを公開しました。

jser_search_itemsjser_search_postsjser_weeksなどのツールを用意して、AIエージェントがJSer.infoのデータへアクセスできるようになりました。 npmパッケージ@jser/mcpとしても配布しています。

これは、JSer.infoの更新フローが結構楽になったので、今後も継続的にメンテナンスしていきたいです。

TSKaigi 2025

5月のTSKaigi 2025で「技術書をソフトウェア開発する - jsprimerの10年から学ぶ継続的メンテナンスの技術」という発表をしました。

jsprimerを10年間メンテナンスし続けてきた方法を話しました。 技術書もソフトウェアと同じように、CIでテストしたり、依存関係を管理したり、リリースサイクルを回したりすることで継続できるという内容です。

YAPC::Fukuoka 2025

11月のYAPC::Fukuoka 2025で「読む技術・書く技術・伝える技術 - 15年続けて分かった持続可能なオープンソース開発」という発表をしました。

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.DateTimeFormatformatToPartsを使った日付フォーマットライブラリ
  • 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-propertiestext-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に記事をまとめました。

  • npmパッケージ/GitHub Actionsを利用する側/公開する側でサプライチェーン攻撃を防ぐためにやることメモ

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設定をほとんど自動化するスクリプトを作って回しています。 やり方が変わっていくので冪等に設定できるという点を意識して作っています。

  • npm Trusted PublishingでOIDCを使ってトークンレスでCIからnpmパッケージを公開する | Web Scratch

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の発表資料を作っているときにも感じましたが、こういった振り返りを書いておくと後で役立つので便利です。書くのは簡単になったけど、その土台になるデータやコンテンツはちゃんとメンテナンスして積み上げておく必要があるなと改めて思いました。

Discussion in the ATmosphere

Loading comments...