Post Longer Content & Longer Videos -- Tutorial
Step-by-step guide to posting extended tweets, long-form articles, and longer videos using XActions with Premium/Premium+ tiers.
Prerequisites
- Logged into x.com in your browser
- Browser DevTools console (F12 -> Console tab)
- X Premium or Premium+ subscription (required for extended limits)
- For Node.js usage:
npm install xactionsand a valid session cookie
Quick Start
- Navigate to x.com
- Open DevTools (F12)
- Use
src/postComposer.jsfor extended tweets orsrc/articlePublisher.jsfor articles - Premium subscribers can post up to 25,000 characters per tweet
Content Limits by Tier
Character Limits
| Tier | Tweet Length | Thread Tweet Length |
|---|---|---|
| Free | 280 characters | 280 per tweet |
| Premium | 25,000 characters | 25,000 per tweet |
| Premium+ | 25,000 characters | 25,000 per tweet |
Video Limits
| Tier | Max Length | Max File Size | Max Resolution |
|---|---|---|---|
| Free | 2 min 20 sec | 512MB | 1920x1200 |
| Premium | 60 minutes | 2GB | 1920x1200 |
| Premium+ | 3 hours | 8GB | 4K |
Articles (Premium+ Only)
| Feature | Limit |
|---|---|
| Title | No strict limit |
| Body | No strict character limit |
| Cover image | Yes, optional |
| Drafts | Unlimited |
| Rich formatting | Yes |
Posting Extended Tweets
Node.js / Puppeteer
Extended tweets work the same as regular tweets -- just type more text:
import { postTweet } from './src/postComposer.js';
const longText = `This is an extended tweet that goes well beyond the 280-character limit.
With X Premium, you can write up to 25,000 characters in a single tweet. This is useful for detailed explanations, stories, or technical content that would otherwise require a thread.
The full text appears in the timeline with a "Show more" button for viewers.`;
await postTweet(page, longText);
Browser Console
// Open compose dialog
document.querySelector('[data-testid="SideNav_NewTweet_Button"]').click();
// Wait, then type extended content
setTimeout(() => {
const textarea = document.querySelector('[data-testid="tweetTextarea_0"]');
textarea.focus();
document.execCommand('insertText', false, 'Your very long post content here...');
}, 1500);
Extended Tweets vs Threads
| Approach | Best For |
|---|---|
| Extended tweet (25k chars) | Long-form explanations, stories, detailed takes |
| Thread (multiple 280-char tweets) | Structured arguments, numbered points, engagement |
| Article (Premium+) | Blog-style content with formatting, cover images |
Extended tweets display with a "Show more" button in the timeline. Not all users click it, so put your hook in the first 280 characters.
Publishing Articles (Premium+)
Articles are X's long-form content format, similar to blog posts.
Node.js / Puppeteer (src/articlePublisher.js)
import { publishArticle, saveDraft, getArticles } from './src/articlePublisher.js';
// Publish an article
const result = await publishArticle(page, {
title: 'Why Browser Automation Beats API Access',
body: `Full article body goes here. Articles support long-form content
with paragraphs, and you can include as much detail as needed.
This is the second paragraph of the article. Unlike tweets, articles
are displayed in a reader-friendly format with proper typography.`,
coverImage: '/path/to/cover.jpg', // Optional
});
// Save as draft instead of publishing
const draft = await saveDraft(page, {
title: 'Draft: Upcoming Feature Analysis',
body: 'Work in progress...',
});
// List your published articles
const articles = await getArticles(page, 'nichxbt');
console.log(articles);
Article Functions
| Function | Description |
|---|---|
publishArticle(page, { title, body, coverImage? }) |
Publish an article |
saveDraft(page, { title, body }) |
Save article as draft |
getArticles(page, username) |
List published articles |
getArticleAnalytics(page, articleUrl) |
Get article engagement stats |
How Article Publishing Works
- Navigate to
https://x.com/compose/article - Click the title input (
[data-testid="articleTitle"]) and type the title - Click the body editor (
[data-testid="articleBody"]) and type the content - Optionally upload a cover image via
[data-testid="articleCoverImage"] - Click publish (
[data-testid="articlePublish"]) or save draft ([data-testid="articleSaveDraft"])
Article Features
- Rich formatting: Articles support headers, paragraphs, and text styling
- Cover images: Add a hero image that appears at the top of the article
- Drafts: Save work in progress and return to it later
- Analytics: Track views, likes, reposts, and engagement on your articles
- Shareable: Articles get their own URL and preview card when shared
Uploading Longer Videos
Premium Video Upload (up to 60 minutes)
import { postTweet } from './src/postComposer.js';
// Upload a longer video (Premium accounts)
await postTweet(page, 'Full tutorial walkthrough - 45 minutes of content!', {
media: '/path/to/long-tutorial.mp4',
});
For large video files, you may need to increase wait times since processing takes longer:
// The default 2-second wait in postComposer.js may not be enough
// For production use, poll for upload completion
Video Best Practices
- Compress first: Use ffmpeg or HandBrake to compress videos before uploading
- Format: MP4 with H.264 video codec and AAC audio codec works best
- Thumbnail: X auto-generates a thumbnail from the first frame
- Captions: Add captions using
src/videoCaptions.jsfor accessibility (see the video captions tutorial) - Processing time: Large videos can take several minutes to process on X's servers
Extended Content Strategy
When to Use Extended Tweets
- Detailed explanations that lose meaning when split into thread chunks
- Stories or narratives that flow better as continuous text
- Technical documentation or tutorials
- Responses to complex questions
When to Use Threads Instead
- Numbered lists or step-by-step guides
- Content designed for maximum engagement (threads get more interaction)
- Content where each point stands alone
- Building suspense or narrative tension
When to Use Articles
- Blog-style content with structure and formatting
- Content you want discoverable via your profile's Articles tab
- Evergreen content that should be easy to find later
- Long tutorials, guides, or analyses
Tips & Tricks
- First 280 characters matter: Even in extended tweets, the timeline only shows the first ~280 characters with a "Show more" button. Hook readers early.
- Video compression: A 60-minute video at 1080p can be several gigabytes. Compress to a reasonable bitrate (5-8 Mbps for 1080p).
- Article SEO: Article titles appear in search results. Use clear, descriptive titles.
- Draft regularly: For articles, use
saveDraft()frequently to avoid losing work. - Premium check: The script will fail gracefully if Premium features are not available, returning an error message instead of crashing.
Troubleshooting
| Issue | Solution |
|---|---|
| Character count exceeded (free tier) | Upgrade to Premium for 25,000-character tweets, or split into a thread. |
| Video too long (free tier) | Free accounts are limited to 2:20. Upgrade to Premium for 60 minutes. |
| Article compose not available | Articles require Premium+. The script returns an error if not available. |
| Video processing stuck | Large videos can take 5-10 minutes. Refresh the page and check if processing completed. |
| Cover image upload failed | Verify the image file exists and is a valid format (JPG, PNG). |
| Article draft not saving | Check that you have Premium+ and the title field is filled in. |
Related Scripts
src/postComposer.js-- Standard tweet posting (supports extended tweets)src/articlePublisher.js-- Article publishing and managementsrc/postThread.js-- Thread posting (alternative to extended tweets)src/videoCaptions.js-- Add captions to longer videossrc/schedulePosts.js-- Schedule extended tweets for later
⚡ Ready to try Post Longer Content & Longer Videos -- Tutorial?
XActions is 100% free and open-source. No API keys, no fees, no signup.
Browse All Scripts