Skip to main content

📜 isnady  إسناد

Hadith search built around the isnad, the chain of transmission
Search the collections, read every chain narrator by narrator, and see how the scholars read it

PyPI Python Platform npm License

Why • Install • Quick Start • Search • Chains • Educational • Appearance • Data • CLI • Screenshots • Roadmap

Searching النيات finds بالنيات in Sahih al-Bukhari 1, with the chain above the text

Pre-alpha (0.0.7). Search and chains of transmission work today, on data you import in one command. Narrators, scholars, gradings and the rest are being built, in the open.


🎯 Why isnady

A hadith is two things: the text (matn) and the chain of people who passed it on (isnad). Most hadith sites let you search the text and show a grade. isnady is built the other way round: the chain comes first, because that is where the scholars of hadith did their work.

  • The chain is read, not typed in. isnady reads the chain from the Arabic text itself: who narrated to whom, with which words, and whether it reaches the Prophet.
  • Nothing is guessed. Where the wording cannot be read with confidence, the chain is kept whole and marked, never split wrongly. A missing link is shown as missing.
  • Every fact has a source. Every hadith, text and grade records where it came from, under which licence.
  • Grades are shown as the scholars gave them. Each grade keeps its scholar's name and wording; isnady does not merge them or invent its own.
  • Window and command line, same engine. Everything the window does, the command line does too, with the same results.

📦 Install

One line, on any system — it removes earlier copies first, installs one, puts its commands on PATH and checks the result:

# Linux and macOS
curl -fsSL https://raw.githubusercontent.com/bayramkotan/isnady/main/install.sh | bash
# Windows (PowerShell)
irm https://raw.githubusercontent.com/bayramkotan/isnady/main/install.ps1 | iex

Or with pip:

pip install isnady
isnady            # or the short name:  iy

Run inside a clone of this repository, the installer makes an editable (developer) install of that clone instead.

The same program answers to several names: iy to type, isnady to read, and isnady-cli kept from the first releases. Without arguments it opens the window; with arguments it is the command line. On Windows, isnady-gui opens the window without a console.

🐧 On Linux, pip may refuse to install

Most current distributions mark the system Python as externally managed (PEP 668), so a plain pip install stops with error: externally-managed-environment. Two ways around it:

# Isolated — recommended, no system packages touched
pipx install isnady

# Into your user site — needs the override flag
pip install isnady --break-system-packages --no-cache-dir -U

Something not right?

iy doctor lists every copy of isnady on the computer and which one each command really starts — an older copy in the user folder can hide a newer one — and iy doctor --fix removes the extras. The same report is under Help → Check Installation. If an old copy starts even for iy doctor, run python3 -s -m isnady doctor --fix (Windows: py -s -m isnady doctor --fix).

Upgrading

pip install -U isnady --no-cache-dir

Your data stays where it is; a newer isnady upgrades the database in place the first time it opens it.


🚀 Quick Start

isnady ships without hadith data: you choose the sources. One command brings in Sahih al-Bukhari and Sunan Abi Dawud in Arabic and Turkish from the open fawazahmed0/hadith-api collection (public domain):

iy import fawazahmed0 https://cdn.jsdelivr.net/gh/fawazahmed0/hadith-api@1/editions.json \
   --book bukhari --book abudawud --language ara --language tur --license Unlicense

Or open the window with iy and choose File → Data Sources: every built-in collection (al-Bukhari, Muslim, Abu Dawud, al-Tirmidhi, al-Nasa'i, Ibn Maja, the Muwatta and three forty-hadith books) and the Taqrib import with one click — or Import all — in the languages you tick. You can add your own files or links there too, and move the data folder anywhere you like.

On the command line:

iy search النيات            # Arabic, with or without diacritics
iy search "niyetlere göre"   # Turkish, English, any imported language
iy chain bukhari 1           # one chain, narrator by narrator

Importing takes a minute or two; the search index and the chains are built as part of it.

To identify the narrators in those chains, add Ibn Hajar's Taqrib al-Tahdhib — 8,824 narrators with his verdict on each — from the OpenITI corpus:

iy import taqrib https://raw.githubusercontent.com/OpenITI/0875AH/master/data/0852IbnHajarCasqalani/0852IbnHajarCasqalani.TaqribTahdhib/0852IbnHajarCasqalani.TaqribTahdhib.JK000121-ara1.completed
iy narrator الزهري

Arabic without diacritics الاعمال finds الأَعْمَالُ. Alef forms, alef maqsura, hamza seats and ta marbuta are treated alike, so you type the way you normally write
Attached prefixes النيات finds بالنيات, because Arabic joins bi-, wa-, fa- and al- to the word. Whole words only turns this off
Latin-script text Case and accents are ignored: NIYET, niyet and nîyet are one word; Muʿādh, Mu'adh and Muadh too
Match All words, any word, or the exact phrase
Filters Book and language; the language filter also chooses which translations appear
Grades Shown under each hadith with the scholar's name, exactly as given
Highlighting On the original, diacritised text, diacritics included

Results appear at once and fill in as you read; the window never waits for them.


🔗 Chains of transmission

Every Arabic text is read for its chain:

Sahih al Bukhari 1
   1. حدثنا (narrated to us)  الْحُمَيْدِيُّ عَبْدُ اللَّهِ بْنُ الزُّبَيْرِ
   2. حدثنا (narrated to us)  سُفْيَانُ
   3. حدثنا (narrated to us)  يَحْيَى بْنُ سَعِيدٍ الْأَنْصَارِيُّ
   4. أخبرني (informed me)    مُحَمَّدُ بْنُ إِبْرَاهِيمَ التَّيْمِيُّ
   5. سمع (heard)            عَلْقَمَةَ بْنَ وَقَّاصٍ اللَّيْثِيَّ
   6. سمعت (I heard)          عُمَرَ بْنَ الْخَطَّابِ
      -> the Prophet

In the window, each result shows its chain as a row of names ending at the Prophet, and View chain opens it as a timeline from the book to the Prophet, with the Arabic text below: the chain in lighter ink, the text of the hadith in full ink.

👤 Who each narrator is

With Ibn Hajar's Taqrib al-Tahdhib imported, every name in a chain is matched to a narrator, and the chain shows what Ibn Hajar says of him: his verdict in his own words, its rank on Ibn Hajar's twelve-step scale, the narrator's tabaqa (generation) and his death year.

A name is linked only when the evidence leaves one person: the words of the name, the book marks (a narrator in al-Bukhari must be one Ibn Hajar marks خ), the order of generations along the chain, and the last link before the Prophet being a Companion. When several narrators remain — "Sufyan" can be al-Thawri or Ibn 'Uyayna — the chain says so and names how many, rather than choosing one. Today about half of all names are identified; in blind, hand-checked samples of the identified ones, the last fifty were all correct.

Names are kept exactly as written, with the clarifications the compilers added ("— yaʿnī Ibn Muḥammad —", "mawlā Ibn ʿAbbās"), because identifying each narrator is a separate step that comes next.

📊 How well it reads today

Measured on Sahih al-Bukhari and Sunan Abi Dawud (12,852 chains):

Bukhari Abu Dawud Both
Split into narrators 85.5% 71.9% 79.9%
Of those, reaching the Prophet 78.3%
Narrators per chain 5.0

In a blind, hand-checked sample of 30 chains: no wrong narrator, 27 complete.

The rest are kept whole, each with its reason: tahwil (ح, a second chain joining), two teachers at one link (qiran), a second chain after the first, or wording that could not be read with confidence. Abu Dawud uses qiran and tahwil far more often than Bukhari, which is why its share is lower. One known limit: a last narrator introduced only by qāla ("قال قال عبد الله") is not added, because the same words also begin stories.


🎓 Educational by Design

isnady teaches the science it uses. Every transmission term in a chain explains itself:

Term Reads What the critics took it to mean
حدثنا narrated to us The teacher recited it to a group: heard directly
حدثني narrated to me Recited to the narrator alone: heard directly
أخبرنا informed us Often a text read back to the teacher (ʿarḍ)
أنبأنا told us Later often transmission by permission (ijāza)
سمعت I heard Direct hearing, stated explicitly
قرأت على I read to The narrator read the text back to the teacher
عن from Does not say how it was received (ʿanʿana); connected when the two could have met and the narrator is not known for tadlīs
أن that Treated by most critics like ʿan (muʾannan)

The Learn section — hadith terminology, grading, jarḥ wa taʿdīl and the classical works, each shown on real hadith and real chains — is on the roadmap.


🎨 Appearance

Every script has its own reading font, size, colour and line spacing — Arabic, Latin, Cyrillic, Bengali and Tamil today, more as sources in other scripts arrive. The light and the dark theme each keep their own colours, and the interface font can be changed too. Edit → Preferences (Ctrl + ,) applies every change at once; each row has its own Default button.

Preferences — font, size, line spacing and colour for each script

The same settings from the command line:

iy config list --prefix text.arabic       # what is set, and what is changed
iy config set text.arabic.size 22
iy config set text.latin.family "Noto Serif"
iy config set colors.dark.gilt "#5A4A1E"  # matched words in the dark theme
iy config reset text.arabic               # back to the defaults

Settings live in settings.json in the isnady data folder, shared by the window and the command line.


📚 Data and licences

isnady reads open formats and keeps the source of everything:

  • Supported now: the fawazahmed0/hadith-api JSON format, from a file or a URL, with or without authentication (username and password, bearer token, or API key; credentials are never stored).
  • Rijal: Ibn Hajar's Taqrib al-Tahdhib in OpenITI mARkdown — each narrator's name, kunya, verdict, rank, tabaqa, death year and book marks, read by the rules Ibn Hajar sets out in his own introduction. The OpenITI release does not state its licence in the repository, so it is kept as tier C (used on your computer, never redistributed) until it is confirmed.
  • Coming: CSV, SQL/SQLite, OpenITI mARkdown, REST APIs and Shamela, so any collection you have can be brought in.

Every source records a licence tier: A may be redistributed, B may be redistributed under its conditions, C may not. Sources you add yourself stay on your computer. Help → Licences lists every source in your database with its licence.


⌨️ CLI

Everything the window does also works without it — on a server, over SSH, or in a script. The command line never loads Qt.

Short Full What it does
iy isnady Open the window
iy search WORDS isnady search WORDS Search; --mode all|any|phrase, --whole-words, --book, --language, --limit
iy chain BOOK NUMBER isnady chain bukhari 1 One chain, narrator by narrator, with who each one is; --raw adds the wording
iy isnads isnady isnads Read every chain and report per book; --rebuild reads them again
iy narrator NAME isnady narrator الزهري A narrator: Ibn Hajar's verdict and rank, tabaqa, death year, books, other names
iy import FORMAT FILE-OR-URL isnady import … Import a source; --book, --language, --license, --user, --token-env, --api-key-env
iy catalog list isnady catalog list Built-in sources and your own, with what is imported — the same as File → Data Sources
iy catalog import ID isnady catalog import fawaz-muslim --language tur Import a listed source; remove, add, delete manage the list
iy catalog import --all isnady catalog import --all --language ara Every built-in source at once
iy datadir [FOLDER] isnady datadir /data/isnady Show or change where the database and settings live; --as-is, --default
iy formats isnady formats Formats that can be imported
iy sources isnady sources Imported sources, their licence and tier
iy stats isnady stats Hadith, texts, grades and chains per book
iy remove KEY isnady remove KEY Remove a source and everything imported from it
iy config list|get|set|reset isnady config … Appearance and other settings — the same as Edit → Preferences
iy doctor isnady doctor --fix Every copy of isnady on this computer; --fix removes the extras
iy -V isnady -V Show the version (also -v, --version, version)
iy -h isnady -h Show help
$ iy search niyet --book abudawud --limit 1
43 hadith found in 8 ms

Sunan Abu Dawud #472
  grades: Al-Albani: Hasan; Muhammad Muhyi Al-Din Abdul Hamid: Hasan; Shuaib Al Arnaut: Daif; Zubair Ali Zai: Daif
  [Turkish] Ebu Hureyre (r.a.); Resulullah (Sallallahu aleyhi ve Sellem)'in şöyle buyurduğunu rivayet etmiştir: "Bir kimse mescid'e hangi [niyet]le gelirse nasibi ondan ibarettir"

📸 Screenshots

Isnad Chains — the chain of Sahih al-Bukhari 1 as a timeline from the book to the Prophet

Search — Sunan Abi Dawud with each scholar's grade and the chain above the text

Dark theme — a seven-narrator chain from Sunan Abi Dawud

Chains overview — per-book statistics and what was kept whole


🗺️ Roadmap

  • Narrators — the other half of the names identified through teachers and students (al-Mizzi's Tahdhib al-Kamal), a page for every narrator, the verdicts of other critics beside Ibn Hajar's, and whether each link could have met the next.
  • Hadith scholars — lives, books, teachers and students, and what their collections contain.
  • Shia rijal — narrator verdicts from the Shia rijal works, beside the Sunni view.
  • Learn — the sciences of hadith, shown on real hadith and real chains.
  • More sources and formats — and adding your own from inside the window.
  • Glossary — every Arabic term of hadith and the Islamic sciences explained where it appears: hover or click a term, read its meaning in the interface language.
  • isnady.net — the same engine on the web.

🏗️ Build from Source

git clone https://github.com/bayramkotan/isnady.git
cd isnady
pip install -e .
iy

Python 3.10 or newer and PySide6. The command line alone needs no PySide6.


📝 License

MIT for the application code. Hadith data comes from separate sources, each under its own licence, recorded with the data and listed under Help → Licences.

The Arabic and reading typeface is Amiri by Khaled Hosny, bundled under the SIL Open Font License 1.1 (src/isnady/assets/fonts/OFL.txt).

Metadata

Release files for isnady 0.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for isnady 0.0.7
File Size Uploaded
isnady-0.0.7.tar.gz 510.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for isnady 0.0.7
File Interpreter ABI Platform
isnady-0.0.7-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / isnady-0.0.7.tar.gz

Download URL isnady-0.0.7.tar.gz
Size 510.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a298976f4a898b55c5d7c617814b017add0b17584f070f95744548d90dd4ca27
BLAKE2b-256 checksum
How to use checksums
c5944dc8c80d992e749b963752daec2c600a7cdcf0aa9bde0ba7dd0517c2276a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / isnady-0.0.7-py3-none-any.whl

Download URL isnady-0.0.7-py3-none-any.whl
Size 527.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd40a2fcca398e436453e05ad03b0204cc759890971edcff5a804106c6f4df1a
BLAKE2b-256 checksum
How to use checksums
1865c8b7ec0818de9d271c5e5ec9fd54d520fb76ce30d432057cb10ca2c3e9ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.9

2 release files

0.0.8

2 release files

This release

0.0.7 This release

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page