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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
17GitHub stars
1star in 7 days
1skill in this repository
1commit in 30 days

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

Oct 25, 2026Nov 4, 202617

30-day change not yet available: not enough history.

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

4,121 tokens

When the skill is activated

Reference documents

2,149 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Iron rules
  2. What the output has
  3. Accepted input
  4. Workflow
  5. The reply
  6. Input format (`in.md`)
  7. Uthmani script (الرسم العثماني) — only on request
  8. Known limits (tell the user when relevant, in the words of «The reply»)

Scripts executed separately

  • scripts/make.py
  • scripts/quran.py
  • scripts/to_md.py
  • scripts/typeset.py

Files

  • SKILL.mdcore17,265 bytes
  • SKILL.mdcore17,265 bytes
  • SKILL.mdcore17,265 bytes
  • assets/fonts/_LotusLotfi-Bold.ttfasset580,376 bytes
  • assets/fonts/_LotusLotfi-Regular.ttfasset597,836 bytes
  • assets/quran/SOURCE.mddoc2,326 bytes
  • assets/quran/UthmanicHafs_V22.ttfasset297,700 bytes
  • assets/quran/quran.txt.xzasset323,900 bytes
  • assets/symbols/NotoNaskhArabic-Regular.ttfasset247,336 bytes
  • assets/symbols/OFL.txtdoc4,382 bytes
  • assets/symbols/SOURCE.mddoc1,427 bytes
  • references/spec.mddoc3,951 bytes
  • scripts/make.pyruns18,983 bytes
  • scripts/quran.pyruns9,571 bytes
  • scripts/to_md.pyruns13,899 bytes
  • scripts/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 GitHub

Skills 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 scripts

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skill/saffaf/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 87
    num = tok.strip('()<U+06DD>')

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
Signal confidence: 41 facts

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativePath CLAUDE.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md skill/saffaf/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skill/saffaf/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skill/saffaf/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skill/saffaf/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.