Notes
Notes on the mess.
Short pieces on the situations the tools answer — where the text came from, why it broke, and what to do about it. Every number in them is measured by the engine when the page is built.
Sep 5, 2026
Why JSON.parse rejects the dict you copied out of a Python log
print() writes a dict with single quotes, True, False and None; JSON allows none of them. The four rules that differ, and how to fix the text you have.
Sep 5, 2026
Kibana Discover CSV export: the message column is JSON
A Discover export is a CSV with ECS columns and, in the message cell, the JSON your service logged, quotes doubled. How to read it as rows and open that cell.
Sep 5, 2026
Double-encoded JSON: how a payload ends up inside a string, and how to read it
SNS envelopes, SQS bodies, Kafka values, text columns, log fields: every hop that stores JSON as text adds a layer of backslashes. How to open them in place.
Sep 5, 2026
logfmt vs JSON logs: what a parser actually needs from a line
A timestamp, a level, a message and the key=value pairs after it turn text into records. Where logfmt and JSON lines fall short, and how a pasted log is read.
Sep 5, 2026
The ways a pasted JSON breaks
Unquoted keys, single quotes, trailing commas, Python literals, comments, a truncated line: where each way a pasted JSON breaks comes from, and the fix.
Sep 6, 2026
JSON from a model: the fence, the sentence after it, and the cut at max_tokens
A model answers with a sentence, a ```json fence and another sentence; JSON.parse refuses the first word. One fix unwraps it; a cut at max_tokens is closed.
Sep 6, 2026
SNS to SQS: why your Lambda calls JSON.parse twice
An SQS event’s body is the SNS envelope as a string; its Message is your event as a string. Where each layer comes from, and how the record opens in one click.
Sep 6, 2026
Fine-tuning JSONL: the four ways the upload refuses the file
A byte-order mark, a record pretty-printed over lines, a trailing comma, a .json array: why a fine-tuning file is refused, each named on its line and fixed.