33 ポイント 投稿者 xguru 2026-03-02 | 7件のコメント | WhatsAppで共有
  • ローカル開発時の ポート衝突何番ポートを使ったか覚えなければならないつらさ を解決する Vercel Labs のオープンソースユーティリティ
  • 各開発サーバーに固有の app.localhost サブドメイン を割り当て、人間と AI エージェントの両方が認識できる URL 体系を提供
    next dev で実行すると http://localhost:3000 となり 3000 を覚える必要がありますが、
    portless myapp next dev を実行すると http://myapp.localhost:1355 の形でアクセス可能
    portless api.myapp pnpm start のように実行すると http://api.myapp.localhost:1355 としてサブドメインアクセスにも対応
  • プロキシベースの構造 で動作し、portless proxy が中央でリクエストをルーティング
    • アプリ実行時に自動でプロキシが起動し、各アプリは任意のポート (4000–4999) に割り当て
    • ほとんどのフレームワーク (Next.js, Express, Nuxt など) は PORT 環境変数を自動認識
    • Vite、Astro など一部のフレームワークでは 自動フラグ注入機能 により互換性を確保
  • HTTP/2 と HTTPS をサポート し、高速なページ読み込みと安全なローカル通信を実現
    • ブラウザは HTTP/1.1 をホストごとに 6 接続までに制限
      • Vite/Nuxt のように複数の未圧縮ファイルを配信する開発サーバーでは性能低下が発生
      • HTTP/2 はすべてのリクエストを単一接続で多重化
    • 独自証明書の生成とシステム信頼ストアへの登録を自動化
    • --cert, --key オプションで カスタム証明書 も適用可能
  • コマンド中心の CLI インターフェースを提供
    • portless <name> <cmd> : 指定した名前でアプリを実行
    • portless list : アクティブなルート一覧を表示
    • portless proxy start/stop : プロキシを制御
    • PORTLESS=0 環境変数でプロキシをバイパスして実行可能
  • 状態管理ディレクトリ を通じてルートと PID 情報を保存
    • 一般ユーザーモードでは ~/.portless、root モードでは /tmp/portless を使用
    • PORTLESS_STATE_DIR でパスを再定義可能
  • Vite、webpack-dev-server などで API プロキシを設定する際は Host ヘッダーの書き換えが必要
    • 設定が誤っている場合は 508 Loop Detected レスポンスで問題を案内
  • Node.js 20 以上macOS および Linux 環境をサポート
  • pnpm + Turborepo ベースのモノレポ構成
  • Apache-2.0 ライセンス、TypeScript (約 74%) コードベース

7件のコメント

 
xguru 2026-03-05

ワークツリーをサポートするようにアップデートされました

https://github.com/vercel-labs/portless/releases/tag/v0.5.2

これで自動的にワークツリーを認識して、ブランチ名をホストの前に付けてくれます

 
ragingwind 2026-03-02

同一プロジェクトのワークツリーとは相性があまり良くないので、使っていません。

 
ndrgrd 2026-03-02

自動で割り当ててくれるのかと思ったら、単に手動で登録する方式なんですね
Caddyを使っているので、あえてこれに乗り換える理由はなさそうです

 
ksc2601 2026-03-02

docker + traefik + mkcert ですでにやっていましたが、あれを使うほうがもっと便利そうですね

 
bytecakelake 2026-03-02

役に立つ記事ですね

 
xguru 2026-03-02

これで EADDRINUSE エラーともおさらばですかね?
最近はエージェント経由であれこれ開発してると、いろいろ立ち上がって勝手にぶつかって大騒ぎなんですよね(笑)

 
xguru 2026-03-02

Xで話題になっていましたが、Dockerで使う場合は Docker デーモンの PID を強制的に渡せば、それでも動くそうです。

https://github.com/vercel-labs/portless/issues/61