Compact decoding
The compact notation Claude writes instead of source, the 28 languages it covers, and where it is decoded.
Writing source is where a coding session spends most of its output budget. The
culp-emmet skill has Claude write a short, Emmet-like notation instead, and
the plugin expands it into real source before the file is written.
How a write actually happens
-
Claude calls
WriteorEditwith compact content. -
The plugin's
PreToolUsehook takes the compact content out of the tool call and posts it to the decoder, signed with this device's key. -
The decoder picks a language by explicit hint, then by its own confidence, then by file extension, parses the notation, and returns real source plus a receipt.
-
The hook hands the real source back as the tool's arguments, replacing only the field that held the compact content and preserving every other argument.
-
The tool writes decoded source.
Decoding happens before the mutation, never after it. An earlier design rewrote the file afterwards, which left a window in which a language server read the compact text and reported a screenful of deterministic errors against it.
The languages
Twenty-eight, each with its own decoder module and its own reference:
Ada, C, C++, C#, COBOL, CSS, Dart, Go, HTML, Java, JavaScript, JSX, Kotlin, Lua, Perl, PHP, Python, R, Ruby, Rust, SCSS, SQL, Swift, TypeScript, TSX, Visual Basic, XML, Zig.
Claude loads the reference for a language before writing compact source in it, and writes ordinary source for anything not on the list. Compact syntax is never invented for a language CULP does not cover.
What it costs you to have it
A decode is one HTTPS round trip on a file write, and it needs an active subscription. If the decoder cannot be reached, the write is refused rather than guessed at, and you write ordinary source instead.
Shell redirection is not covered. Write and Edit are tool calls the plugin
can intercept; printf 'x' > file.py in a Bash call is not decoded, and content
written that way lands exactly as typed.
Receipts
Every successful decode prints one line: the language, the file, the line count, whether the generated source parses, and an id. The receipt never contains the generated code, which is the whole point: putting the output back in the transcript would spend exactly the tokens the feature saves.
The consequence is worth knowing: after a compact write, Claude has not seen the file it just wrote. It has to read it before editing it.