Docs

How OddLab tools work, what they deliberately do not do, and the known limits of every tool — written down once, in one place.

How this site works

Every tool on OddLab runs entirely in your browser. Your files and text are processed on your own device — they are not uploaded to a server to be converted or stored.

Tools are single files with no build step and no external code dependencies (the PDF tools carry their own embedded PDF engine). They keep working offline once loaded, and each one can be saved locally and used as a standalone page.

Where a tool cannot do something — or does it with caveats — the limit is listed below under that tool. We publish real numbers measured from real output, never unconditioned percentage claims.

Known limits by tool

converter

Number Base Converter

Honest limits: fractions truncate — non-terminating expansions (0.1 in decimal → binary) are cut at the chosen fractional-digit limit and never shown as exact; a "truncated" badge marks them. Negative numbers appear as a plain minus sign and magnitude in the rows; two's complement exists only in the bit grid, at fixed widths up to 64 bits. Bitwise operations are capped at 64-bit widths by the visualization. The bytes pane speaks UTF-8 and latin-1 only — no legacy encodings like Shift-JIS. There is no arithmetic in arbitrary bases here; that is a calculator's job. Non-integer, negative, and complex bases are out of scope. Results are uppercase; input is accepted in any case.

Color Converter

Honest limits: CMYK is formula-only (naive rgb→cmyk) — a screen estimate, not a print profile, and real print output will differ because no ICC profiles are involved. LAB/LCH conversions use a D65 white point at roughly 1-decimal precision and are sRGB-based. Contrast math assumes sRGB and the standard WCAG formulas; wide-gamut rendering can differ from the computed ratio. Color-name matching is approximate — the nearest name is picked in plain RGB space, which is a crude stand-in for perceptual distance. Browser color-picker widget styling is limited by the browser itself. No color blindness simulation in this version.

Image Format Converter

Honest limits: this tool reads what your browser can decode — typically PNG, JPEG, WEBP, GIF (first frame only), BMP and ICO. RAW, PSD, TIFF and HEIC are out (except HEIC on recent Safari), and SVG input is rasterized at the chosen size. Animated GIF/WEBP/APNG converts as frame 1 only; there is no animated output. PNG output size is not tunable, and canvas works in an sRGB-ish space, so wide-gamut (Display P3) images may shift color. Very large images (around 16k px per side, less on iOS Safari) can fail on memory; the queue decodes and converts one file at a time. WEBP encoding needs a browser that supports it (Safari 16.4 or newer on Apple devices).

Unit Converter

Honest limits: no currency by design — exchange rates need a live feed and this tool works offline. Exotic historical units (Planck length, Roman cubit) are deliberately left out; extreme ratios may round. Data storage shows SI (kB = 1000) and IEC (KiB = 1024) as separate units to remove the classic ambiguity.

pdf

Compress PDF

Honest limits: password-protected PDFs can't be opened here — remove the password first. Text-heavy and vector-heavy PDFs contain little to compress: this tool tells you before you run, and it never promises a percentage. Embedded fonts are not subset or stripped. JPEG 2000, JBIG2 and CCITT fax images, indexed/CMYK images, and images with transparency masks pass through untouched. We cannot match Ghostscript or Adobe on pathological files — when our output would be larger, you keep your original file. Everything is processed in memory in your browser: very large scanned PDFs can exhaust the tab, and there is no server fallback — that is the trade for your file never leaving your device.

Merge PDF

Honest limits: password-protected PDFs can't be opened here — remove the password first. Office documents (DOC/DOCX/XLS/PPT) are not converted; export them to PDF in their app first. Page content is copied exactly as stored — no re-render, so page quality is unchanged — while linearization and tagged-PDF structure trees may not be preserved. Form fields are carried per page but can collide when the same field name appears in several inputs; the merge warns when it detects forms. Everything is processed in memory, so very large merges (hundreds of pages, hundreds of MB) can exhaust the tab — this tool warns before it tries.

Rotate PDF

Honest limits: password-protected PDFs can't be opened here — remove the password first. Rotation is written as the PDF page's view-rotation flag (/Rotate) — every mainstream viewer honors it, but some old or niche viewers and raw-image extractors ignore the flag. Pages are never re-rendered or redrawn, which is exactly why quality is preserved — there is no "rotate the text layer only" mode. Rotation cannot crop, straighten, or de-skew: a scan tilted by 3 degrees stays tilted by 3 degrees. Processing happens in memory, so extremely large PDFs can exhaust the tab; there is no upload or server fallback.

Split PDF

Honest limits: password-protected PDFs can't be opened here — remove the password first. In "max file size" mode a split file always holds at least one whole page, so a single page bigger than your cap stays bigger — the tool tells you which page when that happens. Pages are copied exactly as stored (no re-render), so quality is untouched; container bytes per page differ slightly from the source. All output is built in memory and the ZIP is stored uncompressed — very large outputs can exhaust the tab, and this tool asks before creating more than 100 files. Splitting by bookmark or heading is not offered here; ranges are page numbers only.

text document

Bold-First Reader

Honest limits: bold plus dimmed contrast is uncomfortable for some low-vision and autistic readers — the plain text view above is one click away and the input is never changed. Dimming uses inline opacity, which some destinations strip (bold usually survives, dimming may not). Markdown has no way to express dimming, so Markdown output carries the bold leads only. Very large pastes are rendered in chunks to keep the page responsive, but per-word markup is still real DOM weight. PDF and e-book import/export are deliberately out of scope. Everything runs in your browser; nothing is uploaded.

Case Converter

Honest limits: Sentence Case cannot know proper nouns — it will not capitalize names or places on its own (the abbreviation guard only protects known abbreviations). Casing is locale-independent JavaScript casing, so edge cases like ß/SS, Turkish dotted i, and ligatures may surprise. aLtErNaTiNg and iNVERSE cASE are toys: they break search, screen readers, and copy-paste semantics. Styled-Unicode "font" output is deliberately not included — the glyphs are accessibility-hostile. Everything runs in your browser; nothing is uploaded.

Lorem Ipsum Generator

Honest limits: only the classic opening is authentic Latin — everything else is pseudo-Latin recombined from an embedded word list, which is how every generator of this kind works; it is not grammatical Latin and the letter distribution is approximate. The "Bytes" unit trims the generated text to at most the requested UTF-8 size (ending on a word boundary when possible; HTML/Markdown markup adds extra bytes on top; the counter shows the real output size). "Bytes" is UTF-8 bytes, which differs from character count for non-ASCII text. Without a seed, randomness is ordinary, not cryptographic. Everything runs in your browser; nothing is uploaded.

Text Cleaner

Honest limits: aggressive cleanup is your call — this tool cannot tell intentional spacing from accidental. Trimming and collapsing also affect deliberate non-breaking spaces and zero-width characters; the report tells you what changed but cannot know what you meant. HTML stripping is regex-level, not a real parser — malformed markup may survive. "Join all line breaks" inserts one space at every break, which is wrong for hard-wrapped URLs or code lines. No grammar or spell fixing here. Everything runs in your browser; nothing is uploaded.