Getting Started#

In this tutorial we're going to walkthrough using r3ply from start to finish with an example. We will be installing the re CLI tool, generating a config, simulating a comment, and then discussing next steps. Follow the the steps below from within your project's top-level directory.

Table of Contents#

──𓆝𓆟𓆞𓆝𓆟 𓆝𓆟𓆞──

Installation & Setup#

For this tutorial we will need to install the r3ply CLI tool called re.

# use npm -D @r3ply/cli for per project installations
npm -g @r3ply/cli
re --help

You should see the usage statement print.

Next initialize a new r3ply project at the top-level directory of your project.

re init

You should see output similar to this (but not exactly the same):

Initialized empty r3ply project at /Users/spence/Developer/r3ply/site

Add the following site entry to your config:

[[site]]
domain = "site.local.test"
r3ply = "cli.r3ply.test"
signet = "Pym_RNyK78Em16_hiYUEMQ"
issued = "2025-10-22"
label = "CLI"

This is a site entry and in r3ply there's one site entry per domain x r3ply pair. In this case, the domain is "site.local.test" and r3ply is "cli.r3ply.test", which are special cases that are reserved for use with the r3ply CLI. The signet is a special cryptographic envelope that signifies that domain x r3ply pair mentioned earlier. In this case, the signet is issued by the r3ply CLI to your local project.

Great, now our r3ply project is initialized. Don't worry about saving the initialization output above. We will see it again next when we generate a config.

Generating a Config#

Now let's generate a config so we can use r3ply.

re generate config

You should see output similar to this:

version = "0.0.1"
enabled = true

[[site]]
domain = "site.local.test"
r3ply = "cli.r3ply.test"
signet = "Pym_RNyK78Em16_hiYUEMQ"
issued = "2025-10-22"
label = "CLI"

[moderation]
enabled = true
github = []
webhook = []

[[moderation.local]]
"file_path_{}" = "comment_{{ comment.id[:8] }}.json"
enabled = true
"allow*" = []

(If you look closely you can see that the [[site]] entry here is identical to the one from the re init command we ran earlier)

Now copy the above output and add it to a file named config.toml and save the file in a place where it can be accessed from your website. r3ply will look at the following paths in this order:

# Priority from highest to lowest:

https://${domain}/.well-known/r3ply/config.toml
https://${domain}/.well-known/r3ply.config.toml
https://${domain}/r3ply.config.toml
https://${domain}/r3ply.toml

(The r3ply website itself stores the config at static/.well-known/r3ply/config.toml and can be reached online at https://r3ply.com/.well-known/r3ply/config.toml.)

Finally, let's set the path of your config as the default config path:

re config set-default <your-config-path>

We can run re config validate to verify that our config is well formed. If there's no output then you're ready to proceed to the next section and begin simulating email comments.

Simulating a Comment#

Now it's time to get setup for simulating an email comment.

re simulate email

You should see a bunch of text and at the very bottom something that looks like this:

# === Comment: Prescreening Results ===

# Prescreening failed checks:

comments_configured = [ "No comments configuration found" ]

This means that we will have to add a comment and email section to our config. Open your r3ply config from the prior step and add the following configuration between the [[site]] and [[moderation]] entries:

[comments.email]

Here we added an empty comments object, with a nested email object. This is because r3ply provides defaults for most configuration items, but only if their top-level objects exist.

Now re-run the re simulate email from earlier. You should see a bunch of text representing each stage of the comment processing pipeline. You can see the docs for more info about how to read and understand this output, as well as how to silence and filter it. But for now we have one last thing to do: writing our comment as a file.

To actually have simulated email be written as a file we will need to add the --moderate flag to the same command. What this tells re to do is to simulate and email and to moderate it. So go ahead and run the updated command:

re simulate email --moderate

Towards the bottom of the output you should see something similar to this (but not exactly the same):

1# === Moderation: Local[0] ===
2
3#################################
4# Request portion of moderation #
5#################################
6
7# `bypass` asks to skip moderation altogether. For local moderation it has no effect.
8[request]
9type = "local"
10bypass = false
11
12 # `relative_path` is relative to project root.
13 [request.args]
14 relative_path = "content/comments/b69922e4.json"
15 # `comment` variable elided, see comment output from earlier steps in docs
17
18################################
19# Ticket portion of moderation #
20################################
21
22# `ticket.local` is the response to a request for local moderation.
23[ticket.local]
24absolute_path = "/Users/spence/Developer/r3ply/site/content/comments/b69922e4.json"

At the bottom we see the absolute_path the comment was written to! You can change this path by editing your config. In the next step we'll take a closer look at that comment.

What's Inside a Comment#

Now that we can simulate the receiving comments based on a real configuration, we need to understand what's inside a comment object. Open the file that was at the absolute_path from the last step. You can also expand the one that was used during the making of this tutorial.

Expand to See File
{
  "r3ply": {
    "config_version": "0.0.1",
    "server": "cli.r3ply.test",
    "site": "site.local.test",
    "signet": "wWM5hk4DKr1xVRhVq-7aog",
    "issued": "2025-10-16"
  },
  "author": {
    "pseudonym": "2ec68974e2f82e9bd891a351eefe4bbeefe2670b745c861df31c975e54c207c1",
    "token": "kktE_W_Nlh95kjQpAbbcDkpOPtTjh8SRJNAdulGWav5Nv0zJNUABG91PMIeTo8K6PyMXkHp8iJsxuR-Qg0rFwKLk3LmZt0NTJ1SNUOLL8-0k0Ik-bNSBWCnH_lRCkWFc7LRpTfPNurZ7ncifRVFGbqgKrFoLhvwGSujQivorr9tNKq_r7C2aTyb-ECmTWJdgWVHaD4lwetqv0tU-tueGkBlbTHWlAR6JUX2UwOrQrTSgzx6Ft3-hb4Q9esLhlN1ffUK43Ov0E8dhGReH-Uy1fj2k_EzyOwLLfZ771mkfC4dMsjPl0jMZTSjDQqP-tK3hiA5xJsC6Aa00S04ZFVXBIZVNHEgds4AbcfUhpZqwOfBLfCXey4scQBW5DZFGkF3Km3_gaBJUYKTaYoYLN71Xd5rjELcpahwzvxUurUoNYQn-D6zt_U-Fbt4SeoA9370ivV1U0HeY6w-5YWrk"
  },
  "comment": {
    "id": "b69922e4da6e45cf9cd75cc3b878fc5c",
    "ts_rcvd": "1761144137",
    "subject": {
      "url": "https://site.local.test/reviews/toughest-fights-in-monkey-island",
      "origin": "https://site.local.test",
      "protocol": "https:",
      "hostname": "site.local.test",
      "path": "/reviews/toughest-fights-in-monkey-island"
    },
    "txt": "Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?",
    "md": "<p>Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?</p>\n",
    "html": "<p>Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?</p>\n"
  },
  "email": {
    "to": "site.local.test@cli.r3ply.test",
    "subject": "https://site.local.test/reviews/toughest-fights-in-monkey-island",
    "date": "2018-08-26T07:24:01+00:00",
    "text": "Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?",
    "auth": {
      "dkim": false,
      "spf": false,
      "dmarc": false,
      "pass": false
    },
    "from": {
      "pseudonym": "2ec68974e2f82e9bd891a351eefe4bbeefe2670b745c861df31c975e54c207c1",
      "signet": "wWM5hk4DKr1xVRhVq-7aog",
      "issued": "2025-10-16",
      "token": "kktE_W_Nlh95kjQpAbbcDkpOPtTjh8SRJNAdulGWav5Nv0zJNUABG91PMIeTo8K6PyMXkHp8iJsxuR-Qg0rFwKLk3LmZt0NTJ1SNUOLL8-0k0Ik-bNSBWCnH_lRCkWFc7LRpTfPNurZ7ncifRVFGbqgKrFoLhvwGSujQivorr9tNKq_r7C2aTyb-ECmTWJdgWVHaD4lwetqv0tU-tueGkBlbTHWlAR6JUX2UwOrQrTSgzx6Ft3-hb4Q9esLhlN1ffUK43Ov0E8dhGReH-Uy1fj2k_EzyOwLLfZ771mkfC4dMsjPl0jMZTSjDQqP-tK3hiA5xJsC6Aa00S04ZFVXBIZVNHEgds4AbcfUhpZqwOfBLfCXey4scQBW5DZFGkF3Km3_gaBJUYKTaYoYLN71Xd5rjELcpahwzvxUurUoNYQn-D6zt_U-Fbt4SeoA9370ivV1U0HeY6w-5YWrk"
    }
  }
}

That was a lot! Let's look more closely at individual items to get a better understanding.

  ...
  "r3ply": {
    "config_version": "0.0.1",
    "server": "cli.r3ply.test",
    "site": "site.local.test",
    "signet": "wWM5hk4DKr1xVRhVq-7aog",
    "issued": "2025-10-16"
  },
  ...

This is just metadata about concerning the site, r3ply server, etc... that serviced this comment. Next let's look at author:

  ...
  "author": {
    "pseudonym": "2ec68974e2f82...",
    "token": "..."
  },
  ...

Here we see details about the comment's author. Their email address has been anonymized to a stable pseudonym that can be used like an ID. There's also a long token which is an opaque, encrypted token of their real email address. Only the original r3ply server can decrypt it. It's there for future-proofing r3ply so that if changes need to be made, the original, cleartext email address won't be lost.

  ...
  "comment": {
    "id": "b69922e4da6e45cf9cd75cc3b878fc5c",
    "ts_rcvd": "1761144137",
    "subject": {
      "url": "https://site.local.test/reviews/toughest-fights-in-monkey-island",
      "origin": "https://site.local.test",
      "protocol": "https:",
      "hostname": "site.local.test",
      "path": "/reviews/toughest-fights-in-monkey-island"
    },
    "txt": "Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?",
    "md": "<p>Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?</p>\n",
    "html": "<p>Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?</p>\n"
  },
  ...

Here's the actual comment object. There're three nearly identical versions of the comment body: txt, md, and html. This is because r3ply supports text written as markdown, as well as converting that markdown to HTML, but it will also strip out malicious html tags. You can configure this further within the [comment] object (docs).

There's also the subject field of the comment object, which tells us the URL of what the comment was in response to. Using this you should be able to identify the page the comment belongs on.

Summary & Next Steps#

Great, you are now able to simulate comments via email with re simulate email, which should work exactly the same as real email comments when your changes go online. You can now use these test comments to develop your site to incorporate comments throughout its pages:

In the future, when you make changes to your website, you can check that new comments will continue to work by testing your changes with this tool.


There's a lot more that you can do in r3ply than what was shown here in this tutorial. Tweaking your config can make r3ply an incredibly powerful tool.

Add a new site entry for your site's public domain (docs):

# each (site x r3ply) pair has an entry
[[site]]
domain = "example.com"
r3ply = "r3ply.com"
signet = "iSQIIBcF7ka2UURJpFDkYw"
issued = 2025-08-26

Next, add another moderation channel to your r3ply config (docs).

# E.g. add moderation by GitHub PR
[[moderation.github]]
owner = "<ACCOUNT>"
repo = "<REPO>"
"file_path_{}" = "content/comments/{{ comment.id[:8] }}.md"

Finally, read the config and CLI docs to take full advantage of r3ply.

──𓆝𓆟𓆞𓆝𓆟 𓆝𓆟𓆞──

# Comments (13)

Write Comment [+] Expand All
Hi, I am a JS d…
Comment-ID
: <
357f72e7
From
: <
e8e9d9a…
Subject
:
/docs/getting-started/
Date
:
Tue , 24 May 2022 14 : 50 : 41 +0000

Hi, I am a JS developer and aiming to get into Research domain. Is there any live example. If someone has an idea for a mobile app and wants to develop it without any funds or developmental skills how would you recommend going about it while protecting your idea?


r3ply!
I hold 3% sweat…
Comment-ID
: <
eabcac57
From
: <
a1d3fd7…
Subject
:
/docs/getting-started/#:~:text=in%20advance%20What%20do%20you%20think?
Date
:
Wed , 16 Jun 2021 19 : 58 : 32 +0000
(source)

in advance What do you think?

I hold 3% sweat equity in a service-oriented startup, and the founder is offering to buy it back since I am no longer involved with them. Based on his forecast $600k in revenue and a market-sector average of 6% profit, he estimates $36k profit this year, and thus a valuation of $72k, making my 3% worth $2160. Is this a common experience among developers?


r3ply!
in advance What…
Comment-ID
: <
cbb3b523
From
: <
29d4ec2…
Subject
:
/docs/getting-started/
Date
:
Sun , 18 Aug 2019 23 : 53 : 04 +0000

in advance What do you think?


r3ply!
I would appreci…
Comment-ID
: <
34f434a4
From
: <
02b7b40…
Subject
:
/docs/getting-started/#cbb3b523
Date
:
Sat , 18 May 2024 06 : 06 : 30 +0000

I would appreciate the advice. Top 10 reasons or even top 5 reasons. What are your favorite tech and non-tech podcasts?


r3ply!
What are you wi…
Comment-ID
: <
071fd9f2
From
: <
eecafa1…
Subject
:
/docs/getting-started/#:~:text=You%20should%20see%20a%20bunch%20of%20text%20representing
Date
:
Sun , 07 Jan 2018 19 : 26 : 07 +0000
(source)

You should see a bunch of text representing

What are you willing to spend, per bottle?


r3ply!
Comment-ID
: <
674fcd60
From
: <
921b4a0…
Subject
:
/docs/getting-started/
Date
:
Sun , 17 Dec 2017 04 : 05 : 03 +0000

r3ply!
I want to break…
Comment-ID
: <
ffa892d2
From
: <
4c3d579…
Subject
:
/docs/getting-started/
Date
:
Thu , 11 May 2017 13 : 59 : 29 +0000

I want to break into the industry and I would appreciate the advice. Top 10 reasons or even top 5 reasons. What are your favorite tech and non-tech podcasts?


r3ply!
If yes, What is…
Comment-ID
: <
781e859a
From
: <
f5fbedf…
Subject
:
/docs/getting-started/#ffa892d2
Date
:
Tue , 02 Apr 2024 17 : 44 : 20 +0000

If yes, What is your favorite playlist. I know that I missed different opportunities because I fail this part of interviews. Technical part is piece of cake but this kind of interview is my soft spot. How can I prepare this interview?


r3ply!
Is it possible …
Comment-ID
: <
c34ad93a
From
: <
478a64d…
Subject
:
/docs/getting-started/#781e859a
Date
:
Sat , 21 Mar 2020 19 : 31 : 42 +0000

Is it possible to run a startup successfully without Investor/funding. Is there any platform where I could contribute to build a project based on ongoing research, like implementing a research paper?


r3ply!
I am a JS devel…
Comment-ID
: <
d66837c3
From
: <
e8d39a3…
Subject
:
/docs/getting-started/#ffa892d2
Date
:
Wed , 09 Nov 2022 01 : 45 : 16 +0000

I am a JS developer and aiming to get into Research domain. Is there any live example. If someone has an idea for a mobile app and wants to develop it without any funds or developmental skills how would you recommend going about it while protecting your idea?


r3ply!
If you run a SA…
Comment-ID
: <
37097d76
From
: <
9d2373c…
Subject
:
/docs/getting-started/#:~:text=Only%20the%20original%20r3ply%20server%20can%20decrypt%20it.
Date
:
Tue , 26 Jul 2016 17 : 08 : 37 +0000
(source)

Only the original r3ply server can decrypt it.

If you run a SAAS and you have a small team or even 1 man bootstrapped, how do you get started?


r3ply!
Hi, I am a JS d…
Comment-ID
: <
20e3196e
From
: <
326bb93…
Subject
:
/docs/getting-started/#:~:text=Great%2C%20you%20are%20now%20able%20to%20simulate%20comments
Date
:
Fri , 13 May 2016 18 : 52 : 52 +0000
(source)

Great, you are now able to simulate comments

Hi, I am a JS developer and aiming to get into Research domain. Is there any live example. If someone has an idea for a mobile app and wants to develop it without any funds or developmental skills how would you recommend going about it while protecting your idea?


r3ply!
I love your pho…
Comment-ID
: <
d950860f
From
: <
17e616c…
Subject
:
/docs/getting-started/#20e3196e
Date
:
Fri , 29 Sep 2017 14 : 53 : 50 +0000

I love your photo album, elisa. Sorry if this is a non-sequitor


r3ply!