Next-generation JavaScript identifier recovery with LLMs.
See the codeTry FlowName in your browser → — enter your JavaScript, API key and model; no installation required.
CLI: npx --yes --package=flowname@latest flowname input.js (set GEMINI_API_KEY first).
FlowName is a next-generation Semantic Identifier Recoverer for obfuscated JavaScript. By using AST-based static analysis to group logically related variables into budgeted LLM requests, FlowName eliminates the context-loss hallucinations common in naive text-window approaches.
In a direct benchmark against a leading symbol-based tool (Humanify) on a 411-binding obfuscated scope, FlowName delivered:
Explore all 411 name comparisons in the HTML report. The 155 vs 37 comparison is an automated, uncalibrated Jev judgment; this one-program run cannot establish a general naming-quality advantage. See the benchmark notes.
Set GEMINI_API_KEY (or FLOWNAME_API_KEY) in your environment, then run:
npx --yes --package=flowname@latest flowname input.js
The CLI writes recovered code to a new flowname-output-TIMESTAMP-ID/output.js directory. Add --report to watch each request and proposed name in a live HTML report. No flags are required for the default Gemini model; the CLI does not load .env automatically. Requires Node.js 22.8+.
For the browser, open the playground, paste JavaScript, supply your own API key and start recovery. Requests go directly from your browser to the selected provider; Stop interrupts the run.
FlowName names identifiers; it does not unpack bundles or undo structural obfuscation. Use webcrack for supported obfuscation patterns or Wakaru for supported bundles, then pass the resulting JavaScript to FlowName. It resolves lexical bindings, uses lightweight relations and same-scope fallback to group targets, and asks the LLM for several names per request. See how the grouping works.
npm install flowname
import { readFile } from 'node:fs/promises';
import { recoverNames, createProvider } from 'flowname';
const sourceCode = await readFile('./input.js', 'utf8');
const provider = createProvider({
provider: 'gemini',
model: 'gemini-3.5-flash-lite',
apiKey: process.env.GEMINI_API_KEY,
});
const result = await recoverNames(sourceCode, { provider });
console.log(result.code);
See the usage guide for options, CLI reports and a complete library example. The documentation index covers the approach, architecture, limitations, prior work and Humanify comparison.
Licensed under MIT. See the release notes.
33 commits
JavaScript
49.9%
TypeScript
47.9%
HTML
2.2%
Next-generation JavaScript identifier recovery with LLMs.
See the codeTry FlowName in your browser → — enter your JavaScript, API key and model; no installation required.
CLI: npx --yes --package=flowname@latest flowname input.js (set GEMINI_API_KEY first).
FlowName is a next-generation Semantic Identifier Recoverer for obfuscated JavaScript. By using AST-based static analysis to group logically related variables into budgeted LLM requests, FlowName eliminates the context-loss hallucinations common in naive text-window approaches.
In a direct benchmark against a leading symbol-based tool (Humanify) on a 411-binding obfuscated scope, FlowName delivered:
Explore all 411 name comparisons in the HTML report. The 155 vs 37 comparison is an automated, uncalibrated Jev judgment; this one-program run cannot establish a general naming-quality advantage. See the benchmark notes.
Set GEMINI_API_KEY (or FLOWNAME_API_KEY) in your environment, then run:
npx --yes --package=flowname@latest flowname input.js
The CLI writes recovered code to a new flowname-output-TIMESTAMP-ID/output.js directory. Add --report to watch each request and proposed name in a live HTML report. No flags are required for the default Gemini model; the CLI does not load .env automatically. Requires Node.js 22.8+.
For the browser, open the playground, paste JavaScript, supply your own API key and start recovery. Requests go directly from your browser to the selected provider; Stop interrupts the run.
FlowName names identifiers; it does not unpack bundles or undo structural obfuscation. Use webcrack for supported obfuscation patterns or Wakaru for supported bundles, then pass the resulting JavaScript to FlowName. It resolves lexical bindings, uses lightweight relations and same-scope fallback to group targets, and asks the LLM for several names per request. See how the grouping works.
npm install flowname
import { readFile } from 'node:fs/promises';
import { recoverNames, createProvider } from 'flowname';
const sourceCode = await readFile('./input.js', 'utf8');
const provider = createProvider({
provider: 'gemini',
model: 'gemini-3.5-flash-lite',
apiKey: process.env.GEMINI_API_KEY,
});
const result = await recoverNames(sourceCode, { provider });
console.log(result.code);
See the usage guide for options, CLI reports and a complete library example. The documentation index covers the approach, architecture, limitations, prior work and Humanify comparison.
Licensed under MIT. See the release notes.
33 commits
JavaScript
49.9%
TypeScript
47.9%
HTML
2.2%