Arabic Handwriting Animation
Type العربية, watch it written by hand, export it as video — free, no watermark, no sign-up. Correctly joined, written right to left, with the dots added afterwards.
Arabic is the one that changes the engine
Every other script here is animated cluster by cluster. Arabic cannot be, and this is the single most important thing about doing it properly.
Arabic is cursive. A letter takes a different shape depending on whether it begins, sits inside, ends or stands alone in a word, and joined letters share one continuous baseline stroke. Trace one character at a time and you capture the isolated form of every letter — producing a row of disconnected shapes that a reader would call simply wrong. The whole word therefore goes to the tracer in one piece, after the browser has shaped it.
That has a practical cost worth being honest about: a per-word cache has a lower hit rate than a per-letter one, and a long word takes longer to work out the first time. The cache is bounded and evicts by pixel cost, and long words are traced at a slightly coarser working size so the wait stays short.
Right to left, at every level
- The line lays out right to left, and right alignment is the natural default — not a setting you have to find.
- Word order: the rightmost word is written first.
- Within a stroke: the pen travels right to left along the baseline, which is the natural cursive motion.
- The word gap belongs to whichever word comes first logically — on an RTL line that is the one on the right. Getting this backwards is what makes Arabic run together as مرحبابالعالم, and it is an easy mistake to make.
The i'jam, written last
The dots on ب ت ث ن ي ج خ ذ ز ش ض ظ غ ف ق are separate marks, not part of the joined stroke. A hand writes the body of the word first and then goes back along it adding the dots. That is what happens here: the dots are held back until the body is finished, then placed right to left — back along the word the hand just wrote. Hamza and any harakat are treated the same way.
Fonts
| Font | Mode | Character |
|---|---|---|
| Noto Naskh Arabic | Stroke | The default. Clear, even naskh; the safest choice. |
| Lateef | Stroke | Lighter, more open. |
| Scheherazade New | Stroke | Traditional naskh with fuller detail. |
| Reem Kufi | Stroke | Geometric kufi; strong for titles. |
| Amiri | Reveal only | Thick naskh with heavy joins — does not thin cleanly. |
| Aref Ruqaa | Reveal only | Calligraphic ruqaa. Beautiful, and genuinely untraceable. |
Aref Ruqaa is a good example of why the picker says reveal only out loud. It is one of the nicest faces in the set, and a stroke animation of it would look broken — so it animates as a clean wipe instead, and the tag tells you that before you pick it rather than after.
Mixed Arabic and Latin
A brand name or a number inside Arabic text is handled by a simplified bidi pass: the paragraph direction comes from the first strong character, runs are laid out in that direction, and words inside an opposite-direction run keep their own order. This covers the ordinary case. It is not the full Unicode bidirectional algorithm, and rather than quietly approximating, the app puts a note on screen when a line mixes directions so you can check it.
Frequently asked questions
Does the Arabic join correctly?
Yes. The whole word is shaped and traced as one unit, so initial, medial, final and isolated forms are all correct. Letter-by-letter tracing is what produces disconnected letterforms.
Is it written right to left?
Yes — line layout, word order, stroke direction and dot placement are all right to left, and right alignment is the default.
Can I export with a transparent background?
Yes, free. Luma matte, alpha-packed MP4 or a PNG sequence — see transparent handwriting animation.
Do you support Urdu, Persian or Pashto?
Those use the Arabic script with extra letters, and the letters render and join. But Urdu in particular is usually set in Nastaliq, whose steeply cascading baseline is a different problem from naskh, and no Nastaliq face is bundled. Treat non-Arabic languages in this script as working but untested.