idem helps you validate XLSForm files against an authoritative reference form. It is designed for workflows where a canonical form is maintained centrally and partner or localised copies must stay in sync with it — catching drift in question names, choice lists, and answer options before it causes problems in data collection or analysis.
Installation
# install.packages("pak")
pak::pak("impact-initiatives/idem@v2026.4.27")Key concepts
target is the canonical, centrally maintained XLSForm — the source of truth defining what questions, choice lists, and answer options are required.
dev is the copy being validated — a localised adaptation, a partner’s version, or a form deployed in a specific context.
The rule: everything in target must also exist in dev. dev may carry extra content; it must not be missing anything target requires.
The checks
| Check | What is tested |
|---|---|
question_names |
Every question name in target must exist in dev. |
list_names |
Every choice list defined in target’s choices sheet must also be defined in dev’s choices sheet. |
survey_list_names |
Every choice list referenced by target’s survey questions must also be referenced in dev’s survey questions. |
choices |
For every shared list, every choice option in target must exist in the same list in dev. |
All checks return a tidy tibble — one row per issue.
Quick start
library(idem)
# load both forms
target <- msna_template_required # bundled MSNA reference
dev <- read_xlsform("path/to/mission_form.xlsx")
# run all checks
issues <- validate_xlsform(target = target, dev = dev)
issuesAn empty tibble means the form is fully compliant. Any rows flag content that dev is missing relative to target.
See the Getting started article for a full walkthrough: exploring forms, understanding each check, running checks individually, skipping lists, and working with results.