Decompiler for compiled AppleScript (.scpt) files. Parses the Fasd UAS
binary format and reconstructs readable AppleScript source from the bytecode —
including handlers, control flow (if/repeat/try/tell blocks), object
specifiers, and literals.
Built on (and a significant extension of) Jinmo/applescript-disassembler.
pip install applescript-decompilerOr from a checkout:
pip install .Requires Python 3.11+.
asdec compiled.scpt========================================
Function: areaOfCircle
Arguments: none
========================================
if (not ({real, integer} contains class of var_0)) then
error "Radius must be number."
else
end if
return ((var_0 * var_0) * |«class pi »|)
from applescript_decompiler import decompile_file
source = decompile_file("compiled.scpt")
print(source)applescript_decompiler.fasparses theFasd UASserialization format (a port of theFasLoadroutine from the original AppleScript runtime): reference tables, value blocks, records, literals, and embedded bytecode.applescript_decompiler.opcodesknows the 256-entry instruction set and disassembles handler bytecode.applescript_decompiler.decompilerinterprets each handler's instructions against a simulated value stack, emitting AppleScript statements as it goes.
Decompilation reconstructs source from bytecode, and some information is discarded at compile time or only meaningful with an application's terminology dictionary. Expect:
- Local variable names are not stored in compiled scripts, so they appear
as
var_0,var_1, … Handler argument names (including typed and destructuring patterns), globals, and properties are recovered. - Labeled parameters of application/scripting-addition commands are not
reconstructed. A command's name is recovered (e.g.
make,display dialog), but its arguments are rendered positionally rather than with theirwith properties/givenlabels. usestatements,propertyinitializers, andscriptobject structure (inheritance, nesting) are not reconstructed; only the handlers they contain are emitted.- Output is per-handler, framed with
=/Function:/Arguments:headers, not a single recompilable file. The handler bodies are valid AppleScript for most inputs; pathological scripts can still leave a stray marker.
A trailing return of the last expression is emitted for every handler (the
compiler stores it as the result), which is harmless but not always present in
the original.
uv sync # install dev dependencies
uv run pytest # run the test suiteThe test suite compiles a corpus of AppleScript sources with osacompile
(macOS only) and verifies that decompilation round-trips: output must contain
no unknown markers, balance its blocks, recompile cleanly, and leave no opcode
unhandled.
MIT — see LICENSE. Original disassembler © 2017 Jinmo; decompiler extension © 2026 n0kovo.