Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
This branch is 4 commits behind monero-ecosystem:master.

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


moneriote-python is a Python script to maintain DNS records of monero nodes with their RPC port open. It actively scans the Monero network through monerod and manages DNS records.

An example is the remote node service

dig A

;; ANSWER SECTION:	3600	IN	CNAME	300	IN	A	300	IN	A	300	IN	A	300	IN	A	300	IN	A

Supports the following DNS providers: Cloudflare, TransIP



  1. Python >= 3.5
  2. Domain name
  3. A running and fully synced Monero daemon


git clone <this repo> python-moneriote
cd python-moneriote
virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
python develop

Moneriote is now installed inside the virtualenv.


Usage: moneriote [OPTIONS]

  --monerod-path TEXT           Path to the monero daemon executable (monerod).  [default: monerod]
  --monerod-address TEXT        Monero daemon address.  [default:]
  --monerod-port INTEGER        Monero daemon port.  [default: 18081]
  --monerod-auth TEXT           Monero daemon auth as 'user:pass'. Will be passed to monerod as `--rpc-login` argument.
  --blockheight-discovery TEXT  Available options: 'monerod', 'xmrchain', 'moneroblocks'. When set to 'compare', it will use all methods and pick the highest
                                blockheight.  [default: compare]
  --dns-provider TEXT           The DNS provider/plugin to use.  [default: cloudflare]
  --domain TEXT                 The domain name without the subdomain. ''.
  --subdomain TEXT              The subdomain name.  [default: node]
  --api-key TEXT                DNS API key.
  --api-email TEXT              DNS email address or username.
  --max-records INTEGER         Maximum number of DNS records to add.  [default: 5]
  --loop-interval INTEGER       Update loop interval.  [default: 600]
  --scan-interval INTEGER       Interval at which to mass-scan RPC nodes.  [default: 3600]
  --concurrent_scans INTEGER    The amount of servers to scan at once.  [default: 20]
  --from-config TEXT            Load configuration from ini file.
  --help                        Show this message and exit.


Easiest is to run in screen or tmux. If you really care about uptime and want to babysit the process, write some configuration for supervisord or systemd.

moneriote --monerod-path "/home/xmr/monero-gui-v0.12.3.0/monerod" 
          --blockheight-discovery "compare" 
          --dns-provider "cloudflare" 
          --domain "" 
          --subdomain "node"
          --api-key "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
          --api-email "" 
          --max-records 5



The full path to the monerod executable. On windows this ends on .exe.



The address on which your local monerod is listening


Default: 18081

The port on which your local monerod is listening


The authentication string to use when contacting monerod.


Default: compare

Available options: monerod, xmrchain, moneroblocks. When set to compare, it will use all methods and pick the highest blockheight.

xmrchain and moneroblocks are both Monero explorer websites that expose an API.


Available DNS providers: cloudflare, transip.

If your DNS provider is not included but does provide an API for adding/removing records, you can code a custom implementation of DnsProvider. See moneriote/dns/


The domain name without the subdomain, example:


The subdomain name, example: node

The full domain would become


The key required by your DNS provider for API access.


The email required by your DNS provider for API access. This flag could also serve for an username, depending on DnsProvider.


Default: 5

The maximum amount of records to add.


Default: 600

Shuffle/randomize the records every X seconds. Default is 10 minutes.


Default: 3600

Ask monerod for new peers and mass-scan them, every X seconds. Default is 1 hour.


Default: 20

The amount of servers to scan at once.


Alternatively, configuration can be passed via config.ini.


Additional DNS provider(s) can be implemented by inheriting from moneriote.dns.DnsProvider(). Your custom class must implement the following methods.

def get_records(self)

Must return a list of nodes (moneriote.rpc.RpcNodeList).

def add_record(self, node: RpcNode)

Adds the A record to the subdomain

def delete_record(self, node: RpcNode):

Removes the A record from the subdomain.



Python scripts to maintain Monero opennodes DNS records







No packages published


  • Python 100.0%