{"_id":"@boris.barac/linkloom","_rev":"7-be138513b7f94ae4a7b447fa7541429b","name":"@boris.barac/linkloom","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@boris.barac/linkloom","version":"0.1.0","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.0","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"6e14a3062391651330b44fb477475dc1993f405a","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.0.tgz","fileCount":50,"integrity":"sha512-R1/jUaFw9m0LXvv7NwUBuS6rpF923aHiD1T2yqjqG20rlyDajvztcmB6aVDYSaknKcgIM4EgoqRd4JLIYqZtdg==","signatures":[{"sig":"MEUCIFINVNUOhKrUJKTri8kn5eYRVHRZocJ1IEaTg8nTbhumAiEA1yzVGAUv5+Ev3fi5Hpb0xx44pxsdXH/du/gOHTHBauY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111038},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","shasum":"6e14a3062391651330b44fb477475dc1993f405a","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","type_check":"bunx tsc --noEmit"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"_integrity":"sha512-R1/jUaFw9m0LXvv7NwUBuS6rpF923aHiD1T2yqjqG20rlyDajvztcmB6aVDYSaknKcgIM4EgoqRd4JLIYqZtdg==","repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"10.8.3","description":"Web scraping, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"_nodeVersion":"24.3.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","jsdom":"^29.0.2","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.13","@types/node":"^25.6.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.0_1777240919360_0.35344015056505906","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@boris.barac/linkloom","version":"0.1.1","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.1","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"5004ab3850bb6ede6ac9cad5539956c81975d1a7","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.1.tgz","fileCount":50,"integrity":"sha512-7eRbgZK8y7QATjDImdQa0RFqvuiM34bdFBHgxptKH5Bvr6AFmZ3nYXEGBZYGs/cuqw/oBfBc9lw1B9EiXlSq+A==","signatures":[{"sig":"MEYCIQDiEUcKOSwz7kmEPZtWrGYAihxg957LpJD9gUFY5pWj2QIhAO5hPz0ffVwjw37QMY/UUsHoP+3NmfHtmkYLAIZRvu+7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111380},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","shasum":"5004ab3850bb6ede6ac9cad5539956c81975d1a7","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","type_check":"bunx tsc --noEmit"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"_integrity":"sha512-7eRbgZK8y7QATjDImdQa0RFqvuiM34bdFBHgxptKH5Bvr6AFmZ3nYXEGBZYGs/cuqw/oBfBc9lw1B9EiXlSq+A==","repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"10.8.3","description":"Web scraping, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"_nodeVersion":"24.3.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","jsdom":"^29.0.2","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.13","@types/node":"^25.6.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.1_1777241137155_0.998860874175461","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@boris.barac/linkloom","version":"0.1.2","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.2","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"82809b960955c147702a289b624cbf1cf5f203bf","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.2.tgz","fileCount":50,"integrity":"sha512-bV46eT4UV1pYmfBcW9I2aiSDvIWNowwChQwwMqH2bw5ZnNMxMmlpKo3Tr/rRueIIMmh6jLvJj6qjXGnhkLeyaw==","signatures":[{"sig":"MEYCIQDk4uqA3DA5m6lCoGOWZPc0iEn8fQxifZludiLaBaUQ3gIhAOG5/oONhPvbJ9t6sAwTSePnHhj8ZJ3l7Fj1a+HbWuIG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112165},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"gitHead":"02c760434691cc10ddb35a5f249c0ba415b54ebb","scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","type_check":"bunx tsc --noEmit","browser:path":"camoufox-js path","setup:browser":"camoufox-js fetch"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"11.16.0","description":"Web scraping, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"_nodeVersion":"26.3.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","jsdom":"^29.0.2","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.13","@types/node":"^25.6.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.2_1782244838301_0.4249437450496538","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@boris.barac/linkloom","version":"0.1.3","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.3","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"12dff9b072710645298706fcbfd831837a26b052","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.3.tgz","fileCount":51,"integrity":"sha512-kOXKJm++WJsXtpE/tkcoxwfs6K6vQ3kuZVzBrBFeasmv0wdbVYVTDQ+P0wGqWsKcmwQpSvyfmRyhzqvgF/N0iA==","signatures":[{"sig":"MEQCIHALs24PnKBF7gp3SHeVcRwoITIt5PUUpVmgFrECzcslAiB9IMUBgsWGnF+BPkPGJWU8FVZxtKx/QCBfZcIo0We8LQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119347},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"gitHead":"fb0154e65f80e437cc909b7d9053f5546977d9fa","scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","type_check":"bunx tsc --noEmit","browser:path":"camoufox-js path","setup:browser":"camoufox-js fetch"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"11.16.0","description":"Web scraping, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"_nodeVersion":"26.3.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","jsdom":"^29.0.2","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.13","@types/node":"^25.6.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.3_1782247391012_0.09515459365785595","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@boris.barac/linkloom","version":"0.1.4","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.4","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"2f8ab444c406ee59f9dab62a9a2e6691e5633af8","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.4.tgz","fileCount":57,"integrity":"sha512-bc6Iy51oV6+8ADdtY6uQCLAfi8Z5F+n3PIdovcyKy7y9SxLNgpI9Xaqp9FVSdZi16XxYcBA5OrKrCBTrYwubBQ==","signatures":[{"sig":"MEUCIAyjPfqFYtbVnhVH+m2Jvs+UnZwayvScy1cj0TTQS1XKAiEA9YGIbuyi0RN6vga5G7QgelcqNOuWbQ1LGnalTWllEjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134746},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"gitHead":"2d9de0e2a2b3a6a98b4a4dcb7f4f72c8323dfbcc","scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","type_check":"bunx tsc --noEmit","browser:path":"camoufox-js path","setup:browser":"camoufox-js fetch && bun scripts/setup-camoufox.mjs"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"11.16.0","description":"Web scraping, Brave search, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"_nodeVersion":"26.3.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","impit":"^0.14.2","jsdom":"^29.0.2","cheerio":"^1.2.0","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.13","@types/node":"^25.6.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.4_1782336905869_0.10621196635638652","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@boris.barac/linkloom","version":"0.1.5","keywords":["scraping","markdown","pdf","mcp","bun","cli","web-scraping","content-extraction"],"license":"MIT","_id":"@boris.barac/linkloom@0.1.5","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"bin":{"linkloom":"src/cli.ts","linkloom-mcp":"src/mcp.ts"},"dist":{"shasum":"d66e81ceb626bd4c6fa4cd5548cd9c1f7d51a33a","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.1.5.tgz","fileCount":57,"integrity":"sha512-FdOocDH/NOXU4t0tfu3TNbnAi4jSLWxx8yfGpUaqCSpEVXm8gVdRZuYNqZxpmEW3GubKFnSSCfleBzdVCAH8cw==","signatures":[{"sig":"MEUCIQCGT8UphYzX69AoYLa2jrHtkNDdItbJljSTNT1OMrnSNgIgHfTZe9v34zump0NLzyvheQSAV3MktJjaGC6RWnI1R3I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139975},"main":"index.ts","type":"module","types":"index.ts","module":"index.ts","engines":{"bun":">=1"},"exports":{".":"./index.ts"},"gitHead":"f9a09e5ff4e68859d3e6ba097c749479209f28da","scripts":{"cli":"bun run src/cli.ts","mcp":"bun run src/cli.ts mcp","lint":"bunx biome lint --write","test":"bun scripts/test-isolated.mjs","check":"bunx biome check --write","start":"bun run index.ts","format":"bunx biome format --write","prepare":"husky","type_check":"bunx tsc --noEmit","browser:path":"camoufox-js path","setup:browser":"camoufox-js fetch && bun scripts/setup-camoufox.mjs","test:aggregate":"bun test"},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"repository":{"url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git","type":"git"},"_npmVersion":"11.17.0","description":"Web scraping, Brave search, content extraction, and markdown conversion — in TypeScript/Bun","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs,cjs,json,jsonc,md}":"bunx biome check --write"},"_nodeVersion":"26.4.0","dependencies":{"axios":"^1.15.2","citty":"^0.2.2","impit":"^0.14.2","jsdom":"^29.0.2","cheerio":"^1.2.0","turndown":"^7.2.4","playwright":"^1.59.1","camoufox-js":"^0.10.2","pdf.js-extract":"^1.0.1","@langchain/openai":"^1.4.4","@mozilla/readability":"^0.6.0","@langchain/google-genai":"^2.1.28","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","@types/bun":"^1.3.13","@types/node":"^25.6.0","lint-staged":"^17.0.8","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/linkloom_0.1.5_1782509587558_0.1465290690014598","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@boris.barac/linkloom","version":"0.2.1","description":"Web scraping, Brave search, content extraction, and markdown conversion — in TypeScript (Bun & Node.js)","type":"module","main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"author":{"name":"Boris Barac"},"license":"MIT","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"homepage":"https://github.com/borisBarac/linkloom-agent-scraper","repository":{"type":"git","url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git"},"bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"keywords":["scraping","markdown","pdf","mcp","bun","node","nodejs","cli","web-scraping","content-extraction"],"engines":{"bun":">=1","node":">=20"},"publishConfig":{"access":"public"},"bin":{"linkloom":"dist/cli.js","linkloom-mcp":"dist/mcp.js"},"scripts":{"build":"tsup","prepublishOnly":"tsup","test":"vitest run","test:watch":"vitest","format":"npx @biomejs/biome format --write","lint":"npx @biomejs/biome lint --write","check":"npx @biomejs/biome check --write","type_check":"npx tsc --noEmit","start":"bun run index.ts","start:node":"node --import tsx index.ts","cli":"bun run src/cli.ts","cli:node":"node --import tsx src/cli.ts","mcp":"bun run src/cli.ts mcp","mcp:node":"node --import tsx src/cli.ts mcp","setup:browser":"camoufox-js fetch && node scripts/setup-camoufox.mjs","browser:path":"camoufox-js path","prepare":"husky"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs,cjs,json,jsonc,md}":"npx @biomejs/biome check --write"},"devDependencies":{"@types/jsdom":"^28.0.1","@types/node":"^25.6.0","@types/turndown":"^5.0.6","husky":"^9.1.7","lint-staged":"^17.0.8","tsup":"^8.5.1","tsx":"^4.23.1","typescript":"^6.0.3","vitest":"^4.1.10"},"dependencies":{"@langchain/google-genai":"^2.1.28","@langchain/openai":"^1.4.4","@modelcontextprotocol/sdk":"^1.29.0","@mozilla/readability":"^0.6.0","axios":"^1.15.2","camoufox-js":"^0.10.2","cheerio":"^1.2.0","citty":"^0.2.2","impit":"^0.14.2","jsdom":"^29.0.2","pdf.js-extract":"^1.0.1","playwright":"^1.59.1","turndown":"^7.2.4"},"gitHead":"9fb638f50c2580155e5b5180a4e0372173ea6eac","_id":"@boris.barac/linkloom@0.2.1","_nodeVersion":"26.5.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-VQrE0SrEX2HTrkfb81Zr23soPneDghHZDr3vU3HEnVVDUHbkkyYIdAH/x4PyPSBCn1m6jveLmaVTtqheIUrz3w==","shasum":"2817c5ff7e759c987f340619ab6a165baefccabd","tarball":"https://registry.npmjs.org/@boris.barac/linkloom/-/linkloom-0.2.1.tgz","fileCount":13,"unpackedSize":428547,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBnrhG2/+fA2HzPvhxAkySNG0nfQrYUDxhSwm70YVSfTAiEAvJ1cC0ARlkYhMXanhT36YTjIFWzWuNkA0J95NfCxffc="}]},"_npmUser":{"name":"boris.barac","email":"boris.raptor@gmail.com"},"directories":{},"maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/linkloom_0.2.1_1785272903362_0.04287757915096235"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-26T22:01:59.290Z","modified":"2026-07-28T21:08:23.702Z","0.1.0":"2026-04-26T22:01:59.509Z","0.1.1":"2026-04-26T22:05:37.297Z","0.1.2":"2026-06-23T20:00:38.434Z","0.1.3":"2026-06-23T20:43:11.155Z","0.1.4":"2026-06-24T21:35:05.989Z","0.1.5":"2026-06-26T21:33:07.697Z","0.2.1":"2026-07-28T21:08:23.545Z"},"bugs":{"url":"https://github.com/borisBarac/linkloom-agent-scraper/issues"},"license":"MIT","homepage":"https://github.com/borisBarac/linkloom-agent-scraper","keywords":["scraping","markdown","pdf","mcp","bun","node","nodejs","cli","web-scraping","content-extraction"],"repository":{"type":"git","url":"git+https://github.com/borisBarac/linkloom-agent-scraper.git"},"description":"Web scraping, Brave search, content extraction, and markdown conversion — in TypeScript (Bun & Node.js)","maintainers":[{"name":"boris.barac","email":"boris.raptor@gmail.com"}],"readme":"# LinkLoom\n\nWeb scraping, Brave search, content extraction, and markdown conversion — in TypeScript.\nPass a URL, get clean markdown. Render JS-heavy pages. Search the web with Brave. Extract links, tables, and embeddings.\n\nRuns on both **Bun** (primary) and **Node.js ≥ 20**.\n\n## Requirements\n\n- **Bun ≥ 1** _or_ **Node.js ≥ 20** — pick either runtime\n- Headless rendering additionally requires [Camoufox](#camoufox-setup) (fetches its own browser binary)\n\n## Features\n\n- **URL to Markdown** — pass any URL, get clean markdown back. Auto-detects HTML pages vs PDF files\n- **HTML to Markdown** — extract readable content from raw HTML using Readability + Turndown\n- **PDF to Markdown** — parse PDF buffers into structured markdown\n- **Headless browser rendering** — render JavaScript-heavy pages via Camoufox (stealth Firefox/Playwright)\n- **iframe support** — extract content from nested frames with configurable wait strategies\n- **Link extraction** — pull and classify URLs from text or HTML (PDF vs Page)\n- **Web search** — query Brave search results and return structured links\n- **Table extraction** — scrape HTML tables from pages and convert to markdown tables\n- **Text embeddings** — generate vectors via OpenAI or Gemini (optional, requires API key)\n- **CLI** — use every feature from the command line\n- **MCP Server** — expose all tools to Claude Desktop, Cursor, and other MCP clients\n\n## Tech Stack\n\nBun or Node.js, Camoufox, JSDOM + Readability + Turndown, pdf.js-extract, LangChain (optional embeddings). Tests run on [Vitest](https://vitest.dev) under either runtime.\n\n## Install\n\n```bash\nbun add @boris.barac/linkloom\n# or\nnpm install @boris.barac/linkloom\n```\n\n## Quick start\n\n### CLI (no install)\n\n```bash\nbunx @boris.barac/linkloom scrape https://example.com        # Bun\nnpx @boris.barac/linkloom scrape https://example.com         # Node.js\n```\n\n### Library\n\n```ts\nimport { convertLinkToMarkdown } from \"@boris.barac/linkloom\";\n\nconst markdown = await convertLinkToMarkdown(\"https://example.com\");\nconsole.log(markdown);\n```\n\n### MCP server\n\n```bash\nbunx @boris.barac/linkloom mcp        # Bun\nnpx @boris.barac/linkloom mcp         # Node.js\n```\n\nSee the [MCP Server docs](src/mcp/README.md) for Claude Desktop / Cursor client config.\n\n## Runtime support\n\nThe package ships pre-built ESM (`dist/`) that runs on both Bun and Node.js ≥ 20 — no bundler or TypeScript compiler required at install time.\n\nFrom source, Bun executes `.ts` directly; Node uses `tsx` (installed as a dev dependency):\n\n```bash\nbun run src/cli.ts scrape https://example.com        # Bun (direct)\nnode --import tsx src/cli.ts scrape https://example.com  # Node\n```\n\n## Camoufox Setup\n\nHeadless rendering uses [Camoufox](https://github.com/daijro/camoufox). After installing dependencies, set up the browser binary and GeoIP database:\n\n```bash\nbunx camoufox-js fetch\n```\n\nWhen developing from this repo, use `bun run setup:browser`. On macOS, that command also re-signs the downloaded app bundle so Camoufox can launch.\n\nIf Camoufox aborts with `SIGABRT` in the Codex macOS sandbox, re-run browser-backed verification outside the sandbox. In this repo, `bun run setup:browser` was also used to repair/re-sign the local Camoufox install before verification.\n\nUse `bun run browser:path` to print the installed Camoufox path.\n\n## CLI Usage\n\nThe CLI exposes every feature as a subcommand. See the [CLI Reference](src/cli/README.md) for all commands and flags (`scrape`, `html`, `pdf`, `render`, `links`, `search`, `tables`, `mcp`).\n\n## Documentation\n| Document | Description |\n|---|---|\n| [Library API](src/README.md) | Programmatic usage with code examples for every module |\n| [CLI Reference](src/cli/README.md) | Command-line interface — all subcommands, flags, and examples |\n| [MCP Server](src/mcp/README.md) | Model Context Protocol server for AI clients (Claude, Cursor, etc.) |\n\n## Environment\n\n```bash\ncp env.example .env\n```\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `PAGE_LOAD_TIMEOUT` | No | `10000` | Browser page load timeout (ms) |\n| `FRAME_TIMEOUT` | No | `5000` | iframe load timeout (ms) |\n| `PDF_DOWNLOAD_TIMEOUT` | No | `30000` | PDF download timeout (ms) |\n| `PROXY_URL` | No | — | Proxy endpoint (`http://user:pass@host:port` or `socks5://host:port`) |\n| `OPENAI_API_KEY` | Yes\\* | — | Required for `textToVector` with OpenAI |\n| `GEMINI_API_KEY` | Yes\\* | — | Required for `textToVector` with Gemini |\n| `LINKLOOM_DEBUG` | No | — | Set to `1` (or `DEBUG=linkloom`) to log non-fatal cleanup failures |\n\n> \\* Only needed if you use the `textToVector` embedding feature. The core scraping and conversion pipeline works without any API keys.\n\n## Scripts (development)\n\nBun is the primary dev driver; equivalent Node variants are provided where useful.\n\n| Command | Description |\n|---|---|\n| `bun run build` | Build ESM to `dist/` (tsup) — required before publishing/`npx` |\n| `bun run start` | Run the entry point (Bun) |\n| `bun run start:node` | Run the entry point (Node via tsx) |\n| `bun run cli` / `cli:node` | Run the CLI |\n| `bun run mcp` / `mcp:node` | Run the MCP server |\n| `bun run check` | Format + lint (biome) |\n| `bun run type_check` | TypeScript type check |\n| `bun run setup:browser` | Download the Camoufox browser + GeoIP DB and re-sign the app bundle on macOS |\n| `bun run browser:path` | Print the local Camoufox install path |\n| `bun run test` | Run tests (vitest) |\n| `bun run test:watch` | Run tests in watch mode |\n\n## Publishing\n\nThe published artifact is the pre-built ESM in `dist/` (built by `tsup`). `npm publish` automatically runs the build via the `prepublishOnly` hook — no Bun required to publish.\n\n```bash\nnpm publish --access public\n```\n\n## License\n\n[MIT](LICENSE) © Boris Barac\n","readmeFilename":"README.md","author":{"name":"Boris Barac"}}