Skip to content

sea: add vfsArchive to serve the assets from a ZIP archive - #65810

Open
mcollina wants to merge 2 commits into
nodejs:mainfrom
mcollina:sea-vfs-zip
Open

mcollina wants to merge 2 commits into
nodejs:mainfrom
mcollina:sea-vfs-zip

Conversation

@mcollina

@mcollina mcollina commented Sep 5, 2026

Copy link
Copy Markdown
Member

This adds a "vfsArchive" option to the SEA configuration that serves the bundled assets from a ZIP archive, and fixes a performance bug in the SEA asset lookup found while benchmarking it.

"vfsArchive"

Instead of listing individual "assets", the configuration can point at a prebuilt ZIP archive:

{
  "main": "main.js",
  "output": "app",
  "useVfs": true,
  "vfsArchive": "assets.zip"
}

--build-sea embeds the archive verbatim as a single reserved asset (only a PK signature sanity check happens at build time — no ZIP serialization logic is added to the build side). At runtime the SEA virtual file system mounts the existing ZipProvider over a zero-copy view of the embedded archive instead of the SEAProvider, and the main script is injected into the in-memory archive index as a stored entry, so the mounted tree looks exactly like plain "useVfs": __dirname-relative reads, relative require(), and bare specifier lookups are unchanged.

The archive can be produced with any ZIP tool or with the ZIP support in node:zlib (zlib.zipFiles()), which is also what the test does. "vfsArchive" requires "useVfs": true and cannot be combined with "assets". Since only the archive is embedded, sea.getAsset()/sea.getAssetAsBlob() do not serve the individual files; they are read through the fs APIs instead.

Perf fix: return the SEA resource by reference

FindSingleExecutableResource() returned the deserialized SeaResource by value, copying the whole assets map on every call. getAsset() calls it once per asset read, making every fs operation served by the SEA VFS pay a cost linear in the number of bundled assets: with 8192 assets, reading each of them took ~7.9s instead of ~270ms (~30x). Fixed in the first commit by returning a reference to the cached resource.

Size / speed tradeoff

Measured with a 75% text / 25% random asset mix in 16KB files (Linux x64, warm cache, medians of 15 runs; scenarios: start the binary touching no asset, read one small asset, read every asset):

Assets Binary (plain → archive) Startup +Δ Read one +Δ Read all (plain → archive)
1MB 151.3MB → 150.6MB +12ms +14ms 50ms → 64ms
8MB 158.7MB → 153.0MB +11ms +12ms 69ms → 110ms
32MB 183.9MB → 161.2MB (−22.7MB) +12ms +19ms 115ms → 213ms
128MB 284.7MB → 193.9MB (−90.8MB, −32%) +8ms +11ms 269ms → 477ms
  • The startup penalty is a flat ~10ms independent of bundle size (loading the internal/zip machinery and parsing the central directory); nothing is inflated until a file is opened.
  • Reads from the archive are ~2.5x slower than the SEAProvider memcpy path; per-file stat cost is identical (VFS dispatch dominates).
  • Max RSS is lower with the archive for workloads that read a subset of the assets (119MB vs 198MB at the 128MB tier) because fewer executable pages are touched.

Rule of thumb: the archive is a clear win above roughly 30MB of compressible assets when a run reads a subset of them; plain "useVfs" remains better for small bundles or workloads that repeatedly read large assets.

——

AI written, humanly reviewed.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/loaders
  • @nodejs/single-executable
  • @nodejs/startup
  • @nodejs/vm

@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Sep 5, 2026
@mcollina
mcollina marked this pull request as ready for review September 7, 2026 06:19
@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.74576% with 18 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.26%. Comparing base (4521f26) to head (6d148fa).
⚠️ Report is 105 commits behind head on main.

Files with missing lines Patch % Lines
src/node_sea.cc 69.49% 13 Missing and 5 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #65810      +/-   ##
==========================================
+ Coverage   90.01%   90.26%   +0.25%     
==========================================
  Files         785      790       +5     
  Lines      269282   271742    +2460     
  Branches    51288    51865     +577     
==========================================
+ Hits       242381   245296    +2915     
+ Misses      17401    16942     -459     
- Partials     9500     9504       +4     
Files with missing lines Coverage Δ
lib/internal/vfs/sea.js 100.00% <100.00%> (ø)
src/module_wrap.cc 74.21% <100.00%> (ø)
src/node.cc 76.89% <100.00%> (+0.04%) ⬆️
src/node_contextify.cc 81.64% <100.00%> (-0.17%) ⬇️
src/node_sea.h 100.00% <ø> (ø)
src/node_sea.cc 87.87% <69.49%> (-1.79%) ⬇️

... and 130 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@mcollina mcollina added the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 7, 2026
@github-actions github-actions Bot removed the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 7, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@pipobscure

Copy link
Copy Markdown
Contributor

The CI is possibly hitting the same bug addressed in #65814 as this means SEA is looking for a package.json, etc. at the root of the archive.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@mcollina mcollina added the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 10, 2026
@github-actions github-actions Bot added request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. and removed request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. labels Sep 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Failed to start CI
- Validating Jenkins credentials
✔  Jenkins credentials valid
- Querying data for job/node-test-pull-request/77180/
SyntaxError: Unexpected token '<', ..."    
  https://github.com/nodejs/node/actions/runs/34502846196

@mcollina mcollina added request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. and removed request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. labels Sep 12, 2026
@github-actions github-actions Bot added request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. and removed request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. labels Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Failed to start CI
- Validating Jenkins credentials
✔  Jenkins credentials valid
- Querying data for job/node-test-pull-request/77180/
SyntaxError: Unexpected token '<', ..."    
  https://github.com/nodejs/node/actions/runs/34683737619

When "vfsArchive" names a ZIP archive in the SEA configuration (with
"useVfs": true), --build-sea embeds the archive verbatim as one
reserved asset, and at runtime the SEA virtual file system mounts the
existing ZipProvider over a zero-copy view of the embedded archive
instead of the SEAProvider. The main script is injected into the
in-memory archive index as a stored entry, so the mounted tree looks
the same as with "assets".

The archive can be produced with any ZIP tool or with the ZIP support
in node:zlib; no ZIP serialization logic is added to the build side.
This trades asset read speed (entries are inflated when opened) for a
substantially smaller executable when the assets are compressible.

Also make FindSingleExecutableResource() return the deserialized
SeaResource by reference instead of by value: the copy included the
whole assets map, and getAsset() calls it once per asset read, so
every fs operation served by the SEA virtual file system paid a cost
linear in the number of bundled assets - with 8192 assets, reading
each of them took seconds instead of milliseconds.

Signed-off-by: Matteo Collina <hello@matteocollina.com>
@mcollina mcollina added request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. and removed request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. labels Sep 16, 2026
@github-actions github-actions Bot added request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. and removed request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. labels Sep 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Failed to start CI
�[36m⠋�[39m Getting reviews from nodejs/node/pull/65810
�[36m⠋�[39m Getting commits from nodejs/node/pull/65810
�[36m⠙�[39m Validating Jenkins credentials
�[36m⠙�[39m Validating Jenkins credentials
✔  Jenkins credentials valid
�[36m⠹�[39m Getting comments from nodejs/node/pull/65810
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying API for job/node-test-pull-request/77180/
SyntaxError: Unexpected token '<', ..."    
  https://github.com/nodejs/node/actions/runs/35060560795

@mcollina mcollina added request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. and removed request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. labels Sep 16, 2026
@github-actions github-actions Bot added request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. and removed request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. labels Sep 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Failed to start CI
�[36m⠋�[39m Getting reviews from nodejs/node/pull/65810
�[36m⠋�[39m Getting commits from nodejs/node/pull/65810
�[36m⠙�[39m Validating Jenkins credentials
�[36m⠙�[39m Validating Jenkins credentials
✔  Jenkins credentials valid
�[36m⠹�[39m Getting comments from nodejs/node/pull/65810
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying API for job/node-test-pull-request/77180/
SyntaxError: Unexpected token '<', ..."    
  https://github.com/nodejs/node/actions/runs/35071280576

@mcollina mcollina added request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. and removed request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. labels Sep 17, 2026
@github-actions github-actions Bot added request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. and removed request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. labels Sep 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Failed to start CI
�[36m⠋�[39m Getting reviews from nodejs/node/pull/65810
�[36m⠋�[39m Getting commits from nodejs/node/pull/65810
�[36m⠙�[39m Validating Jenkins credentials
�[36m⠙�[39m Validating Jenkins credentials
✔  Jenkins credentials valid
�[36m⠹�[39m Getting comments from nodejs/node/pull/65810
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying data for job/node-test-pull-request/77180/
�[36m⠸�[39m Querying API for job/node-test-pull-request/77180/
SyntaxError: Unexpected token '<', ..."    
  https://github.com/nodejs/node/actions/runs/35185994844

@mcollina mcollina added request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. and removed request-ci-failed Starting CI with the request-ci label failed and requires manual intervention. labels Sep 17, 2026
@github-actions github-actions Bot removed the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 17, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

pipobscure added a commit to pipobscure/bundles that referenced this pull request Sep 18, 2026
Yesterday's fix was `.cjs`, on the reasoning that the stub is injected at the
root of this package's own bundle and this package says "type": "module", so a
.js there is an ES module and `require` is undefined in it. All true, and the
wrong conclusion: "mainFormat": "module" says the same thing from the other
direction, and then the stub is an ES module on purpose rather than a CommonJS
one by extension.

Which is the better shape. Every other file in that bundle is ESM, the launcher
it loads is ESM, and importing it directly beats requiring an ES module through
interop. The stub also stops needing a promise chain: top-level await and a
try/catch say the same thing in fewer moving parts.

Worth recording what does *not* work, since the name suggests it should:
"mainFormat": "commonjs" does not make a .js stub CommonJS. Format detection
inside the mount follows the file system rules, so the package.json at the root
wins, and the only route to a CommonJS main there is the .cjs extension.

  .js  + CJS syntax, mainFormat unset       fails
  .js  + CJS syntax, mainFormat commonjs    fails — the type: module still wins
  .js  + ESM syntax, mainFormat module      works
  .cjs + CJS syntax, mainFormat unset       works

The vfsArchive this depends on is nodejs/node#65810, which is on the deploy
branch but not merged upstream; useVfs itself (#65675) is merged. Docs are left
alone for now — that status is a week from changing.
Run the synchronous SEA build and execution inside the promise callback. The
callback is then counted before buildSEA can skip the test when signing tools
are unavailable.

Signed-off-by: Matteo Collina <hello@matteocollina.com>
Assisted-by: Pi
@mcollina mcollina added the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 18, 2026
@github-actions github-actions Bot removed the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Sep 18, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@mcollina mcollina added the commit-queue PRs queued for automated landing through the Commit Queue. label Sep 19, 2026
@nodejs-github-bot nodejs-github-bot added commit-queue-failed PRs whose Commit Queue landing failed and need manual intervention before retrying. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Sep 19, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Commit Queue failed

This pull request has multiple commits, but no landing policy was selected.

Add commit-queue-squash PRs the Commit Queue should land as one squashed commit. to land it as one commit, or commit-queue-rebase PRs the Commit Queue should land as multiple self-contained commits. to land the commits separately.

The pull request was removed from the Commit Queue and labeled commit-queue-failed PRs whose Commit Queue landing failed and need manual intervention before retrying. . After resolving the failure, remove that label and add commit-queue PRs queued for automated landing through the Commit Queue. to retry.

Full Commit Queue output
�[36m⠋�[39m Loading data for nodejs/node/pull/65810
�[36m⠋�[39m Loading data for nodejs/node/pull/65810
�[36m⠋�[39m Getting collaborator contacts from README of nodejs/node
�[36m⠋�[39m Getting PR from nodejs/node/pull/65810
�[36m⠋�[39m Getting reviews from nodejs/node/pull/65810
�[36m⠋�[39m Getting comments from nodejs/node/pull/65810
�[36m⠋�[39m Getting commits from nodejs/node/pull/65810
✔  Done loading data for nodejs/node/pull/65810
----------------------------------- PR info ------------------------------------
Title      sea: add vfsArchive to serve the assets from a ZIP archive (#65810)
Author     Matteo Collina <matteo.collina@gmail.com> (@mcollina)
Branch     mcollina:sea-vfs-zip -> nodejs:main
Labels     c++, lib / src, needs-ci, commit-queue
Commits    2
 - sea: add vfsArchive to serve the assets from a ZIP archive
 - test: avoid mustCall mismatch in SEA zip test
Committers 1
 - Matteo Collina <hello@matteocollina.com>
PR-URL: https://github.com/nodejs/node/pull/65810
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day>
------------------------------ Generated metadata ------------------------------
PR-URL: https://github.com/nodejs/node/pull/65810
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day>
--------------------------------------------------------------------------------
   ℹ  This PR was created on Sat, 05 Sep 2026 10:34:11 GMT
   ✔  Approvals: 3
   ✔  - Paolo Insogna (@ShogunPanda) (TSC): https://github.com/nodejs/node/pull/65810#pullrequestreview-5248755685
   ✔  - James M Snell (@jasnell) (TSC): https://github.com/nodejs/node/pull/65810#pullrequestreview-5133336852
   ✔  - Gürgün Dayıoğlu (@gurgunday): https://github.com/nodejs/node/pull/65810#pullrequestreview-5219255737
   ✔  Last GitHub CI successful
   ℹ  Last Full PR CI on 2026-09-18T19:11:07Z: https://ci.nodejs.org/job/node-test-pull-request/77620/
�[36m⠙�[39m Querying data for job/node-test-pull-request/77620/
�[36m⠙�[39m Querying data for job/node-test-pull-request/77620/
�[36m⠙�[39m Querying API for job/node-test-pull-request/77620/
✔  Build data downloaded
   ✔  Last Jenkins CI successful
--------------------------------------------------------------------------------
   ✔  No git cherry-pick in progress
   ✔  No git am in progress
   ✔  No git rebase in progress
--------------------------------------------------------------------------------
�[36m⠹�[39m Bringing origin/main up to date...
�[36m⠹�[39m Bringing origin/main up to date...
From https://github.com/nodejs/node
 * branch                  main       -> FETCH_HEAD
   b1251217f2..22ab7d77f1  main       -> origin/main
✔  origin/main is now up-to-date
main is out of sync with origin/main. Mismatched commits:
 - adf8525c33 buffer: add Buffer.stringLength()
 - 22ab7d77f1 buffer: add Buffer.stringLength()
--------------------------------------------------------------------------------
HEAD is now at 22ab7d77f1 buffer: add Buffer.stringLength()
   ✔  Reset to origin/main
�[36m⠸�[39m Downloading patch for 65810
�[36m⠸�[39m Downloading patch for 65810
From https://github.com/nodejs/node
 * branch                  refs/pull/65810/merge -> FETCH_HEAD
✔  Fetched commits as b1251217f2d2..6d148faf9f15
--------------------------------------------------------------------------------
Auto-merging doc/api/single-executable-applications.md
Auto-merging doc/api/vfs.md
Auto-merging src/node.cc
[main 30e57979f8] sea: add vfsArchive to serve the assets from a ZIP archive
 Author: Matteo Collina <hello@matteocollina.com>
 Date: Sun Sep 13 21:05:28 2026 +0200
 17 files changed, 389 insertions(+), 18 deletions(-)
 create mode 100644 test/fixtures/sea/vfs-zip/config.json
 create mode 100644 test/fixtures/sea/vfs-zip/greeting.txt
 create mode 100644 test/fixtures/sea/vfs-zip/math.js
 create mode 100644 test/fixtures/sea/vfs-zip/sea-config.json
 create mode 100644 test/fixtures/sea/vfs-zip/sea.js
 create mode 100644 test/fixtures/sea/vfs-zip/test-pkg-index.js
 create mode 100644 test/fixtures/sea/vfs-zip/test-pkg-package.json
 create mode 100644 test/sea/test-single-executable-application-vfs-zip.js
[main 2220531fb9] test: avoid mustCall mismatch in SEA zip test
 Author: Matteo Collina <hello@matteocollina.com>
 Date: Fri Sep 18 13:39:56 2026 +0200
 1 file changed, 3 insertions(+), 3 deletions(-)
   ✔  Patches applied
There are 2 commits in the PR. Attempting autorebase.
(node:668) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
(Use `node --trace-deprecation ...` to show where the warning was created)
Rebasing (2/4)
Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
sea: add vfsArchive to serve the assets from a ZIP archive

When "vfsArchive" names a ZIP archive in the SEA configuration (with
"useVfs": true), --build-sea embeds the archive verbatim as one
reserved asset, and at runtime the SEA virtual file system mounts the
existing ZipProvider over a zero-copy view of the embedded archive
instead of the SEAProvider. The main script is injected into the
in-memory archive index as a stored entry, so the mounted tree looks
the same as with "assets".

The archive can be produced with any ZIP tool or with the ZIP support
in node:zlib; no ZIP serialization logic is added to the build side.
This trades asset read speed (entries are inflated when opened) for a
substantially smaller executable when the assets are compressible.

Also make FindSingleExecutableResource() return the deserialized
SeaResource by reference instead of by value: the copy included the
whole assets map, and getAsset() calls it once per asset read, so
every fs operation served by the SEA virtual file system paid a cost
linear in the number of bundled assets - with 8192 assets, reading
each of them took seconds instead of milliseconds.

Signed-off-by: Matteo Collina <hello@matteocollina.com>
PR-URL: https://github.com/nodejs/node/pull/65810
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day>
--------------------------------------------------------------------------------
[detached HEAD dd408ceb4c] sea: add vfsArchive to serve the assets from a ZIP archive
 Author: Matteo Collina <hello@matteocollina.com>
 Date: Sun Sep 13 21:05:28 2026 +0200
 17 files changed, 389 insertions(+), 18 deletions(-)
 create mode 100644 test/fixtures/sea/vfs-zip/config.json
 create mode 100644 test/fixtures/sea/vfs-zip/greeting.txt
 create mode 100644 test/fixtures/sea/vfs-zip/math.js
 create mode 100644 test/fixtures/sea/vfs-zip/sea-config.json
 create mode 100644 test/fixtures/sea/vfs-zip/sea.js
 create mode 100644 test/fixtures/sea/vfs-zip/test-pkg-index.js
 create mode 100644 test/fixtures/sea/vfs-zip/test-pkg-package.json
 create mode 100644 test/sea/test-single-executable-application-vfs-zip.js
Rebasing (3/4)
Rebasing (4/4)
Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
test: avoid mustCall mismatch in SEA zip test

Run the synchronous SEA build and execution inside the promise callback. The
callback is then counted before buildSEA can skip the test when signing tools
are unavailable.

Signed-off-by: Matteo Collina <hello@matteocollina.com>
Assisted-by: Pi
PR-URL: https://github.com/nodejs/node/pull/65810
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day>
--------------------------------------------------------------------------------
[detached HEAD 06fd7223f9] test: avoid mustCall mismatch in SEA zip test
 Author: Matteo Collina <hello@matteocollina.com>
 Date: Fri Sep 18 13:39:56 2026 +0200
 1 file changed, 3 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/main.
--------------------------------------------------------------------------------
   ℹ  Add `commit-queue-squash` label to land the PR as one commit, or `commit-queue-rebase` to land as separate commits.

View workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Issues and PRs that require attention from people who are familiar with C++. commit-queue-failed PRs whose Commit Queue landing failed and need manual intervention before retrying. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants