Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian
X

NoteTweet

chhoumannchhoumann7k downloads

Post tweets and threads to X (Twitter) directly from your notes.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates27

This plugin allows you to post to X (formerly Twitter) directly from Obsidian.

Features

  • Composer (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.
  • Post selection as tweet - posts the current editor selection as a single tweet, immediately.
  • Post file as thread - parses the first THREAD START/THREAD END block in the active note and posts it as a thread.
  • Multiple X accounts - define named accounts, choose one in the composer, and set the default used by quick-post commands.
  • Encrypted credentials - your API keys are kept in Obsidian's built-in encrypted Secret Storage, not in the plugin's data.json.
  • Auto-split - long text is split into a thread at 280 characters (toggle in settings). Disabling it allows longer tweets, which require a paid X plan.
  • Images - attach images to a post in the composer: hover a post and click the image button to pick one from your vault, or just paste an image straight in (it's saved to your vault, then uploaded). You can also embed one by typing a [[wikilink]] to an image file (gif, jpg, jpeg, png, webp, bmp) in the text. Uploads are desktop only.
  • Tweet tag - optionally append a tag to your note after posting, so you can keep track of what you've tweeted.
  • Delete/undo - after posting, a modal lets you delete the tweets you just posted.
  • Scheduling (optional, advanced) - post on a schedule through a self-hosted scheduler. Follow this guide to set it up.

Feel free to recommend features!

8jE9wvKuls

How to use

Installation

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.

Manual Installation

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.

  1. Go to Releases and download the ZIP file from the latest release.
  2. This ZIP file should be extracted in your Obsidian plugins folder. If you don't know where that is, you can go to Community Plugins inside Obsidian. There is a folder icon on the right of Installed Plugins. Click that and it opens your plugins folder.
  3. Extract the contents of the ZIP file there.
  4. Proceed to Setup

Setup

  1. Go to developer.x.com and sign up for a developer account if you haven't already.
  2. Create a new App in the Developer Portal. New apps created at developer.x.com are automatically placed inside a Project, which is required for the X API v2. (A legacy, non-Project app causes a 403 Client Forbidden with reason client-not-enrolled - see Troubleshooting.)
  3. On app creation you're shown the API Key, the API Key Secret, and a Bearer Token. Copy the API Key and API Key Secret - the portal names these differently than the plugin's fields:
    • API Key = your Consumer Key
    • API Key Secret (some UIs call it Secret Key) = your Consumer Secret
    • The Access Token and Access Token Secret are not shown here - you generate them in the next step.
  4. Enable posting and generate the user tokens (this is the extra step people miss):
    • In the app's Settings tab, open User authentication settings and click Edit.
    • Enable OAuth 1.0a, set App permissions to Read and write, then Save.
    • To save, X also requires a Callback URI / Redirect URL, a Website URL, and a Type of App. The plugin uses OAuth 1.0a with the Access Token below and never uses the callback redirect, so any valid values work: put https://github.com/chhoumann/notetweet_obsidian in both URL fields and pick Web App, Automated App or Bot for the type.
    • Open the Keys and tokens tab, find Access Token and Secret, and click Generate. This gives you the Access Token and Access Token Secret.
    • If you change App permissions after generating the Access Token, regenerate the Access Token - otherwise it stays read-only.
  5. In NoteTweet settings, add a named X account and paste all four values - API Key, API Key Secret, Access Token, and Access Token Secret - into that account. They are stored in Obsidian's encrypted Secret Storage (see 'Credentials & security' below). Repeat this setup for each X account you want to post from.

Important Notes:

  • Credentials are shown only once in the developer portal - if you lose them, regenerate new ones.
  • Ensure your App has Read and write permissions, not just Read, and regenerate the Access Token after changing permissions.
  • Your App must be attached to a Project (required for X API v2). New apps are enrolled automatically; legacy apps must be attached manually.

Each account has its own connection test, which shows the exact reason X returned when verification fails (for example the client-not-enrolled message).

Credentials & security

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.

Composer

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.

Composer Shortcuts

  • Backspace to delete an empty post
  • Alt + Enter (or Enter at the character limit) to start a new post
  • Three line breaks in a row also start a new post
  • Shift + Enter to insert a post above
  • Ctrl + Enter to insert a post below
  • Ctrl + ArrowUp / Ctrl + ArrowDown to focus the post above / below
  • Ctrl + Shift + ArrowUp / Ctrl + Shift + ArrowDown to move the current post up / down
  • Ctrl + Shift + Delete to delete the focused post

Quick posts

Single 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 Posts

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.

Troubleshooting

Not connected - 403 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:

  1. In the Developer Portal, either create a fresh app (new apps are automatically enrolled in a Project) or attach your existing app to a Project.
  2. Regenerate your Access Token and Secret (Keys and tokens -> Access Token and Secret -> Generate), since the tokens are tied to the app.
  3. Paste the updated credentials into the plugin settings and re-check the connection indicator.

Posting fails with 403 even though you're connected

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:

  • Your Access Token is read-only. If the app was Read-only when the token was generated (or you switched to Read and write afterwards without regenerating), the token can read but not post. Set App permissions = Read and write, then regenerate the Access Token and Secret and paste the new ones in - this is the fix in the large majority of cases.
  • You hit the free tier's monthly write cap. X returns a 403 (UsageCapExceeded) once you exceed it; wait for the reset or raise your access tier.
  • Duplicate content. X rejects an identical post; change the text.

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.

Authentication Error (401)

If you're seeing "TypeError: Cannot read properties of undefined (reading 'data')" or authentication errors even though the plugin shows as "connected":

  1. Verify your X app is attached to a Project

    • Go to developer.x.com
    • Navigate to your app settings
    • Ensure your app is attached to a Project (required for X API v2)
  2. Check your system clock

    • Authentication can fail if your system time is incorrect
    • Ensure your computer's clock is synchronized
  3. Regenerate your access tokens

    • In the X Developer Portal, regenerate your Access Token & Secret
    • Update the plugin settings with the new tokens
  4. Verify app permissions

    • Your X app must have "Read and Write" permissions
    • If you recently changed permissions, regenerate your tokens
  5. Check for token expiration

    • X API tokens can expire after extended periods of non-use
    • Simply regenerating them often resolves this issue
  6. Check your access tier and usage limits

    • The free tier can post (write), so it works for most use cases. (Basic is a separate paid tier - you don't need it just to post.)
    • Check your usage limits in the developer portal if you're hitting rate limits

Common Issues

  • Media upload failures: Ensure your image files are in a supported format (gif, jpg, jpeg, png, webp, bmp) and accessible in your vault.
HealthExcellent
ReviewSatisfactory
About
Post to X (formerly Twitter) without leaving your vault. Compose single posts or full threads in a writing-first modal, create them from selected text or a whole note, and split long text into a thread automatically. Attach images by pasting, picking from your vault, or embedding [[wikilinks]]. Schedule posts through a self-hosted scheduler, review everything you posted, and delete recent posts if you change your mind. API credentials are stored in the app’s secure secret storage.
IntegrationsAutomationImages
Details
Current version
0.7.0
Last updated
3 weeks ago
Created
5 years ago
Updates
27 releases
Downloads
7k
Compatible with
Obsidian 1.13.0+
Platforms
Desktop, Mobile
License
MIT
Report bugRequest featureReport plugin
Sponsor
Buy Me a Coffee
Author
chhoumannchhoumann
bagerbach.com/
GitHubchhoumann
  1. Community
  2. Plugins
  3. Integrations
  4. NoteTweet

Related plugins

BRAT

Easily install a beta version of a plugin for testing.

Readwise Official

Sync highlights from Readwise to your vault.

Actions URI

Add additional `x-callback-url` endpoints to the app for common actions — it's a clean, super-charged addition to Obsidian URI.

Todoist Sync

Materialize Todoist tasks within your notes.

Paste image rename

Rename image after pasting, support name pattern and auto renaming.

Shell commands

Define system commands that you want to execute via command palette, hotkeys, URI links or automated events. E.g. open external applications or perform automated file modifications.

Image auto upload

Upload images from your clipboard by PicGo.

Google Calendar

Interact with your Google Calendar.

Homepage

Open a note, base, or workspace on startup, or set it for quick access later.

Advanced URI

Control everything with URI.