Configuration Reference

Last updated: 06/12/2026

TechWrit AI exports and imports configuration as a single JSON file (techwrit-config.json). This page documents every field so you can hand-edit a config, build one from scratch, or generate one programmatically.

Top-level structure

{
  "rules": [],
  "termSubs": [],
  "glossary": [],
  "customInst": "",
  "modeInstructions": {},
  "templates": []
}

All fields are optional on import — missing fields are left unchanged.


rules

An array of style rule objects. Each rule tells the AI to check for (and fix) a specific writing pattern.

{
  "id": "no-please",
  "label": "Avoid \"Please\"",
  "description": "Don't start instructions with \"Please\" — use direct, imperative language.",
  "active": true,
  "custom": false,
  "category": "Tone"
}
FieldTypeRequiredDescription
idstringYesUnique identifier. Built-in IDs are fixed; custom rules should use a slug (e.g., "no-exclamation-points").
labelstringYesShort display name shown in the Settings toggle list.
descriptionstringYesThe instruction sent to the AI. Be specific — this is the actual rule text the model reads.
activebooleanYesWhether the rule is included in the prompt. Set to false to keep a rule defined but disabled.
custombooleanYestrue for user-created rules, false for built-in defaults.
categorystringNoGrouping label. Built-in rules use "Tone", "Clarity", "Formatting", or "Structure". Custom rules default to "Custom".

Built-in rule IDs

no-please, no-and-or, title-case-titles, sentence-case-headings, no-may, ensure-vs-confirm, active-voice, present-tense, second-person, no-future-tense, parallel-structure, no-jargon-undefined, concise, no-there-is, consistent-terminology, no-redundancy

Example: adding a custom rule

{
  "id": "oxford-comma",
  "label": "Use Oxford commas",
  "description": "Always use a comma before the conjunction in a list of three or more items.",
  "active": true,
  "custom": true,
  "category": "Formatting"
}

termSubs

An array of terminology substitution objects. Each entry defines a preferred term and a list of terms to avoid.

{
  "preferred": "select",
  "avoid": ["click on", "click"]
}
FieldTypeRequiredDescription
preferredstringYesThe term to use instead.
avoidstring[]YesOne or more terms to flag and replace. Case-insensitive matching.

Default substitutions

[
  { "preferred": "select", "avoid": ["click on", "click"] },
  { "preferred": "enter", "avoid": ["type in", "input"] },
  { "preferred": "repository", "avoid": ["repo"] }
]

Example: adding substitutions

[
  { "preferred": "endpoint", "avoid": ["API route", "route"] },
  { "preferred": "run", "avoid": ["execute", "invoke"] },
  { "preferred": "set up", "avoid": ["setup", "configure"] }
]

glossary

An array of glossary entry objects. These give the AI semantic understanding of your product terms — not just spelling, but meaning.

{
  "term": "webhook",
  "definition": "An HTTP callback that sends real-time notifications to your application when an event occurs.",
  "synonyms": ["callback URL", "HTTP callback"]
}
FieldTypeRequiredDescription
termstringYesThe canonical term.
definitionstringYesA 1-2 sentence explanation. The AI uses this definition when writing about or reviewing the term.
synonymsstring[]NoAlternative names. The AI flags these and suggests the canonical term instead.

Example: a product glossary

[
  {
    "term": "workspace",
    "definition": "The main editing environment where users compose input, select modes, and view AI output.",
    "synonyms": ["editor", "dashboard"]
  },
  {
    "term": "style rule",
    "definition": "A writing guideline that TechWrit AI enforces during review, rewrite, and generation.",
    "synonyms": ["writing rule", "lint rule"]
  },
  {
    "term": "context bar",
    "definition": "The horizontal bar above the input area containing the Mode, Audience, Doc Type, and Framework selectors."
  }
]

customInst

A string containing freeform instructions appended to every AI request. Use this for guidance that doesn't fit a single style rule.

{
  "customInst": "Our audience is enterprise IT admins. Keep paragraphs under 4 sentences. Always use Oxford commas."
}

Set to an empty string ("") to clear.


modeInstructions

An object mapping mode IDs to mode-specific instruction strings. When a mode has an entry here, it replaces the global customInst for that mode. Modes without an entry fall back to customInst.

{
  "modeInstructions": {
    "review": "Focus on security concerns and OWASP compliance.",
    "rewrite": "Always use Oxford commas. Prefer bullet lists for non-sequential content.",
    "simplify": "Target a 6th-grade reading level for this project."
  }
}
KeyTypeDescription
Mode ID (e.g., "review")stringThe instruction to use instead of customInst when this mode is active. See the Valid mode IDs table for all accepted keys.

Set a mode's value to an empty string or omit the key entirely to use the global customInst fallback.

This field is optional. If omitted or set to {}, the global customInst applies to all modes.


templates

An array of Prompt Library entry objects. Prompts pre-fill the input area with structured content containing placeholders. Every prompt is user-created — TechWrit AI ships no built-in prompts, so set builtin to false.

{
  "id": "changelog-entry",
  "name": "Changelog Entry",
  "content": "Component: [name]\nDate: [date]\n\nChanges:\n- [change 1]\n- [change 2]\n\n=== OUTPUT FORMAT ===\nFormat as a changelog entry with a summary sentence followed by a bulleted list of changes.",
  "mode": "generate",
  "docType": "Release notes",
  "builtin": false
}
FieldTypeRequiredDescription
idstringYesUnique identifier. Use a slug format (e.g., "changelog-entry").
namestringYesDisplay name shown in the Prompt Library dropdown.
contentstringYesThe prompt body. Use [placeholder] syntax for fields the user fills in. Include an === OUTPUT FORMAT === section to guide the AI's response structure.
modestringNoAuto-set mode when the prompt is applied. See valid mode IDs below.
docTypestringNoAuto-set doc type when the prompt is applied. See valid doc types below.
builtinbooleanYesAlways false. All prompts are user-created; TechWrit AI ships no built-in prompts.

Prompt content tips

  • Use [bracketed placeholders] for fields the user fills in — e.g., [product name], [version number].
  • Add an === OUTPUT FORMAT === section at the end to instruct the AI on structure, headings, and format.
  • Use \n for line breaks in JSON (or actual newlines if editing in the Settings UI).

Valid mode IDs

Use these values for the mode field in Prompt Library entries:

IDLabel
generateWrite
rewriteRewrite
reviewReview
style-checkStyle Check
simplifySimplify
keywordsKeywords
glossary-genGlossary
code-to-docsCode to Docs
user-guideUser Guide
explainExplain
summarizeSummarize
expandExpand
translateTranslate
outlineOutline
ux-reviewUX Review
ux-rewriteUX Rewrite
ux-generateUX Generate

Valid doc types

Use these values for the docType field in Prompt Library entries:

API reference, How-to guide, Quick start guide, Conceptual overview, Tutorial, Release notes, Troubleshooting guide, README, Runbook, Migration guide, Architecture decision record, FAQ

Valid rule categories

Use these values for the category field in style rules:

Tone, Clarity, Formatting, Structure

Custom rules can use any category string — unrecognized values appear as their own group in Settings.


Complete example

A minimal but functional configuration:

{
  "rules": [
    { "id": "no-please", "label": "Avoid \"Please\"", "description": "Don't start instructions with \"Please\" — use direct, imperative language.", "active": true, "custom": false, "category": "Tone" },
    { "id": "active-voice", "label": "Prefer active voice", "description": "Use active voice unless passive is clearer or the actor is unknown.", "active": true, "custom": false, "category": "Tone" },
    { "id": "no-weasel-words", "label": "No weasel words", "description": "Avoid vague qualifiers like \"simply\", \"just\", \"easily\", and \"obviously\" — they undermine the reader's experience when the task isn't easy.", "active": true, "custom": true, "category": "Clarity" }
  ],
  "termSubs": [
    { "preferred": "select", "avoid": ["click on", "click"] },
    { "preferred": "enter", "avoid": ["type in", "input"] }
  ],
  "glossary": [
    {
      "term": "webhook",
      "definition": "An HTTP callback that sends real-time notifications to your application when an event occurs.",
      "synonyms": ["callback URL"]
    }
  ],
  "customInst": "Target a 9th-grade reading level. Use Oxford commas.",
  "modeInstructions": {
    "review": "Focus on security concerns and OWASP compliance.",
    "simplify": "Target a 6th-grade reading level for this project."
  },
  "templates": [
    {
      "id": "sdk-quickstart",
      "name": "SDK Quickstart",
      "content": "SDK name: [name]\nLanguage: [language]\nInstall command: [install command]\nMain use case: [what developers build with it]\n\n=== OUTPUT FORMAT ===\nFormat as a quickstart guide with: Overview, Prerequisites, Installation, First API call (with code example), Next steps.",
      "mode": "generate",
      "docType": "Tutorial",
      "builtin": false
    }
  ]
}