All Articles

1091 articles in total

🗂️Characterizing a Set of Files by Running Brunnhilde on macOS (Format Identification with Siegfried)

A record of installing Brunnhilde — which characterizes sets of born-digital / digitized files — on macOS (Apple Silicon), through to producing a PRONOM format-identification report via Siegfried.

brunnhildesiegfriedmacosデジタルアーカイブ

🦠Verifying ClamAV on macOS, and How an EICAR Test File Gets Quarantined by Resident Antivirus

A record of verifying ClamAV — used in a digital archive SIP-creation workflow — on macOS (Apple Silicon), where an EICAR test file vanished the moment it reached the disk, and isolating the cause. It turned out to be the on-access scan of resident antivirus, not XProtect.

clamavmacoshomebrewセキュリティ

🗂️When You Rearrange Backlog Files into Folders and Bundle Them into One SIP in Archivematica, Where Are the Original and Rearranged Structures Recorded?

Using real data, this organizes where the original structure and the rearranged structure are recorded in the SIP/AIP when you fold backlog files into folders via arrange and bundle them into a single SIP.

archivematicametspremisdigitalarchive

📥DataAccessioner: A Tool That Fixes Checksums and Technical Metadata at Accessioning Time

DataAccessioner is a desktop tool that, at the accessioning stage, captures MD5 and technical metadata via FITS to fix file identity before arrangement.

archivematicadigitalarchivepremisfits

🗃Appraisal via Archivematica's Backlog, and the Appraisal Tab Removed in the Development Version

Testing Archivematica's Backlog and Appraisal features. A record of confirming on real hardware: the story behind the Appraisal tab removed in the development version, appraisal via Backlog search, and the mechanism by which the original state is preserved in the METS even when you change the structure through arrangement.

archivematicadigitalarchivedockerplaywright

📚DH Weekly Topics — 2026年6月21日週

DH Weekly Topics — 2026年6月21日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

🌐Adding i18n to an Entire OSS React App: react-i18next Setup, Japanese Localization, Testing, and Splitting the Work into PRs

A hands-on record of retrofitting i18n onto a mature OSS React app with react-i18next: Japanese localization, plurals, testing (vitest/Playwright), splitting the work into per-page PRs, and lazy-loading locales.

reacti18nextplaywrightoss

📦Turning Digital Archive SIP Creation into a Native macOS App — A Record of Development, Signing, and Release

A record of implementing a native macOS app that builds SIPs from born-digital/digitized files in Swift instead of the upstream (BitCurator/Linux) tool, then signing, notarizing, and publishing it.

デジタルアーカイブmacosswiftsiegfried

📚DH Weekly Topics — 2026年6月14日週

DH Weekly Topics — 2026年6月14日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

📚DH Weekly Topics — 2026年6月7日週

DH Weekly Topics — 2026年6月7日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

🔍Mirador Carries the Zoom Across Pages — preserveViewport Defaults and the @latest Pitfall

In Mirador, moving to the next page carries the previous page's zoom level and pan position over. That is the behavior of osdConfig.preserveViewport, whose default is true (it lives under osdConfig, not window). It has been true across Mirador 3.3.0 through 4.0.0, while the unreleased main branch has it as false. This post covers what the setting does and where it is controlled in the source, why resetting (false) is more natural when canvas sizes vary per page, and the pitfall of mirador@latest moving the default behavior under you — plus the fix: pin the version and set the option explicitly.

miradoriiifopenseadragonfrontend

🎬Making Technical Explainer Videos in a Clone of My Own Voice — Marp Hand-Drawn Figures, a Recording Teleprompter, ElevenLabs PVC × v3, and Masking Seams with a Lingering Pause

Production know-how for making slide-format technical explainer videos narrated in my own voice, using Marp slides + ElevenLabs Professional Voice Clone (PVC) × v3. It covers roughjs hand-drawn-style figures, a recording teleprompter for clone training, how to mask the 'timbre seams' caused by v3's independent per-chunk generation with a lingering pause, detecting and correcting misreadings, and an operation for proofreading series-wide duplication with multiple agents.

elevenlabsvoicecloningmarproughjs

When a Docker Major Upgrade Took Down the Reverse Proxy (Traefik): An Incident Log

An investigation and recovery log of an outage where running apt-get upgrade bumped the Docker Engine to a new major version, after which the Traefik reverse proxy could no longer talk to the Docker API, and the Drupal site behind it became unreachable. The Docker Engine had raised the minimum supported API version, while Traefik's built-in Docker client kept trying to connect with an older API.

dockertraefikdrupalreverse-proxy

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

DH Weekly Topics — 2026年5月31日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

🗺️Notes from migrating an aggregation- and search-heavy app's data layer from Firestore to Postgres (Neon)

Notes on migrating the data layer of a map-based literary archive app from Firestore to Postgres (Neon) + Drizzle. Covers why we hit read-based billing limits, and how the question of fit looks once you frame it in terms of the workload shape: aggregation, faceting, and full-text search.

firestorepostgresneondrizzle

🔁Pitfalls of redirecting all paths to an external domain with vercel.json

A walkthrough of moving a Next.js (output: 'export') site from Vercel to GitHub Pages and turning the Vercel deployment into a redirect-only surface via vercel.json. Documents five or six attempts that failed for non-obvious reasons (framework detection, output validation, path-to-regexp quirks around trailing slashes) and the final config that actually works.

vercelnextjsgithubpagesredirect

🔍Next.js 16: useRouter().push() silently no-ops in production — pushState workaround

Notes on a Next.js 16 + next-intl app where useRouter().push() silently becomes a no-op only in production builds, breaking interactivity on a search page, and a history.pushState + popstate workaround that restores it.

nextjsnextintlreactdebugging

🔑An Upload-Only, Least-Privilege Key via Bucket Policy on DDN EXAScaler Access S3

A record of preparing an upload-only, least-privilege access key on the S3-compatible DDN EXAScaler Access S3. It covers how the bucket policy format differs from AWS and how to narrow down signature and permission issues.

s3ddnexascalerbucket-policy

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

DH Weekly Topics — 2026年5月24日週

dhweeklydigitalhumanitiesデジタルアーカイブocr

📜Porting Kuzushiji Character Detection and Classical-Japanese OCR to JS/Next.js Without Python — ONNX Quantization and Library Extraction

A record of porting kuzushiji/historical-document character detection (YOLOv11) and NDL's koten-OCR-Lite (RTMDet + PARSeq) to JS/Next.js with onnxruntime-node — no Python. Covers ONNX export, SAHI, line detection, an int8 quantization accuracy comparison, why it is hard to run on Vercel, and extracting the core into a shared library.

kuzushijiocronnxonnxruntime