| | |

Prettier 04 ๐ŸŽจ The .prettierrc File โ€” Configuration formats & resolution order

โฑ๏ธ Estimated read: 12 min | |

Prettier’s configuration file is deceptively simple. It is an object with a small set of options. But the file that holds that object can take at least a dozen different forms, from a JSON file named .prettierrc to a TypeScript module named prettier.config.ts, to a "prettier" key buried inside package.json. Prettier resolves these in a strict precedence order, and the resolution process starts not at the project root but at the directory of the file being formatted, walking upward until it finds a configuration or reaches the filesystem root.

This chapter covers the configuration formats Prettier accepts, the precedence order when multiple formats coexist, the upward search algorithm that determines which configuration applies to a given file, and the deliberate absence of a global configuration mechanism. It also covers the overrides feature, which lets a single configuration apply different options to different files, and the parser option that must never appear at the top level.

Key point: Prettier does not have a global configuration. It resolves configuration per file, starting from that file’s location and searching upward. The first configuration found wins, and the format of that configuration is determined by a fixed precedence list, not by which file was created most recently.


Why configuration resolution works this way

The reproducibility problem. Prettier intentionally refuses to support global configuration. The documentation states the reason directly: to ensure that when a project is copied to another computer, Prettier’s behavior stays the same . A global configuration would mean that the formatting of a project depends on the machine it is formatted on, not on the project itself. That defeats the purpose of a formatter that guarantees consistent output across a team.

The monorepo problem. A single project might contain multiple packages, each with its own formatting conventions. A per-file, upward-searching resolution algorithm handles this: a file in packages/legacy/ can use a different configuration than a file in packages/modern/, because Prettier finds the nearest configuration first. The resolution does not assume that one configuration applies to an entire repository.

The format proliferation problem. Prettier accepts many configuration formats because different projects have different needs. A simple project can use a JSON .prettierrc. A project that needs computed values or conditional logic can use a JavaScript or TypeScript configuration. A project that already uses TOML for other tooling can use .prettierrc.toml. The precedence order exists to resolve the ambiguity when a project contains more than one format, which happens more often than it should.


a. The configuration formats

Prettier accepts configuration through the following mechanisms, listed in order of precedence :

// 1. A "prettier" key in package.json (highest precedence)
{
  "name": "my-project",
  "prettier": {
    "semi": false,
    "singleQuote": true
  }
}
# 2. A .prettierrc file written in JSON or YAML
# .prettierrc (YAML is valid here)
semi: false
singleQuote: true
// 3. Explicit-extension JSON or YAML variants
// .prettierrc.json, .prettierrc.yml, .prettierrc.yaml, .prettierrc.json5
{
  "semi": false,
  "singleQuote": true
}
// 4. JavaScript or TypeScript configurations
// .prettierrc.js, prettier.config.js, .prettierrc.ts, prettier.config.ts
// The module system (ESM or CommonJS) depends on package.json "type"
export default {
  semi: false,
  singleQuote: true,
};
// 5. Explicit ESM configurations
// .prettierrc.mjs, prettier.config.mjs, .prettierrc.mts, prettier.config.mts
export default {
  semi: false,
  singleQuote: true,
};
// 6. Explicit CommonJS configurations
// .prettierrc.cjs, prettier.config.cjs, .prettierrc.cts, prettier.config.cts
module.exports = {
  semi: false,
  singleQuote: true,
};
# 7. TOML configuration (lowest precedence)
# .prettierrc.toml
semi = false
singleQuote = true

The precedence order matters when multiple formats exist in the same directory. A "prettier" key in package.json wins over a .prettierrc file, which wins over .prettierrc.json, and so on. In practice, having more than one format in the same directory is a configuration error, not a feature. The precedence list exists to define behavior in that case, not to encourage it.

b. The resolution algorithm

The configuration file is resolved starting from the location of the file being formatted and searching up the file tree until a configuration file is found . This is not a search for “the project’s configuration”; it is a search for “the nearest configuration to this file.”

Consider a repository with this structure:

repo/
โ”œโ”€โ”€ .prettierrc           (semi: true)
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ app.js
โ””โ”€โ”€ packages/
    โ””โ”€โ”€ legacy/
        โ”œโ”€โ”€ .prettierrc   (semi: false)
        โ””โ”€โ”€ old.js

Formatting src/app.js searches src/, then repo/, finds repo/.prettierrc, and uses semi: true. Formatting packages/legacy/old.js searches packages/legacy/, finds packages/legacy/.prettierrc, and uses semi: false. The inner configuration wins because it is found first. The search never proceeds upward past the first match.

If no configuration is found anywhere in the tree, Prettier uses its built-in defaults. There is no fallback to a global configuration, because Prettier does not support one .

c. Overrides: per-file configuration

A single configuration file can apply different options to different files using the overrides key. Each override entry requires a files pattern, which may be a string or an array of strings. An optional excludeFiles pattern excludes files from that override .

{
  "semi": true,
  "singleQuote": true,
  "overrides": [
    {
      "files": ["*.json", "*.jsonc"],
      "options": {
        "trailingComma": "none"
      }
    },
    {
      "files": "legacy/**/*.js",
      "excludeFiles": "legacy/vendor/**/*.js",
      "options": {
        "semi": false
      }
    }
  ]
}

The files patterns are matched against the file path relative to the directory containing the configuration file, not the current working directory. A pattern without a /, such as *.html, matches against the file name alone and applies at any depth .

d. The parser option and its restriction

The parser option tells Prettier which parser to use. By default, Prettier infers the parser from the file extension. The parser option can be set inside an override to handle files that Prettier does not recognize by extension, but it must never appear at the top level of the configuration.

The documentation is explicit about this: putting parser at the top level disables Prettier’s automatic extension-based inference and forces every file to use the specified parser, including CSS files parsed as JavaScript . This is not a configuration choice; it is a misconfiguration that breaks formatting for every file type the project contains.


Complete Example Session

// ============================================
// PART 1: MINIMAL package.json CONFIGURATION
// ============================================
{
  "name": "my-project",
  "prettier": {
    "semi": false,
    "singleQuote": true
  }
}
// Highest precedence. Wins over any .prettierrc file
// in the same directory.
# ============================================
# PART 2: .prettierrc AS YAML
# ============================================
# .prettierrc (no extension, YAML content)
semi: false
singleQuote: true
printWidth: 100
// ============================================
// PART 3: .prettierrc.json WITH EXPLICIT EXTENSION
// ============================================
{
  "semi": false,
  "singleQuote": true,
  "printWidth": 100
}
// Lower precedence than .prettierrc (no extension)
// but same directory.
// ============================================
// PART 4: JAVASCRIPT CONFIGURATION (ESM)
// ============================================
// prettier.config.js with "type": "module" in package.json
export default {
  semi: false,
  singleQuote: true,
  overrides: [
    {
      files: "*.md",
      options: { proseWrap: "always" },
    },
  ],
};
// ============================================
// PART 5: COMMONJS CONFIGURATION
// ============================================
// .prettierrc.cjs
module.exports = {
  semi: false,
  singleQuote: true,
};
// Explicit .cjs extension forces CommonJS regardless
// of package.json "type".
# ============================================
# PART 6: TOML CONFIGURATION
# ============================================
# .prettierrc.toml
semi = false
singleQuote = true
printWidth = 100
// ============================================
// PART 7: OVERRIDES FOR DIFFERENT FILE TYPES
// ============================================
{
  "semi": true,
  "overrides": [
    {
      "files": ["*.json", "*.jsonc"],
      "options": { "trailingComma": "none" }
    },
    {
      "files": "legacy/**/*.js",
      "excludeFiles": "legacy/vendor/**/*.js",
      "options": { "semi": false }
    }
  ]
}
// ============================================
// PART 8: PARSER IN AN OVERRIDE (CORRECT)
// ============================================
{
  "overrides": [
    {
      "files": ".prettierrc",
      "options": { "parser": "json" }
    }
  ]
}
// Teaches Prettier to format its own config file.
// parser is inside overrides, not at the top level.
// ============================================
// PART 9: PARSER AT TOP LEVEL (WRONG)
// ============================================
{
  "parser": "babel"
}
// This forces babel for every file type.
// CSS, JSON, and Markdown will fail to parse.
// Never do this.
// ============================================
// PART 10: MONOREPO RESOLUTION
// ============================================
// repo/.prettierrc           โ†’ semi: true
// repo/packages/legacy/.prettierrc โ†’ semi: false
//
// Formatting repo/src/app.js:
//   Search: repo/src/ โ†’ repo/ โ†’ found (semi: true)
//
// Formatting repo/packages/legacy/old.js:
//   Search: repo/packages/legacy/ โ†’ found (semi: false)
//   Inner config wins; search stops at first match.

The ten parts covered the package.json key, YAML .prettierrc, explicit JSON extension, ESM JavaScript, CommonJS, TOML, overrides, parser inside overrides, the parser top-level error, and monorepo resolution behavior.


Quick Reference

Configuration precedence (highest to lowest)

OrderFormat
1"prettier" key in package.json
2.prettierrc (JSON or YAML, no extension)
3.prettierrc.json, .prettierrc.yml, .prettierrc.yaml, .prettierrc.json5
4.prettierrc.js, prettier.config.js, .prettierrc.ts, prettier.config.ts
5.prettierrc.mjs, prettier.config.mjs, .prettierrc.mts, prettier.config.mts
6.prettierrc.cjs, prettier.config.cjs, .prettierrc.cts, prettier.config.cts
7.prettierrc.toml

Resolution behavior

BehaviorDetail
Search startDirectory of the file being formatted
Search directionUpward through the file tree
Search stopFirst configuration found
Global configurationNot supported
No configuration foundBuilt-in defaults apply

Overrides keys

KeyRequiredPurpose
filesYesGlob(s) matching files for this override
excludeFilesNoGlob(s) excluding files from this override
optionsYesPrettier options to apply

Best Practices

โœ… Do This:

// Use one configuration format per directory
{ "semi": false, "singleQuote": true }                  // โœ…
// Use overrides for file-type-specific options
{ "overrides": [{ "files": "*.md", "options": { "proseWrap": "always" } }] } // โœ…
// Put parser only inside overrides
{ "overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }] } // โœ…
// Use JavaScript config when computed values are needed
export default { semi: !process.env.CI };                // โœ…
# Verify which config applies to a file
npx prettier --find-config-path src/app.js               # โœ…

โŒ Don’t Do This:

// Put parser at the top level
{ "parser": "babel" }                                    // โŒ
// Create multiple config formats in the same directory
// (.prettierrc and .prettierrc.json together)           // โŒ
# Expect a global config to apply
prettier --write .                                       # โŒ (no global config)
// Assume the root config applies everywhere in a monorepo
// Inner configs win; the root config is only for files
// not covered by a nearer config                          // โŒ
// Use .prettierrc with JSON content but no extension
// (it works, but the format is ambiguous)                // โŒ

Common Pitfalls

PitfallWhy It HappensFix
Formatting differs between directoriesA nearer config overrides the root configCheck --find-config-path for each file
CSS files fail to parseparser at top level forces JavaScript parserRemove top-level parser; use overrides if needed
Config changes have no effectA higher-precedence format exists in the same directoryRemove duplicate config formats
Monorepo package formats differentlyInner config found before root configAccept the behavior; that is the design
.prettierrc not recognizedFile has invalid JSON or YAML syntaxValidate syntax; use explicit extension

Real-World Examples

1. Minimal package.json config

{ "prettier": { "semi": false, "singleQuote": true } }

2. Empty YAML .prettierrc

# .prettierrc
{}

3. JavaScript config with overrides

export default {
  semi: false,
  overrides: [{ files: "*.md", options: { proseWrap: "always" } }],
};

4. CommonJS config

module.exports = { semi: false, singleQuote: true };

5. TOML config

semi = false
singleQuote = true

6. Override for JSON files

{ "overrides": [{ "files": "*.json", "options": { "trailingComma": "none" } }] }

7. Override with excludeFiles

{ "overrides": [{ "files": "legacy/**/*.js", "excludeFiles": "legacy/vendor/**", "options": { "semi": false } }] }

8. Parser inside override

{ "overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }] }

9. Find config for a file

npx prettier --find-config-path src/app.js

10. Monorepo with inner config

# repo/.prettierrc
# repo/packages/legacy/.prettierrc
# legacy files use the inner config

Visual

Configuration precedence per directory

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  SAME DIRECTORY: WHICH CONFIG WINS?                          โ”‚
โ”‚                                                              โ”‚
โ”‚  package.json "prettier" key     โ† highest                  โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc (JSON or YAML)                                 โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc.json / .yml / .yaml / .json5                   โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc.js / prettier.config.js / .ts                  โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc.mjs / .mts                                     โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc.cjs / .cts                                     โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  .prettierrc.toml                โ† lowest                   โ”‚
โ”‚                                                              โ”‚
โ”‚  Only the highest-precedence format is used.                 โ”‚
โ”‚  Lower-precedence formats in the same directory are ignored. โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Upward search resolution

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  RESOLUTION FOR packages/legacy/old.js                       โ”‚
โ”‚                                                              โ”‚
โ”‚  Start: packages/legacy/                                     โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  Check for config in packages/legacy/                        โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ”œโ”€โ”€ Found .prettierrc โ”€โ”€โ–บ Use it, STOP                โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ””โ”€โ”€ Not found โ”€โ”€โ–บ Go up one directory                 โ”‚
โ”‚                            โ”‚                                 โ”‚
โ”‚                            โ–ผ                                 โ”‚
โ”‚                     Check packages/                          โ”‚
โ”‚                            โ”‚                                 โ”‚
โ”‚                            โ”œโ”€โ”€ Found โ”€โ”€โ–บ Use it, STOP        โ”‚
โ”‚                            โ”‚                                 โ”‚
โ”‚                            โ””โ”€โ”€ Not found โ”€โ”€โ–บ Go up          โ”‚
โ”‚                                              โ”‚               โ”‚
โ”‚                                              โ–ผ               โ”‚
โ”‚                                       Check repo/            โ”‚
โ”‚                                              โ”‚               โ”‚
โ”‚                                              โ”œโ”€โ”€ Found โ”€โ”€โ–บ Useโ”‚
โ”‚                                              โ”‚               โ”‚
โ”‚                                              โ””โ”€โ”€ Not found โ”€โ”€โ–บโ”‚
โ”‚                                                   Defaults    โ”‚
โ”‚                                                              โ”‚
โ”‚  The first match wins. The search never continues upward      โ”‚
โ”‚  after a config is found.                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Monorepo with nested configs

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  MONOREPO STRUCTURE                                          โ”‚
โ”‚                                                              โ”‚
โ”‚  repo/                                                       โ”‚
โ”‚  โ”œโ”€โ”€ .prettierrc          (semi: true)                      โ”‚
โ”‚  โ”œโ”€โ”€ src/                                                    โ”‚
โ”‚  โ”‚   โ””โ”€โ”€ app.js          โ†’ uses repo/.prettierrc            โ”‚
โ”‚  โ”‚                                                           โ”‚
โ”‚  โ””โ”€โ”€ packages/                                               โ”‚
โ”‚      โ”œโ”€โ”€ modern/                                             โ”‚
โ”‚      โ”‚   โ””โ”€โ”€ new.js      โ†’ uses repo/.prettierrc            โ”‚
โ”‚      โ”‚                                                       โ”‚
โ”‚      โ””โ”€โ”€ legacy/                                             โ”‚
โ”‚          โ”œโ”€โ”€ .prettierrc  (semi: false)                     โ”‚
โ”‚          โ””โ”€โ”€ old.js      โ†’ uses legacy/.prettierrc          โ”‚
โ”‚                                                              โ”‚
โ”‚  legacy/old.js finds the legacy config first.                โ”‚
โ”‚  src/app.js and modern/new.js walk up to repo/.prettierrc.  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Overrides processing

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  OVERRIDES PROCESSING                                        โ”‚
โ”‚                                                              โ”‚
โ”‚  Base options from config:                                   โ”‚
โ”‚    semi: true                                                โ”‚
โ”‚    singleQuote: true                                         โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  File being formatted: legacy/old.js                         โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  Check overrides in order:                                   โ”‚
โ”‚    override 1: files: "*.json" โ”€โ”€โ–บ no match                 โ”‚
โ”‚    override 2: files: "legacy/**/*.js" โ”€โ”€โ–บ match            โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  Merge override options onto base:                           โ”‚
โ”‚    semi: false  (from override)                              โ”‚
โ”‚    singleQuote: true (from base, not overridden)            โ”‚
โ”‚       โ”‚                                                      โ”‚
โ”‚       โ–ผ                                                      โ”‚
โ”‚  Final options for legacy/old.js                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Summary

ItemValue
Highest precedence"prettier" key in package.json
Lowest precedence.prettierrc.toml
Resolution startDirectory of the file being formatted
Resolution directionUpward, first match wins
Global configurationNot supported
Overrides keyoverrides, with files, excludeFiles, options
Parser restrictionOnly inside overrides, never at top level
Search verificationprettier --find-config-path <file>

Key takeaways:

  • Configuration is resolved per file, not per project. The search starts at the file’s directory and stops at the first configuration found. Inner configurations override outer ones by being found first.
  • The precedence order resolves format ambiguity. If multiple configuration formats exist in the same directory, package.json wins, then extensionless .prettierrc, then explicit extensions, then JavaScript variants, then TOML.
  • Global configuration is deliberately absent. Prettier refuses to support it because a global config makes formatting depend on the machine, not the project.
  • overrides applies different options to different files within one configuration. The files pattern is matched relative to the configuration file’s directory, not the current working directory.
  • parser at the top level breaks everything. It disables extension-based inference and forces one parser on every file type. Use it only inside overrides.
  • Monorepos work because of the upward search. A package can have its own configuration, and files within that package use it without affecting files in other packages.

Remember: The .prettierrc file is not a project-level setting. It is a node in a per-file lookup chain. A file’s formatting is determined by the nearest configuration above it, and that configuration’s format is determined by the precedence list, not by which file was created first. This design exists to make formatting reproducible across machines and predictable across monorepos. The two mistakes that cause the most confusion are expecting a root configuration to apply everywhere (it does not, if a nearer configuration exists) and putting parser at the top level (which forces every file through one parser). Keep configuration minimal, keep one format per directory, and use --find-config-path when the output does not match expectations.

Was this helpful?


Stop using slow, ad-bloated tool sites! ๐Ÿคฎ

๐Ÿ”Ž Search “KandZ Tools” on Google to use many professional utilities for free.

KandZ.me is the ultimate minimalist hub for:
โœ… Finance (Mortgage, Interest, Inflation)
โœ… Tech (Base64, JSON, Dev Suite, IP)
โœ… Health (BMI, BMR, TDEE)
โœ… Productivity (Timer, Workspace, QR)

โšก๏ธ Fast & Private
๐Ÿ”’ No data leaves your device
๐Ÿ’Ž 100% Free

๐Ÿ”— Use it now: https://tools.kandz.me
๐Ÿ”– Bookmark itโ€”youโ€™ll need it later!