Configuration Reference

Last updated: 02/22/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 Audience, Doc Type, Mode, and Prompt Library 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.

{
  "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.
builtinbooleanYesSet to false for custom prompts. Built-in prompts (true) are managed by the app and cannot be overridden via import.

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

Valid doc types

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

API reference, How-to 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
    }
  ]
}