What you need before you start
Two things. A Discord account, which you already have, and the Manage Server permission on the server you want to export. If it is your own server, you have it. If it belongs to someone else, you will need them to run one step for you, and that step is called out below.
The part that surprises most people is the bot. Discord has no read-only personal API, and using your own account credentials to read messages programmatically is against Discord's terms of service. A bot is the supported way. The bot is yours: it lives in your own Discord developer account, you can delete it at any second, and Riflet only ever reads with it.
Create your Discord bot
Everything in this section happens at discord.com/developers/applications. Riflet links to the same page from the Discord panel.
Create an application
Click New Application in the top right, give it a name, accept the terms, and click Create. The name is what members will see in your server's member list, so something like "Context Export" is clearer than a random string.
Open the Bot tab
In the left menu of your new application, click Bot. On older accounts you will see an Add Bot button, so click it and confirm. On newer accounts Discord has already created the bot for you and there is nothing to click.
Enable the Message Content Intent
Still on the Bot tab, scroll down to Privileged Gateway Intents and switch on Message Content Intent. Then scroll to the bottom and click Save Changes.
Copy the token
Near the top of the Bot tab, click Reset Token and confirm. Discord generates the token and shows it to you exactly once, so click Copy straight away. If you navigate away before copying, just reset it again. Resetting invalidates the previous token, so if you already connected Riflet with an old one you will need to paste the new one.
Paste it into Riflet
Back in Riflet, open the Discord panel, paste the token into the field and click Connect. Riflet checks it with Discord immediately, so you will know within a second whether it worked.
The two things that go wrong here: forgetting to click Save Changes after the intent toggle, and copying the wrong value. The token lives on the Bot tab. The Client Secret and the Application ID, on the General Information and OAuth2 tabs, look similar and will not work.
Without the Message Content Intent, the setup looks like it works. Riflet connects, lists your servers, lists your channels, and exports a bundle. But every message in it comes back with no text, because Discord treats message content as privileged data and strips it for bots that have not asked for it.
Add the bot to your server
Creating a bot does not put it anywhere. At this point your bot exists in your developer account and belongs to no server at all, which is why Riflet shows an empty server list until you do this step.
The only two permissions Riflet ever needs: View Channel and Read Message History. That is the whole list. You grant them once when you invite the bot, and again on any private channel you want to export. If you remember nothing else from this page, remember those two.
The easy way, from Riflet. Once your token is connected, the Discord panel shows an Invite bot to your server button. Riflet builds the invite link for you with the right permissions already ticked. Click it, and your browser opens Discord's authorization page:
- Pick your server in the dropdown at the top.
- Leave the permissions as they are. Riflet requests View Channels and Read Message History, nothing else.
- Click Authorize and complete the captcha.
- Return to Riflet and click I've added the bot, refresh. Your server appears in the list.
The manual way. If you would rather build the link yourself, or the button did not open your browser, go to your application in the Developer Portal, open the OAuth2 tab, and use the URL Generator. Tick the bot scope, then tick View Channels and Read Message History in the permission list that appears underneath. Copy the URL at the bottom of the page and open it in your browser. You land on the same authorization page.
Ignore the Installation tab. The Developer Portal has an Installation tab with a ready-made Install Link, and it is the first thing most people find. Do not use it here. That link follows the application's Default Install Settings, and if those do not include the bot scope, authorizing it installs your app without any bot user joining the server. Everything looks like it worked: the app shows up in the server's Integrations page, but there is no bot, and Riflet's server list stays empty. The invite button in Riflet does not depend on any of those settings.
The reliable way to check whether the bot actually joined is Riflet itself, not Discord's member list. If your server appears in Riflet's server picker, the bot is in. Two other places can also confirm it: Server Settings then Roles, where a role named after your app now exists, and Server Settings then Integrations, where the Bot section says whether the application has a bot in this server.
Your bot will always show as offline, and that is normal. Riflet only makes REST calls and never opens a gateway connection, which is what would put a bot online. Discord groups offline members at the bottom of the member list and stops showing them at all in larger servers, so not seeing your bot there tells you nothing. Do not use it as a test.
If your server is not in the dropdown: that list only contains servers where you have the Manage Server permission. Discord will not let you add a bot to someone else's server. Send the invite link to an admin of that server and ask them to authorize it. Everything after that works normally for you.
Give the bot access to your channels
Being in the server is not the same as being able to read every channel. Discord applies the same permission rules to your bot as it does to a new member.
Public channels usually need nothing. If a channel is visible to @everyone, your bot can already read it and its history. For most servers that covers everything you want, and you can go straight back to Riflet.
Private channels have to be granted explicitly. Same for public channels with permission overrides. A private channel denies View Channel to @everyone, and that denial beats anything the bot's role has at server level. This is the step that blocks almost everyone, because the bot can already see that the channel exists while being unable to read a single message in it.
When you invited the bot, Discord created a role named after your application. That role is what you grant access with. In Discord:
- Right-click the category containing the channels, or a single channel, and choose Edit Category or Edit Channel. On mobile, tap the name, then the gear icon.
- Open the Permissions tab.
- Click Add members or roles and pick the role named after your app.
- Set View Channel and Read Message History to the green tick.
- Save.
Start with the categories rather than the channels. Every channel inside a category that inherits its permissions picks the change up at once, so three categories can replace twenty channels. Any channel that keeps its lock afterwards has its own overrides, and you grant that one directly.
Editing the role itself will not work. Opening Server Settings, then Roles, then your app's role and ticking the permissions there changes its server-wide defaults, which a private channel's own overrides still override. The permission has to be added on the category or the channel. Discord also warns that this role "is managed by an integration" and cannot be assigned to members by hand. That is expected, and it does not stop you from using the role in channel permissions, which is all you need it for.
Server Settings, then Integrations, is not the place either. Opening your app there shows a Command Permissions section with a Channels list and an Add Channels button, which looks exactly like what you want. It is not: that panel restricts where the app's slash commands can be used. Riflet registers no commands at all, so the panel reads "This application has no commands" and nothing you set in it has any effect on what the bot can read.
Back in Riflet, channels your bot cannot read appear with a small lock icon and cannot be selected. That is your checklist: fix the permission in Discord, reopen the server in Riflet, and the lock is gone. Riflet reads text channels, announcement channels and forum channels, along with their threads, including archived ones.
What Riflet can and cannot see
Riflet talks to Discord's REST API and only ever reads. It lists the servers your bot is in, the channels and categories inside them, the threads, and the message history of the channels you select. That is the whole surface.
- It never writes: no posting, no reactions, no edits, no deletions, no direct messages.
- It never reads your DMs. A bot has no access to them, and Riflet does not ask for any.
- It never reads channels your bot has not been given access to.
- Your token stays on your machine, encrypted with a key kept in your operating system's credential store: the macOS Keychain, Windows Credential Manager, or your desktop password store on Linux.
When you are done, remove the bot from the server like any other member, or delete the application in the Developer Portal to invalidate the token everywhere at once.
Build your first Discord bundle
Pick your channels, set a date range, and export the conversation as one clean file for Claude, ChatGPT, or any model you use.
Get RifletDiscord setup troubleshooting
Riflet says "No servers found" after I connected my token. What now?
The bot exists but has not been invited anywhere yet. Creating a bot in the Developer Portal does not add it to any server. Click "Invite bot to your server" in the Riflet panel, authorize it on your server, then click "I've added the bot, refresh". If it still shows nothing, two things to check. First, that you used Riflet's invite button and not the Install Link from the portal's Installation tab, which installs the app without a bot user unless its default settings include the bot scope. Second, that the token you pasted belongs to the same application you invited. One token per application, and each application is a separate bot.
I authorized the bot but I cannot see it in the server member list.
That is not a reliable test, and in most cases nothing is wrong. Riflet only makes REST calls and never opens a gateway connection, so your bot is permanently offline. Discord groups offline members at the bottom of the list and hides them entirely in larger servers. Check Server Settings then Roles instead: if a role named after your app exists, the bot joined. The real confirmation is Riflet's own server picker, which only lists servers the bot is actually a member of.
Riflet says my Discord bot token is invalid.
Three common causes. You copied the Client Secret or the Application ID from the General Information or OAuth2 tab instead of the token from the Bot tab. You copied only part of the token, which happens easily because the token is long and Discord shows it once. Or you reset the token after connecting, which immediately invalidates the previous one. Go back to the Bot tab, click Reset Token, copy the whole value, and paste it again.
Why does Riflet need the Message Content Intent?
Discord treats the text of messages as privileged data. Without that intent enabled, the API still returns your messages, but the content field of every one of them comes back empty. Riflet would build a bundle of timestamps and author names with no text in it. The intent is a single toggle in the Bot tab, under Privileged Gateway Intents, and it needs Save Changes clicked afterwards.
One of my channels has a lock icon in Riflet.
That channel exists in the server, but your bot cannot read it. This is normal for private channels and for channels with permission overrides. Open the settings of the channel, or better the category above it, go to Permissions, click Add members or roles, pick the role named after your app, and allow View Channel and Read Message History. Two places that look right but do nothing: the role's own permissions in Server Settings, which private channels override, and the Command Permissions panel under Integrations, which only governs slash commands. Reopen the server in Riflet and the lock disappears.
The export failed with a "Missing access" error.
The bot could see the channel in the list but was refused when it tried to read the history. Almost always this means View Channel is allowed but Read Message History is not. In Discord, right-click the channel, choose Edit Channel, open Permissions, and allow Read Message History for your bot.
Can I use the same bot on several servers?
Yes, and that is the simplest setup. Invite the same bot to each server you want to export. In the server picker, Riflet shows an "Invite bot to another server" link for exactly this. You only ever paste one token.
Can other people in the server tell that the bot is reading?
The bot appears in the member list like any other bot, so its presence is visible. It never posts, never reacts, and never sends anything, so there is no visible activity. Anyone with access to the server settings can see when it was added and by whom, and can remove it at any time.