Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Esplora - Electrs backend API

A block chain index engine and HTTP API written in Rust based on romanz/electrs.

Used as the backend for the Esplora block explorer powering blockstream.info.

API documentation is available here.

Documentation for the database schema and indexing process is available here.

Installing & indexing

Install Rust, Bitcoin Core (no txindex needed) and the clang and cmake packages, increase maximum number open files by ulimit -n 100000 and then:

$ git clone https://github.com/blockstream/electrs &&cd electrs
$ git checkout new-index
$ cargo run --release --bin electrs -- --daemon-dir ~/.bitcoin
# Or for liquid:
$ cargo run --features liquid --release --bin electrs -- --network liquid --daemon-dir ~/.liquid

See electrs's original documentation for more detailed instructions. Note that our indexes are incompatible with electrs's and has to be created separately.

The indexes require 610GB of storage after running compaction (as of June 2020), but you'll need to have free space of about double that available during the index compaction process. Creating the indexes should take a few hours on a beefy machine with SSD.

To deploy with Docker, follow the instructions here.

Light mode

For personal or low-volume use, you may set --lightmode to reduce disk storage requirements by roughly 50% at the cost of slower and more expensive lookups.

With this option set, raw transactions and metadata associated with blocks will not be kept in rocksdb (the T, X and M indexes), but instead queried from bitcoind on demand.

Notable changes from Electrs:

  • HTTP REST API in addition to the Electrum JSON-RPC protocol, with extended transaction information (previous outputs, spending transactions, script asm and more).

  • Extended indexes and database storage for improved performance under high load:

    • A full transaction store mapping txids to raw transactions is kept in the database under the prefix t.
    • An index of all spendable transaction outputs is kept under the prefix O.
    • An index of all addresses (encoded as string) is kept under the prefix a to enable by-prefix address search.
    • A map of blockhash to txids is kept in the database under the prefix X.
    • Block stats metadata (number of transactions, size and weight) is kept in the database under the prefix M.

    With these new indexes, bitcoind is no longer queried to serve user requests and is only polled periodically for new blocks and for syncing the mempool.

  • Support for Liquid and other Elements-based networks, including CT, peg-in/out and multi-asset. (requires enabling the liquid feature flag using --features liquid)

CLI options

In addition to electrs's original configuration options, a few new options are also available:

  • --http-addr <addr:port> - HTTP server address/port to listen on (default: 127.0.0.1:3000).
  • --lightmode - enable light mode (see above)
  • --cors <origins> - origins allowed to make cross-site request (optional, defaults to none).
  • --address-search - enables the by-prefix address search index.
  • --index-unspendables - enables indexing of provably unspendable outputs.
  • --enable-mining-rest - enables cached mining-related HTTP endpoints.
  • --utxos-limit <num> - maximum number of utxos to return per address.
  • --electrum-txs-limit <num> - maximum number of txs to return per address in the electrum server (does not apply for the http api).
  • --electrum-banner <text> - welcome banner text for electrum server.

Additional options with the liquid feature:

  • --parent-network <network> - the parent network this chain is pegged to.

Additional options with the electrum-discovery feature:

  • --electrum-hosts <json> - a json map of the public hosts where the electrum server is reachable, in the server.features format.
  • --electrum-announce - announce the electrum server on the electrum p2p server discovery network.

See $ cargo run --release --bin electrs -- --help for the full list of options.

Mining-related HTTP endpoints

GET /block-template is available only with --enable-mining-rest. It proxies the daemon's getblocktemplate response unchanged on Bitcoin-compatible chains. On Liquid, it instead decodes the complete proposal returned by getnewblockhex and projects the recoverable header, transaction, fee, coinbase, and witness-commitment data into the same response shape. Fields that have no equivalent mining semantics for signed dynafed blocks use compatibility defaults or are omitted. The Liquid response is intended for template inspection and distribution, not block reconstruction or federation signing.

Successful responses are cached for 15 seconds and invalidated early when electrs indexes a new tip. Cache misses are coalesced into one daemon request. Responses use Cache-Control: no-store, so downstream caches do not extend the internal lifetime.

Template RPCs use an isolated daemon connection with a 30-second I/O timeout. Failures are retained internally for one second to prevent HTTP pollers from immediately repeating the same failing RPC, while error responses remain Cache-Control: no-store. Malformed Bitcoin templates that cannot be validated against the indexed tip are rejected with 502 Bad Gateway; they are not served or cached.

All connections to the configured daemon RPC endpoint are expected to expose a coherent chain view. Deployments using an L4 load balancer must keep its daemon backends synchronized or provide backend affinity. A template that conflicts with electrs' indexed tip is rejected rather than serving potentially stale mining work.

License

MIT

About

An efficient re-implementation of Electrum Server in Rust

Resources

Stars

391 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages