123wwwa/FlowName

Next-generation JavaScript identifier recovery with LLMs.

JavaScript

1

33 commits

updated Sep 26, 2026

See the code

See what people are saying

README

FlowName

Try 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:

  • ⚡ 85% Faster Execution (67.1s vs 456.2s) through relation-guided request batching (65 vs 411 API calls).
  • 💰 36% Lower Token Cost (87k vs 137k total tokens) by eliminating overlapping context bloat.
  • 🎯 Higher Semantic Precision (155 vs 37 win-rate in Original-aware evaluation) and 50% more exact original-name matches, proving that guaranteed AST context prevents LLM hallucinations.

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.

Run it

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.

Where it fits

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.

Use it as a library

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.

identifier-recovery
javascript
llm
llms
reverse-engineering-tools
static-analysis
static-analysis-tools
typescript
variable-renaming

Contributors

123wwwa

33 commits

123wwwa/FlowName

Next-generation JavaScript identifier recovery with LLMs.

JavaScript

1

33 commits

updated Sep 26, 2026

See the code

See what people are saying

README

FlowName

Try 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:

  • ⚡ 85% Faster Execution (67.1s vs 456.2s) through relation-guided request batching (65 vs 411 API calls).
  • 💰 36% Lower Token Cost (87k vs 137k total tokens) by eliminating overlapping context bloat.
  • 🎯 Higher Semantic Precision (155 vs 37 win-rate in Original-aware evaluation) and 50% more exact original-name matches, proving that guaranteed AST context prevents LLM hallucinations.

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.

Run it

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.

Where it fits

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.

Use it as a library

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.

identifier-recovery
javascript
llm
llms
reverse-engineering-tools
static-analysis
static-analysis-tools
typescript
variable-renaming

Contributors

123wwwa

33 commits

Languages

JavaScript

49.9%

TypeScript

47.9%

HTML

2.2%