Methods
How the Database of Battles is built: one ledger of cited claims, a crosswalk to Wikidata, and the Kursk Data Base read back out of a 1998 US Army report. For each step, the problems met and how each was solved.
Principles
- Every fact is a cited claim. A claim names its subject, field and value, the source document and PDF page, the method, a confidence, and a note. Pipelines append new or changed claims and retire ones they no longer produce, so rerunning one writes nothing. Each pipeline is checked that way. The explorer reads only what the ledger resolves.
- The source checks itself. Printed tables carry arithmetic: row totals and casualty identities. Extracted values are kept only where it holds; they are not trusted because OCR produced them.
- Two independent readers. Scanned pages are read from the PDF's text layer and again by Apple Vision. Agreement raises confidence; a disagreement is settled by the arithmetic or a plausibility rule, or the value is left out. Nothing is guessed.
- Corrections are explicit. Every OCR fix to a unit or weapon name is a line in a table that can be reviewed, not a fuzzy match hidden in code. An unknown misreading stays visible instead of being guessed.
- No OCR prose is published. The scans have a few percent character error, concentrated in proper nouns. The site publishes structured values and citations only; each value links to its scanned page.
- Tested invariants. Continuous integration checks the committed ledger itself: every unit-day satisfies the casualty identities, every position lies in the battle area, every engagement link points at a unit that exists.
1. Surveying comparable datasets
CDB90, the Army's database of 660 engagements from 1600 to 1982, was compared with its relatives: Dupuy's Land Warfare Database, the HERO reports in DTIC, the National Park Service Civil War battle summaries, Wikidata and DBpedia, Correlates of War, UCDP, ACLED, Brecke, Seshat and Bodart. Wikidata was the best general link target. The DTIC reports behind CDB90's successors held the richest primary data.
2. Wikidata crosswalk
A snapshot of about 11,700 Wikidata battles and sieges dated 1595–1975 was matched to CDB90 engagements. The match uses CDB90's DBpedia link, following Wikipedia redirects, or failing that the name and date.
3. Finding the Kursk sources
4. Daily personnel Appendices F–G
One table per unit: nine categories (on hand, total, combat and non-battle casualties, killed, missing, wounded, replaced, returned) by day, 4–18 July 1943, with row totals.
1 5880).Checks: each row sums to its printed total; combat casualties = killed + missing + wounded; total = combat + non-battle; a day-to-day jump in on-hand strength of more than 2× is flagged for line units. A single unread cell is recovered from its row total. Result: 12,443 valid values; 701 of 703 rows match their totals. Two defects are in the print itself: the 11th and 19th Panzer Divisions' on-hand figures are truncated.
5. Order of battle
332dID = 332nd ID).The source puts the 167th Infantry Division under 48th Panzer Corps on 4 July, not II SS Panzer Corps as often given; the ledger follows the source. CDB90 engagements 493–497 are linked to the units on each side through this order of battle. Where CDB90 notes unnamed reinforcements ("6TH GDS ARMY(+)"), the claim says they are not enumerated.
6. Daily positions Appendix L
Each unit's daily location is the mean of its KDB reference points (HQ excluded), with the number of points behind it.
N 50 .563).Checks: every position must fall inside the battle area, and a move of more than 40 km in a day needs both readers to agree. The one such move, the 2d Guards Tank Corps coming up from reserve on 5 July, is real. Five independent tank brigades appear only here, so they have positions but no personnel.
7. Daily weapons and tanks Appendices H–I
One table per unit, often over two or three pages, in six sections: on hand, destroyed or abandoned, damaged, in repair, replaced, returned. Each has a row per weapon type and a column per day.
000010), one header
prints its days as 1–15, and one TOTAL heading was lost.HOmmmtr,
PzH, T-tfO.268268). A cell is
dropped only when both readings are plausible.Checks tried and kept only as reports: the day-to-day balance (on hand = yesterday − losses + replacements + returns) holds 93% of the time. The rest are mostly real one-day attachments, so it cannot reject values. Alphabetical order holds in 545 of 555 sections; the exceptions are printed that way. Result: 43,105 of 43,181 values valid. On 4 July the data gives about 1,000 German and 2,500 Soviet tanks on the southern face, in line with published figures.
8. Daily ammunition Appendices J–K
One table per unit, 92 in all: short tons on hand, used and received each day, for tank and antitank, artillery, rocket and other ammunition. Used and received print row totals; received goes negative when ammunition leaves with a detached unit.
ooooooooooooooo. Elsewhere 0-10 is two cells.o are read as zeros, and a cell glued to a negative neighbour is split
at the sign.Checks: used and received rows must sum to their totals. Where the readers disagree on an on-hand cell, the value that keeps the day's balance (yesterday's on hand − used + received) wins. That balance holds exactly on 79% of days and to within a ton on 90%: the rest is rounding and the stocks of attached units, mostly at headquarters. Result: 16,425 of 16,560 printed values valid; the rest are rows whose own arithmetic cannot settle them.
9. The Kursk map
An export built from the resolved ledger feeds the Kursk page. It shows each unit's daily position, with circle area for men, for tanks plus self-propelled guns, or for tons of ammunition on hand. A day slider, unit tracks and an engagement filter go with it, and every value links to its scanned page.
10. The Ardennes: German daily casualties ACSDB report
The Ardennes Campaign Simulation Data Base (1990) is a dBASE database. Its report, the only part that is public, describes how the data were built and reprints a few tables. Two have daily detail: killed, wounded and captured for the 42 German divisions and brigades, 16 December 1944 to 16 January 1945, and each one's daily activity rating. There are no daily locations or equipment, so there is no map; the Ardennes page charts the casualties by unit and day.
These are estimates, not wartime returns. The report took 10-day and monthly army and division totals, divided them among divisions and spread them over days, an active day counting 6.5 times an inactive one. That is why a division can show 38 killed, 115 wounded and 34 captured ten days running. Where the report marks a day as resting on daily primary-source figures, the claim says so and carries higher confidence; the rest are cited as ACSDB estimates.
1IS for 115, is for 15). Vision skips half the cells on a full
page.5256 for 5252, 01/10/45 for 01/05/45).Checks: the two tables check each other. Out-of-contact days average 2 casualties (155 of 169 are zero), inactive days 29, active days 157; units rated outside the area have no casualties (three edge days print zeros). A change in one column alone, read by one reader only, is dropped, since a real switch moves all three together. Result: 3,585 of 3,741 values for 1,238 unit-days, and 1,238 activity ratings.
11. Civil War battles CWSAC summaries
The Civil War Sites Advisory Commission (1993) named 384 principal battles of the American Civil War and wrote a one-page summary of each: other names, county, campaign, dates, principal commanders, forces engaged, estimated casualties, result, and a preservation priority with a significance class from A (decisive) to D (local). The National Park Service published the summaries until about 2020; they are gone from nps.gov, so each page was read from the Wayback Machine's latest good capture. The capture time, size and sha256 of every page are recorded, so the same bytes can be fetched again. The Civil War page charts them by date and casualties.
Checks: every value was compared with an independent cleaning of the same pages
(Jeffrey Arnold's acw_battle_data): dates differ for 1 battle, casualty totals
for 2, results for 1 and class for 1, each where the archived page says what is used here.
CDB90's 49 Civil War engagements are each linked to the CWSAC battle whose dates overlap
and whose name is closest; all 49 agree with Arnold's crosswalk. Result: 382
battles, 340 with a casualty figure, 84 with forces as numbers.
The summaries' text is not published. The site shows the values parsed from it. The wording of every section, the battle descriptions included, is kept internally for classification, and any summary shown here will be written by us after analysis.
12. Civil War battlefields ABPP boundaries
The National Park Service's American Battlefield Protection Program maps each CWSAC battlefield as two areas: the core area, where the fighting was, and the study area, the battle's historic setting. The 1993 survey drew them first and the state resurveys of 2007–2013 redrew most of them. Both are in one public NPS map service, keyed by the CWSAC reference. The four Civil War layers were downloaded with their sizes and sha256 recorded. The layers carry names, states and acreage only, no text.
Checks: every site's state matches its battle's. The point drawn for each battle lies inside its core area, or inside its study area where no core area is mapped. Result: 380 of the 382 battles are mapped. Round Mountain and Middle Boggy Depot, both in Oklahoma, have no boundary.
13. Revolutionary War and War of 1812 ABPP 2007 report
The National Park Service's 2007 report to Congress on Revolutionary War and War of 1812 sites rated every principal battlefield of both wars. Its preservation priority tables give each battlefield's site code, name, states, significance class (A to D), short- and long-term threat and priority group. They were read from the PDF, whose sha256 is recorded, and the 2007 study's boundaries come from the same NPS map service as the Civil War's. The Revolution and 1812 page maps them.
Result: 243 battlefields, 236 mapped and 106 dated. Only the battlefields are read, not the forts, depots and other associated properties the report also rates, nor the sites in Canada.
14. Civil War orders of battle Official Records
The Official Records of the Union and Confederate Armies print, for each major battle, the organization of both armies: corps, divisions and brigades, each with its commanders in order of succession, then its regiments and batteries with theirs. The orders of battle are read from the Internet Archive's scans, whose OCR gives a box for every word; the files' sha256 are recorded. Gettysburg is first, from series I, volume 27, parts 1 and 2. The order of battle page shows both armies.
Checks: the counts match the armies' known strength (Army of the Potomac: 7 infantry corps, 22 divisions, 250 infantry units and 74 batteries; Army of Northern Virginia: 3 corps, 10 divisions, 175 infantry units and 70 batteries). Against the National Park Service's list of Union regiments at Gettysburg, 259 of its 266 are found. Of the 7 it has that are not found here, two were not at Gettysburg, and the rest are OCR errors in a number (a "22d" for the 122d New York). Result: 844 formations and units on both sides.
The volumes' text is not published. Every page of each volume read so far (reports, correspondence, returns and orders of battle) is kept internally as text in reading order, with its footnotes and its numbered document, for classification and for the summaries we will write. The site shows only the values parsed from it.
Still open
- A handful of KDB values remain unresolved: Corps Raus on-hand, the 167th ID's replaced and returned rows, the 35th Guards Rifle Corps totals, the 29th Tank Corps on 4 July, and 23 weapon cells the two readers dispute, and 17 ammunition rows or cells (II SS Panzer Corps' receipts among them). They are left out, not guessed.
- The 233 Wikidata links awaiting review.
- In the orders of battle: the footnotes (units not engaged, changes of command), the OCR's misread numbers, a stable identity for each regiment across battles, and the Official Records' returns of casualties by unit.
- The NPS's 2009–2013 state update reports, which revise some of the CWSAC's figures, are not yet read. Their redrawn boundaries are on the Civil War map.
- The ACSDB's own database files, with US data, daily locations and equipment, are not public. Its report's US return-to-duty printouts are working copies and are not extracted.
Sources
| Report | What it gives | Copy |
|---|---|---|
| CAA-SR-98-7, KOSAVE II (1998), AD-A360-311 | Kursk Data Base: personnel, weapons, ammunition, locations, order of battle | Internet Archive |
| The Ardennes Campaign Simulation Data Base (1990), AD-A240-088 | German daily battle casualties (estimates) and activity ratings | Internet Archive |
| Civil War Sites Advisory Commission, battle summaries (1993) | 384 principal Civil War battles: dates, commanders, forces, casualties, result, class | Wayback Machine |
| American Battlefield Protection Program, battlefield boundaries (1993; state resurveys 2007–2013) | Core and study areas of 380 Civil War battlefields | NPS map service |
| National Park Service, report to Congress on Revolutionary War and War of 1812 sites (2007) | 243 battlefields: significance class, threats, preservation priority | NPS DataStore |
| CDB90 | 660 engagements, 1600–1982 | US Army Concepts Analysis Agency |
| Wikidata | Battle identifiers and links | wikidata.org |