npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

lacspace-enrich

v0.2.2

Published

Free, open-source company + contact enrichment — turn a domain, URL or email into a profile: name, description, logo, emails, phones, socials, address, tech stack, DNS/SPF/DMARC/DKIM deliverability, RDAP registration, key-page discovery and email-pattern

Readme

lacspace-enrich

Free, open-source company + contact enrichment. Give it a domain, URL or email and it builds a profile from open sources — name, description, logo, emails, phones, socials, address and tech stack — no paid API. v0.2 adds DNS/deliverability signals (MX, SPF, DMARC, DKIM), domain registration via RDAP, email-pattern guessing, categorized tech detection with confidence + versions, and key-page discovery (contact/about/careers/pricing/blog/status). Batch a whole list and export to JSON/CSV/Excel. Built on the lacspace-scraper engine.

npx lacspace-enrich acme.com --dns --rdap -v

What's new in 0.2.2

  • Runs on the current scraper engine. The dependency range ^0.1.0 pinned lacspace-scraper to 0.1.0 (0.x versions don't upgrade across minors), so every engine fix since then was missing here. It now requires lacspace-scraper 0.2.2. Company profiles no longer list dates, asset ids and SVG path data as phone numbers.

What you get

For each input, a profile with:

  • name & description — from OpenGraph, JSON-LD or the page title (cleaned)
  • logo — from JSON-LD, og:image or the favicon
  • emails & phones — scraped from the home page (and /contact, /about if needed)
  • socials — Facebook, Instagram, WhatsApp, LinkedIn, X, YouTube, TikTok, Telegram
  • address — from schema.org PostalAddress when present
  • tech stack — detected platforms/libraries (WordPress, Shopify, Wix, Next.js, Cloudflare, GA…)
  • pages (v0.2) — discovered contact / about / careers / pricing / blog / rss / status URLs
  • dns (v0.2, --dns) — MX + mail provider, SPF policy, DMARC policy, DKIM presence, catch-all hint, plus MX-verification of every email found
  • registration (v0.2, --rdap) — registrar, created/updated/expiry dates, nameservers, status (open, keyless RDAP)
  • techDetailed (v0.2) — the same detections categorized (cms/framework/analytics/ads/cdn/ecommerce/payment/hosting/fonts/tag-manager/…), each with a confidence, the matching signal and a version where visible
  • sources (v0.2, -v) — per-field confidence + where each value came from

It reads schema.org JSON-LD heavily (Organization / LocalBusiness) — so structured sites give clean, rich data. Everything new is additive: old fields, flags and exports are unchanged.

CLI

npx lacspace-enrich <domain|url|email> [more…] [options]
npx lacspace-enrich guess "<Full Name>" <domain> [options]

| Option | Meaning | | --- | --- | | -d, --domain <x> | A domain, URL or email (repeatable) | | --domains <list> | Comma-separated list | | -i, --input <file> | One domain/email per line from a file | | --no-contact-pages | Don't fetch /contact & /about for extra emails | | --no-pages | Skip key-page discovery | | --dns | Add DNS/deliverability signals (MX, SPF, DMARC, DKIM) + MX-verify emails | | --rdap | Add domain registration via RDAP (registrar, dates, nameservers) | | --assets <dir> | Download each site's logo + favicon into <dir> | | --concurrency <n> | Parallel lookups (default 4) | | --timeout <ms> | Per-request timeout | | --rate <ms> | Minimum gap between requests to the same host (rate limit) | | --resume | Skip domains already present in the --out file, append the rest | | --fields <a,b,c> | Keep only these columns in csv/xlsx (in this order) | | -v, --verbose | Print per-field confidence + source notes | | -f, --format <fmt> | json · ndjson · csv · xlsx (default json) | | -o, --out <file> | Output file, or - for stdout |

Examples

# One company, pretty JSON
npx lacspace-enrich stripe.com

# Full picture: deliverability + registration + provenance
npx lacspace-enrich acme.com --dns --rdap -v

# From an email → its company
npx lacspace-enrich [email protected] -f csv

# A whole list into a spreadsheet (socials + new columns become columns)
npx lacspace-enrich --input domains.txt --dns -f xlsx -o companies.xlsx

# Resumable, polite batch (skip done, throttle per host, pick columns)
npx lacspace-enrich --input domains.txt --resume --rate 800 \
  --fields domain,name,mailProvider,validEmails,registrar -f csv -o enriched.csv

# Save logos + favicons to a folder
npx lacspace-enrich acme.com --assets ./logos

# Guess a person's likely email; a known colleague reveals the org pattern
npx lacspace-enrich guess "Jane Doe" acme.com --known "Bob Smith:[email protected]"

CSV/Excel output flattens the profile — emails/phones joined, each social network its own column, tech comma-joined. v0.2 adds columns only when the data is present (hasMx, mailProvider, spf, dmarc, dkim, validEmails, registrar, created, expires, nameServers, page_*, techCategories, savedLogo/savedFavicon), so existing (feature-off) output is unchanged. Use --fields to pick exactly the columns your CRM wants.

Library

import { enrichDomain, enrichMany } from "lacspace-enrich";

const profile = await enrichDomain("acme.com", { dns: true, rdap: true });
// { domain, name, description, logo, emails, phones, socials, address, tech, contactPage,
//   dns, emailStatus, registration, techDetailed, pages, sources }

const many = await enrichMany(["a.com", "b.com"], { concurrency: 6, perHostRateMs: 500 });

New building blocks are exported and unit-tested — most are pure:

import {
  guessEmails, detectPatternFromEmail, splitName,   // email-pattern guessing (pure)
  detectTechDetailed, groupTechByCategory,          // categorized tech (pure)
  discoverPages,                                     // key-page discovery (pure)
  parseSpf, parseDmarc, mailProviderFromMx,          // DNS record parsers (pure)
  dnsSignals, verifyEmailDomains,                    // DNS lookups (Node-only)
  parseRdap, rdapLookup,                             // RDAP (parser pure, lookup network)
  downloadAsset,                                      // save logo/favicon
} from "lacspace-enrich";

guessEmails("Jane Doe", "acme.com", { knownContact: { name: "Bob Smith", email: "[email protected]" } });
// → [{ email: "[email protected]", pattern: "flast", confidence: 1 }, …]

The classic pure helpers are still here too: normalizeDomain, cleanName, detectTech, extractSocials, factsFromJsonLd, socialKey, flattenProfile, plus selectFields.

Honest limitations

  • DNS/RDAP need Node (they use node:dns and fetch); they're skipped/return an honest fallback in the browser.
  • RDAP coverage varies — some TLDs/registries don't expose full data; on any failure registration.source is "unavailable" with a note, never a fake value.
  • Catch-all is a hint, not proof. True catch-all detection needs live SMTP probing, which this tool deliberately does not do. dns.catchAllLikely is inferred from a permissive SPF / forwarder only.
  • MX-verification checks the domain accepts mail (has MX) — it does not confirm a specific mailbox exists; no message is ever sent.
  • Email guesses are guesses. They're ranked permutations of a name; verify before you send. A known colleague's address raises confidence but isn't a guarantee.
  • Tech detection reads the delivered HTML only (no JS execution), so client-rendered signals can be missed; confidences are rough heuristics.

Please use it responsibly

lacspace-enrich only reads public business information a site chooses to publish, and public DNS/RDAP records. Respect each site's Terms and your local data-protection law (GDPR and friends), and use the data lawfully — don't spam.

Licence

Free under the Lacspace Free Licence. Part of the Lacspace developer platform.