This is meant to be an evolving list of personal software projects that I’ve worked on and made available online in some form. I link to a handful of these directly from my homepage, but I think it will be more realistic to keep track of things in a blog post that can be updated without fuss.
Items are placed in alphabetical order.
- abjadcalc.com: A simple tool to calculate the numerical abjad value of a string of Arabic or Persian text. Unlike most of what I’ve developed, this seems to have a substantial number of users. I occasionally get email feedback from strangers, and fellow researchers have told me that they started using this utility before knowing that I was behind it. I have a few updates planned, but not yet the time to implement them. (GitHub repo)
- allsorts: A little web app that serves as a demonstration of feruca, my Rust implementation of the Unicode Collation Algorithm (also linked below). You can input a list of words and have them sorted, with a few different settings available. What’s useful about Unicode collation is that, for example, a name like Élodie is sorted correctly before a name like Frank—whereas, in naïve text sorting based on the byte values of the characters, any accented letter will sort after all unaccented letters. i.e., É will come after Z, which can be confusing. It’s important to be able to collate texts in a way that is Unicode-aware. Many implementations of the Unicode Collation Algorithm have been written, but mine does have certain unique features. I added “tailorings” that change the sorting relationship between the Latin and Arabic scripts. You can also play with those options in the demo app. (GitHub repo)
- arabic-font-tests: A page that allows for testing the performance of a number of Arabic-script Google Fonts. I have often found that what I want from a web font for Arabic or Persian—for example, robust support for diacritics—is frustratingly difficult to come by. There are lots of interesting display fonts out there nowadays, but if you need something really strong for general usage? Good luck. For a long time, I’ve relied on Scheherazade from SIL, and that’s still my favorite. In my review of other fonts available through Google’s service, I was particularly impressed by Markazi Text. Anyway, it may be that the test cases I developed will be of use to someone else. (GitHub repo)
- arabic-numbers: A little tool that allows you to choose a number between 1 and 100 (inclusive), then set the desired gender and case of a hypothetical counted noun in Arabic, and be presented with the correct form of the number and noun written out in words. Arabic numbers are famously complicated; this tool can help! (GitHub repo)
- bast: An indicator of my current state of mind with two options, qabz (closed, tight, depressed) and bast (open, optimistic). These terms are drawn from the Sufi tradition, where travelers on the path to union with God would go through alternating periods in which they felt that they were, or were not, making progress. I structured this project so that the front-end page is called bast, while the back-end service is qabz. I can send a simple POST request to the server to switch between the two states. (GitHub repo)
- charpick: A brutally simple character picker, with which you can copy any of a range of characters commonly used in the romanization of Arabic, Persian, and Turkish. If I’ve missed one, let me know, and I’ll probably be happy to add it. (GitHub repo)
- doomsday: The Doomsday algorithm is a way of determining the day of the week associated with a given date. For each year, one of the days of the week will be “Doomsday.” Once you have that figured out, you can use a few simple mnemonics to calculate the weekday for any date in the year in question. I just built a tool to make the process easier, and to remind myself of the rules. (GitHub repo)
- dorufin: A page that plays Kingo Hamada’s song “Machi No Dorufin,” starting the music so that the key moment hits at exactly midnight. (The GitHub repo is private, for reasons that should be obvious.)
- dozenal-time: A page that shows the current dozenal time, albeit in an unusual manner. The idea is to use a progress bar for each time unit, to produce a visualization that may be more intuitive than the typical dozenal clock. The top progress bar runs from midnight to midnight, i.e., the full twenty-four hours. The next unit in dozenal time reflects a “phase of day,” equivalent to two hours in conventional timekeeping. Next comes a unit that I compare to a coffee break, equivalent to ten conventional minutes. Finally, there is the “dozenal minute,” equivalent to fifty conventional seconds. With the progress bars representing the movement of these units, one can get a sense of how a dozenal time value corresponds to a point in the day. (GitHub repo)
- feruca: A simple but relatively performant implementation of the Unicode Collation Algorithm, in safe Rust. This is a project that I took on partly as a programming challenge, and more importantly because I wanted to be able to experiment with the relationship between the Latin and Arabic scripts in Unicode collation. For an idea of how this works, you can check out the demo web app that I made, called allsorts—which is listed above. (GitHub repo)
- ganjoor-pretty: This service allows you to take the URL of any ghazal on Ganjoor, replace
.net
with.fly.dev
, and get a nicely formatted version of the poem. I always liked the way that ghazals are conventionally written in manuscripts and typeset in printed divans: in two columns of equal width, with the final distich instead stacked vertically in a centered column of its own. This is simple enough to implement on a webpage with CSS, except for justifying the text to fill the columns. The proper way to handle that in the Arabic script is by using kashida, i.e., lengthening sections of the baseline between connected letters so that the overall line grows to the desired length. But automated kashida for justification is not available on the web, so we must resort to simply adding space between words. The problem there is that different Persian poems, depending on meter and other factors, have widely varying hemistich lengths. If we set our CSS to accommodate a long line in a long meter, then justify by adding however much space is necessary, the result will look pretty bad most of the time. I eventually found a workaround for this. My script scans the text of a given poem, finds the longest hemistich, and sets the column width to that length (plus a bit of breathing room). I’ve been pleased with it. If you ever want to print out a poem from Ganjoor, or to grab a screenshot, you may find this helpful. (GitHub repo) - german-declension: A game to practice adding the correct articles and suffixes to German noun-adjective pairs. You generate a problem, and it will prompt you with, for example, the adjective “spät” and the noun “Wort,” to be set in the genitive case with a definite article. In this example, you would need to enter the article “des,” the suffix “-en” on the adjective, and the suffix “-es” on the noun. I used this to practice German declension in my first year or two in Berlin. (GitHub repo)
- Kalīla Reader: A static web app that facilitates comparative reading of the fables of Kalīla and Dimna across dozens of versions in almost as many languages. I built this as part of my work for the AnonymClassic project at the Freie Universität Berlin, where I was a postdoc. It remains one of my most substantial and most-used digital humanities tools. If you have any interest in any part of Kalīla and Dimna as a phenomenon in world literature, I think you’ll like this. (The GitHub repo is private, for reasons that should be obvious.)
- kam-sala: Intended strictly for amusement, this tool lets you “encrypt” a string of Arabic-script text by using a simple substitution cipher that was common in the Persianate world in (at least) the late medieval and early modern periods. Please never rely on security through obscurity! My curiosity about this cipher began when I saw mention of it in a Persian treatise on calligraphy from the tenth/sixteenth century. (GitHub repo)
- meters: A convenient online version of Wheeler Thackston’s list of the Persian poetic meters, which he included in the introduction to his textbook, A Millennium of Classical Persian Poetry. Thackston ordered the meters according to syllable length, from short to long, which I always found helpful when trying to scan a poem. I kept that ordering, while adding a few new features, including links to example poems for some of the meters. (GitHub repo)
- muqawwim.com: A calendar conversion utility tailored to the needs of historians of the premodern Near East. I adapted the core of this from work by John Walker, and have refined and added to it over time. As someone who studies (inter alia) Safavid historical texts, I’m particularly glad to have an easy way of checking the “animal year” associated with a given date in the Islamic calendar. This tool, like my abjad calculator, has found a community of users—or so I’m told. (GitHub repo)
- persian-meter: A little Rust program that attempts to detect the meter of a classical Persian poem. This remains in an incomplete state. It was mainly something that I worked on when I was at the beginning of my quest to learn Rust programming. (GitHub repo)
- read.akvan.dev: A site that allows the Persian text of Firdawsī’s Shāhnāma, in the scholarly edition of Khaleghi-Motlagh et al., to be read side-by-side with the English translation by Dick Davis—as well as Jerome Clinton’s translation, in the case of the story of Rustam and Suhrāb. (Description to be expanded) (The GitHub repo is private, for reasons that should be obvious.)
- reed-archive: During grad school, in my exploration of leftist thought, I got into the writing of Adolph Reed. I found that a few of his classic essays are not as easily accessible online as one might imagine. (Depending on the publication, there is also an issue where some of his works could have benefited from more/better copy editing…) Anyway, I started keeping my own copies of Reed’s essays, and eventually I put a handful of them online—on a site that I don’t share widely. If I think that a friend might be interested in one of the pieces, I can send a link. I haven’t updated this collection in some time, and I’m not sure what I’ll do with it over the long term. (GitHub repo)
- rmnz: A page that shows dozens of examples of how Persian words should be romanized according to several standards, including those of the DMG, Encyclopædia Iranica, IJMES, Iranian Studies, and the Library of Congress. There is a search function that allows you to filter the examples, if you’re wondering about a certain consonant or vowel. Note also the links in the header row: I host PDF copies of the different standards themselves. (GitHub repo)
- rustam-suhrab: A page that presents the Persian text of the story of Rustam and Suhrāb from the Shāhnāma, properly digitized from the scholarly edition of Khaleghi-Motlagh et al. This is a work in progress; I’m almost halfway through transcribing/encoding the text. (Description to be expanded) (GitHub repo)
- scour: It drives me nuts when I have to copy text from a source that I don’t control—e.g., bibliographical data from a library catalog entry—and paste it into a document that I’m writing, and I end up with some mess. Over the years, I got used to pasting first into a buffer that would reduce everything to plain text and thereby limit problems. My go-to was TextEdit on macOS. I later developed this little utility, which runs in the browser and offers a few more quality-of-life features, such as eliminating extra whitespace. I don’t know if anyone else will ever use it, but I turn to it on an almost daily basis. (GitHub repo)
- shahnama-transcription: One of my most ambitious undertakings, this is an app that allows for the text of the Khaleghi-Motlagh edition of the Shāhnāma to be transcribed and saved in a database. Each row in the database maps to a line in the text. The two hemistichs of a line of poetry are treated as separate but linked units, and there are other columns to record metadata, e.g. line numbering. It would take a very long time to encode the whole Shāhnāma—though a group of contributors could get through it eventually. I’m starting with the story of Rustam and Suhrāb (also listed above), which is only about a thousand lines. (GitHub repo)
- sidi-ali: An online version of the Mir’atü’l-Memalik, the classic travelogue of the Turkish Admiral Sidi Ali Reïs, describing his passage through India, Afghanistan, Central Asia, and Persia in 1553–56 CE. This is basically a mirror of part of Fran Pritchett’s site, though I also cleaned up the text somewhat. (Description to be expanded) (GitHub repo)
- Steingass: My online version of Steingass’ Persian-English dictionary, representing a significant improvement over the version hosted by the Digital Dictionaries of South Asia project at the University of Chicago. I put a lot of work into this and use it all the time! (Description to be expanded) (GitHub repo)