fixnow checks text against bundled dictionaries and returns structured spelling issues with optional correction suggestions. It supports Arabic, German, English, Spanish, French, Portuguese, Russian, and Vietnamese without downloading language data at runtime.
The API is asynchronous because dictionaries are loaded from disk when first needed. Use the root entry when an application switches languages, or a language subpath when one language is enough.
Eight language dictionaries
| Import | Language | Dictionary license |
|---|---|---|
fixnow/ar |
Arabic | LGPL-3.0 |
fixnow/de |
German | LGPL-3.0 |
fixnow/en |
English | MIT |
fixnow/es |
Spanish | LGPL-3.0 |
fixnow/fr |
French | MIT |
fixnow/pt |
Portuguese | GPL-3.0-or-later |
fixnow/ru |
Russian | GPL-3.0-or-later |
fixnow/vi |
Vietnamese | MIT |
The library code is MIT licensed. The dictionary files retain the licenses shown above and ship with their notices.
Check text and request suggestions
import { checkText, createChecker, suggest } from 'fixnow';
const issues = await checkText('This sentance has a typo', {
language: 'en',
suggestions: true,
});
const spanish = createChecker('es');
const isCorrect = await spanish.isCorrect('código');
const alternatives = await suggest('bonjoor', { language: 'fr' });
Each issue includes the misspelled word, its offset and length, and—when enabled—a list of suggestions. Bound checkers expose check, suggest, isCorrect, and warmup for one language.
In version 2, language is required. Spanish accent tolerance is an explicit acceptAccentOmissions option rather than an implicit default.
Keep technical text intact
The default tokenizer skips protected segments such as code spans, URLs, email addresses, paths, CLI flags, hexadecimal colors, filenames, and dotted identifiers. Applications can replace, extend, or disable that pattern through protectedSegments.
ignoreWords, flagWords, case sensitivity, minimum word length, and a custom protected-word callback provide additional control without modifying a dictionary.
Language-specific imports
import { check, suggest } from 'fixnow/es';
const issues = await check('Esto es un herror', { suggestions: true });
const alternatives = await suggest('herror', 3);
Subpath imports keep the consuming bundle focused on one language. The npm package still contains all eight dictionaries, so installing it downloads the complete dictionary set.
Keep it external when bundling
fixnow resolves its compressed dictionaries from node_modules/fixnow/dictionaries/ at runtime. Node-targeted bundlers—including VS Code extension and CommonJS builds—must keep fixnow external instead of inlining it.
await esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
external: ['fixnow'],
format: 'cjs',
platform: 'node',
});
The package requires Node.js 20 or newer and publishes matching ESM, CommonJS, and TypeScript declaration surfaces.



