Not in the top 1,000 by GitHub stars
iiAMMAR11/saffaf
مهارة لـ Claude تصفّ الأبحاث والمقالات العربية بخط لوتس لطفي، وتُخرجها في ملفَّي Word وPDF
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skill/saffaf/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → fab7c787101a
No earlier version was observed for comparison.
Verified commit fab7c787101a4adaf350dd288065f4f8fc5e47bf
git clone --filter=blob:none --no-checkout https://github.com/iiAMMAR11/saffaf.git .hotskills/iiammar11-saffaf && git -C .hotskills/iiammar11-saffaf checkout --detach fab7c787101a4adaf350dd288065f4f8fc5e47bf
# Copy each selected skill directory from .hotskills/iiammar11-saffaf into .claude/skills/<skill-name>/Heat
2.6- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- saffaf
skill/saffaf
How it works
saffaf
When your agent uses it
A fixed typesetting style for Arabic research papers and articles (صف الأبحاث والمقالات) in Lotus Lotfi, set the way printed Arabic books are, output as Word (.docx) + PDF; Quran verses can be set in Uthmani script (الرسم العثماني) on request. Use this skill whenever the user sends Arabic text or a document file (Word, ODT, RTF, HTML, EPUB, TXT, MD…) and asks to صف / نسّق / اخرج / حوّل لوورد أو PDF a research paper or article (بحث، مقال، ورقة علمية) — even if they only say "صفّه" or "نسّقه بحثًا".
What it loads into context
Frontmatter
150 tokensAlways available to the agent
SKILL.md
4,121 tokensWhen the skill is activated
Reference documents
2,149 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron rules
- What the output has
- Accepted input
- Workflow
- The reply
- Input format (`in.md`)
- Uthmani script (الرسم العثماني) — only on request
- Known limits (tell the user when relevant, in the words of «The reply»)
Scripts executed separately
scripts/make.pyscripts/quran.pyscripts/to_md.pyscripts/typeset.py
Files
SKILL.mdcore17,265 bytesSKILL.mdcore17,265 bytesSKILL.mdcore17,265 bytesassets/fonts/_LotusLotfi-Bold.ttfasset580,376 bytesassets/fonts/_LotusLotfi-Regular.ttfasset597,836 bytesassets/quran/SOURCE.mddoc2,326 bytesassets/quran/UthmanicHafs_V22.ttfasset297,700 bytesassets/quran/quran.txt.xzasset323,900 bytesassets/symbols/NotoNaskhArabic-Regular.ttfasset247,336 bytesassets/symbols/OFL.txtdoc4,382 bytesassets/symbols/SOURCE.mddoc1,427 bytesreferences/spec.mddoc3,951 bytesscripts/make.pyruns18,983 bytesscripts/quran.pyruns9,571 bytesscripts/to_md.pyruns13,899 bytesscripts/typeset.pyruns36,610 bytes
Read SKILL.md
# Arabic research typesetting (Lotus Lotfi)
You are a typesetter (صفّاف). The style is modeled on Saudi academic research papers (e.g. the King Saud University conference paper style), with the page set to the measures of a printed Arabic book, and is fixed; do not redesign it. Spec details: `references/spec.md` (read when asked why something looks a certain way or to change a value).
Requirements: Python 3 with `fonttools` and `pdfplumber`, LibreOffice (`soffice`), `fc-cache`, and poppler-utils (`pdftoppm` for the visual check). Install anything missing before running.
Font: Lotus Lotfi (لوتس لطفي) by Lotfi El-Tokhi, published free by its author; bundled in `assets/fonts`.
Symbols font: Noto Naskh Arabic (SIL Open Font License; `assets/symbols`, details in its `SOURCE.md`). It sets, character by character, only the honorific signs and ligature words Lotus lacks at their standard code points — ﷻ ﷽ ﵁ and the rest of U+FD40–U+FD4F; the author's characters stay as written.
خط الآيات: خط الرسم العثماني – حفص (KFGQPC HAFS Uthmanic Script)، من إصدار مجمع الملك فهد لطباعة المصحف الشريف بالمدينة المنورة، يُستخدم ويوزَّع مجانًا وفق رخصته دون تعديل. ونصّا المصحف من مكتبة QUL. (`assets/quran`, details in its `SOURCE.md` — never edit these files.)
## Iron rules
- **Never change a single letter of the author's text.** Formatting only. Language remarks (e.g. ى/ي confusion, which Lotus exposes visibly via its marked alif maqsura) go in your reply, never into the file. Keep the author's punctuation exactly as written, including a stylistic ".." (two dots) — never "fix" it.View the complete source on GitHubSkills included
- saffaf
Repository facts
- License
- MIT
- Created
- Oct 13, 2026
- Last pushed
- Oct 25, 2026
- Forks
- 1
- Open issues
- 5
- Project activity
- Active
Before you install
Local scriptsAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 2 notes
skill/saffaf/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskill/saffaf/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 34 network referencesin 4 files: saffaf/scripts/typeset.py:13 saffaf/assets/symbols/OFL.txt:1 saffaf/scripts/make.py:22 and 1 more
- 3 obfuscation signalsin 3 files: saffaf/SKILL.md:21 saffaf/scripts/quran.py:87 saffaf/scripts/to_md.py:16
- No instruction overrides
- 4 executable scriptsin 4 files: saffaf/scripts/make.py:1 saffaf/scripts/quran.py:1 saffaf/scripts/to_md.py:1 and 1 more
- No access to secrets
- No requests to vote in Hot
Show all 41 signals by file
skill/saffaf/SKILL.md
- Possible obfuscationline 21
- Only invisible typesetting aids are allowed (RLM inside "١٢/<U+200F>٢٨٣"; the script itself adds no-break spaces and word joiners inside short numbered references so they stay on one line). Never add or remove a visible character or space.
skill/saffaf/assets/symbols/OFL.txt
- Network accessline 1
Copyright 2022 The Noto Project Authors (https://github.com/notofonts/arabic) - Network accessline 3
This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: https://openfontlicense.org - Network accessline 5
https://openfontlicense.org
skill/saffaf/scripts/make.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 22
os.makedirs(PROFILE + '/user', exist_ok=True) open(PROFILE + '/user/registrymodifications.xcu', 'w').write( '<?xml version="1.0" encoding="UTF-8"?><oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w - Network accessline 23
open(PROFILE + '/user/registrymodifications.xcu', 'w').write( '<?xml version="1.0" encoding="UTF-8"?><oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org - Network accessline 24
'<?xml version="1.0" encoding="UTF-8"?><oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
skill/saffaf/scripts/quran.py
skill/saffaf/scripts/to_md.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 14
W = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' - Network accessline 15
MC_FALLBACK = '{http://schemas.openxmlformats.org/markup-compatibility/2006}Fallback' - Possible obfuscationline 16
BIDI_CTRL = dict.fromkeys(map(ord, '<U+202A><U+202B><U+202C><U+202D><U+202E><U+2066><U+2067><U+2068><U+2069><U+FEFF>'))
skill/saffaf/scripts/typeset.py
- Executable scriptline 1
Executable file - Network accessline 13
W_NS = ('xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" ' - Network accessline 14
'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"') - Network accessline 374
empty_h = f'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:hdr {W_NS}><w:p><w:pPr><w:bidi/></w:pPr></w:p></w:hdr>' empty_f = f'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:ftr {W_NS}><w:p><w:pPr><w:bidi/></w:pPr> - Network accessline 375
empty_f = f'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:ftr {W_NS}><w:p><w:pPr><w:bidi/></w:pPr></w:p></w:ftr>' r = '<w:rPr><w:rtl/></w:rPr>'; MC = 'http://schemas.openxmlformats.org/markup-compatibility/2006' def fld( - Network accessline 376
r = '<w:rPr><w:rtl/></w:rPr>'; MC = 'http://schemas.openxmlformats.org/markup-compatibility/2006' - Network accessline 392
number = (f'<mc:AlternateContent xmlns:mc="{MC}"><mc:Choice xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" Requires="w15">{number}</mc:Choice>' - Network accessline 399
{'<w:embedTrueTypeFonts/>' if QURAN_USED else ''}<w:defaultTabStop w:val="720"/><w:characterSpacingControl w:val="doNotCompress"/> <w:footnotePr><w:numFmt w:val="decimal"/><w:numRestart w:val="eachPage"/><w:footnote w:id="-1"/><w:footnote w - Network accessline 400
<w:footnotePr><w:numFmt w:val="decimal"/><w:numRestart w:val="eachPage"/><w:footnote w:id="-1"/><w:footnote w:id="0"/></w:footnotePr> <w:compat><w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:v - Network accessline 401
<w:compat><w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/></w:compat> - Network accessline 415
qfont = (f'<w:font w:name="{quran.FONT}"><w:charset w:val="B2"/><w:family w:val="auto"/><w:pitch w:val="variable"/>' f'<w:embedRegular r:id="rIdFont1" w:fontKey="{g1}"/></w:font>') if QURAN_USED else '' qrel = '<Relationshi - Network accessline 416
f'<w:embedRegular r:id="rIdFont1" w:fontKey="{g1}"/></w:font>') if QURAN_USED else '' qrel = '<Relationship Id="rIdFont1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/font" Target="fonts/font1.odttf"/>' if Q - Network accessline 417
qrel = '<Relationship Id="rIdFont1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/font" Target="fonts/font1.odttf"/>' if QURAN_USED else '' - Network accessline 420
f'<w:font w:name="{FALLBACK}"><w:charset w:val="00"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font>' '<w:font w:name="Courier New"><w:charset w:val="00"/><w:family w:val="modern"/><w:pitch w:val="fixed"/></w:font></w: - Network accessline 421
'<w:font w:name="Courier New"><w:charset w:val="00"/><w:family w:val="modern"/><w:pitch w:val="fixed"/></w:font></w:fonts>') fonttable_rels = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas. - Network accessline 422
fonttable_rels = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' + qrel + '</Relationships>') - Network accessline 423
R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/' - Network accessline 424
doc_rels = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' - Network accessline 429
f'<Relationship Id="rIdF1" Type="{R}footer" Target="footer1.xml"/><Relationship Id="rIdF2" Type="{R}footer" Target="footer2.xml"/></Relationships>') WM = 'application/vnd.openxmlformats-officedocument.wordprocessingml.' ct = ('<?xml - Network accessline 430
WM = 'application/vnd.openxmlformats-officedocument.wordprocessingml.' ct = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">' '<Default Extensi - Network accessline 431
ct = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">' - Network accessline 438
f'<Override PartName="/word/footer1.xml" ContentType="{WM}footer+xml"/><Override PartName="/word/footer2.xml" ContentType="{WM}footer+xml"/>' '<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-packa - Network accessline 439
'<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/></Types>') rels = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlfo - Network accessline 440
rels = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' - Network accessline 441
'<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>' - Network accessline 442
'<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/></Relationships>') - Network accessline 443
core = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/">'
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Declared and executed: 6 facts
- Contacts openoffice.org, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/make.py:24High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/make.py:24High confidence
- Contacts schemas.openxmlformats.org, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/to_md.py:14High confidence
- Contacts schemas.openxmlformats.org, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/typeset.py:13High confidence
- Contacts schemas.microsoft.com, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/typeset.py:392High confidence
- Contacts purl.org, which SKILL.md, the README and the plugin manifest do not mentionsaffaf/scripts/typeset.py:443High confidence
Hidden characters: 1 fact
- Text direction control U+202A, in codesaffaf/scripts/to_md.py:16High confidence
Signal confidence: 41 facts
- Possible obfuscation in prose of the SKILL.mdsaffaf/SKILL.md:21Low confidence
- Network access in prose of documentationsaffaf/assets/symbols/OFL.txt:1Low confidence
- Network access in prose of documentationsaffaf/assets/symbols/OFL.txt:3Low confidence
- Network access in prose of documentationsaffaf/assets/symbols/OFL.txt:5Low confidence
- Executable script in code of a file that runssaffaf/scripts/make.py:1High confidence
- Network access in code of a file that runssaffaf/scripts/make.py:22High confidence
- Network access in code of a file that runssaffaf/scripts/make.py:23High confidence
- Network access in code of a file that runssaffaf/scripts/make.py:24High confidence
- Executable script in prose of a file that runssaffaf/scripts/quran.py:1Low confidence
- Possible obfuscation in code of a file that runssaffaf/scripts/quran.py:87High confidence
- Executable script in code of a file that runssaffaf/scripts/to_md.py:1High confidence
- Network access in code of a file that runssaffaf/scripts/to_md.py:14High confidence
- Network access in code of a file that runssaffaf/scripts/to_md.py:15High confidence
- Possible obfuscation in code of a file that runssaffaf/scripts/to_md.py:16High confidence
- Executable script in code of a file that runssaffaf/scripts/typeset.py:1High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:13High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:14High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:374High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:375High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:376High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:392High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:399High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:400High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:401High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:415High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:416High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:417High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:420High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:421High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:422High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:423High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:424High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:429High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:430High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:431High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:438High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:439High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:440High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:441High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:442High confidence
- Network access in code of a file that runssaffaf/scripts/typeset.py:443High confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Path CLAUDE.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md skill/saffaf/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skill/saffaf/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skill/saffaf/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skill/saffaf/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skill/saffaf/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.