Building a DOCX to TEI/XML Conversion Tool in the Browser Using the TEI Garage API

Introduction TEI (Text Encoding Initiative) is an international standard for digitally structuring texts in the humanities. It is used in libraries, museums, and academic research, but writing TEI/XML directly requires knowledge of markup, making the barrier to entry high. This is where conversion tools from Microsoft Word (.docx) to TEI/XML come in. A well-known example is TEI Garage (formerly OxGarage), but its multi-purpose nature makes the UI somewhat complex. This time, I created a simple browser-based tool specialized for DOCX to TEI/XML conversion. ...

March 1, 2026 · 4 min · Nakamura

How to Bulk Unpublish Hatena Blog Articles (AtomPub API)

When you want to bulk unpublish old articles after migrating your Hatena Blog articles to another site. Important Note: You Cannot Revert to Draft With the Hatena Blog AtomPub API, you cannot revert published articles back to draft. Sending <app:draft>yes</app:draft> via a PUT request results in a 400 Cannot Change into Draft error. Therefore, there are two approaches: Method 1: Replace the Article Body with “This Article Has Moved” You can rewrite the article’s <content> using the AtomPub API’s PUT method. ...

March 1, 2026 · 2 min · Nakamura

Exporting Web Annotations via the Hypothes.is API and Converting to TEI/XML

Introduction Hypothes.is is an open-source annotation tool that allows you to add highlights and comments on web pages. It can be easily used through browser extensions or JavaScript embedding, but there are cases where you may want to back up accumulated annotations or utilize them in other formats such as TEI/XML. This article introduces how to export annotations using the Hypothes.is API and convert them to TEI/XML. Obtaining an API Key Log in to Hypothes.is Go to Developer settings Generate an API key with “Generate your API token” Save the obtained key in a .env file. ...

February 28, 2026 · 16 min · Nakamura

Trying "oitei" - An Automatic Conversion Tool from OpenITI mARkdown to TEI XML

Introduction In the OpenITI (Open Islamicate Texts Initiative) project, which handles historical texts from the Islamicate world, texts can be tagged using a lightweight notation called mARkdown instead of TEI/XML. While TEI/XML is a powerful international standard for structuring texts, it has problems with right-to-left (RTL) languages like Arabic, where mixing XML tags causes display issues in editors. mARkdown was designed to solve this problem. In this article, we will try running oitei, a Python tool that automatically converts mARkdown texts to TEI XML. ...

February 28, 2026 · 17 min · Nakamura

Operating GakuNin RDM API with Node.js — From Project Creation to GitHub + Vercel Auto-Deploy

Introduction GakuNin RDM is a research data management platform provided by the National Institute of Informatics (NII). It is built on the Open Science Framework (OSF) and allows automation of project operations through its API. In this article, I introduce how to perform the following operations using the GakuNin RDM API from Node.js. Project creation and configuration Wiki creation and updating Adding members GitHub integration + automatic deployment with Vercel Prerequisites Obtaining a Personal Access Token Log in to GakuNin RDM Navigate to Settings > Personal Access Tokens Create a new token (scopes: osf.full_read, osf.full_write) Project Initialization m n n k p p d m m i r i i n n r i s d t t m a - l & y l & d c o d t e r n d v m Save the token in a .env file. ...

February 27, 2026 · 14 min · Nakamura

I Created a Japanese Tutorial for ethers.js v6

Introduction I created a Japanese tutorial for ethers.js, a JavaScript library for Ethereum. https://github.com/nakamura196/ethers-ja-tutorial It is also published as a static site using VitePress. https://nakamura196.github.io/ethers-ja-tutorial/ Background ethers.js is one of the most widely used libraries in Ethereum development. Japanese articles about v6 were mostly focused on migration guides from v5, and there was no systematic tutorial for beginners to learn from scratch. Since the official documentation is only available in English, I created a tutorial that allows learners to study the basics step by step in Japanese. ...

February 25, 2026 · 4 min · Nakamura

Annotorious Drawing Mode Breaks Only in Production Build

Introduction One day, I noticed that annotations could no longer be created at all in a IIIF annotation editor deployed on Vercel. It worked correctly on the local development server, but in the production environment, drawing mode could not be entered. There were no console errors. The UI buttons switched correctly, but dragging on the image did nothing. The cause was an automatic upgrade of Annotorious due to caret (^) specification in package.json, and a state management library migration in v3.7.13 that caused issues with webpack’s production build. ...

February 25, 2026 · 10 min · Nakamura

GakuNin RDM Search API (`/api/v1/search/`) Investigation Memo

Investigation date: 2026-02-24 Target: GakuNin RDM (GRDM) Search API Source code: RCOSDP/RDM-osf.io (website/search/ directory) Developer guide: RCOSDP/RDM-developer-guide Note: Official documentation for the Search API could not be found. This article is an investigation record based on both the actual API behavior and the source code. Overview GakuNin RDM is a fork of OSF (Open Science Framework), and its source code is available on GitHub (RCOSDP/RDM-osf.io). The search functionality implementation is in the website/search/ directory and consists mainly of the following files. ...

February 24, 2026 · 8 min · Nakamura

Bulk Managing Google Groups Members via API Without Google Workspace Admin Privileges

Many organizations regularly rotate Google Groups members. Manual registration and deletion is tedious, so you would want to automate it via API. The Admin SDK (Directory API) is commonly introduced as a method for managing Google Groups members via API. However, the Admin SDK requires Google Workspace admin privileges, limiting the situations where it can be used. This article introduces how to bulk manage Google Groups members using the Cloud Identity Groups API, which can be used even without admin privileges. ...

February 18, 2026 · 14 min · Nakamura

Verifying Non-DC Metadata Registration in Archivematica -- Embedding EAD Using source-metadata.csv

In Archivematica, metadata schemas other than Dublin Core (DC) can be embedded into the AIP’s METS.xml. This guide explains how to include non-DC metadata such as EAD and MODS in a Transfer using source-metadata.csv, and verifies via API that they are correctly stored in the AIP. Table of Contents Background and Purpose How source-metadata.csv Works XML Validation Feature Verification 1: MODS-Only Metadata Registration Verification 2: Simultaneous EAD + MODS Registration Storage Format of Non-DC Metadata in METS.xml Verification 3: Metadata Addition via Reingest Summary Background and Purpose In a standard Archivematica Transfer, Dublin Core metadata described in metadata/metadata.csv is stored as <dmdSec> in METS.xml. However, in actual digital archive operations, there are use cases where metadata schemas other than DC need to be handled: ...

February 17, 2026 · 29 min · Nakamura

Verification of Digital Archive Construction Using the AtoM REST API

Introduction AtoM (Access to Memory) is an open-source web application for archive institutions. It is used by libraries, archives, and museums worldwide to manage archival descriptions. AtoM operations are typically performed through the Web UI, but using the REST API enables integration with external systems and batch processing. In this article, we walk through the API following a realistic business scenario, confirming the results in the Web UI. For details on the API plugin development history and implementation, see the separate article Developing a Plugin to Extend AtoM’s REST API. ...

February 15, 2026 · 16 min · Nakamura

Developing a Plugin to Extend the AtoM REST API

Introduction AtoM (Access to Memory) is an open-source web application for archival institutions. It provides descriptive management functionality compliant with international standards such as ISAD(G), ISAAR(CPF), and ISDF, and is used by libraries, archives, and museums worldwide. AtoM ships with a standard REST API plugin called arRestApiPlugin, but it has the following limitations: Primarily centered on CRUD for information objects (archival descriptions), with limited coverage No API for Repositories, Authority records (Actors), or Accessions No API for Taxonomy (classification vocabulary) operations The Digital object upload API is not practical No API for Function descriptions This does not meet business needs such as integration with external systems or batch registration through automated processing. ...

February 15, 2026 · 19 min · Nakamura

Starting Alfresco with Docker and Experiencing the Records Management Lifecycle via REST API

Overview In this article, we will start Alfresco Governance Services Community Edition (hereinafter AGS) latest version (25.3.0) with Docker and experience the entire records management lifecycle using the REST API. Specifically, we assume the following business scenario. Scenario: Contract Management The business department creates and registers a contract The records manager declares it as a record and classifies it in the file plan Set up a Retention Schedule After contract termination, execute cutoff (active to inactive) After the retention period (3 years) elapses, dispose of the record If litigation arises, suspend disposal using a hold (freeze) Based on the previous article, this article introduces the setup procedure and API usage for the latest version. ...

February 15, 2026 · 257 min · Nakamura

Development of a Text Comparison Tool Using IIIF Manifests

Introduction As digitization of classical texts progresses, there is a growing need to compare and analyze texts from different manuscripts and critical editions. This article introduces “Text Comparison Tool,” a web application that leverages IIIF (International Image Interoperability Framework) manifests to display and compare images and text from two materials side by side. Demo site: https://iiif-text.vercel.app/ Background and Challenges Classical texts published in digital archives sometimes have text annotations attached to their IIIF manifests. However, there are few convenient tools for comparing the text of two materials side by side. ...

February 13, 2026 · 5 min · Nakamura

Improved the Drupal GitHub Webhook Module

I improved the custom module “GitHub Webhook” that triggers GitHub Actions from the Drupal admin panel. https://github.com/nakamura196/Drupal-module-github_webhook Originally a basic module with multi-repository support, I added features including UI tab separation, permission granularity, workflow status display, and auto-triggering. Module Before Improvements The original module had the following structure: File count: 5 files (info.yml, routing.yml, links.menu.yml, permissions.yml, SettingsForm.php) Supported versions: Drupal 10 only Repositories: Multi-repository support (dynamic add/remove with AJAX) Screen: Settings and trigger on the same screen (2 accordions) Permissions: Only 1 permission access github webhook settings (same permission for both settings and trigger) Token management: #default_value set on password field (token output in plaintext in HTML source) HTTP client: Direct instantiation of new \GuzzleHttp\Client() Exception class: Written in catch block without use statement (incorrect namespace resolution) $ ] f ; o ' ' ' B r # # # e m t t d f [ y i e o ' p t f r s e l a e e ' e u : t ' l t = t T i > = _ o n > v k g ' a e s p $ l n ' a t u ] s h e w [ s i ' a ' w s s g o - = i r > > s t d t e h ' ( $ t u , ' c b G o i _ i n n t t f o H i # k u g d e b - e n > f ' T g a ] o e u k t l = e ( t n ' _ [ ' g v ) i a , t l h u u e b _ t o k e n ' ) , O u t p u t i n p l a i n t e x t i n H T M L $ c l B i e e f n o t r e = : n G e u w z z \ l G e u z c z l l i e e H n t t t p w \ a C s l i d e i n r t e ( c ) t ; l y i n s t a n t i a t e d w i t h n e w Overview of Changes Comparison of file structure before and after improvements. * indicates modified, + indicates newly added. ...

February 11, 2026 · 53 min · Nakamura

Bulk Deleting Unnecessary Sites Using Netlify CLI

I had accumulated a large number of Netlify sites, so here is a summary of the steps I took to bulk delete them using the CLI. Background The number of Netlify sites created during development and testing had grown to 41. Since only a few sites were currently in use, I decided to delete the old sites in bulk. Environment macOS Node.js netlify-cli v23.15.1 Steps 1. Install Netlify CLI n p m i n s t a l l - g n e t l i f y - c l i 2. Login n e t l i f y l o g i n A browser will open and display the Netlify authentication screen. After authorizing, the token will be saved to the CLI. ...

February 10, 2026 · 7 min · Nakamura

Performing Module Updates and Core Upgrades from the Drupal 10 Admin Interface

This article summarizes the steps for setting up Backup and Migrate for backups and Automatic Updates for automatic module and core updates on Drupal 10.6.1 running on a shared server. Current Status Check Checking “Reports > Status report” in the admin interface revealed three warnings: Drupal core update status: Out of date (version 10.6.3 available) PHP APCu available caching: Memory usage exceeds 75% Module and theme update status: Out of date ...

February 10, 2026 · 6 min · Nakamura

Replacing Only the Window Title of External Manifests in Mirador 4

Background Mirador is an IIIF-compatible image viewer that allows side-by-side comparison of multiple IIIF manifests. When displaying manifests published by multiple institutions in a single view, each window title shows the manifest’s label as-is. However, there are cases where you want to display a custom name as the window title for your own project. For example, when the manifest’s label is a long string containing individual volume information, but you want to display a short name indicating the collection. ...

February 8, 2026 · 15 min · Nakamura

Cause and Fix for `localStorage.getItem is not a function` Error in Next.js 15

Cause and Fix for localStorage.getItem is not a function Error in Node.js 25 + Next.js 15 Introduction When running npm run dev in a Next.js 15 project, the following error occurred and the development server stopped working properly. ⨯ } [ ( T ⨯ n [ d y o T i p [ d y g e T e p e E y : e s r p 2 E t r e 4 r : o E 0 r r r 5 o ' : r ) r 2 o : 8 l r W 9 o : a l 2 c r o 7 a l n c 0 l o i a 3 S c n l 8 t a g S 7 o l : t 9 r S o ' a t ` r g o - a e r - g . a l e g g o . e e c g t . a e I g l t t e s I e t t t m I o e t r m i e a s m g i e s n i - o s f n t i o n l t a o e t ` a f u a w f n a u c f s n t u c i n p t o c r i n t o o ] i v n o i ] n d ] e { d { w p i a t g h e o : u t / a j a v ' a l } i d p a t h There was no code directly calling localStorage, which made identifying the cause time-consuming. This article explains the root cause and solution for this error. ...

February 8, 2026 · 12 min · Nakamura

Three Pitfalls When Adapting a SPARQL Client to Apache Jena Fuseki

I adapted the SPARQL Explorer “Snorql,” originally built for Virtuoso / Dydra, to work with Apache Jena Fuseki. While SPARQL is a W3C standard, the behavioral differences between endpoint implementations can be surprisingly large. Here I document the three issues I encountered during Fuseki adaptation and their solutions. Development Environment I started Fuseki with Docker and tested locally. # s e o d r f l f o v u u u c i s i c p e m s k c e m o o n o e e e e k a n r - v - - l - s k r s i g t t i u : i - : : e a s " r A F m f - c : i : 3 o D U e u d o n 0 n M S s s a m s e 3 m I E : e t p t r 0 e N K k a o a _ : n _ I i : s i n 3 t P _ - e n a 0 : A D d . / m 3 S A a y j e 0 S T t m e : " W A a l n O S : a f R E / - u D T f f s = _ u u e a 1 s s k d = e e i m t k k i e i i n s t d # c o u c L r - k o l H - e a d r d - ' a X C t c t o a o e P n - m s O t b p t S e i o T n n s d t a e a ' - r t h T y u a t y p t p @ p e t - : : e d / s / t t l e d o x a c t t a / a l t . h u t o r t s t l t l : e 3 ' 0 3 0 / t e s t / d a t a ' 1. DESCRIBE Response Format Differs Symptom When sending a DESCRIBE query to Fuseki, results were not displayed on screen. The console showed JSON parse errors. ...

February 8, 2026 · 16 min · Nakamura