{"_id":"@aminoxix/schemind","_rev":"6-f7a684db28057aa759b7004763ff5424","name":"@aminoxix/schemind","dist-tags":{"latest":"0.5.6"},"versions":{"0.5.1":{"name":"@aminoxix/schemind","version":"0.5.1","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"author":{"url":"Aminos","name":"Anshumaan Kumar Prasad R","email":"aminoxix@duck.com"},"license":"MIT","_id":"@aminoxix/schemind@0.5.1","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"homepage":"https://aminoxix.me","bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"bin":{"schm":"dist/cli.js"},"dist":{"shasum":"03a561779d7fe724890fcd3e80468fb55accc88f","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.1.tgz","fileCount":23,"integrity":"sha512-CzN8HZ41tSK1g0cKW6zzVKvXuU7wHN+2UzQ5FE/LYTCEIAI33ktw60Szz5cexe6gIsiYf6petjRSGsRsWSPjoQ==","signatures":[{"sig":"MEUCIQD39IMU3TebVNYa/2Q59OHCjsosgg+AZh0uoPv8xJkbHQIgVM5H2Z9H4jwRhGJ0ws/izhmdNsdn6XwFm0AMvFb4q5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1085486},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm typecheck && pnpm build"},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"repository":{"url":"git+https://github.com/aminoxix/schemind.git","type":"git"},"_npmVersion":"10.9.3","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/schemind_0.5.1_1782419839732_0.6486630763112335","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@aminoxix/schemind","version":"0.5.2","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"author":{"url":"Aminos","name":"Anshumaan Kumar Prasad R","email":"aminoxix@duck.com"},"license":"MIT","_id":"@aminoxix/schemind@0.5.2","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"homepage":"https://aminoxix.me","bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"bin":{"schm":"dist/cli.js"},"dist":{"shasum":"b6aceb854fd8045aebb2f8d4a2913fc2bf517181","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.2.tgz","fileCount":24,"integrity":"sha512-er/mm59GJRM0zMVPevctI7VCcJ78wY1w0LZWB7oB/zHEUfZIOgbXhJl2CY9CRzZlJW49AXEtkyalUk0/IG0k/A==","signatures":[{"sig":"MEUCIAnqEEHa13/ecJth7dXSysDzXjmRn+Xv0IS92IRCqsFeAiEAhC1h4TVFoVBXvQ+THc2HznRdwTaSYHfbXPtmmWSqlOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1086546},"main":"./dist/index.js","type":"module","_from":"file:aminoxix-schemind-0.5.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"_resolved":"/tmp/9735f1c9a38fe9a609947a0d78b6cbf7/aminoxix-schemind-0.5.2.tgz","_integrity":"sha512-er/mm59GJRM0zMVPevctI7VCcJ78wY1w0LZWB7oB/zHEUfZIOgbXhJl2CY9CRzZlJW49AXEtkyalUk0/IG0k/A==","repository":{"url":"git+https://github.com/aminoxix/schemind.git","type":"git"},"_npmVersion":"10.8.2","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/schemind_0.5.2_1782454913642_0.06592220060854737","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@aminoxix/schemind","version":"0.5.3","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"author":{"url":"Aminos","name":"Anshumaan Kumar Prasad R","email":"aminoxix@duck.com"},"license":"MIT","_id":"@aminoxix/schemind@0.5.3","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"homepage":"https://aminoxix.me","bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"bin":{"schm":"dist/cli.js"},"dist":{"shasum":"e4e10df6236cfd16769df2b4cc6515756a39675c","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.3.tgz","fileCount":27,"integrity":"sha512-pQsZ8ZrW6xgANMYLT5W6Zx3X05oegVcnokeLFkIYJzr4wQ9K3pnDwMKBhOaGn27n/1MMQZHbQrGvnCqOLnTjGA==","signatures":[{"sig":"MEUCIQCEEXZCEt15zvCa8RkaZHo3RCDk1XjwQXMbY89bWqKUrQIgKex3ST/9fBlPwKwDWkiynqmZUYoozx74tHAVU1r117E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1219173},"main":"./dist/index.js","type":"module","_from":"file:aminoxix-schemind-0.5.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./tanstack":{"types":"./dist/tanstack.d.ts","import":"./dist/tanstack.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"_resolved":"/tmp/3aa7bea150fd10989043f994a5e027e6/aminoxix-schemind-0.5.3.tgz","_integrity":"sha512-pQsZ8ZrW6xgANMYLT5W6Zx3X05oegVcnokeLFkIYJzr4wQ9K3pnDwMKBhOaGn27n/1MMQZHbQrGvnCqOLnTjGA==","repository":{"url":"git+https://github.com/aminoxix/schemind.git","type":"git"},"_npmVersion":"10.8.2","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@tanstack/react-query":"^5.101.1"},"peerDependencies":{"typescript":">=5.0.0","@tanstack/react-query":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/schemind_0.5.3_1782585192368_0.6223489816356886","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@aminoxix/schemind","version":"0.5.4","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"author":{"url":"aminos","name":"Anshumaan Kumar Prasad","email":"aminoxix@duck.com"},"license":"MIT","_id":"@aminoxix/schemind@0.5.4","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"homepage":"https://aminoxix.me","bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"bin":{"schm":"dist/cli.js"},"dist":{"shasum":"6b3c8487bc63948b6c63b25618982688054f9df8","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.4.tgz","fileCount":27,"integrity":"sha512-09vpUtbvpbLWx0diz8+kC5J8UYXUAmcnRc+6hWjaEXjg2Jy0oNEYil0p2aEqvoMjlzlIqjXXA561kPe8CsUVUg==","signatures":[{"sig":"MEQCIEvT3/0mGmbq/OUOYGPnMasj6iEBAy/sF/qBZ1YDieQlAiAFOB6Vcc/aXSMNgbC+aTit5e/uG6qJceA+z/MVjq9VGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1219284},"main":"./dist/index.js","type":"module","_from":"file:aminoxix-schemind-0.5.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./tanstack":{"types":"./dist/tanstack.d.ts","import":"./dist/tanstack.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"_resolved":"/tmp/988410bb74e7025f20aaa0a797a0d19d/aminoxix-schemind-0.5.4.tgz","_integrity":"sha512-09vpUtbvpbLWx0diz8+kC5J8UYXUAmcnRc+6hWjaEXjg2Jy0oNEYil0p2aEqvoMjlzlIqjXXA561kPe8CsUVUg==","repository":{"url":"git+https://github.com/aminoxix/schemind.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@tanstack/react-query":"^5.101.1"},"peerDependencies":{"typescript":">=5.0.0","@tanstack/react-query":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/schemind_0.5.4_1784551495555_0.5647196952718216","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@aminoxix/schemind","version":"0.5.5","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"author":{"url":"aminos","name":"Anshumaan Kumar Prasad","email":"aminoxix@duck.com"},"license":"MIT","_id":"@aminoxix/schemind@0.5.5","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"homepage":"https://dev.iflyrich.space","bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"bin":{"schm":"dist/cli.js"},"dist":{"shasum":"ba3bf5722c987adb0cab89100648e7176f9c06f3","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.5.tgz","fileCount":27,"integrity":"sha512-JrWTaYonp4YhitwB+hrK3UKGBd/dCh6Ga/vfyj4C2iVD70p5EZ32wc23XkgGf+wtujgy+BOZuYEfJAYenCkiag==","signatures":[{"sig":"MEYCIQDfa52svSGIsOx/mXIKVmGl74Qo5ZEOYG42ZFgyfzCF5wIhAJvOA1H8H09yaacG+mvqS1Eid/zZ/qSiT+NNkPa4GnYy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1219288},"main":"./dist/index.js","type":"module","_from":"file:aminoxix-schemind-0.5.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./tanstack":{"types":"./dist/tanstack.d.ts","import":"./dist/tanstack.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"_resolved":"/tmp/53edebf275b43a64a8f3d38589e839a5/aminoxix-schemind-0.5.5.tgz","_integrity":"sha512-JrWTaYonp4YhitwB+hrK3UKGBd/dCh6Ga/vfyj4C2iVD70p5EZ32wc23XkgGf+wtujgy+BOZuYEfJAYenCkiag==","repository":{"url":"git+https://github.com/aminoxix/schemind.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@tanstack/react-query":"^5.101.1"},"peerDependencies":{"typescript":">=5.0.0","@tanstack/react-query":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/schemind_0.5.5_1788080564744_0.590609125345239","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@aminoxix/schemind","version":"0.5.6","description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","type":"module","license":"MIT","author":{"name":"Anshumaan Kumar Prasad","email":"aminoxix@duck.com","url":"aminos"},"homepage":"https://dev.iflyrich.space","repository":{"type":"git","url":"git+https://github.com/aminoxix/schemind.git","directory":"packages/core"},"bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"engines":{"node":">=18.0.0"},"sideEffects":false,"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","bin":{"schm":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./next":{"types":"./dist/next.d.ts","import":"./dist/next.js"},"./hono":{"types":"./dist/hono.d.ts","import":"./dist/hono.js"},"./tanstack":{"types":"./dist/tanstack.d.ts","import":"./dist/tanstack.js"},"./package.json":"./package.json"},"devDependencies":{"@tanstack/react-query":"^5.101.1","@types/node":"^22.10.0","tsup":"^8.3.5","typescript":"^5.7.2","vitest":"^2.1.8"},"peerDependencies":{"@tanstack/react-query":">=5.0.0","typescript":">=5.0.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true},"typescript":{"optional":true}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest","test:run":"vitest run","test:coverage":"vitest run --coverage"},"_id":"@aminoxix/schemind@0.5.6","_integrity":"sha512-wZektYrp+NB4rT8/Hny8rPdHOlb3hGq4cusxRIkDiPh3/hzNCjaQmUqdZPHVUSKo5ANB3h6XDgkPQBiDiIDKJw==","_resolved":"/tmp/60d41be5e9df5ab6d7fc08c93a123d9e/aminoxix-schemind-0.5.6.tgz","_from":"file:aminoxix-schemind-0.5.6.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-wZektYrp+NB4rT8/Hny8rPdHOlb3hGq4cusxRIkDiPh3/hzNCjaQmUqdZPHVUSKo5ANB3h6XDgkPQBiDiIDKJw==","shasum":"ff130a88fd2085f3e0527e6e8859bde24187788b","tarball":"https://registry.npmjs.org/@aminoxix/schemind/-/schemind-0.5.6.tgz","fileCount":27,"unpackedSize":1219918,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDVdlhKs9AL/b7DXSq74UFFT1+mxf3jwsQTfcMLljdllwIgacSohaAY0A92K/IeNipfm/5G8vLNgY6m8mfBTDwyfVA="}]},"_npmUser":{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"},"directories":{},"maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/schemind_0.5.6_1788630639681_0.7919734431010483"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-25T20:37:19.519Z","modified":"2026-09-05T17:50:39.977Z","0.5.1":"2026-06-25T20:37:19.929Z","0.5.2":"2026-06-26T06:21:53.808Z","0.5.3":"2026-06-27T18:33:12.599Z","0.5.4":"2026-07-20T12:44:55.710Z","0.5.5":"2026-08-30T09:02:44.895Z","0.5.6":"2026-09-05T17:50:39.835Z"},"bugs":{"url":"https://github.com/aminoxix/schemind/issues"},"author":{"name":"Anshumaan Kumar Prasad","email":"aminoxix@duck.com","url":"aminos"},"license":"MIT","homepage":"https://dev.iflyrich.space","keywords":["api","schema","drift","shape","contract-testing","openapi","typescript"],"repository":{"type":"git","url":"git+https://github.com/aminoxix/schemind.git","directory":"packages/core"},"description":"Language-agnostic API response shape intelligence — detects when your API's shape silently changes.","maintainers":[{"name":"aminoxix","email":"anshumaankrprasad76@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"../../assets/logo.svg\" alt=\"schemind logo\" width=\"120\" />\n\n# schemind\n\n**your API's shape has a mind of its own. schemind watches it.**\n\n[![npm](https://img.shields.io/npm/v/%40aminoxix%2Fschemind?color=1818ab&label=npm)](https://www.npmjs.com/package/@aminoxix/schemind)\n[![license](https://img.shields.io/npm/l/%40aminoxix%2Fschemind?color=1818ab)](https://github.com/aminoxix/schemind/blob/main/LICENSE)\n[![node](https://img.shields.io/node/v/%40aminoxix%2Fschemind?color=1818ab)](https://nodejs.org)\n[![zero deps](https://img.shields.io/badge/dependencies-zero-1818ab)](https://www.npmjs.com/package/@aminoxix/schemind)\n\n[Quickstart](#quickstart) · [How it works](#how-it-works) · [Integrations](#integrations) · [CI gate](#ci-gate) · [Backend adapters](#backend-adapters)\n\n</div>\n\n---\n\n## The problem\n\nYour frontend calls `/api/users/:id` and trusts the shape of what comes back. Then, one day, a backend team renames `author` to `authorInfo`, or a field quietly becomes nullable — and nothing tells you until a user hits a blank screen in production.\n\nNo OpenAPI spec catches this if it's out of date. No TypeScript type catches this if the backend and frontend are different teams, different languages, or different repos entirely.\n\n**schemind watches the actual shape of your API responses at runtime and tells you the moment it changes — no spec to write, no types to maintain.**\n\n---\n\n## Quickstart\n\n```bash\nnpm install @aminoxix/schemind\n# or\npnpm add @aminoxix/schemind\n```\n\nDrop it into your existing `fetch` calls — no rewrite required:\n\n```ts\nimport { createSchemindFetch } from \"@aminoxix/schemind\";\n\nconst fetch = createSchemindFetch({\n  onObserve: ({ endpoint, report }) => {\n    if (report?.severity === \"breaking\") {\n      console.error(\"API drift detected!\", endpoint, report);\n    }\n  },\n});\n\n// every call through this fetch is now observed automatically\nconst res = await fetch(\"/api/users/42\");\n```\n\n**Requires** Node.js `≥ 18` · zero runtime dependencies · works in browser, edge, and Node.\n\n---\n\n## How it works\n\nschemind intercepts your API calls, extracts the *structural shape* of each JSON response (field names, types, nesting — **never** the actual values), and compares it to a stored baseline. When the shape drifts, you get a precise path and severity.\n\n```\nGET /api/users/:id  →  shape extracted  →  compared to baseline\n                                                     │\n                              field_removed     →  🔴 breaking\n                              became_nullable   →  🟡 warn\n                              field_added       →  🔵 info\n```\n\nThe baseline is created automatically on first sight — subsequent calls diff against it. No schema to hand-write, ever.\n\n| Change | Severity |\n|---|---|\n| `field_removed` | 🔴 breaking |\n| `type_changed` | 🔴 breaking |\n| `array_item_changed` | 🔴 breaking |\n| `became_nullable` | 🟡 warn |\n| `became_required` | 🟡 warn |\n| `field_added` | 🔵 info |\n\n---\n\n## Integrations\n\nschemind ships first-class adapters for whatever you're already using — pick one, no other code changes needed.\n\n<table>\n<tr><td width=\"50%\" valign=\"top\">\n\n**Fetch wrapper** — the fastest way in\n```ts\nimport { createSchemindFetch } from \"@aminoxix/schemind\";\n\nexport const fetch = createSchemindFetch({\n  onObserve: ({ endpoint, report }) => {\n    if (!report || report.changes.length === 0) return;\n    console.warn(`[drift] ${endpoint}`, report);\n  },\n});\n```\n\n</td><td width=\"50%\" valign=\"top\">\n\n**Express middleware**\n```ts\nimport { schemindExpress } from \"@aminoxix/schemind/express\";\n\napp.use(express.json()); // must come first\napp.use(schemindExpress({\n  onObserve: (r) => r.report && console.log(r.report),\n}));\n```\n\n</td></tr>\n<tr><td width=\"50%\" valign=\"top\">\n\n**Next.js route wrapper**\n```ts\nimport { withSchemind } from \"@aminoxix/schemind/next\";\n\nexport const GET = withSchemind(async (req) => {\n  return Response.json(await getUsers());\n});\n```\n\n</td><td width=\"50%\" valign=\"top\">\n\n**Hono middleware**\n```ts\nimport { schemindHono } from \"@aminoxix/schemind/hono\";\n\napp.use(\"*\", schemindHono());\n```\n\n</td></tr>\n</table>\n\n**TanStack Query** gets its own zero-touch integration — wrap your `QueryClient` once and every `useQuery` / `useMutation` in the app is observed automatically:\n\n```ts\nimport { createSchemindQueryClient } from \"@aminoxix/schemind/tanstack\";\n\nconst queryClient = createSchemindQueryClient({\n  onObserve: ({ endpoint, report }) => {\n    if (report?.severity === \"breaking\") console.error(\"drift!\", endpoint, report);\n  },\n});\n```\n\nPer-query hooks (`useSchemindQuery`, `useSchemindMutation`) and a low-level `wrapQueryFn` are also available for finer control — see the [full docs](https://github.com/aminoxix/schemind#tanstack-query-integration).\n\n---\n\n## CI gate — catch drift before it ships\n\nThe `schm` CLI probes your API, diffs shapes against a committed baseline, and fails the build on breaking drift. It's a contract test that needs no spec to maintain.\n\n```bash\n# scaffold config + routes file (run once)\nnpx schm init\n\n# run the gate\nnpx schm ci --base-url https://staging.api.com --routes ./routes.json\n```\n\n```json\n[\n  { \"method\": \"GET\",  \"path\": \"/api/users\" },\n  { \"method\": \"GET\",  \"path\": \"/api/users/:id\", \"params\": { \"id\": \"1\" } },\n  { \"method\": \"POST\", \"path\": \"/api/auth/login\", \"body\": { \"email\": \"a@b.c\", \"password\": \"x\" } }\n]\n```\n\n### GitHub Action\n\n```yaml\n- uses: aminoxix/schemind@v0.5.0\n  with:\n    base-url: https://staging.api.com\n    routes: ./routes.json\n    fail-on: breaking   # info | warn | breaking\n    comment: true       # post/update a PR comment with the drift table\n```\n\n---\n\n## Persist baselines across runs\n\nBy default baselines live in memory and vanish on restart. Persist them so CI has something real to diff against:\n\n```ts\nimport { createSchemind, SnapshotStore } from \"@aminoxix/schemind\";\nimport { LocalStorageDriver } from \"@aminoxix/schemind/node\";\n\nconst engine = createSchemind({\n  store: new SnapshotStore(new LocalStorageDriver(\".schemind/snapshots\")),\n});\n```\n\nCommit `.schemind/snapshots/` to git so CI always has a baseline.\n\n| Driver | Import | Use case |\n|---|---|---|\n| `MemoryStorageDriver` *(default)* | `@aminoxix/schemind` | tests, browser |\n| `LocalStorageDriver` | `@aminoxix/schemind/node` | local dev, CI with git-committed snapshots |\n| `RedisStorageDriver` | `@aminoxix/schemind/node` | shared baseline across instances |\n| `S3StorageDriver` | `@aminoxix/schemind/node` | durable shared baseline in CI |\n\nRedis and S3 are bring-your-own-client — schemind stays dependency-free.\n\n---\n\n## Reduce noise\n\nIgnore volatile fields (`updatedAt`, `requestId`, etc.) that change on every request but aren't real drift:\n\n```ts\nexport default defineConfig({\n  ignoreFields: [\"updatedAt\", \"createdAt\", \"requestId\"],\n  ignorePaths: [\"**.timestamp\", \"data[].traceId\"],\n});\n```\n\n---\n\n## Notifications\n\nWire reporters straight into `schemind.config.mjs` — Slack, GitHub PR comments, generic webhooks (HMAC-signable), PagerDuty, and OpenTelemetry are all built in.\n\n```ts\nimport { defineConfig, slackReporter, githubReporter } from \"@aminoxix/schemind\";\n\nexport default defineConfig({\n  baseUrl: \"https://staging.api.com\",\n  routes: \"./routes.json\",\n  reporters: [\n    slackReporter({\n      webhookUrl: process.env.SCHEMIND_SLACK_WEBHOOK,\n      notifyOn: [\"warn\", \"breaking\"],\n    }),\n    githubReporter({\n      token: process.env.GITHUB_TOKEN,\n      repo: process.env.GITHUB_REPOSITORY,\n      pullNumber: Number(process.env.PR_NUMBER),\n    }),\n  ],\n  ci: { failOn: \"breaking\" },\n});\n```\n\n---\n\n## Generate types & mocks from what you've observed\n\nOnce schemind has learned your API's real shapes, export them as usable artifacts — no manual spec-writing:\n\n```bash\nschm codegen --target ts      --out src/api-types.ts   # TypeScript interfaces\nschm codegen --target openapi --out openapi.json       # OpenAPI 3.0 spec\nschm codegen --target json-schema                       # JSON Schema (stdout)\nschm codegen --target msw     --out src/mocks.ts        # MSW request handlers\n```\n\nAlready have a spec? Seed baselines from it instead of starting cold:\n\n```bash\nschm seed --from openapi.json\n```\n\n---\n\n## Local dashboard\n\n```bash\nschm dashboard\n# → http://127.0.0.1:4500\n```\n\nInspect endpoint health scores, trigger scans, and accept drift with one click.\n\n---\n\n## Backend adapters\n\nInstall a satellite adapter on your backend to unlock the hash fast-path — schemind skips shape extraction entirely when the response struct hasn't changed.\n\n| Backend | Package | Status |\n|---|---|---|\n| Go (`net/http`) | `schemind-go` | ✅ available |\n| Java / Spring Boot | `schemind-java` | ✅ available |\n| Python (FastAPI / Django) | `schemind-py` | ✅ available |\n\n---\n\n## Why schemind?\n\n- **No spec to maintain.** Baselines are learned at runtime, not hand-written and left to rot.\n- **Language-agnostic core.** The same drift model (`none` / `breaking` / `warn` / `info`) works whether your backend is TypeScript, Go, Java, or Python.\n- **Zero runtime dependencies.** Ships lean, works anywhere JavaScript runs — browser, edge, Node.\n- **Drop-in, not a rewrite.** Wrap your existing `fetch`, add a middleware line, or wrap a query client — that's the whole integration.\n- **CI-native.** Fails builds on real breaking changes, not on cosmetic diffs, with configurable severity thresholds.\n\n---\n\n## Contributing\n\nContributions are very welcome — see [CONTRIBUTING.md](https://github.com/aminoxix/schemind/blob/main/CONTRIBUTING.md) to get started. Good first areas: new backend adapters, additional reporters, and codegen targets.\n\n## License\n\n[MIT](https://github.com/aminoxix/schemind/blob/main/LICENSE) · built by [aminos](https://dev.iflyrich.space)\n","readmeFilename":"README.md"}