Small tools. Clearer code.
Format a payload, check a timestamp or compare two snippets. Practical developer tools for the moment a small detail needs a closer look.
No account needed · Inputs stay in your browser
JSON formatter & validator
Validate, format or minify JSON without rounding large numbers or changing string content. Copy the result or download a JSON file.
Format JSON →{"id":9007199254740993,"enabled":false}Format JSON without changing the data →Unix timestamp converter
Convert Unix seconds or milliseconds to a UTC date, or an ISO date with an explicit timezone to Unix time. Check units without guessing.
Convert a timestamp →1704067200 seconds
= 2024-01-01T00:00:00.000ZDebug timestamps: seconds, milliseconds and timezones →Text & code diff checker
Compare two snippets line by line. See added and removed lines, check final newlines and optionally ignore trailing spaces. No code is executed.
Compare two texts →- return value || 3;
+ return value ?? 3;Read a code diff for behavior, not just changed lines →Loop boundary explorer
Change a JavaScript loop’s start, boundary and step. See the values it visits, the first failed condition and loops that never finish.
Explore a loop →for (let i = 0; i < 5; i += 1) {
console.log(i);
}Find an off-by-one error before running the loop →JavaScript truthiness explorer
Compare Boolean(value), logical OR and nullish coalescing for zero, empty strings, null, undefined, arrays and objects.
Compare default values →const retries = 0;
retries || "fallback"; // "fallback"
retries ?? "fallback"; // 0Keep zero: choosing between || and ?? in JavaScript →SQL JOIN & NULL filter explorer
Compare LEFT JOIN and INNER JOIN when filtering on a joined column in ON versus WHERE, and see how COUNT(*) differs from COUNT(column) on NULL-extended rows.
Explore SQL JOINs →SELECT c.name, COUNT(o.id)
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id AND o.status = 'paid'
GROUP BY c.id, c.name;Why a WHERE filter turns a LEFT JOIN into an INNER JOIN →Python iterator & mutable default explorer
Trace two classic Python state bugs side by side: one-shot generator exhaustion across two passes and shared mutable default list arguments across function calls.
Trace Python state →records = (n for n in [12, 18, 25])
has_adult = any(n >= 18 for n in records)
total = sum(records) # 25, not 55Trace exhausted Python iterators and shared mutable defaults →Incident log timeline explorer
Trace an interleaved gateway, checkout and ledger log stream. Separate the first timeout symptom from the underlying lock wait and non-idempotent retry.
Inspect log timeline →10:14:00.120 [LEDGER] WARN: waiting on row lock; commit will take 650ms
10:14:00.400 [GATEWAY] WARN: upstream timeout after 400ms on attempt=1Separate the first symptom from the root cause in service logs →Predict. Change. Explain.
Make a prediction before reading the result. Change one input, then explain the difference in your own words. These are open learning examples; they do not produce a diagnostic score.