{"_id":"@aparte/titler","_rev":"6-548a7545f17a2a6ab3cf6350b07f1fde","name":"@aparte/titler","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@aparte/titler","version":"1.0.0","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"license":"MIT","_id":"@aparte/titler@1.0.0","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"homepage":"https://apartejs.dev/models/titler/","bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"dist":{"shasum":"3aa8797e7b5a9937eee77e9c6a22059aaf23f61a","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.0.0.tgz","fileCount":5,"integrity":"sha512-2qluJmvDDzUDfN6sqgfQulzFXW1DNlIzs/TxyXYo6Y7dQc6JpakQtOi1grThJmfpAM9ObOxEKAtyQbyKjgH5PQ==","signatures":[{"sig":"MEYCIQDNrVC0CHD2QshSVne0GHbJLC2uMfqnoBqBwIhd3teFJQIhANEmB+Wje6QbX7USyp5q94HbcUqGWBLJH7i+/aIrhr1g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21277},"main":"./src/titler.js","type":"module","_from":"file:aparte-titler-1.0.0.tgz","types":"./src/titler.d.ts","module":"./src/titler.js","engines":{"node":">=18"},"exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"scripts":{"test":"node --test test/*.test.mjs"},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\bddd3427f6190756451083aab6d4b9d4\\aparte-titler-1.0.0.tgz","_integrity":"sha512-2qluJmvDDzUDfN6sqgfQulzFXW1DNlIzs/TxyXYo6Y7dQc6JpakQtOi1grThJmfpAM9ObOxEKAtyQbyKjgH5PQ==","repository":{"url":"git+https://github.com/apartejs/aparte-titler-model.git","type":"git","directory":"packages/titler"},"_npmVersion":"11.9.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/titler_1.0.0_1788380626208_0.8955007033281028","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aparte/titler","version":"1.0.1","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"license":"MIT","_id":"@aparte/titler@1.0.1","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"homepage":"https://apartejs.dev/models/titler/","bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"dist":{"shasum":"7bb27a170e598115209a9308f98ea62397d021fe","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.0.1.tgz","fileCount":5,"integrity":"sha512-15qhtQT8lYdrFab/SE5aa1JEdVcxK2i6FwESvu1PU8M6yygQwNLwt7U5hafQ0dw1G6O2TOpOvHYyuNfG64mUkQ==","signatures":[{"sig":"MEUCIFbdStrIM67sJvpba0rkofQa6Ip1BCkPZUMowV+nWNTXAiEAu+4j4m6TiOcjnHpJMKgXjbFMxky3/xOHhhud7TeO/Fs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21277},"main":"./src/titler.js","type":"module","_from":"file:aparte-titler-1.0.1.tgz","types":"./src/titler.d.ts","module":"./src/titler.js","engines":{"node":">=18"},"exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"scripts":{"test":"node --test test/*.test.mjs"},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\764c021e3c2f083f34fadbb510c6b19c\\aparte-titler-1.0.1.tgz","_integrity":"sha512-15qhtQT8lYdrFab/SE5aa1JEdVcxK2i6FwESvu1PU8M6yygQwNLwt7U5hafQ0dw1G6O2TOpOvHYyuNfG64mUkQ==","repository":{"url":"git+https://github.com/apartejs/aparte-titler-model.git","type":"git","directory":"packages/titler"},"_npmVersion":"11.9.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/titler_1.0.1_1788381217496_0.01140889401578482","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aparte/titler","version":"1.0.2","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"license":"MIT","_id":"@aparte/titler@1.0.2","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"homepage":"https://apartejs.dev/models/titler/","bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"dist":{"shasum":"df80e2b57fad857559b8b0c90037c2be8ce66eb2","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.0.2.tgz","fileCount":5,"integrity":"sha512-IxP8fNIkTRanTaqcERD1EtlwZP0WRHlujcKQxNbe+t77mi2vcP/6ROmd1utt05vKbuIfk4A/Vb3YeIK2vC6/Iw==","signatures":[{"sig":"MEUCIQCodl60mUOfpQExURMvVxT+cvWe0N47tWBUvm42M/czhwIgHlmZl0Cy6C/G5KdCnUesy5u5X3aU2wHZ6oi/HLtWSyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22388},"main":"./src/titler.js","type":"module","_from":"file:aparte-titler-1.0.2.tgz","types":"./src/titler.d.ts","module":"./src/titler.js","engines":{"node":">=18"},"exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"scripts":{"test":"node --test test/*.test.mjs"},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\f1c3469bdebbf9e32a221107af3120b4\\aparte-titler-1.0.2.tgz","_integrity":"sha512-IxP8fNIkTRanTaqcERD1EtlwZP0WRHlujcKQxNbe+t77mi2vcP/6ROmd1utt05vKbuIfk4A/Vb3YeIK2vC6/Iw==","repository":{"url":"git+https://github.com/apartejs/aparte-titler-model.git","type":"git","directory":"packages/titler"},"_npmVersion":"11.9.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/titler_1.0.2_1788384797978_0.932323626931211","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aparte/titler","version":"1.0.3","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"license":"MIT","_id":"@aparte/titler@1.0.3","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"homepage":"https://apartejs.dev/models/titler/","bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"dist":{"shasum":"07980127ae6ba582a72bd28daf0ecd6567974938","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.0.3.tgz","fileCount":5,"integrity":"sha512-8vgY2OVtkrZtRcmbvH5ejvEQHHOFkCmAwr1FnzRN3+nhLfzwv5HU/StUiofI43gk94EDYqv0SuLQRBAJjoDfuA==","signatures":[{"sig":"MEQCIDx6ct6GcJpOr8XoWQS3sVE8EWupOa6g0pPnhVM8LAOVAiBeEmoE2DF/eExlknMOeiz+0wdCzAMlfnwCm6NpQF50PQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22388},"main":"./src/titler.js","type":"module","_from":"file:aparte-titler-1.0.3.tgz","types":"./src/titler.d.ts","module":"./src/titler.js","engines":{"node":">=18"},"exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"scripts":{"test":"node --test test/*.test.mjs"},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\4bf2e9f305deb7f4ddc7b81635729547\\aparte-titler-1.0.3.tgz","_integrity":"sha512-8vgY2OVtkrZtRcmbvH5ejvEQHHOFkCmAwr1FnzRN3+nhLfzwv5HU/StUiofI43gk94EDYqv0SuLQRBAJjoDfuA==","repository":{"url":"git+https://github.com/apartejs/aparte-titler-model.git","type":"git","directory":"packages/titler"},"_npmVersion":"11.9.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/titler_1.0.3_1788455122610_0.21715784251541748","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@aparte/titler","version":"1.0.4","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"license":"MIT","_id":"@aparte/titler@1.0.4","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"homepage":"https://apartejs.dev/models/titler/","bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"dist":{"shasum":"159c8a5da247c0f2824010f441b4a81a58cf03aa","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.0.4.tgz","fileCount":5,"integrity":"sha512-p3WLvPpGaBhnA8hy8SrTXUrMP2CtCFFMN5/3dD7n3Y25sZ0OACf6afK0Jg4gJhOI76oR4dcvh+bSy67mGIjq+w==","signatures":[{"sig":"MEQCIAfJfTGc30V79E7RlGgFNd81TuTs+ROv7Dj8hVwnduMbAiBNl1ZaNrDpn3HCEFuLcfR63KtTPEj5xHuoO3gbdjXafA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22388},"main":"./src/titler.js","type":"module","_from":"file:aparte-titler-1.0.4.tgz","types":"./src/titler.d.ts","module":"./src/titler.js","engines":{"node":">=18"},"exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"scripts":{"test":"node --test test/*.test.mjs"},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\0105097615c7c711bd7886ff1a3f244c\\aparte-titler-1.0.4.tgz","_integrity":"sha512-p3WLvPpGaBhnA8hy8SrTXUrMP2CtCFFMN5/3dD7n3Y25sZ0OACf6afK0Jg4gJhOI76oR4dcvh+bSy67mGIjq+w==","repository":{"url":"git+https://github.com/apartejs/aparte-titler-model.git","type":"git","directory":"packages/titler"},"_npmVersion":"11.9.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/titler_1.0.4_1788456756197_0.36066280174401033","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aparte/titler","version":"1.1.0","description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","license":"MIT","homepage":"https://apartejs.dev/models/titler/","repository":{"type":"git","url":"git+https://github.com/apartejs/aparte-titler-model.git","directory":"packages/titler"},"bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"type":"module","main":"./src/titler.js","module":"./src/titler.js","types":"./src/titler.d.ts","exports":{".":{"types":"./src/titler.d.ts","default":"./src/titler.js"}},"sideEffects":false,"engines":{"node":">=18"},"scripts":{"test":"node --test test/*.test.mjs"},"_id":"@aparte/titler@1.1.0","_integrity":"sha512-bHlzY9gsZ+PwJCJ7ar0BdhzLHuug9lQzyIVReDprFx9xfkrp7S1eByKUune1lQNR8zdclkQr6/RIILlnZBz3Rg==","_resolved":"C:\\Users\\paul\\AppData\\Local\\Temp\\e73688596ce92691a2263415b4de8b2f\\aparte-titler-1.1.0.tgz","_from":"file:aparte-titler-1.1.0.tgz","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-bHlzY9gsZ+PwJCJ7ar0BdhzLHuug9lQzyIVReDprFx9xfkrp7S1eByKUune1lQNR8zdclkQr6/RIILlnZBz3Rg==","shasum":"3f13d51e8a84faf1e6c1151c0598861fbf171b19","tarball":"https://registry.npmjs.org/@aparte/titler/-/titler-1.1.0.tgz","fileCount":5,"unpackedSize":25082,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICw4naja9RJ+bW9TD527kJdvYV6TLHOJQ1NrGoo7dktHAiBbBhiM9w05SyG23qSVRrwfAiRWwBz+9X0WeCG4D1ebSw=="}]},"_npmUser":{"name":"paulrichez","email":"paul.richez59@gmail.com"},"directories":{},"maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/titler_1.1.0_1788620960839_0.258127277807652"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-02T20:23:45.976Z","modified":"2026-09-05T15:09:21.152Z","1.0.0":"2026-09-02T20:23:46.345Z","1.0.1":"2026-09-02T20:33:37.647Z","1.0.2":"2026-09-02T21:33:18.128Z","1.0.3":"2026-09-03T17:05:22.751Z","1.0.4":"2026-09-03T17:32:36.349Z","1.1.0":"2026-09-05T15:09:20.989Z"},"bugs":{"url":"https://github.com/apartejs/aparte-titler-model/issues"},"license":"MIT","homepage":"https://apartejs.dev/models/titler/","keywords":["chat","title","conversation","summarization","extractive","tiny-model","browser","offline","aparte","nlp","multilingual"],"repository":{"type":"git","url":"git+https://github.com/apartejs/aparte-titler-model.git","directory":"packages/titler"},"description":"Conversation titles from the first message, in 17 languages, in the browser — the runtime for aparte-titler models (bring your own .bin, or use @aparte/titler-latin)","maintainers":[{"name":"paulrichez","email":"paul.richez59@gmail.com"}],"readme":"# @aparte/titler\r\n\r\nThe runtime for [aparte-titler](https://apartejs.dev/models/titler/) models: a title of 3 to 6 words for a conversation, copied verbatim from its first message, in the browser or in Node, with no API call. One file, no dependency, ~6 KB minified, 6–7 ms per title on one CPU core.\r\n\r\nThis package is the runtime only. It reads the `.bin` model files published at [huggingface.co/apartejs/aparte-titler](https://huggingface.co/apartejs/aparte-titler). If you just want it to work, install [`@aparte/titler-latin`](https://www.npmjs.com/package/@aparte/titler-latin) instead: same runtime, default model bundled (17 languages, 133 KB).\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install @aparte/titler\r\n```\r\n\r\n## Use\r\n\r\n```js\r\nimport { Titler } from \"@aparte/titler\";\r\n\r\n// any model from https://huggingface.co/apartejs/aparte-titler\r\nconst url = \"https://huggingface.co/apartejs/aparte-titler/resolve/main/titler-v1.1-latin-int3.bin\";\r\nconst titler = new Titler(await fetch(url).then((r) => r.arrayBuffer()));\r\n\r\ntitler.title(\"Write me a cover letter for a junior data analyst position at a bank\");\r\n// -> \"cover letter junior analyst position bank\"\r\n\r\ntitler.title(\"Salut ! Tu peux me donner une recette de pain sans gluten facile pour ce week-end ?\", 4);\r\n// -> \"pain gluten facile week-end\"   (a budget of 4 words instead of 6)\r\n\r\ntitler.words(\"Can you explain how photosynthesis works in plants?\");\r\n// -> { words: [{ word: \"Can\", start: 0, end: 3, score: 0.11 }, …, { word: \"photosynthesis\", start: 19, end: 34, score: 1.00 }, …], … }\r\n```\r\n\r\nIn Node, read the file instead of fetching it:\r\n\r\n```js\r\nimport { readFile } from \"node:fs/promises\";\r\nconst buf = await readFile(\"titler-v1.1-fr-int3.bin\");\r\nconst titler = new Titler(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength));\r\n```\r\n\r\nGive the model **only the user's first message** — never a system prompt or the conversation history: it picks the most salient words of whatever it is given.\r\n\r\n## Which model file?\r\n\r\n| file | covers | int3 size |\r\n|---|---|---|\r\n| `titler-v1.1-latin-int3.bin` | 17 European languages (en, fr, es, de, pt, it, nl, pl, sv, da, fi, cs, ro, no, hu, hr, lt) | 133 KB |\r\n| `titler-v1.1-latin-mini-int3.bin` | the same 17, smaller vocabulary, −0.5 point on average | 96 KB |\r\n| `titler-v1.1-efigsp-int3.bin` | en, fr, es, de, pt, it | 77 KB |\r\n| `titler-v1-<lang>-int3.bin` | one language | 40 KB |\r\n\r\nEvery model also exists in `fp32`, `int8` and `int4`. `int3` is the recommended precision: same score as `fp32` on every benchmark. Scores, sizes and charts: [huggingface.co/apartejs/aparte-titler](https://huggingface.co/apartejs/aparte-titler).\r\n\r\n## What it does, exactly\r\n\r\nA 2-layer transformer encoder (58k parameters for one language, 141k for seventeen) scores every word of the message; the title is the best-scored words, kept in message order. The words are always copied from the message — it never rewrites, never invents, never corrects a typo. It also cannot execute anything: the worst an injected instruction can do is a poor title.\r\n\r\n## Format and versions\r\n\r\nThe runtime reads model files of `format: 1`. A future format 2 (new architecture) will ship with a new major version of this package that still reads format 1 files. Models and runtime follow the same versioning: `1.x` keeps the file format, `2.0` changes it.\r\n\r\n## License\r\n\r\nMIT © 2026 Paul Richez. The models have their own cards and licenses on Hugging Face.\r\n","readmeFilename":"README.md"}