unrust

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.000Z
Debug 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"; // 0
Keep 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 55
Trace 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=1
Separate 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.