DocMake
The PDF DocMake makes from the Work Instruction template

The first page of the document DocMake makes from the sample values on this page.

Operations

Work Instruction

A work instruction sits at the narrow end of the documentation set. A procedure describes activities that cross functions; an instruction describes how one task is done inside one function, in enough detail that a trained person who last did the job two months ago still gets the same result.

No hierarchy is required. ISO 9001:2015 replaced documents, records and the quality manual with the single idea of documented information, and ISO 10013:2021, the guidance published alongside it, states plainly that a documented information hierarchy is not required and that organizations may define their own. Policy, procedure, instruction, form survives as one worked example rather than as an obligation.

That same guidance is unusually specific about content: a work instruction describes the materials, equipment and documented information to be used, and where relevant it includes acceptance criteria. Which is the step table below. Each row carries the action, the role that performs it, and the criterion that says when the step has been done correctly, and that last column is what turns a description into something a new starter or an auditor can check against.

The header exists for the same reason. When documented information is created or updated, clause 7.5.2 asks for identification and description, a suitable format, and review and approval, so identifier, revision, effective date, owner and approver belong in the printed header rather than in a file name, with the change history at the foot. Protective equipment is on the form because a real instruction at a bench carries it, not because a quality standard asks for it. Generating the instruction from the register whenever it changes keeps the laminated copy at the bench and the register entry describing the same revision.

Blanks to fill

doc_title Title
doc_id Document ID
revision Revision
effective_date Effective date
supersedes Supersedes
department Department
workstation Workstation or area
process_owner Process owner
approved_by Approved by
approval_date Approval date
purpose Purpose
scope Scope
competence_required Who may do this work
safety_notice Safety notice
related_documents Read with this
company_name Company
protective_equipment[] One per item, so a row is added for every item in the list
equipment[] One per item, so a row is added for every item in the list
steps[] One per item, so a row is added for every item in the list
records[] One per item, so a row is added for every item in the list
revisions[] One per item, so a row is added for every item in the list

The data behind the preview

This is the exact JSON that produced the document above. Change the values, POST them to the API, and you get your version back as DOCX or PDF. Lists grow and shrink with your data; the layout adapts.

  1. 01 Sign up free and duplicate this template into your workspace.
  2. 02 Adjust the wording and branding in the visual editor.
  3. 03 Fill it in the app, share it as a form link, or call the API.
sample-data.json
{
  "company_name": "Ellerby Precision Engineering",
  "doc_id": "WI-CNC-07",
  "doc_title": "Setting and running the CNC lathe, cell 3",
  "revision": "4",
  "effective_date": "1 September 2026",
  "supersedes": "Revision 3 of 14 February 2025",
  "department": "Machining",
  "workstation": "Cell 3, CNC lathe LT-220",
  "process_owner": "Cell Leader, Machining",
  "approved_by": "Verity Ashgate, Production Manager",
  "approval_date": "28 August 2026",
  "purpose": "Set and run the CNC lathe in cell 3 so that every part leaves the machine within drawing, and so that anybody on any shift sets it the same way.",
  "scope": "Turned parts made on the LT-220 in cell 3, from the setting sheet to the first part being passed. It does not cover programming, tool grinding or the yearly machine service.",
  "competence_required": "Trained on the LT-220 and signed off on the training record by the cell leader. An apprentice may set the machine only with a signed off operator at the cell.",
  "safety_notice": "The door interlock is never bypassed. The spindle is stopped and the isolator locked before anybody reaches into the work area. Swarf is cleared with the hook and the brush, never by hand.",
  "protective_equipment": [
    {
      "protective_equipment": "Safety glasses",
      "when": "At all times in the cell"
    },
    {
      "protective_equipment": "Cut resistant gloves",
      "when": "Handling bar stock and clearing swarf, never with the spindle running"
    },
    {
      "protective_equipment": "Safety boots",
      "when": "At all times in the cell"
    },
    {
      "protective_equipment": "Ear defenders",
      "when": "While the bar feeder is running"
    }
  ],
  "equipment": [
    {
      "equipment_or_material": "CNC lathe",
      "identifier": "LT-220, asset 3114",
      "check_before_use": "Daily check card signed, guards and interlock working"
    },
    {
      "equipment_or_material": "Tool holder set",
      "identifier": "TH-3 to TH-9",
      "check_before_use": "Inserts free of chips, clamp screws to 4 Nm"
    },
    {
      "equipment_or_material": "Digital micrometer",
      "identifier": "MIC-0442",
      "check_before_use": "In calibration date, reads zero on the standard"
    },
    {
      "equipment_or_material": "Bar stock",
      "identifier": "As the works order",
      "check_before_use": "Grade and heat number match the order"
    }
  ],
  "steps": [
    {
      "action": "Read the works order and the drawing, and take the setting sheet for the part number.",
      "done_by": "Operator",
      "checked_against": "Setting sheet matches the drawing issue"
    },
    {
      "action": "Load the program from the cell folder and check the program number against the setting sheet.",
      "done_by": "Operator",
      "checked_against": "Program number and issue agree"
    },
    {
      "action": "Fit the tools listed on the setting sheet and set the offsets.",
      "done_by": "Operator",
      "checked_against": "Offsets written on the setting sheet"
    },
    {
      "action": "Load the bar, set the stop and run one part in single block at 25 per cent feed.",
      "done_by": "Operator",
      "checked_against": "No alarm, no rub, chips breaking"
    },
    {
      "action": "Measure the first part on all drawing dimensions and record them on the first off sheet.",
      "done_by": "Operator",
      "checked_against": "Every dimension inside the drawing limits"
    },
    {
      "action": "Have the first part passed before the run starts.",
      "done_by": "Cell leader or inspector",
      "checked_against": "First off sheet signed"
    },
    {
      "action": "Run the batch, measuring one part in ten and writing it on the run chart.",
      "done_by": "Operator",
      "checked_against": "Run chart inside the limits"
    },
    {
      "action": "Stop the machine and tell the cell leader if any reading moves outside the limits.",
      "done_by": "Operator",
      "checked_against": "Machine stopped, parts held"
    }
  ],
  "records": [
    {
      "record": "First off sheet",
      "form": "F-QA-12",
      "kept_for": "3 years"
    },
    {
      "record": "Run chart",
      "form": "F-QA-15",
      "kept_for": "3 years"
    },
    {
      "record": "Daily machine check card",
      "form": "F-MA-02",
      "kept_for": "1 year"
    }
  ],
  "related_documents": "Drawing DR-4471 issue C, setting sheet SS-4471, the calibration schedule, and the procedure for output that does not meet the requirement.",
  "revisions": [
    {
      "revision": "2",
      "date": "3 June 2024",
      "change": "Bar feeder added to the equipment list.",
      "approved_by": "V. Ashgate"
    },
    {
      "revision": "3",
      "date": "14 February 2025",
      "change": "Measuring rate changed from one in twenty to one in ten.",
      "approved_by": "V. Ashgate"
    },
    {
      "revision": "4",
      "date": "28 August 2026",
      "change": "First part now passed by the cell leader, and the wording brought to plain words.",
      "approved_by": "V. Ashgate"
    }
  ]
}

Generate this document via the API

One template plus changing data is the whole point. The list of blanks above is the contract, and every new set of values comes back in the same layout: fill it in the app, hand someone a form link, or POST the JSON and get the file straight back.

The request below carries this page's own values, so it runs as soon as the template exists in your workspace. Swap the values for yours and the response is your document.

make-work-instruction.sh
curl -X POST https://app.docmake.io/api/v1/render \
  -H "Authorization: Bearer $DOCMAKE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  --output work-instruction.pdf \
  --data-binary @- <<'JSON'
{
  "template_id": "tmpl_your_template_id",
  "format": "pdf",
  "data": {
    "company_name": "Ellerby Precision Engineering",
    "doc_id": "WI-CNC-07",
    "doc_title": "Setting and running the CNC lathe, cell 3",
    "revision": "4",
    "effective_date": "1 September 2026",
    "supersedes": "Revision 3 of 14 February 2025",
    "department": "Machining",
    "workstation": "Cell 3, CNC lathe LT-220",
    "process_owner": "Cell Leader, Machining",
    "approved_by": "Verity Ashgate, Production Manager",
    "approval_date": "28 August 2026",
    "purpose": "Set and run the CNC lathe in cell 3 so that every part leaves the machine within drawing, and so that anybody on any shift sets it the same way.",
    "scope": "Turned parts made on the LT-220 in cell 3, from the setting sheet to the first part being passed. It does not cover programming, tool grinding or the yearly machine service.",
    "competence_required": "Trained on the LT-220 and signed off on the training record by the cell leader. An apprentice may set the machine only with a signed off operator at the cell.",
    "safety_notice": "The door interlock is never bypassed. The spindle is stopped and the isolator locked before anybody reaches into the work area. Swarf is cleared with the hook and the brush, never by hand.",
    "protective_equipment": [
      {
        "protective_equipment": "Safety glasses",
        "when": "At all times in the cell"
      },
      {
        "protective_equipment": "Cut resistant gloves",
        "when": "Handling bar stock and clearing swarf, never with the spindle running"
      },
      {
        "protective_equipment": "Safety boots",
        "when": "At all times in the cell"
      },
      {
        "protective_equipment": "Ear defenders",
        "when": "While the bar feeder is running"
      }
    ],
    "equipment": [
      {
        "equipment_or_material": "CNC lathe",
        "identifier": "LT-220, asset 3114",
        "check_before_use": "Daily check card signed, guards and interlock working"
      },
      {
        "equipment_or_material": "Tool holder set",
        "identifier": "TH-3 to TH-9",
        "check_before_use": "Inserts free of chips, clamp screws to 4 Nm"
      },
      {
        "equipment_or_material": "Digital micrometer",
        "identifier": "MIC-0442",
        "check_before_use": "In calibration date, reads zero on the standard"
      },
      {
        "equipment_or_material": "Bar stock",
        "identifier": "As the works order",
        "check_before_use": "Grade and heat number match the order"
      }
    ],
    "steps": [
      {
        "action": "Read the works order and the drawing, and take the setting sheet for the part number.",
        "done_by": "Operator",
        "checked_against": "Setting sheet matches the drawing issue"
      },
      {
        "action": "Load the program from the cell folder and check the program number against the setting sheet.",
        "done_by": "Operator",
        "checked_against": "Program number and issue agree"
      },
      {
        "action": "Fit the tools listed on the setting sheet and set the offsets.",
        "done_by": "Operator",
        "checked_against": "Offsets written on the setting sheet"
      },
      {
        "action": "Load the bar, set the stop and run one part in single block at 25 per cent feed.",
        "done_by": "Operator",
        "checked_against": "No alarm, no rub, chips breaking"
      },
      {
        "action": "Measure the first part on all drawing dimensions and record them on the first off sheet.",
        "done_by": "Operator",
        "checked_against": "Every dimension inside the drawing limits"
      },
      {
        "action": "Have the first part passed before the run starts.",
        "done_by": "Cell leader or inspector",
        "checked_against": "First off sheet signed"
      },
      {
        "action": "Run the batch, measuring one part in ten and writing it on the run chart.",
        "done_by": "Operator",
        "checked_against": "Run chart inside the limits"
      },
      {
        "action": "Stop the machine and tell the cell leader if any reading moves outside the limits.",
        "done_by": "Operator",
        "checked_against": "Machine stopped, parts held"
      }
    ],
    "records": [
      {
        "record": "First off sheet",
        "form": "F-QA-12",
        "kept_for": "3 years"
      },
      {
        "record": "Run chart",
        "form": "F-QA-15",
        "kept_for": "3 years"
      },
      {
        "record": "Daily machine check card",
        "form": "F-MA-02",
        "kept_for": "1 year"
      }
    ],
    "related_documents": "Drawing DR-4471 issue C, setting sheet SS-4471, the calibration schedule, and the procedure for output that does not meet the requirement.",
    "revisions": [
      {
        "revision": "2",
        "date": "3 June 2024",
        "change": "Bar feeder added to the equipment list.",
        "approved_by": "V. Ashgate"
      },
      {
        "revision": "3",
        "date": "14 February 2025",
        "change": "Measuring rate changed from one in twenty to one in ten.",
        "approved_by": "V. Ashgate"
      },
      {
        "revision": "4",
        "date": "28 August 2026",
        "change": "First part now passed by the cell leader, and the wording brought to plain words.",
        "approved_by": "V. Ashgate"
      }
    ]
  }
}
JSON

tmpl_your_template_id is a stand-in: build this template in the visual editor and copy the id it shows, or create one with POST /api/v1/templates. Keys, formats, strict mode and batches are in the API reference.

Or let an AI assistant do it

The DocMake MCP server lets Claude and other assistants make this document the same way. Install it once:

claude mcp add docmake \
  --env DOCMAKE_API_KEY=dm_your_api_key \
  -- npx -y @docmake/mcp@latest

Then ask for the document in plain words:

Make a PDF from my Work Instruction template with document ID "WI-CNC-07" and revision "4".

How the MCP server works →

More operations templates