Merge pull request #153 from ditatompel/update/xmr-public-api

Merge pull request #153

This merge action was created automatically.

Reviewed-by: ditatompel <ditatompel@users.noreply.github.com>
This commit is contained in:
ditatombot[bot] 2024-06-11 10:16:03 +00:00 committed by GitHub
commit 8510486009
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 66 additions and 246 deletions

View file

@ -1,13 +1,13 @@
---
title: "Public API Monero Remote Node List"
description: "API documentation to search for monitored Monero remote nodes on xmr.ditatompel.com. You can filter based on nettype, countries and more."
summary: "API documentation to search for monitored Monero remote nodes on xmr.ditatompel.com. You can filter based on nettype, countries and more."
date: 2022-01-29T23:40:26+07:00
lastmod:
draft: false
noindex: false
featured: false
pinned: false
# comments: false
series:
# -
categories:
@ -16,25 +16,14 @@ tags:
- Monero
- API
images:
# -
# menu:
# main:
# weight: 100
# params:
# icon:
# vendor: bs
# name: book
# color: '#e24d0e'
authors:
- ditatompel
---
Since my main site that displays list of Monero remote nodes **MAY** contains Google AdSense (where very likely track users behavior and interests), I decided create dedicated subdomain for my Monero Remote Node pages and it's API endpoint. No Ads, no user tracking.
<!--more-->
- Web interface: [https://xmr.ditatompel.com/](https://xmr.ditatompel.com/).
- Source Code: Available for public soon.
- Source Code: [https://github.com/ditatompel/xmr-remote-nodes](https://github.com/ditatompel/xmr-remote-nodes)
## API Endpoint and Query Parameters
@ -45,6 +34,7 @@ Since my main site that displays list of Monero remote nodes **MAY** contains Go
The default response will display 10 records, sorted from `last_checked` node.
Optional query string parameters:
- `host`: Filter nodes based on hostname or IP address.
- `protocol`: Possible values:
- `any` or _empty string_ or _not set_: Return nodes using any protocol.
@ -74,18 +64,21 @@ Optional query string parameters:
- `-1`: No CORS filter is applied (default).
For example, if you want to **list CORS enabled Monero nodes using https from United States sorted from recently checked node**:
```shell
curl -sL 'https://xmr.ditatompel.com/api/v1/nodes?cors=1&protocol=https&country=us&sort_by=last_checked&sort_direction=desc' | jq
curl -sL 'https://xmr.ditatompel.com/api/v1/nodes?cors=1&protocol=https&cc=us&sort_by=last_checked&sort_direction=desc' | jq
```
## Response Header
The response header includes the **HTTP status code** and the `content-type`. Clients that receive a HTTP status code other than `200` and `content-type` other than `application/json` must back-off.
## Response Body
The response body includes the information of the query result, query status, and response message. In the example below, the response body of:
```shell
curl -sL 'https://xmr.ditatompel.com/api/v1/nodes?country=SG' | jq
curl -sL 'https://xmr.ditatompel.com/api/v1/nodes?cc=SG' | jq
```
```json
@ -134,41 +127,42 @@ curl -sL 'https://xmr.ditatompel.com/api/v1/nodes?country=SG' | jq
},
}
```
- `status`: *string*, `ok` means everything looks good.
- `message`: *string*, Information related to your query, *success* or *error* message if any.
- `data`: *object*, Information related to your query.
- `total_rows`: *unsigned int*; Total number of nodes found.
- `rows_per_page`: *unsigned int*; Number of nodes per page.
- `items`: *array* of nodes or null if no nodes found. Each node has the structure as follows:
- `id`: *unsigned int*; ID of the node.
- `hostname`: *string*; The hostname / nodes IP address.
- `ip`: *string*; The IP address of node, empty string if hostname is not resolveable (Eg.: TOR nodes)
- `port`: *unsigned int*; TCP port the nodes is using to listen to RPC calls.
- `protocol`: *string*; The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`.
- `is_tor`: *boolean*; whether the node is accessed through the Tor network.
- `is_available`: *boolean*; whether the node is online or not. False may means node wasn't ready or my bots can't connect to nodes RPC daemon.
- `nettype`: *string*; Network type (one of `mainnet`, `stagenet` or `testnet`).
- `height`: *unsigned int*; Current length of longest chain known to daemon.
- `adjusted_time`: *unsigned int*; Current time approximated from chain data, as Unix time.
- `database_size`: *unsigned int*; The size of the blockchain database, in bytes.
- `difficulty`: *unsigned int*; Least-significant 64 bits of the 128-bit network difficulty.
- `version`: *string*; Vesion of remote monero node is running.
- `uptime`: *float*; Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 60 seconds).
- `estimate_fee`: *unsigned int*; Amount of fees estimated per byte in atomic units. This just fee estimation, Malicious actors who running remote nodes [still can return high fee only when you about to create a transactions](monero-tx-fee-node.jpg).
- `asn`: *unsigned int*; The AS number that owns nodes IP address, `0` if no information available.
- `asn_name`: *string*; The AS name that owns nodes IP addres.
- `cc`: *string*; two-letter ISO 3166-1 country code nodes location, empty string if no information available.
- `country_name`: *string*; Country name based on nodes IP address, empty string if no information available.
- `city`: *string*; City location based on nodes IP address, empty string if no information available.
- `latitude`: *float*; Approx. latitude (geographic coordinate).
- `longitude`: *float*; Approx. longitude (geographic coordinate).
- `date_entered`: *unsigned int*, The Unix time when my bots start monitoring the node.
- `last_checked`: *unsigned int*, The Unix time when was the last time my bot checked into a monero node.
- `last_check_statuses`: *array* (size: `5`); last node avaibility status. Possible values:
- `status`: _string_, `ok` means everything looks good.
- `message`: _string_, Information related to your query, _success_ or _error_ message if any.
- `data`: _object_, Information related to your query.
- `total_rows`: _unsigned int_; Total number of nodes found.
- `rows_per_page`: _unsigned int_; Number of nodes per page.
- `items`: _array_ of nodes or null if no nodes found. Each node has the structure as follows:
- `id`: _unsigned int_; ID of the node.
- `hostname`: _string_; The hostname / nodes IP address.
- `ip`: _string_; The IP address of node, empty string if hostname is not resolveable (Eg.: TOR nodes)
- `port`: _unsigned int_; TCP port the nodes is using to listen to RPC calls.
- `protocol`: _string_; The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`.
- `is_tor`: _boolean_; whether the node is accessed through the Tor network.
- `is_available`: _boolean_; whether the node is online or not. False may means node wasn't ready or my bots can't connect to nodes RPC daemon.
- `nettype`: _string_; Network type (one of `mainnet`, `stagenet` or `testnet`).
- `height`: _unsigned int_; Current length of longest chain known to daemon.
- `adjusted_time`: _unsigned int_; Current time approximated from chain data, as Unix time.
- `database_size`: _unsigned int_; The size of the blockchain database, in bytes.
- `difficulty`: _unsigned int_; Least-significant 64 bits of the 128-bit network difficulty.
- `version`: _string_; Vesion of remote monero node is running.
- `uptime`: _float_; Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 60 seconds).
- `estimate_fee`: _unsigned int_; Amount of fees estimated per byte in atomic units. This just fee estimation, Malicious actors who running remote nodes [still can return high fee only when you about to create a transactions](monero-tx-fee-node.jpg).
- `asn`: _unsigned int_; The AS number that owns nodes IP address, `0` if no information available.
- `asn_name`: _string_; The AS name that owns nodes IP addres.
- `cc`: _string_; two-letter ISO 3166-1 country code nodes location, empty string if no information available.
- `country_name`: _string_; Country name based on nodes IP address, empty string if no information available.
- `city`: _string_; City location based on nodes IP address, empty string if no information available.
- `latitude`: _float_; Approx. latitude (geographic coordinate).
- `longitude`: _float_; Approx. longitude (geographic coordinate).
- `date_entered`: _unsigned int_, The Unix time when my bots start monitoring the node.
- `last_checked`: _unsigned int_, The Unix time when was the last time my bot checked into a monero node.
- `last_check_statuses`: _array_ (size: `5`); last node avaibility status. Possible values:
- `0`: Offline
- `1`: Online
- `2`: not yet checked.
- `cors`: *boolean*, whether the node return with `Access-Control-Allow-Origin` header or not.
- `cors`: _boolean_, whether the node return with `Access-Control-Allow-Origin` header or not.
> You will get `200` response code, `ok` status, and even if your query return no nodes (`null` value in `data.items` field).
@ -220,11 +214,12 @@ Diff: [013aa7d](https://github.com/ditatompel/insights/commit/013aa7db35edd28e72
Because I [refactoring my backend]({{< ref "/blog/rewriting-ditatompel-site-to-svelte-tailwind-and-go/index.md" >}}), there will most likely be another breaking changes in the near future.
### Update 2023-05-24
- I've add `cors` and `last_check_statuses` to nodes data record.
### Update 2022-05-10
- I've add `estimate_fee` to nodes data record which I get from [get_fee_estimate](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_fee_estimate) daemon RPC. This just fee estimation, moneromooo explain that malicious actors who running remote nodes [still can return high fee only when you about to create a transactions](monero-tx-fee-node.jpg).
- [selsta](https://github.com/selsta) create [pull request](https://github.com/monero-project/monero-gui/pull/3897) to add warning about high fee on official GUI conformation dialog.
- **The best and safest way is running your own node!**
- Nodes with 0% uptime within 1 month with more than 500 check attempt will be removed. You can always add your node again latter.

57
go.mod
View file

@ -6,91 +6,34 @@ require (
github.com/GoogleChrome/workbox v7.1.0+incompatible // indirect
github.com/KaTeX/KaTeX v0.16.10 // indirect
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20200 // indirect
github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2 v2.21100.20000 // indirect
github.com/hbstack/back-to-top v0.2.0 // indirect
github.com/hbstack/base v0.6.0 // indirect
github.com/hbstack/bigger-picture v0.10.1 // indirect
github.com/hbstack/blog v0.35.1 // indirect
github.com/hbstack/blog/modules/breadcrumb v0.1.23 // indirect
github.com/hbstack/blog/modules/content-panel v0.1.21 // indirect
github.com/hbstack/blog/modules/featured-image v0.2.21 // indirect
github.com/hbstack/blog/modules/heading-sign v0.1.23 // indirect
github.com/hbstack/blog/modules/post-nav v0.4.0 // indirect
github.com/hbstack/blog/modules/related-posts v0.4.0 // indirect
github.com/hbstack/blog/modules/toc-scrollspy v0.2.0 // indirect
github.com/hbstack/bootstrap v0.2.2 // indirect
github.com/hbstack/breadcrumb v0.7.1 // indirect
github.com/hbstack/carousel v0.2.5 // indirect
github.com/hbstack/code-block-panel v0.1.2 // indirect
github.com/hbstack/content-panel v0.10.1 // indirect
github.com/hbstack/docs v0.17.2 // indirect
github.com/hbstack/docs/modules/breadcrumb v0.1.10 // indirect
github.com/hbstack/docs/modules/doc-nav v0.3.7 // indirect
github.com/hbstack/docs/modules/featured-image v0.2.8 // indirect
github.com/hbstack/docs/modules/giscus v0.1.10 // indirect
github.com/hbstack/docs/modules/heading-sign v0.1.9 // indirect
github.com/hbstack/featured-image v0.2.1 // indirect
github.com/hbstack/footer v0.4.1 // indirect
github.com/hbstack/footer/modules/socials v0.3.0 // indirect
github.com/hbstack/gallery v0.13.0 // indirect
github.com/hbstack/gallery/modules/breadcrumb v0.1.1 // indirect
github.com/hbstack/giscus v0.1.1 // indirect
github.com/hbstack/hb v0.12.2 // indirect
github.com/hbstack/header v0.14.5 // indirect
github.com/hbstack/header/modules/language-picker v0.1.25 // indirect
github.com/hbstack/header/modules/search v0.1.36 // indirect
github.com/hbstack/header/modules/socials v0.2.0 // indirect
github.com/hbstack/header/modules/theme-toggle v0.5.1 // indirect
github.com/hbstack/heading-sign v0.2.0 // indirect
github.com/hbstack/mermaid v0.2.2 // indirect
github.com/hbstack/meta/recommended v0.2.10 // indirect
github.com/hbstack/noscript v0.7.0 // indirect
github.com/hbstack/pagination v0.8.0 // indirect
github.com/hbstack/progress-bar v0.1.0 // indirect
github.com/hbstack/pwa v0.1.2 // indirect
github.com/hbstack/scrollbar v0.1.0 // indirect
github.com/hbstack/search v0.2.2 // indirect
github.com/hbstack/slide v0.4.0 // indirect
github.com/hbstack/snackbar v0.1.2 // indirect
github.com/hbstack/socials v0.16.0 // indirect
github.com/hbstack/syntax-highlighting v0.2.0 // indirect
github.com/hbstack/syntax-highlighting/styles/gruvbox v0.1.1 // indirect
github.com/hbstack/toc-scrollspy v0.1.0 // indirect
github.com/henrygd/bigger-picture v1.1.17 // indirect
github.com/hugomods/ascii v0.1.0 // indirect
github.com/hugomods/base v0.7.0 // indirect
github.com/hugomods/bootstrap v0.22.2 // indirect
github.com/hugomods/code-block-panel v0.7.0 // indirect
github.com/hugomods/font-awesome v6.5.2+incompatible // indirect
github.com/hugomods/fuse-js v0.1.0 // indirect
github.com/hugomods/giscus v0.1.1 // indirect
github.com/hugomods/google-adsense v0.1.0 // indirect
github.com/hugomods/gravatar v0.2.0 // indirect
github.com/hugomods/hugopress v0.4.0 // indirect
github.com/hugomods/i18n-js v0.2.1 // indirect
github.com/hugomods/icons v0.6.4 // indirect
github.com/hugomods/icons/vendors/bootstrap v0.5.6 // indirect
github.com/hugomods/icons/vendors/font-awesome v0.6.6 // indirect
github.com/hugomods/icons/vendors/simple-icons v1.0.41 // indirect
github.com/hugomods/idb-js v0.1.0 // indirect
github.com/hugomods/images v0.10.1 // indirect
github.com/hugomods/katex v0.3.1 // indirect
github.com/hugomods/mermaid v0.1.1 // indirect
github.com/hugomods/pwa v0.9.0 // indirect
github.com/hugomods/search v0.14.0 // indirect
github.com/hugomods/seo/modules/alternatives v0.1.0 // indirect
github.com/hugomods/seo/modules/base v0.1.2 // indirect
github.com/hugomods/seo/modules/favicons v0.2.1 // indirect
github.com/hugomods/seo/modules/open-graph v0.1.0 // indirect
github.com/hugomods/seo/modules/schema v0.1.2 // indirect
github.com/hugomods/seo/modules/translations v0.1.0 // indirect
github.com/hugomods/seo/modules/twitter-cards v0.1.0 // indirect
github.com/hugomods/shortcodes v0.21.0 // indirect
github.com/hugomods/simple-icons v12.2.0+incompatible // indirect
github.com/hugomods/snackbar v0.1.2 // indirect
github.com/hugomods/workbox v0.1.0 // indirect
github.com/jakearchibald/idb v8.0.0+incompatible // indirect
github.com/krisk/Fuse v7.0.0+incompatible // indirect
github.com/twbs/bootstrap v5.3.3+incompatible // indirect
github.com/twbs/icons v1.11.3 // indirect
)

124
go.sum
View file

@ -4,109 +4,34 @@ github.com/KaTeX/KaTeX v0.16.10 h1:Q7Zw1aTBezZ0y7zYkipTq9Z+Gkkohyk7xBaiZKO8yZs=
github.com/KaTeX/KaTeX v0.16.10/go.mod h1:VI+aE+CVs/VqtbHnuhstfQST46GmrwpXH7LQAzYIouw=
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20200 h1:SmpwwN3DNzJWbV+IT8gaFu07ENUFpCvKou5BHYUKuVs=
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20200/go.mod h1:kx8MBj9T7SFR8ZClWvKZPmmUxBaltkoXvnWlZZcSnYA=
github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2 v2.21100.20000 h1:GZxx4Hc+yb0/t3/rau1j8XlAxLE4CyXns2fqQbyqWfs=
github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2 v2.21100.20000/go.mod h1:mFberT6ZtcchrsDtfvJM7aAH2bDKLdOnruUHl0hlapI=
github.com/hbstack/back-to-top v0.2.0 h1:oVGYYL34PL4OX2O725YmRL9kHjZuxBuyT33/ZG1Zze0=
github.com/hbstack/back-to-top v0.2.0/go.mod h1:lVnZhVZ8pabJJ/M27APUyayelJO5yr9jkwsVnxk1O4k=
github.com/hbstack/base v0.6.0 h1:kIMI5C7X1aTWffKnG9N5Db20O6DhjyztN5yAPIFFDbY=
github.com/hbstack/base v0.6.0/go.mod h1:4A2bxdXMjpj4HSEnugN7hlFECiap4zUX56jOqtu4YPY=
github.com/hbstack/bigger-picture v0.10.1 h1:EgUYZgSGhl4KwKVqryf6ncB2QY4YYgOqTpDW6+5tq14=
github.com/hbstack/bigger-picture v0.10.1/go.mod h1:wZpRrOlTFrt2lO3tl9Y7cIAJbAJN1MdvRu0UsbCnkaE=
github.com/hbstack/blog v0.35.1 h1:2fHcVrZwMuJI6sD1WgvInWfTkakIwpf4SGXxiNd0sKo=
github.com/hbstack/blog v0.35.1/go.mod h1:/A1EQoCCs9zlcn7dWecP0YMUmH2n1juv3DO4e/mfQ+o=
github.com/hbstack/blog/modules/breadcrumb v0.1.23 h1:MgUR88vv4cs/M1/cVBKUInFw3DcRw0W2AlmmcdhxewY=
github.com/hbstack/blog/modules/breadcrumb v0.1.23/go.mod h1:smQySqXDtUv2pP7bb+XBr+QGNFxhDGN0fLmQkOIWa5g=
github.com/hbstack/blog/modules/content-panel v0.1.21 h1:g43IVjn3O6QCQSvCbgr9iYCgZcI5XG8YAiuVPb269Ok=
github.com/hbstack/blog/modules/content-panel v0.1.21/go.mod h1:fVnvVtnfo3R78jnGLgckfC43j7rYMMN+l1PhU9E6Jas=
github.com/hbstack/blog/modules/featured-image v0.2.21 h1:G4nwll995EsnEAJOBUKJMjH12HtJ0YFPL0nH8m7qneI=
github.com/hbstack/blog/modules/featured-image v0.2.21/go.mod h1:+gxtGAEh7aXDDKQA0wWzdi9HPLcqCSRtRp63F+NN8QU=
github.com/hbstack/blog/modules/heading-sign v0.1.23 h1:Z6QZvCKER/O3Y0eXQtRtkICEzYllFZW0m5fkT5OXrTE=
github.com/hbstack/blog/modules/heading-sign v0.1.23/go.mod h1:fBpZ5ifaLbAVClB/cXGQCD45wFc7bU/GBuNyTwTMjJ8=
github.com/hbstack/blog/modules/post-nav v0.4.0 h1:oc90hYrFTQXXAgbi73xeaD+BxYjDwCvpCAxKJRDx4UE=
github.com/hbstack/blog/modules/post-nav v0.4.0/go.mod h1:tgP0PtW87TQPYz52S6rAjwusQcBheJLBC8US/bwxy0Q=
github.com/hbstack/blog/modules/related-posts v0.4.0 h1:FujQXAfdqixHGJibxkO3wSBhidElq/kM0XxfoSAJVus=
github.com/hbstack/blog/modules/related-posts v0.4.0/go.mod h1:h+O7tmtrhKImBt6/RS0GYDnOgDXCE632yyzlVVHTtN0=
github.com/hbstack/blog/modules/toc-scrollspy v0.2.0 h1:UgA7UxoHTOzFDRp1XxhCmCNiSZlfpXqyEBnkPMCMjsM=
github.com/hbstack/blog/modules/toc-scrollspy v0.2.0/go.mod h1:61D0fK0cilgwUzQm4fhVqfAc0cFYkvTE4pVSP6+FvHI=
github.com/hbstack/bootstrap v0.2.2 h1:Kiy+XEiyDvH9KVfuS7uWYTDoTLbiww0PWTheEXO/fdM=
github.com/hbstack/bootstrap v0.2.2/go.mod h1:2Qd2g72fKgje8fCMSaz8KlKIv60c6PAak59Zg2FJHs0=
github.com/hbstack/breadcrumb v0.7.1 h1:PntlY/kcdivpQ6/ae13qaR5RsTinYo3gtF1Xv2jGeK4=
github.com/hbstack/breadcrumb v0.7.1/go.mod h1:iLp0/AKYRVTNo+Sae1V55hX7CfhX9i0F/nMZ0SnicLQ=
github.com/hbstack/carousel v0.2.5 h1:+N4U9wvCvd8gWI0anyNVqelkrDqsWI/jDc8LG/KvB1E=
github.com/hbstack/carousel v0.2.5/go.mod h1:37ffr9r5ilAS4b7KrplyCeOcTPmFd2PMygLo+VPe3oY=
github.com/hbstack/code-block-panel v0.1.2 h1:7ZW54ZA7tBNr5oQSWrBrAvEyXfm0Usk9+Nsp7X7Xhko=
github.com/hbstack/code-block-panel v0.1.2/go.mod h1:VK2kn+hD3pr5HPz8izFAUyFG0lB/nXybe8ix5uc/LLs=
github.com/hbstack/content-panel v0.10.1 h1:DB0sg3nNWD4oy7RMCxe3xXYjAzhy3G58r6QlM324bEA=
github.com/hbstack/content-panel v0.10.1/go.mod h1:lEyMXJYCNHL6fkT260oX2FnXF6gD5Vd3EytifVuz3iQ=
github.com/hbstack/docs v0.17.2 h1:qGUhtRykmndetii9LcFLF0jFuXrNrJWHd2sGX6BDhFs=
github.com/hbstack/docs v0.17.2/go.mod h1:8nM1YwlDGfIkb51arJR8Viy35NFkytHfKqKUjdjLb8w=
github.com/hbstack/docs/modules/breadcrumb v0.1.10 h1:Ryp68WkRdOxL2UlGNYtN5ZJUxbbHv7bWe0NdzDt2Obg=
github.com/hbstack/docs/modules/breadcrumb v0.1.10/go.mod h1:pTh43gl04dPERZZVDQ70KVU0j0Z4hmPK7GrxUfLw15s=
github.com/hbstack/docs/modules/doc-nav v0.3.7 h1:K0U0EAsYYsnOV4AGYMbbkMEJe2HrBSmuWipbpBg4V4A=
github.com/hbstack/docs/modules/doc-nav v0.3.7/go.mod h1:EoYAPHmhHmM7hDgDvIJIRNRiy6G+n/Eeto6HUgsw5ww=
github.com/hbstack/docs/modules/featured-image v0.2.8 h1:5sYRhNxVa/EYGCsgS5SKiZMIAdhZQJxam4CEyTFWL8Q=
github.com/hbstack/docs/modules/featured-image v0.2.8/go.mod h1:zg3OOJK2GXuggE0w/Ov2M0FDzyCHs8BRoWiD7Nz5o58=
github.com/hbstack/docs/modules/giscus v0.1.10 h1:rSZKSrgiZeuf4nizv2A9BJGikm7PSsQy7T6u/6u+/Yw=
github.com/hbstack/docs/modules/giscus v0.1.10/go.mod h1:6MTfPyydWOJ2hH/9vhQw1r6Z5lvNTgDN7zpAfgjIQz0=
github.com/hbstack/docs/modules/heading-sign v0.1.9 h1:gwqg3R5YGwqCHFXrnV1ligZ2wFHbOj9chFS6bmqh2f8=
github.com/hbstack/docs/modules/heading-sign v0.1.9/go.mod h1:64D1dr+tmjfQh0F1PtYa+cs9PiZttR6LCoXaiBXD4bI=
github.com/hbstack/featured-image v0.2.1 h1:sRIzjV6YPVG7Ah0Hxjiuxd9bQnEV+62McOgXZjGNV7g=
github.com/hbstack/featured-image v0.2.1/go.mod h1:hux3nYqQUVnQHPttJxVrvwfTsULGuVGRGFk3lO2Si54=
github.com/hbstack/footer v0.4.1 h1:dGEIcqCM6K/s9bygnFQlPcVMJn+BblAjaESied8H7ug=
github.com/hbstack/footer v0.4.1/go.mod h1:EvignAN0ShrWDbPAlf9+lrRfJSha9G4wYPDUed4wPzg=
github.com/hbstack/footer/modules/socials v0.3.0 h1:m8d8o9j+3BQUfxpONEaGP4tL8WSgnrA50bM4ux6twg8=
github.com/hbstack/footer/modules/socials v0.3.0/go.mod h1:clVl77mC1//pSZuHEr8aHqDk8Ylggk+I+XOQoBiim8w=
github.com/hbstack/gallery v0.13.0 h1:xIS5vK0g4wlxgNjxBOdn+9E5n1VsQiZNjBUX5IcPBpQ=
github.com/hbstack/gallery v0.13.0/go.mod h1:FeLNZqjpKCj1ryfPoTJVk59Bph2N1BfDcNBHyudWT4o=
github.com/hbstack/gallery/modules/breadcrumb v0.1.1 h1:hPP+FuHcBo2nieDA3eY/f7714JBe/egECb6TRnmPHTo=
github.com/hbstack/gallery/modules/breadcrumb v0.1.1/go.mod h1:LdbDrxkgYlIOn/x9HFrde+mpIagFayRuLjIDXL1zCHw=
github.com/hbstack/giscus v0.1.1 h1:jKbA17XjAcbD59QIDUVoFOdbi9P2WzQMtOcIpG/Znuo=
github.com/hbstack/giscus v0.1.1/go.mod h1:XElW8oNLnS0dRVFzoo9Gq8xknvz3D2PuTHC7yw9h3EE=
github.com/hbstack/hb v0.12.2 h1:zFIPi39iB68P9y5o5ckVqK4qCc/6cl7oYRvfEpQucPs=
github.com/hbstack/hb v0.12.2/go.mod h1:gwKZN1bsmMuSjEkI/l/9zJCG0Xz96h0r7Cv/WOjjNjc=
github.com/hbstack/header v0.14.5 h1:TGjaudDop6df38A0K8hjMOdmcD1WpUN03xenpgR7tJw=
github.com/hbstack/header v0.14.5/go.mod h1:W7eolpYJctsTD8GVFEj09Ogbqqy8OAqcxBEbW3ZTYIg=
github.com/hbstack/header/modules/language-picker v0.1.25 h1:F8ervz2fAJa2PaCaexmQaVRqkcVb7/dHK1ZSiHCcu6A=
github.com/hbstack/header/modules/language-picker v0.1.25/go.mod h1:kkNF76Y6HJUA+sCAVVlhAR9UoKJirpnZSIT2z/9tyoo=
github.com/hbstack/header/modules/search v0.1.36 h1:SqQjKXX46dABksZp9UR/QH9eayxAkRD5CAbBenOUGJQ=
github.com/hbstack/header/modules/search v0.1.36/go.mod h1:enMXYMhDd+V2OQ0e2xzD9qbkktwK5DzbpP5UxvdALXo=
github.com/hbstack/header/modules/socials v0.2.0 h1:ztbnGhgFrgViU8+TlvFpOajVWcQztqc+C0wPNp7iyJo=
github.com/hbstack/header/modules/socials v0.2.0/go.mod h1:OoJfwBEicrezWzSF+F/mKuqCoo9FfP1nb8Oo4vmGWG8=
github.com/hbstack/header/modules/theme-toggle v0.5.1 h1:CXognO+rbqUVXCJ/Udc3frntSu15mY1ZH15I/H20aF4=
github.com/hbstack/header/modules/theme-toggle v0.5.1/go.mod h1:EHXmyYT45ZhcUIXdL45lRG3HpxodbHSr4KpD9Ynhzfg=
github.com/hbstack/heading-sign v0.2.0 h1:yXKZQEjPn/+jKyQxCJh34X+wXbiG4Bnr1VVF6lgMhi8=
github.com/hbstack/heading-sign v0.2.0/go.mod h1:SXJWIr9C/7phTOXfWMzNSVZCeimKbYualuwIOHDeOu0=
github.com/hbstack/mermaid v0.2.2 h1:TtGzO04if+jgnLXdFDiI2opnzvcTDJqoaQAQvNgG0xs=
github.com/hbstack/mermaid v0.2.2/go.mod h1:gVO/itIHv07hiGqzmUtLw78vkcTU8RMnOl72GVSUUrA=
github.com/hbstack/meta/recommended v0.2.10 h1:RzRe2LT/lJxlsfGv5UzYC3onl7lp1VWbCm1jAb69kSw=
github.com/hbstack/meta/recommended v0.2.10/go.mod h1:OdGN+zqdgFbet5A6XrfjaTNUTd5L91rOUNRJxgq38fo=
github.com/hbstack/noscript v0.7.0 h1:PxHaeCInP9SFofMOS+QUmAxujwP+Nh2D1kO5C0IlZIE=
github.com/hbstack/noscript v0.7.0/go.mod h1:F0qU9/caEaqa45OfHiL+8nTCohs2rg97Hek2KQUzK8M=
github.com/hbstack/pagination v0.8.0 h1:xnrLD6c7HalpQFQKN9pcQi1M8H0o8b3yrjbjBFs/03o=
github.com/hbstack/pagination v0.8.0/go.mod h1:XaYSS/iReEFQo+fbVAx2YfjP4muWEraVNGeaTcVA35o=
github.com/hbstack/progress-bar v0.1.0 h1:2ZiGS3RFZbZYBUbT2nFCoU9SJsbD9jtV4A7ab41B4jg=
github.com/hbstack/progress-bar v0.1.0/go.mod h1:JZt160XK62FxThzt+RmokjOww3De8ZL0ITcxMJLVE7g=
github.com/hbstack/pwa v0.1.2 h1:zJhLf5Uf+jO9aCBKvFcASlw7sULK2i0qUJZxscBo0HM=
github.com/hbstack/pwa v0.1.2/go.mod h1:8x01rczLrSw1aCWD+yrn6v5FRQPtaEh/PYCtFDICEWo=
github.com/hbstack/scrollbar v0.1.0 h1:uQMNbkWbLxnjQMiD3zdt33RG48sY2a0XWyGQkK2HsyY=
github.com/hbstack/scrollbar v0.1.0/go.mod h1:BEDha5gOjQfXBKZfwT+4vn8hCE88qElocjEI2SY1eAs=
github.com/hbstack/search v0.2.2 h1:OcGCw2cVzZlB48wogNatcbaHk2BB7Boc/ESt9txI4Gw=
github.com/hbstack/search v0.2.2/go.mod h1:sVNCCvokrCfydqCNF/q7kcAd+U73a7Y/0P+v8vJaC0I=
github.com/hbstack/slide v0.4.0 h1:rWrbEmL1bKW1VF1coMtMblDUwzMvVcm1MgvauFX6vMg=
github.com/hbstack/slide v0.4.0/go.mod h1:5LOWGyawNzSWFlW+3kuUBSrK15kottNvolEc7FVcYVg=
github.com/hbstack/snackbar v0.1.2 h1:/9R2CdWnLcOBobxzdpe30cgM1gcKJAXtbVbZtp2pgmY=
github.com/hbstack/snackbar v0.1.2/go.mod h1:4uZSGpI9ZtR9by0bA8yJW2y61sRks2W4a8VvyMluXuo=
github.com/hbstack/socials v0.15.0 h1:Nyn+7S9B1BJ0CsRYmJTds/TfoquLK3gae7gKyKnCWyQ=
github.com/hbstack/socials v0.15.0/go.mod h1:Bu1TdfuxLKtpEImsmuvB8OwbYJaGzOriQbOh3u7gTtc=
github.com/hbstack/socials v0.16.0 h1:gR7NL/EBLQzqO31Tp/ITU7jtDuyDXfNskJyLtnpU0VM=
github.com/hbstack/socials v0.16.0/go.mod h1:9pfExMNoBMnQ0JV2ODURqUQsEC/HlgUo9b3jXdrHNM4=
github.com/hbstack/syntax-highlighting v0.2.0 h1:BP5SR/AbVlJyAFtVdgYjeqVZKmncEmuplTR5R2AUbw8=
github.com/hbstack/syntax-highlighting v0.2.0/go.mod h1:6IoaM+tSIkKZblIrT1i5L3zVH68nt4UScU9JB30FQsc=
github.com/hbstack/syntax-highlighting/styles/gruvbox v0.1.1 h1:IzJlnkHGS8XhibNjUFvyV3YE7rc7WMsAhdxWZTbORI4=
github.com/hbstack/syntax-highlighting/styles/gruvbox v0.1.1/go.mod h1:ar5ZFplNyVZCVG6rvo69co1hNZwptxtrDz3zproGLPg=
github.com/hbstack/toc-scrollspy v0.1.0 h1:sr9HidxHVYeSZR1FVOGQzphONSsct/OscbWPSV+vMlo=
github.com/hbstack/toc-scrollspy v0.1.0/go.mod h1:wIqdWFRjqGGKX6Y5XVRQzaBBeZ91kZBKgovQp8IPvtk=
github.com/henrygd/bigger-picture v1.1.16 h1:S7xIGHnzUSpRnSzSMVvs4Cs8oWc+Pongjggdzs3GInQ=
github.com/henrygd/bigger-picture v1.1.16/go.mod h1:LayqbjDNNsZH+ZXklmjBe5T02qxpH9Cah/ygAraOBIk=
github.com/henrygd/bigger-picture v1.1.17 h1:X41lEdmfYbLLgMdkH4F3Mdhipy8EQjA2w16u1y+BgM8=
github.com/henrygd/bigger-picture v1.1.17/go.mod h1:LayqbjDNNsZH+ZXklmjBe5T02qxpH9Cah/ygAraOBIk=
github.com/hugomods/ascii v0.1.0 h1:c7E0nV3z7PiNchGXkIuFBWsKym17k0iOo+o6Bp6bw30=
github.com/hugomods/ascii v0.1.0/go.mod h1:vvC2YaCuNBWl/8F/mfk9vMxVpwXluH80cROV9TDpmLk=
@ -116,10 +41,6 @@ github.com/hugomods/bootstrap v0.22.2 h1:wdZbyx/kLs3WH33pdDBmo/MH+42TTZzMtF0bH7o
github.com/hugomods/bootstrap v0.22.2/go.mod h1:daEkGLSsmfI8vQ1SjKR7KELPSrm1G+yUnTptKdRxFN0=
github.com/hugomods/code-block-panel v0.7.0 h1:7y8wbXMPvaFpqNIRUb8ykOQtz+E8lVcYd3yWGv2gMGw=
github.com/hugomods/code-block-panel v0.7.0/go.mod h1:3J9yUxaShbhYvFFZbGVHcBoHPl6TUKLL3f2fTsnVNNg=
github.com/hugomods/font-awesome v6.5.2+incompatible h1:sDSRuMLUK7N7u/PTpNngqoqbfUI/UP9Rcb+885kV4Wk=
github.com/hugomods/font-awesome v6.5.2+incompatible/go.mod h1:C2wW6xDvHkcMlJMVTPQ+Npt+rO0OGv13xT1iyll2z2Q=
github.com/hugomods/fuse-js v0.1.0 h1:CmWHBZANvjOP44RDNQNLntqlLf9GLqeM29jekxTNcPE=
github.com/hugomods/fuse-js v0.1.0/go.mod h1:srCqvtBQR02HS/abTraDU4oINv1D3PljNPdexdoHhpo=
github.com/hugomods/giscus v0.1.1 h1:Kb8137Cp2nQJPFb6e+CdXy8nyIAJ2dFIymG4bDdaXWI=
github.com/hugomods/giscus v0.1.1/go.mod h1:tCRkqNi/sMsLh3kjDesXZNzf4R/w+b5oc5boS/l8Jtw=
github.com/hugomods/google-adsense v0.1.0 h1:eykHVCF+JjJRpEQ/b+EkH9aQLQxIdGI8m06qsq1iybA=
@ -128,59 +49,20 @@ github.com/hugomods/gravatar v0.2.0 h1:642HNhGN7Mw7qefNcUFJKzLoT2zJKt4IQkrS53mIU
github.com/hugomods/gravatar v0.2.0/go.mod h1:oATWuh5u2XUK/ZKzOD0VEP5I/TZfVZwplTyhT61Q4Fc=
github.com/hugomods/hugopress v0.4.0 h1:ZNORTaUTdw3/AJdu3F280r9aM84c+tZyDQpcJOQJ7Ks=
github.com/hugomods/hugopress v0.4.0/go.mod h1:CRYvr60xOkZOf4Atkuj+uEj2EH5pjJ39Ws3aJAkoMkA=
github.com/hugomods/i18n-js v0.2.1 h1:uIUl4LiYdwo8IK08oq7OmluYLedL21Wc9Rig1taDTSI=
github.com/hugomods/i18n-js v0.2.1/go.mod h1:eJfxjgI2CQsNA1/ReIVvr5127DftUKcbHd2A2SQmDvU=
github.com/hugomods/icons v0.6.3 h1:2Ra6NU2GOeVvz8vowLq/OZCTzxqhq84MA0TICRBVxeY=
github.com/hugomods/icons v0.6.3/go.mod h1:cIkSvK6W0q6N4U6n9KGz+QfRWQXAW0INd+1P31gPNGg=
github.com/hugomods/icons v0.6.4/go.mod h1:cIkSvK6W0q6N4U6n9KGz+QfRWQXAW0INd+1P31gPNGg=
github.com/hugomods/icons/vendors/bootstrap v0.5.6 h1:4Vj7u52gFUnO+Jj/CqmGfsLroify2aysRpIvgHRNjjI=
github.com/hugomods/icons/vendors/bootstrap v0.5.6/go.mod h1:Sw1RhQvFcsQlJ5a4SKpp7A0XHDYQ0DK0pQwnnx+l+Ao=
github.com/hugomods/icons/vendors/font-awesome v0.6.6 h1:rb12roByF9LZfUxBpyhyqenkcX2+VGkYf5jJ/55OPHo=
github.com/hugomods/icons/vendors/font-awesome v0.6.6/go.mod h1:2IVdmnq+IWCnPFYsvbxq59dTuW3+prPLerpu8Ezobro=
github.com/hugomods/icons/vendors/simple-icons v1.0.40 h1:esnu84uFnWGhDMqBJF9qBHTXKAC170lwqZlRA9FjXeA=
github.com/hugomods/icons/vendors/simple-icons v1.0.40/go.mod h1:594XsVTJ2lgbzAUy/4OopxsZEeAOKmg8GfOBwiBiCe8=
github.com/hugomods/icons/vendors/simple-icons v1.0.41/go.mod h1:LppcJG9cNDKHw5NRGmyGPBsZoqo+I18HegEgmo2/LVg=
github.com/hugomods/idb-js v0.1.0 h1:mA6hEGtR0aFEdmq9zYMGpfSpCU6SMilx9RzC4uK3DqY=
github.com/hugomods/idb-js v0.1.0/go.mod h1:GPfnmr+BQpP4s6Epd4Yu+RlUog8q/Djw8qy8BZFWZ04=
github.com/hugomods/images v0.10.1 h1:ok3ZUZ63MAcmFuTx2kC5JJ3Sffd420RRW9yO57SFeQA=
github.com/hugomods/images v0.10.1/go.mod h1:U6Gwj16LKvk66rOMyGFrnF6f0aV8lT89lqOsckOAjYY=
github.com/hugomods/katex v0.3.1 h1:uxaETvO5zIMQeNYjTCOulfGGb7EPBlMhNI/jUujg35M=
github.com/hugomods/katex v0.3.1/go.mod h1:EBY1YQTN6F8FDQz+mWp3EzEh8vDN31YjL9luVni+Wm0=
github.com/hugomods/mermaid v0.1.1 h1:12b8DbdiKOTtPmkWOMXsBz3LKkAWVqa5tGkbEboj0a4=
github.com/hugomods/mermaid v0.1.1/go.mod h1:7sKIZLAeYsXXnKRh4KR70UQx27xnzf0mSQ2o99zTLS0=
github.com/hugomods/pwa v0.9.0 h1:bEKFkP7xkow6IadY9hKEwPbdKeLC0XZfVT31gGP7CPc=
github.com/hugomods/pwa v0.9.0/go.mod h1:KpYK2Ffn969+Py5SzV3+iXYase4UoUeRAsd9jY7Q2Us=
github.com/hugomods/search v0.14.0 h1:mN52YGIaIBr2pv5NWGJiQhAVFt+lOUHDNcpbz9T4CxA=
github.com/hugomods/search v0.14.0/go.mod h1:xPnDGjP/HCdEWJrJBwwdI2mEtdxFxp+wHBwSl/r2m00=
github.com/hugomods/seo/modules/alternatives v0.1.0 h1:G5IjM7j7ExgXEMyxQj1Z/5JwwRW8DEmL0nDJYxA3NhE=
github.com/hugomods/seo/modules/alternatives v0.1.0/go.mod h1:ff9uz+f5yii9k2jbwt/HKM3RpLR3EYZrNQBAOabNxMA=
github.com/hugomods/seo/modules/base v0.1.2 h1:Md3RgadMJpGnM1w/9Advmn4Gp406kNsA/AsKT3olzZs=
github.com/hugomods/seo/modules/base v0.1.2/go.mod h1:qfm1Vga0eGxL+Szgz8Jopm+NtJ5PGov2a2dikTg1qSg=
github.com/hugomods/seo/modules/favicons v0.2.1 h1:9FP4DIbdmBhmUpBuJVJYo60iwv9Xc/XNQX1mT8zCNj0=
github.com/hugomods/seo/modules/favicons v0.2.1/go.mod h1:xFDhrpWUZR4NMMVkilzT6xFBHiF5eyCQ8PlzOS2K9lY=
github.com/hugomods/seo/modules/open-graph v0.1.0 h1:Whveal1j1n2xZWcAlNAd2rdfKp7Fh5apol36wLGLb54=
github.com/hugomods/seo/modules/open-graph v0.1.0/go.mod h1:G7mXf7D1QtRN/i7A9v+cUF5P55H/QaxRqxJ8tp9fVq4=
github.com/hugomods/seo/modules/schema v0.1.2 h1:IAz1sG31S/jtEufb47+hpwKLp/rjPATT2Yd616Mom/4=
github.com/hugomods/seo/modules/schema v0.1.2/go.mod h1:R6hRr2FIJITcMnFA/3V3dPAZgGQLNWGS7v1PLsmVRxU=
github.com/hugomods/seo/modules/translations v0.1.0 h1:wPDuPKGx/x+otHn2HfAankKCGQxSrC3gLHhRHpNjC18=
github.com/hugomods/seo/modules/translations v0.1.0/go.mod h1:yU2p2hk2dK86YNRU9zfoWRoCrYmrjEmf3oN7cCTbzcM=
github.com/hugomods/seo/modules/twitter-cards v0.1.0 h1:jH9WfmFZ3kCndUkATM/D/BYL+TQYoXA7/IxgQJbifKQ=
github.com/hugomods/seo/modules/twitter-cards v0.1.0/go.mod h1:QYs7SWbhXSQrsn/RHZSD7DwzaCHFpoLQdVPxEI3j63k=
github.com/hugomods/shortcodes v0.21.0 h1:h8Vulwd3Kiff5FERe3KaAXsI9GWW3msNof6XjNgGGEo=
github.com/hugomods/shortcodes v0.21.0/go.mod h1:EnVopbZMNI/HeteM3Lp3phBTCRLvPSe7l142qhRFFPY=
github.com/hugomods/simple-icons v12.1.0+incompatible h1:ovp83b4IfedZnVSq8S8OvnWW54L9kEn1m73ndjgqlTE=
github.com/hugomods/simple-icons v12.1.0+incompatible/go.mod h1:1Lvymol7AMVY7ji/o88jMoDHHZIJ5Wc+WwNe5hjmk+U=
github.com/hugomods/simple-icons v12.2.0+incompatible h1:Atj+h4st6qB8I9p7jdMdf1/tw7pqtWBFL6L4SCaWEFI=
github.com/hugomods/simple-icons v12.2.0+incompatible/go.mod h1:1Lvymol7AMVY7ji/o88jMoDHHZIJ5Wc+WwNe5hjmk+U=
github.com/hugomods/snackbar v0.1.2 h1:SLpfH9jlYwf81epH7DvM2XTZHo+3fXXpk6XKtxmo964=
github.com/hugomods/snackbar v0.1.2/go.mod h1:ykFm0IFibeQPuPAm8Gaa27xJS/bNZcSez4omVSl2gQ0=
github.com/hugomods/workbox v0.1.0 h1:yxuTj3gT1BNf6OitxrjxSJXfmbFBj2UTwdWr142eYFQ=
github.com/hugomods/workbox v0.1.0/go.mod h1:RpFcIcltqYsiHWJV6PHPOdMagFZxO7nrO5XUpn/TMoc=
github.com/jakearchibald/idb v8.0.0+incompatible h1:sTNGHgh+JoyQ4Eqey+1ScX4F03uTsYGhs2MbVSJNfF4=
github.com/jakearchibald/idb v8.0.0+incompatible/go.mod h1:AuDoW54s2DKfbclM+ScrnPp8ahUQ9rHph9bb8sZTEXc=
github.com/krisk/Fuse v7.0.0+incompatible h1:jVyg6No+Joc51Rn97QQYJZIpCxzd4ywACn/4+FKWjvo=
github.com/krisk/Fuse v7.0.0+incompatible/go.mod h1:3moWv8rDjwoKic9nwiPLgZjldkbdTAbtzJHCu/Vsj4A=
github.com/twbs/bootstrap v5.3.2+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0=
github.com/twbs/bootstrap v5.3.3+incompatible h1:goFoqinzdHfkeegpFP7pvhbd0g+A3O2hbU3XCjuNrEQ=
github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0=
github.com/twbs/icons v1.11.3 h1:XhvrQ1XDom9ggBbQx3wQCFGEr8qAQwQP/dAcw8OXMtA=
github.com/twbs/icons v1.11.3/go.mod h1:GnRlymgVWp5iVJCMa0Me5b6tFyGpVc2bSxPMRGIJmyA=