{"_id":"@almostjacked/fitness-tools","_rev":"5-04b12f87e8894572b87500a9ceaaf389","name":"@almostjacked/fitness-tools","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@almostjacked/fitness-tools","version":"0.1.0","keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"license":"MIT","_id":"@almostjacked/fitness-tools@0.1.0","maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"homepage":"https://github.com/ajwallacemusic/fitness-tools/tree/main/packages/core#readme","bugs":{"url":"https://github.com/ajwallacemusic/fitness-tools/issues"},"dist":{"shasum":"dfa7ab4f1b82e59a207ad0ec9e0bfde299319439","tarball":"https://registry.npmjs.org/@almostjacked/fitness-tools/-/fitness-tools-0.1.0.tgz","fileCount":49,"integrity":"sha512-A/gwXQPkDcZnpirSWiRQGbX3glKz06hO4hwrbRckEBhA+sWswtnmOc2I2aaZVSDmfkZL11aSGGMU+Lr1L7t5ng==","signatures":[{"sig":"MEQCIG99XgYApO678+XnVRQu+D8HhCfn0XFPQifqHxgXjmhOAiA+GGBEN5qKwbDUXgCF/A16/AIRlVPkxC+R1rqBfdiiGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78934},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e1d2b6e3a6bc2095fe925cd6b24d2c62babb2b16","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepack":"tsc -p tsconfig.json","gen:tools":"tsx scripts/gen-tools-table.ts","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"},"repository":{"url":"git+https://github.com/ajwallacemusic/fitness-tools.git","type":"git","directory":"packages/core"},"_npmVersion":"10.2.4","description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","directories":{},"sideEffects":["./dist/index.js"],"_nodeVersion":"21.6.2","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","jsdom":"^24.0.0","vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/fitness-tools_0.1.0_1780422692042_0.48713184687726896","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@almostjacked/fitness-tools","version":"0.2.0","keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"license":"MIT","_id":"@almostjacked/fitness-tools@0.2.0","maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"homepage":"https://github.com/ajwallacemusic/fitness-tools/tree/main/packages/core#readme","bugs":{"url":"https://github.com/ajwallacemusic/fitness-tools/issues"},"dist":{"shasum":"60fa26fbdc41abdd8aaf2ff0737d80c7425ee960","tarball":"https://registry.npmjs.org/@almostjacked/fitness-tools/-/fitness-tools-0.2.0.tgz","fileCount":55,"integrity":"sha512-UP5j5xadqYpFBvnZRAvS69RC17L6is68OGZrrguWMTA2Z6vv5Q3ltZbFLZd2jKBlFfbOgn5NOlXYNRjOVFmDxA==","signatures":[{"sig":"MEYCIQCJekVFGRAlCBWm+FkjXnBqyoRneqO+OVuiOB2P110HJwIhAMKU2Z5YS2c08PrerOvwtiPWMThzj8eJ93XMO8rc2fMH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@almostjacked%2ffitness-tools@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":101285},"main":"./dist/index.js","type":"module","_from":"file:almostjacked-fitness-tools-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","gen:tools":"tsx scripts/gen-tools-table.ts","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4b87f261-392b-480a-b5d0-3ed0ec9568b4"}},"_resolved":"/tmp/4627416e4344495fcdd86c2249089ed0/almostjacked-fitness-tools-0.2.0.tgz","_integrity":"sha512-UP5j5xadqYpFBvnZRAvS69RC17L6is68OGZrrguWMTA2Z6vv5Q3ltZbFLZd2jKBlFfbOgn5NOlXYNRjOVFmDxA==","repository":{"url":"git+https://github.com/ajwallacemusic/fitness-tools.git","type":"git","directory":"packages/core"},"_npmVersion":"11.16.0","description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","directories":{},"sideEffects":["./dist/index.js"],"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","jsdom":"^24.0.0","vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/fitness-tools_0.2.0_1780666881009_0.865227334585327","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@almostjacked/fitness-tools","version":"0.2.1","keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"license":"MIT","_id":"@almostjacked/fitness-tools@0.2.1","maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"homepage":"https://github.com/ajwallacemusic/fitness-tools/tree/main/packages/core#readme","bugs":{"url":"https://github.com/ajwallacemusic/fitness-tools/issues"},"dist":{"shasum":"73de655b15e2fed2e1137c5880fb5573cf124f3f","tarball":"https://registry.npmjs.org/@almostjacked/fitness-tools/-/fitness-tools-0.2.1.tgz","fileCount":55,"integrity":"sha512-pnKiVoB95B7Ei4ZUnxfpN438KRhbMx7ewyOxK4MB2sMGasRZyfsVwi9KKnDNY7NG8IsDNG/k7dtG37qyUMP/oQ==","signatures":[{"sig":"MEUCIFiV7diAcQWD58gZI0KgMdMHzNyfjqr8L7UAXj8L3KvYAiEA+Mo70TrZKV0VFKMn7rjQgvc1+fEtGQdNw/ujEr8jhBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@almostjacked%2ffitness-tools@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":102091},"main":"./dist/index.js","type":"module","_from":"file:almostjacked-fitness-tools-0.2.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","gen:tools":"tsx scripts/gen-tools-table.ts","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4b87f261-392b-480a-b5d0-3ed0ec9568b4"}},"_resolved":"/tmp/659c1ea43afc8aadab918907dce61516/almostjacked-fitness-tools-0.2.1.tgz","_integrity":"sha512-pnKiVoB95B7Ei4ZUnxfpN438KRhbMx7ewyOxK4MB2sMGasRZyfsVwi9KKnDNY7NG8IsDNG/k7dtG37qyUMP/oQ==","repository":{"url":"git+https://github.com/ajwallacemusic/fitness-tools.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","directories":{},"sideEffects":["./dist/index.js"],"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","jsdom":"^24.0.0","vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/fitness-tools_0.2.1_1784772098969_0.9696484884934793","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@almostjacked/fitness-tools","version":"0.3.0","keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"license":"MIT","_id":"@almostjacked/fitness-tools@0.3.0","maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"homepage":"https://github.com/almostjacked/fitness-tools/tree/main/packages/core#readme","bugs":{"url":"https://github.com/almostjacked/fitness-tools/issues"},"dist":{"shasum":"dec873ecc115fa4c4b59012d323ee294072e9150","tarball":"https://registry.npmjs.org/@almostjacked/fitness-tools/-/fitness-tools-0.3.0.tgz","fileCount":59,"integrity":"sha512-t19ODl5SIlEkEfsd1axQ8dew1Q0HIcC4lHHXTXBNAzSr0MN+nN/ezIrRwTbPdS3MP3jTDrYF9jkqzvWvGCYZDg==","signatures":[{"sig":"MEUCIQCIn3FbO9d7HPAHfupGj1CCs4+LE9yVZJw7JMjUKqtEdwIgIHmFEPJOlFaqO3ZRiC0CUuy2fQb2JOQfLz/roCt7WhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@almostjacked%2ffitness-tools@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":113244},"main":"./dist/index.js","type":"module","_from":"file:almostjacked-fitness-tools-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","gen:tools":"tsx scripts/gen-tools-table.ts","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cc2a74e5-1480-4d35-8c6c-b52ec36b2aa0"}},"_resolved":"/tmp/3441fb326f580f2ceb69ce327cee59f7/almostjacked-fitness-tools-0.3.0.tgz","_integrity":"sha512-t19ODl5SIlEkEfsd1axQ8dew1Q0HIcC4lHHXTXBNAzSr0MN+nN/ezIrRwTbPdS3MP3jTDrYF9jkqzvWvGCYZDg==","repository":{"url":"git+https://github.com/almostjacked/fitness-tools.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","directories":{},"sideEffects":["./dist/index.js"],"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","jsdom":"^24.0.0","vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/fitness-tools_0.3.0_1784824618388_0.6354712262880049","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@almostjacked/fitness-tools","version":"0.4.0","description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"sideEffects":["./dist/index.js"],"dependencies":{"zod":"^3.23.8"},"devDependencies":{"typescript":"^5.5.0","vitest":"^2.0.0","jsdom":"^24.0.0","tsx":"^4.16.0"},"license":"MIT","author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"homepage":"https://github.com/almostjacked/fitness-tools/tree/main/packages/core#readme","repository":{"type":"git","url":"git+https://github.com/almostjacked/fitness-tools.git","directory":"packages/core"},"bugs":{"url":"https://github.com/almostjacked/fitness-tools/issues"},"keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"engines":{"node":">=18"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit -p tsconfig.json","gen:tools":"tsx scripts/gen-tools-table.ts"},"_id":"@almostjacked/fitness-tools@0.4.0","_integrity":"sha512-531siYwecXusWCYEpPAyw4eK3QUYiruichacXZJvi7I6SxlKJ3NI92lOepfXwI4xKsJQLUfsqB7BzUKmtgBJZQ==","_resolved":"/tmp/ca29db0cd3ad1dc35bca3aa17a83af36/almostjacked-fitness-tools-0.4.0.tgz","_from":"file:almostjacked-fitness-tools-0.4.0.tgz","_nodeVersion":"22.23.1","_npmVersion":"12.0.1","dist":{"integrity":"sha512-531siYwecXusWCYEpPAyw4eK3QUYiruichacXZJvi7I6SxlKJ3NI92lOepfXwI4xKsJQLUfsqB7BzUKmtgBJZQ==","shasum":"8315f2e27d4044c58acced4cbb4afcc072da0d86","tarball":"https://registry.npmjs.org/@almostjacked/fitness-tools/-/fitness-tools-0.4.0.tgz","fileCount":63,"unpackedSize":137215,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@almostjacked%2ffitness-tools@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCfhfhce5zsQuZV8JKkQ1VKV9HPXhI5dnG5jkMWm6B5GQIhALhoW7MCiiLzeExvLlv6lffYlRPErG2zCpy5iXzhQkgp"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cc2a74e5-1480-4d35-8c6c-b52ec36b2aa0"}},"directories":{},"maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fitness-tools_0.4.0_1784898464958_0.7811252804576598"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-02T17:51:31.830Z","modified":"2026-07-24T13:07:45.401Z","0.1.0":"2026-06-02T17:51:32.195Z","0.2.0":"2026-06-05T13:41:21.140Z","0.2.1":"2026-07-23T02:01:39.101Z","0.3.0":"2026-07-23T16:36:58.544Z","0.4.0":"2026-07-24T13:07:45.120Z"},"bugs":{"url":"https://github.com/almostjacked/fitness-tools/issues"},"author":{"name":"AJ Wallace","email":"ajwallacemusic@gmail.com"},"license":"MIT","homepage":"https://github.com/almostjacked/fitness-tools/tree/main/packages/core#readme","keywords":["fitness","health","calculator","bmr","tdee","body-fat","one-rep-max","1rm","macros","nutrition","strength","ffmi","zod","typescript","isomorphic"],"repository":{"type":"git","url":"git+https://github.com/almostjacked/fitness-tools.git","directory":"packages/core"},"description":"Composable, deterministic fitness calculators. Isomorphic: browser + server.","maintainers":[{"name":"ajwallacemusic","email":"ajwallacemusic@gmail.com"}],"readme":"# @almostjacked/fitness-tools\n\n**New here?** Start with the [getting-started tutorial](https://almostjacked.github.io/fitness-tools/start-here/getting-started/)\n— zero to an understood result in one page. The reference below is the fast version.\n\nValidated, self-describing fitness calculators for TypeScript — **runs natively in the\nbrowser and on the server**. BMR/TDEE, body fat, 1RM, macros, activity multiplier,\npowerlifting attempts, and natural muscular potential, each with multiple methods and a\nconsensus across them.\n\n[![npm](https://img.shields.io/npm/v/@almostjacked/fitness-tools.svg)](https://www.npmjs.com/package/@almostjacked/fitness-tools)\n[![CI](https://github.com/almostjacked/fitness-tools/actions/workflows/ci.yml/badge.svg)](https://github.com/almostjacked/fitness-tools/actions/workflows/ci.yml)\n· Types ✓ · 1 dependency (zod) · MIT\n\n```bash\nnpm i @almostjacked/fitness-tools\n```\n\n## Quick start\n\n```ts\nimport { REGISTRY } from \"@almostjacked/fitness-tools\";\n\nconst tdee = REGISTRY.get(\"tdee\")!;\nconst out = tdee.compute(tdee.input.parse({\n  sex: \"male\", age: 30,\n  height: { value: 180, unit: \"cm\" },\n  weight: { value: 80, unit: \"kg\" },\n  activity: \"moderate\",\n}));\n// out.results   → [{ method: \"mifflin\", value: 2759, ... }, { method: \"harris\", ... }]\n// out.consensus → { mean: 2816.05, median: 2816.05, min: 2759, max: 2873.1, n: 2 }\n```\n\nPrefer raw functions? They're exported too, fully tree-shakeable:\n\n```ts\nimport { mifflinBmr, activityMultiplier } from \"@almostjacked/fitness-tools\";\nmifflinBmr(\"male\", 80, 180, 30) * activityMultiplier(\"moderate\"); // 2759\n```\n\n## Validated & self-describing\n\nEvery tool carries a [Zod](https://zod.dev) schema, so a single definition gives you\n**runtime validation**, **static types**, and a **JSON-Schema** description — for one small\ndependency. TypeScript can't catch a negative age or a body-fat of 200% at an untrusted\nboundary like a form; the schema can:\n\n```ts\nconst r = tdee.input.safeParse({ sex: \"male\", age: -5, /* ... */ });\nif (!r.success) {\n  // r.error.issues → structured, per-field errors you can render in a form\n}\n```\n\nThe same schemas describe each tool (`tool.input` / `tool.output`), which is how the\ncompanion HTTP server generates its catalog and OpenAPI spec — no hand-written docs.\n\n## Runs in the browser, no build step\n\n```html\n<script type=\"module\">\n  import { mifflinBmr } from \"https://esm.sh/@almostjacked/fitness-tools\";\n  console.log(mifflinBmr(\"female\", 65, 168, 28));\n</script>\n```\n\nThe package is isomorphic — zero Node-only APIs — so the identical code runs in a browser,\nan edge function, or Node.\n\n## Tools\n\n<!-- tools:start -->\n| Tool | Methods | Description |\n|---|---|---|\n| `tdee` | mifflin, harris, katch, cunningham | Estimate BMR and TDEE via Mifflin-St Jeor, Harris-Benedict, Katch-McArdle, and Cunningham. Provide body_fat or lean_mass to unlock the LBM-based methods. |\n| `adaptive-tdee` | kalman, regression, endpoints | Measure actual TDEE from a logged history of daily weight and/or calorie intake. Default method (kalman) is a joint Kalman filter over true weight and TDEE — handles missing days, gates outliers, and reports uncertainty (CI95) alongside denoised true weight; regression/endpoints are simple window-based estimates kept for comparison. Use instead of formula TDEE once real logged data exists. Each entry needs at least one of weight/kcal (not necessarily both). Entry dates must span 10 years or less (earliest to latest). Note: all methods need at least one weigh-in (kalman) or two (regression/endpoints) — a history with zero weight entries throws under the kalman default; pass methods:'all' to get a graceful empty/skipped result instead. |\n| `body-fat` | navy, jackson-pollock-3, deurenberg | Estimate body-fat % via US Navy circumference, Jackson-Pollock 3-site skinfold, and Deurenberg (BMI-based) methods. |\n| `one-rep-max` | epley, brzycki, lombardi, wathan, oconner, mayhew | Estimate 1RM from a submaximal set via Epley, Brzycki, Lombardi, Wathan, O'Conner, and Mayhew; returns a %1RM load chart. |\n| `macros` | g-per-kg | Compute protein/fat/carb grams for a calorie target using the g-per-kg-bodyweight method, with goal-based protein defaults. |\n| `activity-multiplier` | lookup, neat-eat | Estimate the TDEE activity multiplier via the classic lookup table or a NEAT+EAT model (occupation/steps for non-exercise, training volume for exercise). |\n| `powerlifting-attempts` | standard | Deterministic opener/second/third attempts from an estimated 1RM, plus a warmup ramp and per-side plate loading. Tunable by aggressiveness and available plates. |\n| `muscle-potential` | casey-butt, ffmi-cap, berkhan | Estimate drug-free maximum bodyweight at a target body-fat % via Casey Butt (wrist+ankle), the FFMI~25 natural cap, and Berkhan's max-contest-weight model. Men only in v1. |\n| `ffmi` | standard | Compute the Fat-Free Mass Index (FFMI) and its height-adjusted form from weight and body fat (or lean mass), and flag whether it exceeds the ~25 natural ceiling. |\n| `rsmi` | direct, wen-2011 | Estimate the appendicular skeletal muscle index (RSMI) from a DXA value (direct) and/or an anthropometric estimate (Wen 2011), and flag low muscle mass against EWGSOP2, AWGS, and Baumgartner sarcopenia cutoffs. |\n<!-- tools:end -->\n\nEach tool runs several methods and reports a `consensus` (mean/median/min/max/n) across\nthem; methods whose inputs are missing are listed in `skipped` (or raise in explicit mode).\nUnits are explicit everywhere (`{ value, unit }`).\n\n## Need it over HTTP?\n\nThere's a reference HTTP server — [`@almostjacked/fitness-tools-api`](../../apps/api) — that re-exposes\nthese calculators over HTTP for clients that can't `npm install` a TS package (other\nlanguages, curl, no-code tools). It's optional: if you're in JS/TS, use this package\ndirectly. The server adds a network boundary, not capability.\n\n## License\n\nMIT — free, open-source, and usable in commercial products. See [LICENSE](../../LICENSE).\nBuilt on published formulas (Mifflin-St Jeor, US Navy, Jackson-Pollock, Epley, Casey Butt,\netc.); contributions welcome.\n","readmeFilename":"README.md"}