All Articles

1091 articles in total

🗺️World Historical Gazetteer: The Linked Places Format Standard That Connects Historical Data

World Historical Gazetteer, a platform that links place names that change over time and interconnects historical data from around the world. This article explains its core data format, Linked Places Format (GeoJSON-T), and its mechanism for reconciling with Wikidata/GeoNames, focusing on the technical perspective.

digitalhumanitiesgislinkeddatahistory

🏛️Stanford ORBIS: A Network Model That Computes Travel in the Ancient Roman World by 'Time and Cost'

Stanford ORBIS models the transportation network of the ancient Roman Empire as a network and computes travel between two points in terms of "time, cost, and distance." This article focuses on the technical perspective, explaining how routing works and the sea-route model that incorporates seasonal winds.

digitalhumanitiesgishistorydatavisualization

✉️Sailing Letters: Building a Corpus of Captured-Ship Letters via Diplomatic Transcription

Dutch letters, seized from ships captured in war and left dormant in a British archive. This explains the Sailing Letters / Brieven als Buit project, which turned them into a language corpus with diplomatic transcription and detailed metadata, focusing on the technical aspects of data construction.

digitalhumanitiesdigitalarchiveshistorylinguistics

🇮🇹The Venice Time Machine: The Technology for Reading 1,000 Years of Historical Documents with AI, and Its Lessons

The Venice Time Machine tried to machine-read the public records of the Republic of Venice and build a "Big Data of the Past." This article explains, from a mainly technical viewpoint, its technical pipeline of scanning, handwritten text recognition, and graph building, along with the data-quality problems that surfaced in 2019.

digitalhumanitiesdigitalarchivesmachinelearninghistory

Scripting Tropy 1.18 — Project files, HTTP API, and an upstream PR

Tropy 1.18.0-beta.1's project files (.tpy / .tropy) are SQLite databases, and the desktop app embeds an HTTP API. A walk-through of driving both from Node scripts, the side findings, and the PR / issue we sent upstream.

tropysqliteelectronhttp-api

Implementing an LLM Router Agent-Based RAG: An 8-Tool Design and 5 Traps Hit on Cloudflare Workers + Azure OpenAI

A record of adding a Router Agent — in which the LLM looks at the question and automatically picks the right tool — to a vector-search RAG over a corpus of classical documents in TEI/XML. It covers the design of the 8-tool setup, the complementarity of structured data and vector search, and the 5 traps hit during implementation (Cloudflare Workers' 3 MiB limit, the Azure OpenAI URL pattern, a blind spot in JSON_CONTAINS, the multi-turn problem with reasoning models, and the TPM bottleneck).

ragllmagenttool-calling

🖼️Validating IIIF Presentation 3.0 Manifests with iiif-prezi3 — Compared with the Official Validator

Validating IIIF Presentation API 3.0 manifests using both the official presentation-validator and the Python library iiif-prezi3, with a side-by-side comparison of their output and intended use.

iiifpythonjson

🎞️Updating the Layer Slideshow Plugin for Mirador 4

I updated the layer slideshow plugin, originally published for Mirador 3, to support Mirador 4. This involved migrating the build from nwb to Vite and replacing Material-UI v4 with MUI v7.

miradoriiifplugindigitalarchives

🎬Annotating IIIF Video — A Mirador Annotation Editor Video Hands-on

A hands-on guide to Mirador Annotation Editor Video, a Mirador 4 plugin for adding both spatial and temporal annotations to IIIF video, covering how to set a temporal target, using the official demo.

miradoriiifannotationvideo

✏️Annotating IIIF Images — A Mirador Annotation Editor Hands-on

A hands-on guide to Mirador Annotation Editor, a plugin that adds annotation creation and editing to the Mirador 4 IIIF image viewer, from creating an annotation to exporting it, using the official demo.

miradoriiifannotationwebannotation

🧩ODD, XSLT, and Processing Model in TEI — Sorting Out the Three Layers: Schema Definition, Transformation, and Rendering Declarations

A minimal-example walkthrough of the three concepts that come up when working with TEI/XML — ODD, XSLT, and Processing Model — organized by their distinct roles: schema definition, transformation, and rendering declarations. Aimed at readers new to TEI.

teixmlxsltodd

📚How Calil's Cross-Library Search Works: Staged Result Retrieval with search and polling

A record of reading the open-source unitrad-ui code to understand how Calil's library cross-search retrieves results in stages through search and polling.

apijavascriptpollinglibrary

🖼️Reading Digital Historical Sources with IIIF and Web Annotation — An IMMARKUS Hands-on

A hands-on guide to IMMARKUS, an open-source tool for adding semantic annotations to IIIF images in W3C Web Annotation format, from first launch to standards-based export, using the Hyakki Yagyo scroll from the University of Tokyo Digital Archive.

immarkusiiifwebannotationdigitalarchives

📄From DOCX to TEI/XML — TEI Tools, Right in Your Browser

A hands-on look at TEI Tools, a browser-only tool for converting Word documents to TEI/XML and for visualizing TEI/XML files, using the bundled sample files.

teixmldocxdigitalhumanities

🌐Review Passed but the App Isn't on the App Store — Setting App Availability After the Fact via the App Store Connect API

TEI Scanner, which I had submitted to the Mac App Store, passed review but never appeared on the App Store — instead showing 'removed from sale'. The cause: App Availability had never been set. This is a record of diagnosing the symptom with the App Store Connect API and setting availability after the fact via the v2 appAvailabilities endpoint.

macosappstoreconnectapimac-app-store

📚DH Weekly Topics — 2026年5月17日週

DH Weekly Topics — 2026年5月17日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

🛒Submitting a macOS App to the Mac App Store — App Store Connect API Steps and the Diffs from iOS

A record of submitting TEI Scanner — the macOS app whose Developer ID distribution I covered earlier — to the Mac App Store and getting it through review. The focus is on the diffs from the iOS submission flow: .pkg upload via the App Store Connect API, enabling App Sandbox, APP_DESKTOP screenshots, and filter[platform]=MAC_OS.

macosswiftappstoreconnectapi

Dependabot Cooldown and GitHub Actions SHA Pinning — Supply Chain Defense for a Personal Blog

A Dependabot alert was the trigger to revisit the repository's automation: not just patching known CVEs, but also defending against maintainer-takeover supply chain attacks. This post bundles cooldown, Actions SHA pinning, npm overrides, ignore-scripts, and security-only auto-merge into one walkthrough.

securitysupply-chaindependabotgithub-actions

🔐Avoiding Plaintext in ~/.aws/credentials — Managing IAM User Keys with aws-vault and the macOS Keychain

Avoiding plaintext management of ~/.aws/credentials using aws-vault and the macOS Keychain in environments where IAM Identity Center (SSO) is not adopted, with an assessment of how practical the approach is.

awssecurityaws-vaultiam

🗺️Notes on Optimizing Delivery of Gigapixel-Class High-Resolution Images with Serverless IIIF

A record of the adjustments made — across encoding, Lambda, CloudFront, and S3 metadata — when delivering a gigapixel-class high-resolution image (a PTIF of roughly 450MB) via Serverless IIIF on AWS Lambda.

iiifserverless-iiifaws-lambdacloudfront