{ "name": "vecline", "version": "2.1.4", "mcpName": "io.github.shunyagatha/vecline", "description": "The measurable image + document toolkit for JavaScript. On flat art -- logos, icons, UI, screenshots, pixel art -- the SVG is bit-exact: SSIM 1.0000, zero differing pixels, verified by rendering it back. On photographs it leads potrace, imagetracerjs and vtracer on SSIM, and says how close it landed instead of claiming perfection. Converts any of 11 raster formats to any other, writes cut-ready DXF that declares its own physical size, plus EPS, PDF and G-code for lasers, plotters and CNC. Renders PDF and Office (docx/xlsx/pptx), images-to-PDF, centerline tracing, gradients, content-aware crop and image editing. Zero-dependency portable core, an MCP server for AI agents, and a local bridge (vecline serve) so a browser can drive your LibreOffice without uploading anything.", "keywords": [ "svg", "vectorize", "vectorizer", "raster", "rasterize", "png-to-svg", "jpg-to-svg", "webp-to-svg", "svg-to-png", "image-trace", "potrace", "lossless", "ssim", "psnr", "delta-e", "bmp", "ico", "favicon", "tga", "ppm", "netpbm", "image-decoder", "typescript", "browser", "image-processing", "image-conversion", "raster-to-vector", "gradient", "avif", "webp", "image-editing", "pdf", "pdf-to-image", "image-to-pdf", "docx", "office", "document-conversion", "centerline", "dxf", "gcode", "blurhash", "smart-crop", "mcp", "mcp-server", "model-context-protocol", "svg-to-dxf", "image-converter", "vector-export", "laser-cutter", "cnc", "screen-printing", "oklab", "laser", "dxf-units", "libreoffice", "local-first", "privacy", "vectorizer-alternative", "potrace-alternative" ], "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/shunyagatha/Vecline.git" }, "homepage": "https://vecline.xyz", "bugs": { "url": "https://github.com/shunyagatha/Vecline/issues" }, "type": "module", "engines": { "node": ">=18.17" }, "main": "./dist/cjs/index.js", "types": "./dist/esm/index.d.ts", "exports": { ".": { "import": { "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.js" }, "require": { "types": "./dist/cjs/index.d.ts", "default": "./dist/cjs/index.js" }, "default": "./dist/esm/index.js" }, "./core": { "import": { "types": "./dist/esm/core.d.ts", "default": "./dist/esm/core.js" }, "require": { "types": "./dist/cjs/core.d.ts", "default": "./dist/cjs/core.js" }, "default": "./dist/esm/core.js" }, "./vectorize": { "import": { "types": "./dist/esm/vectorize/index.d.ts", "default": "./dist/esm/vectorize/index.js" }, "require": { "types": "./dist/cjs/vectorize/index.d.ts", "default": "./dist/cjs/vectorize/index.js" }, "default": "./dist/esm/vectorize/index.js" }, "./metrics": { "import": { "types": "./dist/esm/metrics/index.d.ts", "default": "./dist/esm/metrics/index.js" }, "require": { "types": "./dist/cjs/metrics/index.d.ts", "default": "./dist/cjs/metrics/index.js" }, "default": "./dist/esm/metrics/index.js" }, "./formats": { "import": { "types": "./dist/esm/io/formats/index.d.ts", "default": "./dist/esm/io/formats/index.js" }, "require": { "types": "./dist/cjs/io/formats/index.d.ts", "default": "./dist/cjs/io/formats/index.js" }, "default": "./dist/esm/io/formats/index.js" }, "./ops": { "import": { "types": "./dist/esm/ops.d.ts", "default": "./dist/esm/ops.js" }, "require": { "types": "./dist/cjs/ops.d.ts", "default": "./dist/cjs/ops.js" }, "default": "./dist/esm/ops.js" }, "./vite": { "import": { "types": "./dist/esm/plugin/vite.d.ts", "default": "./dist/esm/plugin/vite.js" }, "require": { "types": "./dist/cjs/plugin/vite.d.ts", "default": "./dist/cjs/plugin/vite.js" }, "default": "./dist/esm/plugin/vite.js" }, "./codecs": { "import": { "types": "./dist/esm/codecs.d.ts", "default": "./dist/esm/codecs.js" }, "require": { "types": "./dist/cjs/codecs.d.ts", "default": "./dist/cjs/codecs.js" }, "default": "./dist/esm/codecs.js" }, "./package.json": "./package.json" }, "bin": { "vecline": "./dist/esm/cli.js" }, "files": [ "dist", "README.md", "LICENSE" ], "scripts": { "build": "npm run build:esm && npm run build:cjs && node scripts/postbuild.mjs", "dev": "tsc -p tsconfig.json --watch", "test": "vitest run", "test:watch": "vitest", "smoke": "node scripts/smoke.mjs", "bench": "node scripts/bench.mjs", "bench:features": "node scripts/bench-features.mjs", "cli": "node --enable-source-maps dist/esm/cli.js", "prepare": "npm run build", "build:esm": "tsc -p tsconfig.json", "build:cjs": "tsc -p tsconfig.cjs.json", "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", "compare": "node scripts/compare.mjs", "corpus": "node scripts/fetch-corpus.mjs", "corpus:report": "node scripts/corpus-report.mjs", "bench:scale": "node scripts/bench-scale.mjs", "format:sweep": "node scripts/format-sweep.mjs", "diagnose": "node scripts/diagnose-photo.mjs", "structure": "node scripts/structure-report.mjs", "blur:control": "node scripts/blur-control.mjs", "notices": "node scripts/third-party-notices.mjs", "structure:check": "node scripts/structure-report.mjs --check", "playground": "node scripts/build-playground.mjs", "figma:art": "node scripts/build-figma-art-trace.mjs && node scripts/build-figma-art-sweep.mjs && node scripts/build-figma-art.mjs && node scripts/build-figma-carousel.mjs", "mcpb": "npx -y @anthropic-ai/mcpb pack mcpb vecline.mcpb", "check:readme": "node scripts/check-readme-bench.mjs" }, "dependencies": { "commander": "^12.1.0", "tinyglobby": "^0.2.12" }, "devDependencies": { "@types/node": "^22.10.0", "esbuild": "^0.21.5", "imagetracerjs": "^1.2.6", "mupdf": "^1.28.0", "potrace": "^2.1.8", "typescript": "^5.7.2", "vitest": "^2.1.8" }, "allowScripts": { "esbuild@0.21.5": true, "sharp@0.34.5": true }, "module": "./dist/esm/index.js", "sideEffects": false, "optionalDependencies": { "@resvg/resvg-js": "^2.6.2", "sharp": "^0.35.3" } }