AnyTool
Your files never leave your device. All processing happens locally in your browser.

How many characters can a tweet (X post) be, and how are they counted?

A standard X (Twitter) post allows 280 “weighted” characters, not 280 keystrokes. X uses the open-source twitter-text algorithm: Latin letters, digits, spaces and common punctuation each count as 1, while CJK, Arabic, Hebrew, Hangul, Cyrillic and other wide code points count as 2. Every URL is shortened to a t.co link and counts as exactly 23 regardless of its real length, and a whole emoji — including multi-part sequences like a family or a flag — counts as 2. This counter reproduces that weighted length live as you type, shows the remaining count in a ring, detects @mentions, #hashtags, URLs and emoji, and splits an over-length draft into a numbered thread. X Premium raises the composer to 25,000 characters. Everything is computed in your browser; nothing is uploaded.

  • Standard post & reply limit: 280 weighted characters (X Premium: 25,000)
  • URLs always count as 23 (t.co shortening), no matter how long the link is
  • CJK / Arabic / Hangul / other wide code points count as 2; Latin counts as 1
  • A whole emoji sequence (family, flag, skin tone) counts as 2, not per code point
  • Over 280? It auto-splits into numbered posts at word boundaries, reserving room for the (i/n) counter

What is

Weighted Character Count (twitter-text)

The weighted character count is X’s method for measuring post length so that a post in a compact script (English) and a post in a dense script (Japanese) are treated fairly. Defined by the open-source twitter-text library (config version 3: maxWeightedTweetLength 280, scale 100, defaultWeight 200, transformedURLLength 23), it assigns each code point a weight — 1 for Basic Latin and common punctuation ranges, 2 for everything else — sums the weights, and divides by the scale. Every URL is replaced by its fixed 23-character t.co length, and with emoji parsing enabled a full emoji sequence counts as a single weight-2 unit. The result, not the raw string length, is what the 280 limit is measured against.

Social Media

Related terms

twitter-text280 character limitt.coweighted lengthCJKemoji ZWJ sequenceX Premiumthreadcode pointNFC normalisation

Frequently Asked Questions

No. Every character is weighted locally in your browser with the twitter-text algorithm — your draft never leaves your device.

The Twitter / X Character Counter is 100% client-side. As you type, a local engine walks each code point, applies X’s weight table, transforms URLs to their 23-character t.co length and detects entities — all in JavaScript on your device. There is no backend, upload, database or CDN in the counting path and no analytics or tracking. The tool works offline once cached, and closing the tab erases your draft; the only optional network use anywhere on the site is consent-gated ads, which never see what you type.

X counts a weighted length: URLs are 23, wide characters and emoji are 2, and everything else is 1 — so the weighted total differs from a raw keystroke count.

X does not count keystrokes; it counts a weighted length defined by twitter-text. Latin letters, digits, spaces and common punctuation each weigh 1, but CJK, Arabic, Hebrew, Hangul, Cyrillic and other wide code points weigh 2. Any URL is shortened to a t.co link and always counts as 23 characters, and a whole emoji — even a multi-code-point family or flag — counts as 2. So a 300-keystroke post of English URLs can fit, while 200 Japanese characters will not. This tool shows both the authoritative weighted length and the naive code-point / UTF-16 counts so you can see the difference.

It packs your words into numbered 280-character posts, breaking only at word boundaries and reserving exact room for each (i/n) counter.

When your draft exceeds 280 weighted characters, the splitter greedily fills each post with whole words up to the weighted limit, never mid-word (a single word longer than a post is hard-split as a last resort). It then reserves precisely enough space for the “(i/n)” numbering — and because the number of posts affects how many digits the counter needs, it iterates until the count is stable, so no finished post ever overflows. You can copy any single post or the entire thread at once. Treat the result as a starting point and review each post before publishing.

You can switch the display target to 25,000, but only the free 280 limit is enforced; Premium access depends on your account.

The counter defaults to the free 280 weighted-character limit, which applies to standard posts and replies. You can switch the target to X Premium’s 25,000-character composer to see how a long draft measures, but that is a display option, not a promise that your account has Premium. X periodically changes limits and verification tiers, so always confirm against the live composer. The thread splitter always targets the free 280 limit, since that is what threads are for.

Detailed Explanation

How It Works

What the Twitter / X Character Counter Does

The Twitter / X Character Counter measures a draft against X’s real limit as you type. It computes the twitter-text weighted length — not a raw keystroke count — and shows the remaining characters in a progress ring that turns amber near 280 and red when over, with an explicit over-by-N read-out. It detects and counts @mentions, #hashtags, URLs and emoji, highlights the exact text that spills past the limit, and, when a draft exceeds 280, splits it into a numbered thread. A limit toggle switches the display target between the free 280 and X Premium’s 25,000. Everything runs in the browser.

  • Standard post / reply limit: 280 weighted characters; X Premium: 25,000
  • Live progress ring with remaining, over-by-N, and colour states
  • Detects @mentions, #hashtags, URLs and emoji with live counts
  • Auto thread splitter for drafts over 280, broken at word boundaries
  • Fully client-side: nothing typed is uploaded or logged
Methodology

The Weighted-Length Algorithm (twitter-text config v3)

X counts a weighted length defined by the open-source twitter-text library: maxWeightedTweetLength 280, scale 100, defaultWeight 200, transformedURLLength 23. The engine walks the string code point by code point and assigns each a weight — 100 (one character) for the light ranges (Basic Latin through U+10FF, plus specific general-punctuation, dash and prime ranges) and the default 200 (two characters) for everything else, including CJK, Arabic, Hebrew, Hangul and Cyrillic. It sums the weights and divides by the scale to get the weighted length that the 280 limit is measured against. This is implemented in a pure module (twitterCountEngine.ts) with no DOM and no network, so it runs identically in a Worker or on the main thread.

  • Config v3: maxWeightedTweetLength 280, scale 100, defaultWeight 200
  • Light ranges weigh 100 (= 1); all other code points weigh 200 (= 2)
  • Weighted length = sum of weights / scale
  • Pure, dependency-free engine — no string.length shortcut
  • Deterministic and identical in a Web Worker or on the main thread
Technical Details

How URLs, Emoji and Entities Are Handled

Every URL is treated as if shortened to a t.co link and counts as exactly 23 weighted characters regardless of its true length; URLs are detected by scheme (https://), a www. prefix, or a domain ending in a common TLD, and trailing punctuation is trimmed. With emoji parsing enabled, a whole emoji sequence — including multi-code-point ZWJ sequences such as a family or a profession, skin-tone modifiers, and regional-indicator flag pairs — counts as a single default-weight (2) unit rather than per code point; the matcher prefers the RGI_Emoji Unicode set and falls back to an Extended_Pictographic sequence pattern on older engines. @mentions (1–15 word characters) and #hashtags (which must contain at least one letter) are detected with Unicode-aware, boundary-anchored patterns and listed with counts.

  • URL → 23 weighted chars via t.co, independent of real length
  • URL detection: scheme, www. prefix, or common-TLD bare domains
  • One RGI emoji sequence (family, flag, skin tone) = 2, not per code point
  • @mentions limited to 1–15 [A-Za-z0-9_]; #hashtags must include a letter
  • Naive code-point and UTF-16 counts shown alongside for comparison
Limitations

Honest Limitations

This tool enforces only the free 280 weighted-character limit; the 25,000 Premium target is a display option, not a statement that your account has Premium. X periodically changes limits and verification tiers, so the authoritative source is always the live composer — verify there before posting. URL auto-detection relies on a curated list of common TLDs, so links using unusual TLDs may not be flagged as URLs and could be mis-counted. X also applies NFC normalisation before counting, which can very slightly reduce the total for rare pre-composed or decomposed characters; to keep the over-limit highlight perfectly aligned with the textarea, this tool counts the text exactly as entered. The thread splitter is a starting point and should be reviewed before publishing.

  • Enforces the free 280 limit; 25,000 is a display target only
  • X changes limits/tiers over time — confirm against the live composer
  • URL detection uses common TLDs; unusual TLDs may be missed
  • Counts text as typed; X additionally NFC-normalises (minor edge cases)
  • Thread output is a suggestion — review each post before posting
Privacy & Security

Private by Design

The counting, entity detection and thread splitting all happen on your device in JavaScript. Your draft is only ever a string held in the page; there is no backend, upload, database, CDN or telemetry in the counting path, and no analytics. This matters because drafts often contain unpublished ideas, client work or personal messages — here they never leave the browser. Nothing is persisted, the tool works offline once cached, and closing the tab erases the draft. The only optional network use anywhere on the site is consent-gated advertising, which never sees what you type.

  • No upload, server, database, CDN or telemetry in the counting path
  • Drafts never leave your device; nothing is persisted
  • Works offline once cached; closing the tab erases the draft
  • No analytics or tracking of what you type
  • Only optional network use is consent-gated ads that never see the draft
Weighted count vs a naive character count
InputNaive lengthX weighted length
A 50-character https:// link5023
日本語 (3 Japanese characters)36
Hello world1111
👨‍👩‍👧‍👦 (family emoji, 7 code points)72
🇯🇵 flag (2 code points)22

X counts a weighted length (twitter-text config v3): URLs = 23, wide code points and whole emoji = 2, Latin = 1. Only the free 280 limit is enforced here; verify against the live composer. As of July 2026.