Craft Anything is an open-source tool designed to help users understand existing software and create their own versions using AI. Developed by the ArtCraft team, the tool integrates software inspection, reverse engineering utilities, and AI-driven programming into a single workflow.
Rather than simply generating applications from text-based queries, Craft Anything analyzes a target website, desktop application, mobile app, or game. It then uses the gathered information to build a new project, compares the result against the original, and further refines the output.
Features
AI-Powered Software Recreation
Craft Anything follows a four-stage workflow: Study, Build, Check, and Refine. Users provide a target and describe what they want to create. The software examines the target, sends the findings to a coding agent, generates a new project, and checks how closely the result matches the original.
It supports recreating websites, applications, and games. Users can also specify their preferred programming language, framework, or game engine.
Reverse Engineering and Inspection
The underlying engine is written in Rust and includes a large collection of inspection tools for different software formats and platforms.
It can examine native applications, Java and .NET programs, Android packages, Apple applications, Electron applications, websites, firmware, databases, game files, and other formats.
The Advanced workbench exposes tools such as disassembly, decompilation, function analysis, call graphs, hexadecimal inspection, and evidence records. Users can investigate software without necessarily starting a recreation project.
Clean Room and Deep Modes
One of the more interesting features is the separation between Clean Room and Deep modes.
Clean Room is the default mode. It studies software through publicly visible behavior, screenshots, and other permitted observations without reading the original application's source code or files. This approach is intended to reduce the risk of copying protected implementation details.
Deep mode enables more extensive inspection, including reading application files and using additional reverse-engineering tools. Ghidra integration provides further decompilation capabilities when installed.
AI Coding Agent Integration
Craft Anything relies on an external coding agent to build applications. Claude Code is the primary supported integration and runs using the user's existing installation and authentication.
The project also includes adapters for other agents, although some integrations are not yet verified in real-world installations.
For analysis and questions, it supports Anthropic, OpenAI, OpenRouter, and local OpenAI-compatible servers.
CLI and MCP Support
The software is not limited to its desktop interface. It also provides a command-line tool and an MCP server.
This allows compatible AI agents and automation workflows to use the same inspection engine. The project advertises 284 tools across its engine, AI, and setup layers, with each tool accessible through the CLI and MCP interfaces.
Build Verification
Generated applications are not simply accepted after the coding agent finishes. Craft Anything checks the output against the original target.
For websites, it captures and compares layouts at desktop, tablet, and mobile widths. It also identifies differences in layout, typography, spacing, page structure, and other visual details.
Game projects can use their own self-tests to check basic functionality. The system can then ask the coding agent to refine the result when checks identify problems.
Download Craft Anything v0.6.1 - Software Mirrors |
|---|
Craft Anything v0.6.1 for Windowscraft-anything-0.6.1-windows-x64.msi | 55.57 MB craft-anything-0.6.1-windows-x64-portable.zip | 66.69 MB craft-anything-0.6.1-windows-arm64.msi | 52.31 MB craft-anything-0.6.1-windows-arm64-portable.zip | 63.72 MB |
Craft Anything v0.6.1 for macOScraft-anything-web-0.6.1.zip | 2.54 MB craft-anything-cli-0.6.1-macos-universal.zip | 26.6 MB craft-anything-0.6.1-macos-universal.dmg | 129.34 MB |
Craft Anything v0.6.1 for Linuxcraft-anything-0.6.1-linux-x86_64.tar.gz.asc | 228 B craft-anything-0.6.1-linux-x86_64.tar.gz | 67.11 MB craft-anything-0.6.1-linux-x86_64.rpm.asc | 228 B craft-anything-0.6.1-linux-x86_64.rpm | 67.67 MB craft-anything-0.6.1-linux-x86_64.pkg.tar.zst | 52.58 MB craft-anything-0.6.1-linux-x86_64.flatpak.asc | 228 B craft-anything-0.6.1-linux-x86_64.flatpak | 49.2 MB craft-anything-0.6.1-linux-x86_64.deb.asc | 228 B craft-anything-0.6.1-linux-x86_64.deb | 68.1 MB craft-anything-0.6.1-linux-x86_64.AppImage.zsync.asc | 228 B craft-anything-0.6.1-linux-x86_64.AppImage.zsync | 222.76 kB craft-anything-0.6.1-linux-x86_64.AppImage.asc | 228 B craft-anything-0.6.1-linux-x86_64.AppImage | 63.57 MB craft-anything-0.6.1-linux-riscv64.tar.gz.asc | 228 B craft-anything-0.6.1-linux-riscv64.tar.gz | 65.7 MB craft-anything-0.6.1-linux-riscv64.rpm.asc | 228 B craft-anything-0.6.1-linux-riscv64.rpm | 66.41 MB craft-anything-0.6.1-linux-riscv64.deb.asc | 228 B craft-anything-0.6.1-linux-riscv64.deb | 66.67 MB craft-anything-0.6.1-linux-aarch64.tar.gz.asc | 228 B craft-anything-0.6.1-linux-aarch64.tar.gz | 63.98 MB craft-anything-0.6.1-linux-aarch64.rpm.asc | 228 B craft-anything-0.6.1-linux-aarch64.rpm | 65.23 MB craft-anything-0.6.1-linux-aarch64.pkg.tar.zst | 49.97 MB craft-anything-0.6.1-linux-aarch64.flatpak.asc | 228 B craft-anything-0.6.1-linux-aarch64.flatpak | 45.8 MB craft-anything-0.6.1-linux-aarch64.deb.asc | 228 B craft-anything-0.6.1-linux-aarch64.deb | 65.84 MB craft-anything-0.6.1-linux-aarch64.AppImage.zsync.asc | 228 B craft-anything-0.6.1-linux-aarch64.AppImage.zsync | 213.19 kB craft-anything-0.6.1-linux-aarch64.AppImage.asc | 228 B craft-anything-0.6.1-linux-aarch64.AppImage | 60.84 MB |
Craft Anything v0.6.1 for BSDcraft-anything-0.6.1-freebsd-x86_64.tar.gz | 64.63 MB craft-anything-0.6.1-freebsd-aarch64.tar.gz | 61.2 MB |
Others Download related to Craft Anything v0.6.1release-signing-key.asc | 803 B |
Craft Anything v0.6.1 Source Code
Craft Anything v0.6.1 Source code (zip)
Craft Anything v0.6.1 Source code (tar.gz)
|
Craft Anything v0.6.1 Release Notes: What's Changed- Keep Mach-O zero-fill sections out of file-backed section data (R3.12) by @Afloat16 in #1348
- Read decimal digit separators when filling added SQLite columns (R3.12) by @Afloat16 in #1318
- Verify Cargo package versions before reporting Rust dependencies (R3.12) by @Afloat16 in #1329
- Read the Swift standard type SQ as Equatable (R3.12) by @Chr0mium24 in #1350
- Let a Deep build through Claude Code start subagents again (R2.2, #1105) by @justinjohn0306 in #1351
- Decode Swift protocols named in a protocol list (R3.12) by @Chr0mium24 in #1353
- Read the kind letter of Swift addressors (R3.12) by @Chr0mium24 in #1354
- Name the right generic parameter in Swift associated types (R3.12) by @Chr0mium24 in #1355
- Name Swift allocating initialisers init outside classes (R3.12) by @Chr0mium24 in #1356
- Keep parentheses around Swift optional function types (R3.12) by @Chr0mium24 in #1357
- Decode Swift enum case symbols (R3.12) by @Chr0mium24 in #1359
- docs: add SonarCloud and CodeRabbit badges to README by @dylanmtaylor in #1361
- Preserve GNU tar member identities at the long-name limit by @Afloat16 in #1362
- Keep ELF symbol versions inside their declared sections (R3.12) by @Afloat16 in #1368
- Reject PE virtual addresses that wrap past the address space (R3.12) by @Afloat16 in #1370
- Bound retained metadata when listing Node SEA programs (R3.12) by @Afloat16 in #1377
- Decode Unity R16 and RG16 textures (R3.9) by @Afloat16 in #1378
- Keep same-named imports attached to their own library slots (R3.12) by @Afloat16 in #1365
- Advance ELF core mapping paths by their original bytes (R3.12) by @Afloat16 in #1366
- Recover dynamic symbols when retained ELF sections omit the symbol table (R3.12) by @Afloat16 in #1367
- Respect the UTF-8 output budget for IL2CPP literals (R3.12) by @Afloat16 in #1380
- Apply PE export limits to aliases and empty function slots (R3.12) by @Afloat16 in #1384
- Read Mach-O thread entry points from the matching complete CPU state (R3.12) by @Afloat16 in #1385
- Bound Mach-O indirect import slots across all sections (R3.12) by @Afloat16 in #1386
- Stop a private browser and delete its profile when the app ends without closing it (R2.9, #810) by @justinjohn0306 in #1376
- Preserve DEX boundaries when member or handler lists are capped (R3.12) by @Afloat16 in #1388
- Keep Android resource children inside their parent chunks (R3.12) by @Afloat16 in #1389
- Bound WebAssembly metadata across repeated custom sections (R3.12) by @Afloat16 in #1390
- Validate Unity serialized metadata ranges before reading (R3.12) by @Afloat16 in #1391
- Decode Unreal floating-point texture formats (R3.9) by @Afloat16 in #1392
- Reject Java constants that exceed the constant-pool slots (R3.12) by @Afloat16 in #1373
- Keep embedded Godot pack reads before the trailer (R3.12) by @Afloat16 in #1379
- Reject Objective-C method records shorter than their declared layout (R3.12) by @Afloat16 in #1387
- Keep PyInstaller CArchive members inside the payload by @Afloat16 in #1363
- Validate gzip header checksums without rejecting informational fields by @Afloat16 in #1371
- Read complete gzip packed members and verify their trailers by @Afloat16 in #1372
- Extract ZIP entries compressed with bzip2 or XZ by @Afloat16 in #1374
- Enforce standalone LZMA budgets before large dictionary growth by @Afloat16 in #1381
- Preserve unambiguous ELF import slots across version-library metadata (R3.12) by @Afloat16 in #1393
- Keep GNU sparse tar payloads out of regular-file extraction by @Afloat16 in #1382
- Extract ZIP LZMA members with checked framing and output limits by @Afloat16 in #1375
- Refuse incomplete tar engine installs after GNU metadata stops by @Afloat16 in #1394
- Reject ASAR manifest nodes with invalid file metadata by @Afloat16 in #1364
- fix(formats): reject incomplete GNU tar record extents by @Afloat16 in #1402
- Count a Claude Code question's own cost (R2.9) by @AlexJoaquimPereira in #1404
- Remember a Deep-mode decompile across requests, so the builder isn't told it hasn't decompiled after each one (R2.9) by @NeuTroNBZh in #1403
- Translate the Japanese strings that were still English by @zitann2020 in #1407
- List MaterialCraft in the Spanish Craft apps table by @zitann2020 in #1409
- List MaterialCraft in the French Craft apps table by @zitann2020 in #1410
- List MaterialCraft in the Portuguese Craft apps table by @zitann2020 in #1411
- List MaterialCraft in the Traditional Chinese Craft apps table by @zitann2020 in #1412
- Give the Japanese, Korean and Chinese READMEs the Mac signature check by @zitann2020 in #1413
- Test the Deep-mode decompile reminder's decision on a later request's run (R2.9) by @NeuTroNBZh in #1415
- Tell a builder's check that is still going from no build running, and wait past the run's own limit (R2.9) by @NeuTroNBZh in #1417
- Study again when a build's kept conversation is from the other mode (R2.9) by @AlexJoaquimPereira in #1418
- Find bundled Codex on macOS and check its ChatGPT sign-in (R2.2) by @dbzx6r in #1414
- docs: fix duplicated text in the README AI section by @belasoaress in #1419
- Sweep leftover agent sessions when the desktop app starts (R2.2) by @AlexJoaquimPereira in #1422
- Keep a builder's check marked until its asker reads it, and answer a check a stop interrupts (R2.9) by @NeuTroNBZh in #1425
- Open the project's program again for a later run's builder in Deep mode (#1421) by @NeuTroNBZh in #1424
- Stop waiting on a builder's process once its stream says it's done (R5.3) by @mytrade2909-design in #1426
- Fail a Gemini turn whose result event itself reports an error by @mytrade2909-design in #1427
- Start the tool server on an SSH host by absolute path by @felipetruman in #1431
- Show a server connecting and give it a minute when adding it by address (R5.4) by @jgt87 in #1430
- Prefer the model a server has loaded when adding it by address without one (R5.4) by @jgt87 in #1435
- Look for AI prefers the model a local server has loaded (R5.4) by @jgt87 in #1437
- Name a Go command package with / on every system by @FuryNocturn in #1442
- Infer no Go launch for a command folder named with a backslash by @FuryNocturn in #1446
- Pace the jobs list's progress bar like the spinner (R5.2) by @tanish2k09 in #1440
- Name Swift type metadata singleton initialization caches (R3.12) by @Chr0mium24 in #1452
- Print
_: for Swift arguments without a label (R3.12) by @Chr0mium24 in #1453 - Wait only 5 s for a program that was stopped, so a check's time limit and Pause always take effect (R5.3) by @justinjohn0306 in #1454
- Log it when a stopped program's exit can't be checked (R5.3) by @justinjohn0306 in #1455
- Decode Swift private declarations (R3.12) by @Chr0mium24 in #1456
- Decode Swift value witness symbols (R3.12) by @Chr0mium24 in #1457
- Print Swift subscript accessors the way swift-demangle does (R3.12) by @Chr0mium24 in #1458
- Let a person stop adding a server while it's asked for its models (R5.4) by @FuryNocturn in #1460
- Build CheckStop::limited only for the Unix tests that use it by @FuryNocturn in #1461
- Read a run's log from its end, and record what capping the file needs by @muraa-p in #218
- Wait for the cut the log-cap test is about by @muraa-p in #1466
- Find a Unity Editor added to Unity Hub with Locate (R1.6) by @justinjohn0306 in #1467
- Space an API backend's requests out with requests_per_minute (R5.4) by @justinjohn0306 in #1469
- Let strings awaiting translation pass the coverage check (R5.2) by @tanish2k09 in #1477
- Say in Settings when a saved agent program is gone (R2.2) by @FuryNocturn in #1468
- Hash a signed Windows program the way Windows does (R3.11) by @muraa-p in #1485
- Read a text source as text outside a build (R3.11) by @chordpli in #1480
- Read a PyInstaller PYZ archive given on its own (R3.11) by @muraa-p in #1488
- Check reading a text source in a live agent chat (R3.11) by @chordpli in #1489
- Read the process list on FreeBSD: one ps -o per column by @FredApps in #1487
- Keep mechanics behavior unverified without runtime measurements (R2.5) by @oliver-mee in #362
- Replace a saved API key from Settings (R5.5) by @AlexJoaquimPereira in #1486
- Scroll the AI settings page in the add-by-address smoke test by @AlexJoaquimPereira in #1492
- Check quantized GGUF tensor byte ranges (R3.12) by @Afloat16 in #1491
- Don't let a key save outlive the backend it belongs to (R5.5) by @AlexJoaquimPereira in #1495
- Recognise text files in target lists and triage (R3.11) by @Martin-Aziz in #1490
- Record a live chat paging a big comparison result (R5.7) by @chordpli in #1493
- Reject overflowing NIB length and index encodings (R3.12) by @Afloat16 in #1497
- Validate complete sBPF symbol records (R3.12) by @Afloat16 in #1496
- Bound shared NIB object copies by retained bytes (R3.12) by @Afloat16 in #1498
- Validate CIL exception section framing (R3.12) by @Afloat16 in #1499
- Name the lists a saved result can page in its summary and browse errors (R5.7) by @chordpli in #1500
- Preserve JAR manifest bytes when unfolding attributes (R3.12) by @Afloat16 in #1505
- Validate JVM switch tables before allocating decoded pairs (R3.12) by @Afloat16 in #1503
- Keep recovered Go functions before a damaged table record (R3.12) by @Afloat16 in #1509
- Avoid quadratic SQLite b-tree page walks (R3.12) by @Afloat16 in #1510
- Bound shared Android string-pool copies by retained bytes (R3.12) by @Afloat16 in #1513
- Reject conflicting certificate signature algorithm OIDs (R3.12) by @Afloat16 in #1514
- Decode Unreal DXT3 textures with explicit alpha (R3.9) by @Afloat16 in #1512
- Use the declared named curve for ECDSA verification (R3.12) by @Afloat16 in #1517
- Verify issuer candidates before extending certificate chains (R3.12) by @Afloat16 in #1518
- Don't hand a build a capture made in the other mode (R2.9) by @AlexJoaquimPereira in #1520
- Decode character references in HTML page titles (R3.13) by @Plastic-time in #1521
- Avoid quadratic visited-node scans in filesystem walks (R3.12) by @Afloat16 in #1522
- Preserve JavaScript directive semantics when splitting sequences (R3.12) by @Plastic-time in #1523
- Decode Unity shared-exponent RGB9e5 textures (R3.9) by @Afloat16 in #1515
- Insert YAML server tables before the document ends (R2.2) by @Plastic-time in #1527
- Decode Swift metadata cache, reflection and Objective-C class symbols (R3.12) by @Chr0mium24 in #1531
- Bound generated source-map lines across inline sections (R3.12) by @Afloat16 in #1533
- Distinguish certificate-chain cycles from the walk limit (R3.12) by @Afloat16 in #1537
- Keep incomplete Android manifests partial in tool evidence (R3.12) by @Afloat16 in #1535
- Keep recovered module paths distinct after hash collisions (R3.12) by @Plastic-time in #1529
- Apply repeated setup client selections only once (R2.2) by @Plastic-time in #1539
- Drop the unreachable testId arm from the browser script name hints by @FredApps in #1481
- Remove the dead currentProgram check from the Ghidra bridge ping by @FredApps in #1482
- Avoid repeated selector scans in EVM dispatchers (R3.12) by @Afloat16 in #1538
- Bound WebAssembly strings expanded through type and name references (R3.12) by @Afloat16 in #1540
- Bound retained Dart string-pool tracking (R3.12) by @Afloat16 in #1541
- Keep source map annotation URL suffixes intact (R3.12) by @Plastic-time in #1524
- Keep the Detect button clear of the Harnesses tab (R2.9) by @istaari in #1530
- Bind APK signer metadata to its signed copies (R3.12) by @Afloat16 in #1542
- Decode Swift async function pointers and resume functions (R3.12) by @Chr0mium24 in #1543
- Preserve EVM bytecode when metadata map keys are ambiguous (R3.12) by @Afloat16 in #1508
- Refuse multi-document YAML configs before editing them (R2.2) by @Plastic-time in #1534
- Retain only the requested SQLite row page (R3.12) by @Afloat16 in #1544
- Resolve CMS signer certificates from their declared identity (R3.12) by @Afloat16 in #1504
- Decode Swift special types such as non-escaping closures and AnyObject (R3.12) by @Chr0mium24 in #1546
- Decode Swift witness table accessor symbols (R3.12) by @Chr0mium24 in #1545
- Reuse constant-pool names while reading Java attributes (R3.12) by @Afloat16 in #1549
- Bound retained DEX payload attachments (R3.12) by @Afloat16 in #1548
- Apply Android package type offsets to resource identities (R3.12) by @Afloat16 in #1547
- Decode Swift operator function names (R3.12) by @Chr0mium24 in #1551
- Decode Swift concurrency standard types (R3.12) by @Chr0mium24 in #1553
- Bound retained Go function names when pclntab references are shared (R3.12) by @Afloat16 in #1554
- Keep fixed PE versions inside their declared values (R3.12) by @Afloat16 in #1555
- Validate CMS signed attributes before reporting authentication (R3.12) by @Afloat16 in #1536
- Require definition or reference handles in CLI type signatures (R3.12) by @Afloat16 in #1556
- Decode Unity textures with unsigned 16-bit channels (R3.9) by @Afloat16 in #1516
- Disclose WebAssembly metadata limits in both tool views (R3.12) by @Afloat16 in #1557
- Account for copied Swift substitution nodes (R3.12) by @Afloat16 in #1560
- Decode Unity ETC1 RGB textures (R3.9) by @Afloat16 in #1561
- Read module formats in current Node SEA archives (R3.12) by @Afloat16 in #1562
- Read the process list on FreeBSD: one ps -o per column (backport #1487 to release) by @FredApps in #1525
- Recover zero-filled cramfs hole blocks (R3.12) by @Afloat16 in #1566
- List Objective-C classes and categories once per address (R3.12) by @Afloat16 in #1559
- Decode Swift lazy witness table cache variable symbols (R3.12) by @Chr0mium24 in #1564
- Verify RSA-PSS signatures using their declared parameters (R3.12) by @Afloat16 in #1565
- Merge repeated JAR entry sections before checking file digests (R3.12) by @Afloat16 in #1568
- Bound retained PE import and export names (R3.12) by @Afloat16 in #1571
- Decode Swift opaque result types (R3.12) by @Chr0mium24 in #1569
- Decode Swift outlined value operation symbols (R3.12) by @Chr0mium24 in #1572
- Bound ASAR paths and preserve partial archive evidence (R3.12) by @Afloat16 in #1558
- Use version-specific Python headers for extracted PYZ code (R3.12) by @Afloat16 in #1563
- Bound expanded PYZ identities across archive listings (R3.12) by @Afloat16 in #1567
- Recover files from big-endian cramfs images (R3.12) by @Afloat16 in #1575
- Apply global PAX attributes to TAR members (R3.12) by @Afloat16 in #1570
- Read requested ranges from stored Unity bundle blocks (R3.12) by @Afloat16 in #1576
- Name Swift noncanonical specialized metadata symbols (R3.12) by @Chr0mium24 in #1578
- Decode Swift key path getter and setter symbols (R3.12) by @Chr0mium24 in #1579
- Decode Swift function type attributes (R3.12) by @Chr0mium24 in #1582
- Recognize required volatile modifiers in CLI signatures (R3.12) by @Afloat16 in #1580
- Decode Swift outlined variable symbols (R3.12) by @Chr0mium24 in #1581
- Recover ordinary uncompressed cramfs blocks (R3.12) by @Afloat16 in #1577
- Preserve valid Unity bundle members when ranges are invalid (R3.12) by @Afloat16 in #1574
- Decode Swift one-time initialization symbols (R3.12) by @Chr0mium24 in #1583
- sonar: leave out vendor/ and record why SHA-1 stays in the WebSocket handshake and signature checks by @FredApps in #1483
- Read ROMFS names at the configured name-length limit (R3.12) by @Plastic-time in #1528
- Reject source map mappings with missing source or name entries (R3.12) by @Plastic-time in #1526
- Report contradictory DOS executable size declarations (R3.12) by @Plastic-time in #1532
- Keep build activity visible with long waiting notes (R2.9) by @jeffreylm in #1587
- packaging: use [[ for bash tests (SonarCloud S7688) by @dylanmtaylor in #1588
- Pair Rust functions across toolchains by their names without the crate hash (R5.7) by @chordpli in #1589
- Preserve AArch64 exclusive-memory results and semantics (R3.11) by @Afloat16 in #1592
- Reject duplicate keys before summarizing safetensors files (R3.12) by @Afloat16 in #1597
- Bound native value-flow work before decoding instructions (R3.11) by @Afloat16 in #1598
- Mark shortened Python code inventories as partial (R3.12) by @Afloat16 in #1596
- Apply keyed archive pagination before copying object rows (R3.12) by @Afloat16 in #1602
- Disclose incomplete asset catalog tree reads (R3.12) by @Afloat16 in #1603
- Reuse recovered filesystem bytes during firmware extraction (R3.12) by @Afloat16 in #1604
- Bound firmware ZIP decoding by the remaining output budget (R3.12) by @Afloat16 in #1605
- Keep nested ZIP members inside the outer firmware archive (R3.12) by @Afloat16 in #1606
- Report incomplete firmware archive member scans (R3.12) by @Afloat16 in #1607
- Report incomplete SQLite b-tree walks (R3.12) by @Afloat16 in #1608
- Keep capped byte-search results in global file-offset order (R3.11) by @Afloat16 in #1609
- Resolve webpack loaders by their parameter bindings (R3.12) by @Afloat16 in #1614
- Preserve AArch64 control-transfer register effects (R3.11) by @Afloat16 in #1599
- Return +0.0 instead of -0.0 from entropy() for constant data by @Silvertree2010 in #1619
- Preserve AArch64 inputs when arithmetic results are discarded (R3.11) by @Afloat16 in #1593
- Report undefined Python bytecode flags without losing code (R3.12) by @Afloat16 in #1595
- Keep native function evidence from blocks before its entry (R3.11) by @Afloat16 in #1600
- Bound input reads and refuse non-regular files before reading (R3.11) by @Afloat16 in #1611
- Preserve the possible x16 input of authenticated returns (R3.11) by @Afloat16 in #1621
- Keep evidence-based call paths within one input binary (R3.11) by @Afloat16 in #1612
- Report partial text coverage when the final line is cut (R3.11) by @Afloat16 in #1610
- Match numeric bundle identifiers by their JavaScript value (R3.12) by @Afloat16 in #1615
- End JavaScript comments at every line terminator (R3.12) by @Afloat16 in #1616
- Keep module roles when dependency imports repeat (R3.12) by @Afloat16 in #1617
- Keep worker modules in their own execution role (R3.12) by @Afloat16 in #1618
- Keep AArch64 address evidence tied to proven register values (R3.11) by @Afloat16 in #1601
- Preserve repeated observations when comparing evidence bundles (R3.11) by @Afloat16 in #1613
- Reject NaN and inf for number options in the CLI by @Silvertree2010 in #1623
- Reject '+' sign in cpio hex and octal header fields by @Silvertree2010 in #1624
- Reject sign characters in hex addresses in parse_address by @Silvertree2010 in #1625
- Keep PE import descriptors inside their declared directories (R3.12) by @Afloat16 in #1369
- Say "yesterday" for recent files 24-48 hours old in question prompt by @Silvertree2010 in #1627
- Reject CIL destinations outside the method body (R3.12) by @Afloat16 in #1630
- Read short block-backed ext symlinks from their data blocks (R3.12) by @Afloat16 in #1633
- docs: use the four step names consistently in the Status section by @viwe-monai in #1628
- Recover cramfs files with direct block pointers (R3.12) by @Afloat16 in #1637
- Reject duplicate GGUF metadata and tensor identities (R3.12) by @Afloat16 in #1635
- Preserve CLI array ranks and declared bounds in type names (R3.12) by @Afloat16 in #1631
- Decode Unity EAC channel textures through the picture exporter (R3.9) by @Afloat16 in #1638
- Decode Unreal packed normalized and floating-point textures (R3.9) by @Afloat16 in #1640
- Decode concatenated XZ streams and standard stream padding by @Afloat16 in #1383
- Reject '+' sign in Go quoted-string hex escapes by @Silvertree2010 in #1642
- Send a note left waiting when the app closed, instead of deleting it (R2.9) by @justinjohn0306 in #1644
- Require bound-import names to terminate inside the PE directory (R3.12) by @Afloat16 in #1645
- Decode DNS service bindings and authentication records (R3.12) by @Afloat16 in #1647
- Trace JVM bootstrap dependencies at their bytecode use sites (R3.12) by @Afloat16 in #1648
- Recognize macOS and VFAT ZIP entry attributes (R3.12) by @Afloat16 in #1650
- Require matching operands before reporting EVM dispatch facts (R3.12) by @Afloat16 in #1651
- Keep Android device configuration selectors distinct (R3.12) by @Afloat16 in #1653
- Keep non-UTF-8 Godot paths from opening a different project (R2.7) by @Afloat16 in #1649
- Add Thai translation of README (README.th.md) by @matavanary in #1643
- Retain padded CLI signatures and report trailing bytes (R3.12) by @Afloat16 in #1632
- Preserve encoded identity in certificate name values (R3.12) by @Afloat16 in #1652
- Preserve readable ASN.1 lengths and report DER limitations (R3.12) by @Afloat16 in #1646
- Recover JFFS2 files when newer nodes replace damaged extents (R3.12) by @Afloat16 in #1636
- Preserve fractional seconds in property-list dates (R3.12) by @Afloat16 in #1656
- Retain Android resource identities with incomplete bags (R3.12) by @Afloat16 in #1654
- Recognize UTF-16 keyed-archive NIB files (R3.12) by @Afloat16 in #1657
- Keep signed exponents inside JS number tokens by @Silvertree2010 in #1658
- Preserve readable ZIP64 directories with framing warnings (R3.12) by @Afloat16 in #1137
- Keep a note left by an earlier run waiting until the builder takes it (R2.9) by @justinjohn0306 in #1660
- Read the certificate set from its declared place in SignedData (R3.12) by @Afloat16 in #1132
- Preserve special inode kinds when reading ext filesystems (R3.12) by @Afloat16 in #1634
- Fix JS tokenizer splitting operators before non-ASCII identifiers by @Silvertree2010 in #1661
- Keep version-two cramfs reads inside the filesystem extent (R3.12) by @Afloat16 in #1664
- Preserve warnings from all managed application graph views (R3.12) by @Afloat16 in #1663
- Validate every SquashFS data block against its logical file span (R3.12) by @Afloat16 in #1670
- Recover LZ4-compressed SquashFS metadata and file data (R3.12) by @Afloat16 in #1668
- Keep unavailable ext4 extent mappings from fabricating file bytes (R3.12) by @Afloat16 in #1671
- Recover ext4 files stored entirely inside their inode (R3.12) by @Afloat16 in #1667
- Saturate oversized OID arcs in oid_text instead of wrapping by @Silvertree2010 in #1662
- Recover ZIP64 end records shifted by prepended data (R3.12) by @Afloat16 in #1676
- Report packet evidence only for valid capture and protocol fields (R3.12) by @Afloat16 in #1247
- Preserve literal $null strings in keyed archives (R3.12) by @Afloat16 in #1674
- Reject impossible JVM array allocation operands (R3.12) by @Afloat16 in #1675
- Recover JFFS2 files from big-endian images (R3.12) by @Afloat16 in #1665
- Assert a misnamed compressed and an empty file stay unknown (R3.11) by @muraa-p in #1677
- Let an earlier run's waiting notes start the build's limits again, as a message does (R2.9) by @justinjohn0306 in #1672
- Report unavailable cramfs block-pointer tables as incomplete (R3.12) by @Afloat16 in #1681
- Keep sBPF symbol and relocation limits global across ELF tables (R3.12) by @Afloat16 in #1678
- Return the first XZ stream from SquashFS blocks (R3.12) by @Afloat16 in #1669
- Distinguish nonfinite CIL constants in method fingerprints (R3.12) by @Afloat16 in #1673
- Recover classic ext triple-indirect file blocks (R3.12) by @Afloat16 in #1666
- Apply source map root prefixes before interpreting source paths (R3.12) by @Afloat16 in #1680
- Record the Windows run of PR #1030's watched-launch descendant tests (R5.2) by @muraa-p in #1683
- Compare numeric results in console run checks (R2.5) by @Afloat16 in #1679
- Keep a reattached project's saved settings and follow-up request (R2.9) by @AlexJoaquimPereira in #1682
- Use an attached project's saved builder and keep its feed and request (R2.9) by @AlexJoaquimPereira in #1684
- Keep a failed program's last output in its error (R2.9) by @AlexJoaquimPereira in #1685
- Compare a console output that is only numbers (R2.5) by @muraa-p in #1686
- Keep the working card's clock from painting over its words by @RealThanhNguyxn in #1687
- Bound expanded source map inventories before allocation (R3.12) by @Afloat16 in #1689
- Keep colliding source-map originals during recovery (R3.12) by @Afloat16 in #1690
- Report uncertain source comparisons after map truncation (R3.12) by @Afloat16 in #1694
- State what each coding agent's builder gets, in one typed table by @muraa-p in #1691
- Drop the pending lines a ticked line already covers by @muraa-p in #1697
- Stop malformed code-signature requirement OIDs showing as a different OID (R3.12) by @NicolasBohn in #1698
- Stop with a plain error when the OpenCode found is 1.x (R2.2) by @Agapenordev in #1151
- Bound source-map recovery manifest paths and report partial recovery (R3.12) by @AlexJoaquimPereira in #1700
- Resolve relative project paths before builds, option runs and Play (R2.7) by @AlexJoaquimPereira in #1702
- Refuse source maps with more source, content, name or ignore-list entries than the parser keeps (R3.12) by @NicolasBohn in #1703
- Drop a cut-off roadmap line and a pending line that is already done by @NicolasBohn in #1704
- Count source-map sections, check skipped values and keep refused maps' sources uncertain (R3.12) by @NicolasBohn in #1705
- Add Help > Check for Updates and bump to 0.6.1 by @dylanmtaylor in #1706
New Contributors- @NeuTroNBZh made their first contribution in #1403
- @dbzx6r made their first contribution in #1414
- @belasoaress made their first contribution in #1419
- @mytrade2909-design made their first contribution in #1426
- @felipetruman made their first contribution in #1431
- @chordpli made their first contribution in #1480
- @FredApps made their first contribution in #1487
- @Martin-Aziz made their first contribution in #1490
- @istaari made their first contribution in #1530
- @jeffreylm made their first contribution in #1587
- @viwe-monai made their first contribution in #1628
- @matavanary made their first contribution in #1643
- @NicolasBohn made their first contribution in #1698
Full Changelog: v0.6.0...v0.6.1 |
Performance and Compatibility
Craft Anything is built with Rust and uses its own inspection engine rather than depending entirely on external reverse-engineering utilities. Ghidra can be integrated for additional analysis in Deep mode.
The desktop application, CLI, and MCP server provide different ways to access its capabilities. Its supported release packages cover Windows, macOS, Linux, and FreeBSD, with a browser-based WebAssembly viewer also available for certain inspection tasks.
However, the project is still in early development. Some agent integrations, application behavior checks, and inspection tools are incomplete or have only been tested with limited inputs. The availability of a feature does not necessarily mean every supported software format has been thoroughly validated.
System Requirements
Craft Anything requires Rust 1.97 or newer when building from source.
On Debian and Ubuntu, compiling the desktop application also requires development libraries for X11, Wayland, GTK, and OpenGL.
Building applications with AI requires a compatible coding agent installed and authenticated on the computer. Additional AI providers may require their own API configuration.
Prebuilt installers are available for supported platforms, so users do not necessarily need to compile the application themselves.
Pros and Cons
Pros
Combines software inspection and AI-powered project creation.
Supports websites, desktop applications, mobile apps, and games.
Provides Clean Room and Deep inspection modes.
Includes extensive Rust-based reverse-engineering tools.
Supports CLI and MCP integrations.
Compares generated websites against original layouts.
Open-source under MIT or Apache-2.0 licensing.
Cons
Still in early alpha development.
Requires an external coding agent for building projects.
Some agent integrations and verification features are incomplete.
Deep analysis can require additional tools and substantial system resources.
Results depend on the quality of the target inspection and the coding agent.
How to Install
The easiest approach is to download a prebuilt package from the project's GitHub Releases page.
Available formats include MSI installers for Windows, DMG for macOS, and AppImage, Flatpak, DEB, and RPM packages for Linux.
Users who prefer compiling from source can clone the repository and run:
git clone https://github.com/storytold/craft-anything
cd craft-anything
cargo run --release -p craft-anything
The CLI can be installed separately:
cargo install --path apps/craft-anything-cli
After installation, run the diagnostic command to check the environment:
craft-anything-cli doctor
Final Verdict
Craft Anything is an ambitious open-source project that combines reverse engineering with AI-assisted software development. Its biggest advantage is the complete workflow: inspect an existing application, understand how it behaves, generate a new implementation, and check the result against the original.
The Clean Room mode is particularly interesting because it provides a more controlled approach to recreating software based on observable behavior rather than directly copying its implementation. Meanwhile, Deep mode gives experienced developers access to more extensive analysis capabilities.
Its main limitation is maturity. The project is still in early alpha, and some integrations and verification features have not been fully validated. Users should treat generated results as development starting points rather than guaranteed replacements for existing software.
Overall, Craft Anything is a promising tool for developers interested in reverse engineering, software prototyping, and AI-powered application recreation. It is worth exploring, especially for technically experienced users who want more control over how AI studies and rebuilds software.
Sources
Post a Comment/Report Broken Link: