chhoumann7k downloadsPost tweets and threads to X (Twitter) directly from your notes.
This plugin allows you to post to X (formerly Twitter) directly from Obsidian.
Post tweet) - a modal for writing single tweets or threads. It pre-fills from your current selection: a THREAD START/THREAD END block becomes a pre-split thread, and other text is auto-split for you.THREAD START/THREAD END block in the active note and posts it as a thread.data.json.[[wikilink]] to an image file (gif, jpg, jpeg, png, webp, bmp) in the text. Uploads are desktop only.Feel free to recommend features!

This plugin has been added to the community plugin browser in Obsidian. You can get it from there.
If you want to watch a video on how to set up this plugin, click here.
Please note that these steps are not necessary anymore. You can get the plugin from the community plugin browser. Just install from there and jump to Setup.
Community Plugins inside Obsidian. There is a folder icon on the right of Installed Plugins. Click that and it opens your plugins folder.Client Forbidden with reason client-not-enrolled - see Troubleshooting.)https://github.com/chhoumann/notetweet_obsidian in both URL fields and pick Web App, Automated App or Bot for the type.Important Notes:
Each account has its own connection test, which shows the exact reason X returned when verification fails (for example the client-not-enrolled message).
Account names, IDs, and the default account are stored in the plugin's data.json. Every account's API key, API secret, access token, and access token secret are kept separately in Obsidian's built-in encrypted Secret Storage (app.secretStorage). Because Secret Storage is used, this plugin requires Obsidian 1.13.0 or newer.
Migrating from an older version. Credentials already held in NoteTweet's four fixed Secret Storage entries are moved automatically into a named Default account. If you're upgrading from a version that stored credentials in data.json, the settings tab instead shows a Migrate credentials section with a Migrate now button. If you previously enabled the old password-based Secure Mode, the button first prompts for that password so it can decrypt the values. Both paths preserve all four X credentials and remove the old credential path after migration.
Run the Post tweet command to open the composer, where you can choose a named X account and craft threads or single tweets. The configured default account is selected initially. If you have text selected, it is ported into the composer automatically: a THREAD START/THREAD END block opens as a pre-split thread, and any other text is auto-split into tweets when it exceeds 280 characters. You can also paste text in, and anything longer than 280 characters is split for you. The composer has a Post button, and a Schedule button when scheduling is enabled.
Backspace to delete an empty postAlt + Enter (or Enter at the character limit) to start a new postShift + Enter to insert a post aboveCtrl + Enter to insert a post belowCtrl + ArrowUp / Ctrl + ArrowDown to focus the post above / belowCtrl + Shift + ArrowUp / Ctrl + Shift + ArrowDown to move the current post up / downCtrl + Shift + Delete to delete the focused postSingle tweets are simple. Select some text and run the Post selection as tweet command to post it immediately through the default account configured in NoteTweet settings.
To post a thread straight from a note, run the Post file as thread command. It detects the first THREAD START/THREAD END block in the active note and posts it through the same default account.
Threads have a specific format. Only the first thread block in a file is detected.
Format:
THREAD START
Here you can type the first tweet in your thread.
Spacing is fine.
---
Separation between tweets is done using a line containing only three dashes - just like you see above.
---
Enjoy!
THREAD END
Threads must start with THREAD START and end with THREAD END, and individual tweets are separated by a line containing only ---.
Scheduling is optional and advanced. The self-hosted scheduler owns its own X credentials and therefore its own posting identity. Choosing an account in NoteTweet affects immediate posting only - a scheduled post is always sent by the account configured on the scheduler server. Scheduling also requires the Natural Language Dates community plugin for entering times. Follow this guide to set it up.
Client Forbidden (client-not-enrolled)This is the most common setup failure. It means the app your credentials come from is not attached to a Project, so it isn't enrolled to use the X API v2 write endpoints. The plugin surfaces this exact reason in the connection status.
To fix it:
The connection indicator uses a read call, so it stays green even when your app can't write. A 403 when you hit Post almost always means one of:
UsageCapExceeded) once you exceed it; wait for the reset or raise your access tier.The failure notice shows X's own reason, and the full payload is logged to the developer console (Post request failed: code=… data=…) so you can tell these apart.
If you're seeing "TypeError: Cannot read properties of undefined (reading 'data')" or authentication errors even though the plugin shows as "connected":
Verify your X app is attached to a Project
Check your system clock
Regenerate your access tokens
Verify app permissions
Check for token expiration
Check your access tier and usage limits