Format + full ecosystem

Easy to read, type, and edit.
No extra symbols.

service.ktav
## A SOCKS5 rotator config.
service: socks5-rotator
port: 20082
debug: true

upstreams: [
    { host: a.example, weight: 0.7 }
]

## dotted keys = flat nesting
node.host: a.example
## '::' forces a literal string
node.auth:: p@ss:word
{ ktav: lang }
Playground

Convert, both ways

How it stacks up

Ktav vs JSON · YAML · TOML · INI

Feature JSON YAML TOML INI Ktav

✓ present · ~ partial · ✕ absent

Install

Seven languages, one Rust core

Editor plugins — direct download

Why ktav?

Why another config format?

Isn't JSON / YAML / TOML enough?

JSON is hostile to hand-edit — quotes, commas, no comments. YAML fixes the ergonomics but adds traps: significant indentation and silent type coercion (the infamous no → false “Norway” bug). TOML is solid but splits tables vs inline. Ktav keeps JSON's shape and drops the punctuation tax — without inheriting YAML's surprises.

What actually makes it different?

Types are inferred by strict lexical form: only true/false/null and a strict number grammar are typed — everything else is a string, and :: forces a literal when you need it. No guessing. Plus dotted keys for flat edits, multi-line strings, and one small spec with one parser.

Is it just another lonely format?

No — and that's the point. On day one Ktav ships official parsers for 7 languages over a single Rust core, a tree-sitter grammar, an LSP, VS Code / JetBrains plugins, and a language-agnostic conformance suite. Identical behaviour everywhere, verified by tests.

When should you NOT use it?

Ktav is a configuration language, not a data-interchange format — don't swap it for JSON in an API. If you need schemas, types and logic inside the config itself, tools like CUE or Dhall go further. Ktav deliberately stays small and readable.