A pure JavaScript implementation of QUIC, HTTP/3, QPACK, and WebTransport for Node.js
npm install quico
🚀 JavaScript implementation of QUIC, HTTP/3, QPACK & WebTransport for Node.js
bash
npm install quico
`
🔗 Node.js API Compatibility
One of the core design goals of QUICO is to provide a familiar and intuitive API.
If you already know how to use Node’s built-in http or https modules, working with QUICO should feel natural.
QUICO exposes an API modeled after Node’s server interfaces:
- createServer works just like in http / https, accepting request and response objects.
- req and res objects follow the same semantics you already know: req.headers, res.writeHead(), res.end(), etc.
`js
import fs from 'node:fs';
import quico from 'quico';
import tls from 'lemon-tls';
const server = quico.createServer({
SNICallback: function (servername, cb) {
cb(null, tls.createSecureContext({
key: fs.readFileSync('YOUR_KEY_FILE_PATH'),
cert: fs.readFileSync('YOUR_CERT_FILE_PATH')
}));
}
}, function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
});
res.end('Hello World from HTTP/3 on Node.js!');
});
server.listen(4433, function () {
console.log('🚀 QUIC server running on https://localhost:4433');
});
`
> 📂 For more examples, see examples/
🧪 Testing
QUIC requires TLS 1.3 with an ECDSA certificate.
RSA self-signed certificates usually fail with QUIC/HTTP3.
For local development the easiest option is mkcert,
which generates locally trusted ECDSA certificates automatically.
This project supports ALPN "h3" only
(final version, not draft variants like h3-29 or h3-32).
You must explicitly force h3 when testing.
> ✅ Launch Chrome with:
> --enable-quic --quic-version=h3 --ignore-certificate-errors --origin-to-force-quic-on=localhost:4433
>
> ✅ Or test with Curl:
> curl --http3 -vvv --trace-time --trace-ascii - https://localhost:4433 --insecure
🛣 Roadmap
The following roadmap reflects the current and planned status of the QUICO project.
✅ = Completed 🔄 = In progress ⏳ = Planned ❌ = Not planned
$3
| Status | Item |
|:------:|------|
| ✅ | QUIC: Initial / Handshake / 1-RTT |
| ✅ | TLS 1.3 handshake & key schedule |
| ✅ | HTTP/3: control streams & basic requests |
| ✅ | QPACK: static & dynamic table |
$3
| Status | Item | Notes |
|:------:|------|-------|
| 🔄 | QPACK: Huffman encoding/decoding | Custom table support partially working |
| 🔄 | WebTransport: unidirectional & bidirectional streams | Stream interface WIP |
| 🔄 | HTTP/3: GOAWAY & request cancellation | Partial control flow support |
| 🔄 | Integration with Node.js https-style API | Goal: seamless compatibility |
| 🔄 | Project modularization & internal refactoring | To improve maintainability |
$3
| Status | Item | Notes |
|:------:|------|-------|
| ⏳ | QUIC: 0-RTT support | Will follow key update & early data support |
| ⏳ | WebTransport: datagram support | Based on RFC 9298 |
| ⏳ | QUIC: proper connection teardown | CLOSE frame, idle timeout |
| ⏳ | QUIC: keep-alive & PING frames | For long-lived connections |
| ⏳ | QUIC: flow control & congestion (BBR / CUBIC) | Needs metrics and simulation |
| ⏳ | QUIC: session resumption & connection migration | For mobile/roaming support |
| ⏳ | End-to-end test suite against Chromium | Automate using testh3 and Puppeteer |
| ⏳ | Benchmarks, performance analysis & tuning | Resource usage, latency, throughput |
| ⏳ | Fuzz testing and protocol robustness checks | To improve security and reliability |
| ⏳ | Developer documentation & API reference | For better onboarding |
| ⏳ | TypeScript typings | Type safety for IDE support |
_Note: QUICO is a work-in-progress project aiming to provide a full JavaScript implementation of QUIC + HTTP/3. Community contributions are welcome!_
_Please ⭐ star the repo to follow progress!_
🙏 Sponsors
QUICO is an evenings-and-weekends project.
Support development via GitHub Sponsors or simply share the project.
📜 License
Apache License 2.0
`
Copyright © 2025 colocohen
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
``