Our combined changelog and roadmap. It contains todos as well as dones.
Only project-wide changes are mentioned here. For individual function changelogs, please refer to their respective Git histories.
Locutus does not follow SemVer as we're a work in progress - and even though we try, we cannot guarantee BC-safety for the hundreds of contributions across the many languages that Locutus is assimilating.
Ideas that will be planned and find their way into a release at one point
-
Address the 25 remaining test failures→ reduced to 1 (set_time_limitis intentionally untestable) - Compare example test cases for PHP against
php -r→ implemented via parity verification system (yarn test:parity) -
Have one way of checking pure JS arrays→ standardized toArray.isArray()in 43 files (PR #518). Object checking patterns remain varied (acceptable - different use cases). -
Investigate callable helper→ Only 2 files use complex resolution (is_callable.js,call_user_func_array.js). Low ROI for abstraction.array_walkonly accepts functions directly. -
Parse→ used existing esprima AST parsing to extract require() calls. 85 PHP functions now show internal dependencies on website with linksrequires with ts-morph - Verification: verify examples against native runtimes with Docker (254 functions verified across 5 languages)
- [x] PHP: 170 functions verified against PHP 8.3
- [x] Go: 20 functions verified against Go 1.23
- [x] Python: 23/25 (92%) - remaining: capwords (impl difference), printable (.length)
- [x] Ruby: 30/32 (94%) - remaining: sample (random), acos (example incompatible)
- [x] C: 11/18 (61%) - remaining: sprintf, strchr, strstr, strcat, frexp, isspace, atof (complex/different semantics)
- [x] Infrastructure: parallel execution, caching, modular architecture, per-language handlers, type-safe config
- [x] CI integration:
parity verified:header in function files, Zod validation,yarn test:parity- [x] Badge: "Verified against PHP 8.3" (added to README, PR #501) - Modernize, e.g.:
- [x] Migrate Babel 6 → TS (Node 22+ typestripping) - removed Babel, using
node --experimental-strip-types- [x] Migrate Mocha → Vitest (PR #506) - [ ] Migrate customtest/browser/app.jsandyarn browser:watch/browserify → Vitest with Playwright support (blocked on ESM migration - Vite browser mode requires ESM, but source functions are CJS) - [ ] Drop Node < 22 support (planned for v3; requires Node >= 22) - [x] ESLint/Prettier → Biome (done in v2.0.33) - [ ] Migrate CJS → ESM (v3.0 candidate - 448 files, use tsup for dual exports, breaking change for consumers) - [x]Migrate Custom tagged releases → Changesets(current process works well: npm version + gh release) - [x] Migrate JS → TS for infra scripts (use Node v22+ native type stripping to run) - TypeScript:
- [x] Convert
src/_util/to TypeScript - [x] Strict mode compatible. Node type stripping compatible - Expansion (port more functions to the different languages) we'll go from most feasible + sensible, to least :) Also: improve header comment driven test coverage to expose more edge cases. And finally another way to expand is on parity test coverage, and fixing issues found by doing that.
- New language candidates (missing from
src/, ranked by suitability for Locutus): 1. Perl (Excellent) - PHP's spiritual ancestor, dynamically typed, function-first stdlib. Functions:join,split,grep,map,sort,reverse,substr,index,uc,lc,chomp. Module structure: core +List::Util,File::Basename. 2. Lua (Excellent) - Simple, clean, educational. Small but organized stdlib. Functions:string.sub,string.upper,string.lower,table.insert,table.sort,math.floor. Module structure:string,table,math,io,os. 3. R (Good) - Vectorized but function-centric; strong text + math. Functions:nchar,substr,toupper,tolower,paste,grep,gsub,sprintf,sort. 4. Julia (Good) - Multiple dispatch and rich stdlib, great for math-heavy functions. Functions:split,join,replace,lowercase,uppercase,sort,floor,round. Modules:Base,Printf,Statistics. 5. Elixir (Good) - Module/function oriented;StringandEnummap well tostrings/array. Functions:String.split,String.replace,String.downcase,String.upcase,Enum.map,Enum.filter. 6. Clojure (Good) - Strong function-first stdlib;clojure.stringmirrors JS string ops. Functions:clojure.string/split,join,replace,lower-case,upper-case, plus coremap/filter/reduce. 7. AWK (Good) - Text processing powerhouse, function-based. Functions:length,substr,index,split,gsub,sub,tolower,toupper,sprintf. Could be single category or split by type. 8. Bash (Moderate) - Useful for CLI, but command-based nature challenging. Built-ins:printf,test, string ops via parameter expansion (substring, replace, case conversion). 9. Java (Moderate) - Popular but OOP-heavy. Static methods only:Math.max,Math.min,Math.abs,Arrays.sort,String.format. Package structure:java.lang,java.util. 10. Rust (Lower) - Ownership model + method-heavy, but solid stdlib. Methods:trim,split,chars. Modules:std::string,std::collections. 11. Haskell (Lower) - Different paradigm but educational. Functions:map,filter,foldl,foldr,zip. Modules:Data.List,Data.Char. - Selection criteria: (1) Type compatibility with JS, (2) Stdlib organized in modules/categories, (3) Function-oriented (or easy to wrap methods as functions), (4) Popularity/demand, (5) Semantic compatibility with JS, (6) Clean mapping to existingsrcmodule layout (strings/array/math/pcre/etc.) - Docs/Website: - [x] The function pages could have a badge themselves in which language version they were parity checked (similar to what was added in the README.md) - [x] website: Render authors server-side (PR #511) - [x] website: Fix the search functionality (verified working 2026-01-07) - [x] Hexo upgrade to 8.1.1 (PR #512) - Next.js migration deferred - [x] Fix Search by function name or behavior (verified working 2026-01-07) - [x] "Rosetta Stone" view for cross-language comparison (PR #520)
Released: TBA. Diff.
Released: 2026-01-19. Diff.
- Restore published Node engine range to >= 10 for 2.x releases (engine bumps now treated as major changes)
- Add CI guardrail to block raising
engines.nodewithout a major version bump
Released: 2026-01-08. Diff.
- R:
toupper,tolower,nchar,sqrt,round,max,min(7) - Lua:
string.len,string.rep,string.reverse,math.sqrt,math.sin,math.cos,math.max,math.min(8) - AWK:
cos,exp,log,sin,sqrt(5) - Elixir:
String.downcase,String.upcase,String.length,String.reverse(4) - Clojure:
string/lower-case,string/upper-case,string/reverse,string/trim,string/blank?(5) - Julia:
lowercase,uppercase(2) - Perl:
reverse(1)
- Moved
rosetta.ymlfromsrc/_data/tosrc/for cleaner structure - Fixed parity test handlers for Julia, Elixir, Clojure, R (string quoting, float precision)
- Updated cross-language mappings in rosetta.yml
Released: 2026-01-08. Diff.
- Perl string functions:
uc(uppercase),lc(lowercase),substr(with negative offset support) - Fixed parity test string normalization for Perl
Released: 2026-01-08. Diff.
- Lua string functions:
upper,lower,sub(with 1-based indexing and negative index support) - AWK builtin functions:
tolower,toupper - Fixed parity test string normalization for Lua and AWK
Released: 2026-01-08. Diff.
- Perl 5.40:
POSIX::ceil,POSIX::floor,core::length - Lua 5.4:
math.ceil,math.floor,math.abs - R 4.4:
ceiling,floor,abs - Julia 1.11:
Base.ceil,Base.floor,Base.abs - Elixir 1.18:
Float.ceil,Float.floor,Kernel.abs - Clojure 1.12:
Math/ceil,Math/floor,Math/abs - GNU AWK 5.3:
length,int,substr
- Go: 11 strings functions (
Contains,ContainsAny,Count,EqualFold,HasPrefix,HasSuffix,Index,LastIndex,Repeat,ReplaceAll,Split) - Ruby: 14 Math functions (
sqrt,sin,cos,exp,log,tan,asin,atan,cbrt,cosh,log10,log2,sinh,tanh) - Python: 8 math functions (
ceil,floor,exp,fabs,log,log10,log2,trunc)
- New cross-language verification system with Docker
- PHP: 164 functions verified against PHP 8.3
- Python: 23/25 functions verified against Python 3.12
- Go: 20 functions verified against Go 1.23
- Ruby: 30/32 functions verified against Ruby 3.3
- C: 11/18 functions verified against GCC
parity verified:header in function files for CI integration- Parallel execution with caching for fast test runs
- Rosetta Stone: Cross-language function links on each function page
- Hover tooltips on verified badges showing exact version
- Internal dependencies shown with clickable links
- Authors rendered server-side instead of client-side JS
- Hexo upgrade 7.1.1 → 8.1.1
- Converted
src/_util/to TypeScript, removed Babel 6 - Migrated from Mocha/Chai to Vitest
- Updated Node engine requirement from >= 10 to >= 22
- Added stricter Biome rules:
noAccumulatingSpread,useAwait,noFloatingPromises - CI runs full lint checks (
lint:ts,lint:headers,lint:no-stray-js) - Standardized array checking to
Array.isArray()across 43 files - Added
composer.jsonfor PHP project integration
- mocha 10 → 11, chai 4 → 6, rimraf 5 → 6, cross-env 7 → 10
- Node 25 compatibility: async queue drain, indentString
- Docker image pull optimization (once at init, not per-function)
Released: 2026-01-07. Diff.
-
quoted_printable_encode: Fixed soft line break stripping logic -
get_defined_functions: Updated unrealistic test expectation -
array_diff_uassoc: Corrected expected return value to match PHP -
array_merge_recursive: Reimplemented to properly merge arrays recursively -
array_splice: Fixed test to use arrays instead of objects
- Updated Yarn from 4.0.1 to 4.12.0
- Added Knip for unused code detection
- Added TypeScript and @types/node as devDependencies
- Created initial TypeScript type definitions (index.d.ts)
- Added cross-language verification script (scripts/verify.ts)
- Migrated from ESLint/Prettier to Biome
- Introduced
yarn checkcommand
- Added CORE_MAINTAINER.md maintenance workflow
- Documents LGPL licensing for bc functions (closes #473)
- Added CONTRIBUTING.md improvements
- Go strings: +10 functions (HasPrefix, HasSuffix, ToLower, ToUpper, Trim, TrimSpace, Replace, Split, Join, Repeat)
- Go strconv: +6 functions (Atoi, Itoa, ParseBool, ParseInt, FormatBool, FormatInt)
- Python string: +5 functions (digits, hexdigits, octdigits, printable, whitespace)
- Python math: +7 functions (factorial, gcd, isfinite, isinf, isnan, pow, sqrt)
- Ruby String: +11 functions (capitalize, chomp, chop, downcase, upcase, include, length, reverse, start_with, end_with, strip)
- Ruby Array: +6 functions (compact, first, last, flatten, sample, uniq)
- C ctype.h: +8 functions (isalnum, isalpha, isdigit, islower, isupper, isspace, tolower, toupper)
- C stdlib.h: +2 functions (atoi, atof)
- C string.h: +5 functions (strlen, strcmp, strchr, strstr, strcat)
Released: 2024-04-05. Diff.
- Update intro and add to the NPM module as a
README.md
Released: 2024-04-05. Diff.
- dx: Add
use strictto generated tests - dx: Add Stale Action
- file_exists: Introduced (in #461, thx @erikn69)
- strtotime: Add support oracle dates (fixes #340)
- bin2hex: Add support for multi-byte characters (fixes #427)
- var_dump: Detect circular references (fixes #305)
- escapeshellarg: Add Windows support (fixes #395)
- fmod: Fix Uncaught RangeError: toFixed() digits argument must be between 0 and 100 (thx @dekairi, fixes #417)
Released: 2024-04-05. Diff.
- Relax yarn engine requirement (fixes #467)
- Allow for custom mocha tests for functions (that arent generated based on header comments)
Released: 2024-04-04. Diff.
- Fix issue #458: unserialize fails when serialized array contains (@kukawski)
- dx: Switch from
master->mainbranch - dx: Upgrade to Yarn 4 managed by Corepack
- dx: Add testing for Node 20
- dx: Add prettier & upgrade ESLint & StandardJS
- dx: Upgrade Hexo to latest
- dx: Clarify contributing docs
- dx: Allow all core contributors to cut NPM releases by pushing Git tags (GHA CI handles the rest)
- dx: Upgrade all remaining dependencies
Released: 2019-06-12. Diff.
- Switch from Travis CI to GitHub Actions
- Fix ReDOS on IPv6
- Basic timezone support in strtotime
Released: 2019-06-12. Diff.
- functions: Community-contributed function improvements, see respective functions' changelogs in the Diff:
- ci: test Node.js 6, 8, 10 and 11 (#384)
- website: Fix code listing on locutus website (#379)
Released: 2018-09-07. Diff.
- functions: Community-contributed function improvements, see respective functions' changelogs in the Diff.
Released: 2017-06-22. Diff.
- functions: Community-contributed function improvements, see respective functions' changelogs in the Diff.
Released: 2017-02-23. Diff.
- Upgrade eslint and fix newly found issues accordingly
- functions: Community-contributed function improvements, see respective functions' changelogs in the Diff.
Released: 2017-02-09. Diff.
- functions: Community-contributed function improvements, see respective functions' changelogs in the Diff.
Released: 2016-06-16. Diff.
- Language fixes
Released: 2016-06-16. Diff.
- Cache node modules on Travis so we'll be less dependent on npm connectivity
Released: 2016-05-25. Diff.
- Upgrade depurar to 0.2.2, fixing an issue with the testwriter (@kukawski)
- Add the 'reimplemented by' and 'parts by' contributionKeys to the /authors website page
- Fix linting warnings when hacking on website by adding eslint dependencies locally
- Improve array_rand: Fix coding style, hangs when selected huge number of keys from huge array, function signature (@kukawski)
Released: 2016-05-22. Diff.
- Minor
util.jsrefactoring - Use hexo deploy instead of custom bash script to aid Windows compatibility
- Use cross-env and rimraf in build scripts to aid Windows compatibility
- Improve Travis auto-deployments (now using official deploy methods)
- Switch from locutusjs.io to locutus.io
- Triage all open issues and PRs
- Triage all open issues and PRs
- docs: Miscellaneous cosmetic updates
- website: Miscellaneous cosmetic updates
- website: Show languages & functions in profile sidebar
- website: Add social buttons
- website: Let Travis auto-deploy to gh-pages on main changes
- website: Use Hexo deploy vs bash script
Released: 2016-05-02. Diff.
- Don't use
filesin package.json as we don't ship all ofdistnow
Released: 2016-05-02. Diff.
- Don't use
binin package.json as we don't shipcli.js
Released: 2016-05-02. Diff.
- website: Add profile to sidebar
- Rename
_locutus_sharedto_helpers. Rename_locutus_shared_bcto_bc - website: Fix jumpy scrolling due to on the githubs
- website: DRY up add_more code
- website: About as homepage
- Transpile to ES5 before publishing to npm
- Add
estargetoption to all functions, setip2longtoes2015 - Change
fix(me)?andTodoto@todo - Replace single line
/**/comments with// - Enforce a 100 character line-length via eslint, and change all functions accordingly
- Do not pass values by reference via the
windowglobal, use e.g.countObj.valueanderrorObj.valueinstead - Have one way of getting an
inivalue and its default - Track all cases of
setTimeout, use them without window prefix. Removecodezreplace hack - Track all cases of XMLHttpRequest
- Test
is_arrayin-browser to see if therequireforini_getworks correctly with Browserify - Deprecate blocking ajax requests in e.g.
file_get_contents - Use native
sha1andmd5encoding when available - Remove XUL from functions
- Rename
strictForIntosortByReference - Remove
// (BEGIN|END) (STATIC|REDUNDANT) - Index all
notes - Either deprecate or document all functions using
evalornew Function - Port Util to ES6 class
- Write one function (
ip2long) in ES6 and make it pass tests & linting - Deprecate support for node_js: 0.8
- Make Travis fail on eslint issues
- Move CHANGELOG to own file
- Make all functions pass eslint with JavaScript Standard Style
- Remove
_workbenchand_experimental. They are available for reference in1.3.2but making them harder to find for newcomers should help avoid a lot of complaints - Move functions that overly rely on ini & locales & global & ajax file operations to _legacy
- Address ~50 test failures that were previously skipped and now enabled
-
json_*functions can leverage Node's - Add ES6 capabilities
- Adopt better global detection, use
$locutus.golang.<specifics> - Add more 'social' buttons to website (twitter, github)
- Rework injectweb after structural changes in util.js
- Use
requirefor dependencies - Remove
;from examples in accordance with JavaScript Standard Style - Use mocha for generating language tests
- Use require for dependencies
- In util.opener: First
*should point to the requesting/current language - Split out the npm module so you could do
var sprintf = require('locutus/sprintf') - Launch BC breaking blogpost
- Roll out support for Ruby, C, Go, Python
Released: April 4, 2016
- Start using a CHANGELOG https://github.com/locutusjs/locutus/releases/tag/v1.3.2