Every codebase grows a utils/ folder of the same snippets: a retry with backoff, a slugify, a byte formatter, a CSV writer that gets quoting wrong. Lacspace wrote the correct versions of those, once, and shipped them dependency-free — a missing standard library across four small kits.

What’s inside

- Utils Kit — id (unique IDs), retry (backoff), case (camel/snake/kebab).
- Data Kit — xlsx (real Excel), csv (correct parse/format).
- DX Kit — humanize (bytes/dates/numbers), color (hex/rgb/hsl + WCAG contrast).
- Backend Kit — signed-url, pdf (no Chromium), webhooks, idempotency.
- …and extras — cache (LRU + TTL + SWR), money (integer minor-units + Intl), markdown (zero-dep MD→HTML).
Correct, not copy-pasted
import { retry } from '@lacspace/retry';
const data = await retry(() => fetchFlaky(), { tries: 5, backoff: 'exp' });
Real PDFs without spinning up Chromium, money that never loses a cent, CSV that quotes correctly, colour with a built-in WCAG check — the un-glamorous things, done right.
Get started
Browse them all at lacspace.com/packages and read the docs at lacspace.com/docs. They’re part of the 63-package zero-dependency ecosystem.
Frequently asked questions
What do the Utils, Data, DX and Backend kits cover?
The small, universal helpers every project reaches for — unique IDs, resilient retries and string-case (Utils); real Excel and correct CSV (Data); human-readable formatting and colour maths (DX); and server essentials like signed URLs, PDFs, webhooks and idempotency (Backend). Plus extras like caching, money and markdown. All zero-dependency and isomorphic.
Why not just copy-paste a retry or a slugify?
You can — until the edge cases bite (exponential backoff with jitter, Unicode in slugs, CSV quoting, timezone-correct humanize). These packages are the correct, tested versions of the snippets everyone re-writes, with no dependency tree attached.
Can I really make PDFs without headless Chromium?
Yes — @lacspace/pdf generates real PDFs with zero dependencies and no headless browser (no puppeteer, no pdfkit). It runs on Node, edge and the browser, with batteries-included invoice() and receipt() helpers plus a document builder.
What is idempotency and why do I need it?
It’s how you stop a retried request (a double-clicked “Pay” button, a webhook redelivery) from doing the work twice. @lacspace/idempotency gives you idempotency keys so the same operation runs once, safely.
Is money handling really that tricky?
Floating-point money is a classic bug source. @lacspace/money uses integer minor-units (cents/paisa), safe allocation (splitting a bill without losing a cent) and Intl formatting — so your totals are always exact.








