# INI editor

- Human page: https://happytails.ai/en/developer-tools/ini-editor/
- Markdown: https://happytails.ai/en/developer-tools/ini-editor.md
- Structured JSON: https://happytails.ai/agents/en/developer-tools/ini-editor/index.json
- Visibility: public

## Tool capabilities

| Property | Value |
| --- | --- |
| Tool ID | `ini-editor` |
| Category | developer-tools |
| Implementation | Registered implementation. Registration alone is not a production-quality guarantee. |
| Browser execution | Use the visible action or interactive controls. |
| Browser processing | Browser; see tool notes for network behavior. |
| HTTP API | Not callable through HTTP. |
| Browser-agent interface | run_current_tool |

### Implementation notes

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.

### Inputs and settings

Text input: INI file.

Example or placeholder shown in the interface (not a validated fixture):

```text
[server]
port = 8080
```

Paste the whole file. Sections, comments and blank lines are kept as they are. Up to 200,000 characters. Review the settings before running.

| Setting | Meaning | Control type | Default | Constraints |
| --- | --- | --- | --- | --- |
| `edits` | Edits | textarea | "" |  |
| `commentChars` | Comment characters | select | ";#" | Allowed: ;#, ;, # |
| `inlineComments` | Allow comments after values | checkbox | false |  |
| `delimiters` | Key delimiter | select | "=" | Allowed: =, =: |
| `duplicateKeys` | Repeated keys | select | "error" | Allowed: error, first, last |
| `duplicateSections` | Repeated sections | select | "error" | Allowed: error, merge |
| `caseSensitive` | Case-sensitive names | checkbox | false |  |
| `globalKeys` | Allow keys before the first section | checkbox | true |  |
| `continuation` | Indented lines continue the previous value | checkbox | false |  |

### Browser-agent workflow

1. Open the human page in a browser that supports WebMCP.
2. Discover the interface exposed by that page; use its actual schema.
3. Select files on the page first when the tool requires files.
4. Call `run_current_tool` with valid input and settings.
5. Inspect the returned result or error and the displayed output. Retrieve files from the displayed download links.

Calls do not automatically copy or download results. Browser permissions still apply. Interface availability alone is not proof of successful execution.

### Planning specification

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.

This describes intended requirements. Use the implementation notes, interface schema and observed output to determine current support.

### Complete machine-readable capability record

```json
{
  "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"
  }
}
```

## Page guide

Check 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.

How can we improve this tool?

Report a problem or share an idea.

Please leave out private information. Your message and the tool name go to our team via PostHog.

### How to use INI editor

1. Paste the INI file.
2. Choose the dialect: comment characters, delimiter, repeated keys and case rules.
3. Add edits such as set \[server\] port = 9090, one per line.
4. Run the check and review the findings.
5. Download the edited file and the JSON report.

## Useful next steps

- [TOML validator](https://happytails.ai/en/data-tools/toml-validator/) ([Markdown](https://happytails.ai/en/data-tools/toml-validator.md))

- [Environment file validator](https://happytails.ai/en/developer-tools/environment-file-validator/) ([Markdown](https://happytails.ai/en/developer-tools/environment-file-validator.md))

- [YAML validator](https://happytails.ai/en/developer-tools/yaml-validator/) ([Markdown](https://happytails.ai/en/developer-tools/yaml-validator.md))

## Why the dialect matters

INI 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.

### How editing keeps the file intact

The 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.

### Limits

Interpolation 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.
