{
  "title": "INI editor",
  "human_url": "https://happytails.ai/en/developer-tools/ini-editor/",
  "agent_url": "https://happytails.ai/agents/en/developer-tools/ini-editor/",
  "language": "en",
  "markdown_url": "https://happytails.ai/en/developer-tools/ini-editor.md",
  "content": "INI editor\nCheck an INI file against the dialect you choose and apply section and key edits without disturbing the rest of the file. Comments, spacing and line endings you did not edit stay exactly as they were.\nHow can we improve this tool?\nReport a problem or share an idea.\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\nHow to use INI editor\nPaste the INI file.\nChoose the dialect: comment characters, delimiter, repeated keys and case rules.\nAdd edits such as set [server] port = 9090, one per line.\nRun the check and review the findings.\nDownload the edited file and the JSON report.\nUseful next steps\nTOML validator\nEnvironment file validator\nYAML validator\nWhy the dialect matters\nINI has no single standard. Windows, Python configparser, Git and PHP read the same text differently, especially repeated keys, inline comments and indented lines. Happytails.ai makes each of these choices explicit so the findings and the edited file match the program that reads your file.\nHow editing keeps the file intact\nThe file is read line by line into a lossless structure that keeps every byte. An edit replaces only the value part of one line, or adds or removes whole lines. When you set a key that has no value and nothing follows its delimiter, the spacing before the delimiter is added after it too, so k = becomes k = 5; if an inline comment follows the empty value, the new value gets the same spacing before the comment, so the comment stays a comment. A new key goes after the last key of its section. It copies the delimiter and the spaces around it from the first key of that section, or from the first key in the file when the section has none; if that key has no value, its spacing before the delimiter is used on both sides. A file with no keys gets key = value. When repeated keys are allowed, set changes the value that wins under your rule.\nLimits\nInterpolation such as ${section:key} or %(name)s and escape sequences are not interpreted; values are treated as plain text. Values you set must be one line without leading or trailing spaces. Findings refer to line numbers in the original file.",
  "content_format": "text/plain",
  "visibility": "public",
  "links": [
    {
      "name": "TOML validator",
      "url": "https://happytails.ai/en/data-tools/toml-validator/"
    },
    {
      "name": "Environment file validator",
      "url": "https://happytails.ai/en/developer-tools/environment-file-validator/"
    },
    {
      "name": "YAML validator",
      "url": "https://happytails.ai/en/developer-tools/yaml-validator/"
    }
  ],
  "tool": {
    "id": "ini-editor",
    "category": "developer-tools",
    "built": true,
    "requirements": "Up to 200,000 characters, 5,000 lines and 100 edits. Everything runs on your device in a background worker. Downloads: the edited .ini file and a JSON report with findings and effective keys.",
    "implementation": {
      "fields": [
        {
          "key": "edits",
          "label": "Edits",
          "value": "",
          "type": "textarea",
          "help": "One per line: set [section] key = value, delete [section] key, add [section] or remove [section]. Use [] for keys before the first section. Up to 100 edits."
        },
        {
          "key": "commentChars",
          "label": "Comment characters",
          "value": ";#",
          "type": "select",
          "values": [
            ";#",
            ";",
            "#"
          ]
        },
        {
          "key": "inlineComments",
          "label": "Allow comments after values",
          "value": false,
          "type": "checkbox"
        },
        {
          "key": "delimiters",
          "label": "Key delimiter",
          "value": "=",
          "type": "select",
          "values": [
            "=",
            "=:"
          ]
        },
        {
          "key": "duplicateKeys",
          "label": "Repeated keys",
          "value": "error",
          "type": "select",
          "values": [
            "error",
            "first",
            "last"
          ]
        },
        {
          "key": "duplicateSections",
          "label": "Repeated sections",
          "value": "error",
          "type": "select",
          "values": [
            "error",
            "merge"
          ]
        },
        {
          "key": "caseSensitive",
          "label": "Case-sensitive names",
          "value": false,
          "type": "checkbox"
        },
        {
          "key": "globalKeys",
          "label": "Allow keys before the first section",
          "value": true,
          "type": "checkbox"
        },
        {
          "key": "continuation",
          "label": "Indented lines continue the previous value",
          "value": false,
          "type": "checkbox"
        }
      ],
      "registrationFamily": "config-analysis-reference",
      "inputMaxLength": 200000,
      "inputErrorCode": "CONFIG_ANALYSIS_REFERENCE_TOO_LONG",
      "note": "Edits INI files on your device and keeps every untouched line exactly as it was. Up to 200,000 characters, 5,000 lines and 100 edits.",
      "inputKeywords": [
        {
          "id": "config-analysis-reference/ini-editor/edits.verb",
          "kind": "command",
          "code": "CONFIG_ANALYSIS_REFERENCE_EDIT_VERB",
          "fold": "exact",
          "values": {
            "set": [
              "set"
            ],
            "delete": [
              "delete"
            ],
            "add": [
              "add"
            ],
            "remove": [
              "remove"
            ]
          },
          "describedBy": [
            "Start each edit with set, delete, add or remove.",
            "Write each edit on its own line as set [section] key = value, delete [section] key, add [section] or remove [section]."
          ]
        }
      ],
      "experience": {
        "automatic": false,
        "single": false,
        "inputMaxLength": 200000,
        "inputMode": "text",
        "label": "INI file",
        "placeholder": "[server]\nport = 8080",
        "help": "Paste the whole file. Sections, comments and blank lines are kept as they are. Up to 200,000 characters. Review the settings before running.",
        "action": null
      },
      "mode": "explicit",
      "interactive": false
    },
    "execution": "Browser interface",
    "api": null,
    "browser_agent": {
      "supported": true,
      "name": "run_current_tool",
      "discovery": "WebMCP on the human page in a supporting browser",
      "verification": "See audit/API-AUDIT.md; availability is not verification"
    }
  },
  "markdown": "# INI editor\n\n- Human page: https://happytails.ai/en/developer-tools/ini-editor/\n- Markdown: https://happytails.ai/en/developer-tools/ini-editor.md\n- Structured JSON: https://happytails.ai/agents/en/developer-tools/ini-editor/index.json\n- Visibility: public\n\n## Tool capabilities\n\n| Property | Value |\n| --- | --- |\n| Tool ID | `ini-editor` |\n| Category | developer-tools |\n| Implementation | Registered implementation. Registration alone is not a production-quality guarantee. |\n| Browser execution | Use the visible action or interactive controls. |\n| Browser processing | Browser; see tool notes for network behavior. |\n| HTTP API | Not callable through HTTP. |\n| Browser-agent interface | run_current_tool |\n\n### Implementation notes\n\nEdits INI files on your device and keeps every untouched line exactly as it was. Up to 200,000 characters, 5,000 lines and 100 edits.\n\n### Inputs and settings\n\nText input: INI file.\n\nExample or placeholder shown in the interface (not a validated fixture):\n\n```text\n[server]\nport = 8080\n```\n\nPaste the whole file. Sections, comments and blank lines are kept as they are. Up to 200,000 characters. Review the settings before running.\n\n| Setting | Meaning | Control type | Default | Constraints |\n| --- | --- | --- | --- | --- |\n| `edits` | Edits | textarea | \"\" |  |\n| `commentChars` | Comment characters | select | \";#\" | Allowed: ;#, ;, # |\n| `inlineComments` | Allow comments after values | checkbox | false |  |\n| `delimiters` | Key delimiter | select | \"=\" | Allowed: =, =: |\n| `duplicateKeys` | Repeated keys | select | \"error\" | Allowed: error, first, last |\n| `duplicateSections` | Repeated sections | select | \"error\" | Allowed: error, merge |\n| `caseSensitive` | Case-sensitive names | checkbox | false |  |\n| `globalKeys` | Allow keys before the first section | checkbox | true |  |\n| `continuation` | Indented lines continue the previous value | checkbox | false |  |\n\n### Browser-agent workflow\n\n1. Open the human page in a browser that supports WebMCP.\n2. Discover the interface exposed by that page; use its actual schema.\n3. Select files on the page first when the tool requires files.\n4. Call `run_current_tool` with valid input and settings.\n5. Inspect the returned result or error and the displayed output. Retrieve files from the displayed download links.\n\nCalls do not automatically copy or download results. Browser permissions still apply. Interface availability alone is not proof of successful execution.\n\n### Planning specification\n\nUp to 200,000 characters, 5,000 lines and 100 edits. Everything runs on your device in a background worker. Downloads: the edited .ini file and a JSON report with findings and effective keys.\n\nThis describes intended requirements. Use the implementation notes, interface schema and observed output to determine current support.\n\n### Complete machine-readable capability record\n\n```json\n{\n  \"id\": \"ini-editor\",\n  \"category\": \"developer-tools\",\n  \"built\": true,\n  \"requirements\": \"Up to 200,000 characters, 5,000 lines and 100 edits. Everything runs on your device in a background worker. Downloads: the edited .ini file and a JSON report with findings and effective keys.\",\n  \"implementation\": {\n    \"fields\": [\n      {\n        \"key\": \"edits\",\n        \"label\": \"Edits\",\n        \"value\": \"\",\n        \"type\": \"textarea\",\n        \"help\": \"One per line: set [section] key = value, delete [section] key, add [section] or remove [section]. Use [] for keys before the first section. Up to 100 edits.\"\n      },\n      {\n        \"key\": \"commentChars\",\n        \"label\": \"Comment characters\",\n        \"value\": \";#\",\n        \"type\": \"select\",\n        \"values\": [\n          \";#\",\n          \";\",\n          \"#\"\n        ]\n      },\n      {\n        \"key\": \"inlineComments\",\n        \"label\": \"Allow comments after values\",\n        \"value\": false,\n        \"type\": \"checkbox\"\n      },\n      {\n        \"key\": \"delimiters\",\n        \"label\": \"Key delimiter\",\n        \"value\": \"=\",\n        \"type\": \"select\",\n        \"values\": [\n          \"=\",\n          \"=:\"\n        ]\n      },\n      {\n        \"key\": \"duplicateKeys\",\n        \"label\": \"Repeated keys\",\n        \"value\": \"error\",\n        \"type\": \"select\",\n        \"values\": [\n          \"error\",\n          \"first\",\n          \"last\"\n        ]\n      },\n      {\n        \"key\": \"duplicateSections\",\n        \"label\": \"Repeated sections\",\n        \"value\": \"error\",\n        \"type\": \"select\",\n        \"values\": [\n          \"error\",\n          \"merge\"\n        ]\n      },\n      {\n        \"key\": \"caseSensitive\",\n        \"label\": \"Case-sensitive names\",\n        \"value\": false,\n        \"type\": \"checkbox\"\n      },\n      {\n        \"key\": \"globalKeys\",\n        \"label\": \"Allow keys before the first section\",\n        \"value\": true,\n        \"type\": \"checkbox\"\n      },\n      {\n        \"key\": \"continuation\",\n        \"label\": \"Indented lines continue the previous value\",\n        \"value\": false,\n        \"type\": \"checkbox\"\n      }\n    ],\n    \"registrationFamily\": \"config-analysis-reference\",\n    \"inputMaxLength\": 200000,\n    \"inputErrorCode\": \"CONFIG_ANALYSIS_REFERENCE_TOO_LONG\",\n    \"note\": \"Edits INI files on your device and keeps every untouched line exactly as it was. Up to 200,000 characters, 5,000 lines and 100 edits.\",\n    \"inputKeywords\": [\n      {\n        \"id\": \"config-analysis-reference/ini-editor/edits.verb\",\n        \"kind\": \"command\",\n        \"code\": \"CONFIG_ANALYSIS_REFERENCE_EDIT_VERB\",\n        \"fold\": \"exact\",\n        \"values\": {\n          \"set\": [\n            \"set\"\n          ],\n          \"delete\": [\n            \"delete\"\n          ],\n          \"add\": [\n            \"add\"\n          ],\n          \"remove\": [\n            \"remove\"\n          ]\n        },\n        \"describedBy\": [\n          \"Start each edit with set, delete, add or remove.\",\n          \"Write each edit on its own line as set [section] key = value, delete [section] key, add [section] or remove [section].\"\n        ]\n      }\n    ],\n    \"experience\": {\n      \"automatic\": false,\n      \"single\": false,\n      \"inputMaxLength\": 200000,\n      \"inputMode\": \"text\",\n      \"label\": \"INI file\",\n      \"placeholder\": \"[server]\\nport = 8080\",\n      \"help\": \"Paste the whole file. Sections, comments and blank lines are kept as they are. Up to 200,000 characters. Review the settings before running.\",\n      \"action\": null\n    },\n    \"mode\": \"explicit\",\n    \"interactive\": false\n  },\n  \"execution\": \"Browser interface\",\n  \"api\": null,\n  \"browser_agent\": {\n    \"supported\": true,\n    \"name\": \"run_current_tool\",\n    \"discovery\": \"WebMCP on the human page in a supporting browser\",\n    \"verification\": \"See audit/API-AUDIT.md; availability is not verification\"\n  }\n}\n```\n\n## Page guide\n\nCheck an INI file against the dialect you choose and apply section and key edits without disturbing the rest of the file. Comments, spacing and line endings you did not edit stay exactly as they were.\n\nHow can we improve this tool?\n\nReport a problem or share an idea.\n\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\n\n### How to use INI editor\n\n1. Paste the INI file.\n2. Choose the dialect: comment characters, delimiter, repeated keys and case rules.\n3. Add edits such as set \\[server\\] port = 9090, one per line.\n4. Run the check and review the findings.\n5. Download the edited file and the JSON report.\n\n## Useful next steps\n\n- [TOML validator](https://happytails.ai/en/data-tools/toml-validator/) ([Markdown](https://happytails.ai/en/data-tools/toml-validator.md))\n\n- [Environment file validator](https://happytails.ai/en/developer-tools/environment-file-validator/) ([Markdown](https://happytails.ai/en/developer-tools/environment-file-validator.md))\n\n- [YAML validator](https://happytails.ai/en/developer-tools/yaml-validator/) ([Markdown](https://happytails.ai/en/developer-tools/yaml-validator.md))\n\n## Why the dialect matters\n\nINI has no single standard. Windows, Python configparser, Git and PHP read the same text differently, especially repeated keys, inline comments and indented lines. Happytails.ai makes each of these choices explicit so the findings and the edited file match the program that reads your file.\n\n### How editing keeps the file intact\n\nThe file is read line by line into a lossless structure that keeps every byte. An edit replaces only the value part of one line, or adds or removes whole lines. When you set a key that has no value and nothing follows its delimiter, the spacing before the delimiter is added after it too, so k = becomes k = 5; if an inline comment follows the empty value, the new value gets the same spacing before the comment, so the comment stays a comment. A new key goes after the last key of its section. It copies the delimiter and the spaces around it from the first key of that section, or from the first key in the file when the section has none; if that key has no value, its spacing before the delimiter is used on both sides. A file with no keys gets key = value. When repeated keys are allowed, set changes the value that wins under your rule.\n\n### Limits\n\nInterpolation such as ${section:key} or %(name)s and escape sequences are not interpreted; values are treated as plain text. Values you set must be one line without leading or trailing spaces. Findings refer to line numbers in the original file.\n"
}