{"record":{"id":"10f74e7cdd2cef48","repo":"remotion-dev/remotion","slug":"no-input","errorCode":null,"errorMessage":"No input","messagePattern":"No input","errorType":"error_code","errorClass":"ErrorWithBacktrace","httpStatus":null,"severity":"error","filePath":"packages/compositor/rust/main.rs","lineNumber":42,"sourceCode":"mod tone_map;\n\nuse errors::ErrorWithBacktrace;\nuse global_printer::{_print_verbose, set_verbose_logging};\nuse long_running_process::LongRunningProcess;\nuse memory::get_ideal_maximum_frame_cache_size;\nuse std::env;\n\nuse payloads::payloads::{CliInputCommand, CliInputCommandPayload};\n\nextern crate png;\n\nfn mainfn() -> Result<(), ErrorWithBacktrace> {\n    let args = env::args();\n\n    let first_arg =\n        args.skip(1)\n            .next()\n            .ok_or(errors::ErrorWithBacktrace::from(std::io::Error::new(\n                std::io::ErrorKind::Other,\n                \"No input\",\n            )))?;\n\n    let opts: CliInputCommand = parse_init_command(&first_arg)?;\n\n    match opts.payload {\n        CliInputCommandPayload::StartLongRunningProcess(payload) => {\n            set_verbose_logging(payload.verbose);\n\n            let max_video_cache_size = payload\n                .maximum_frame_cache_size_in_bytes\n                .unwrap_or(get_ideal_maximum_frame_cache_size());\n\n            _print_verbose(&format!(\n                \"Starting Rust process. Max video cache size: {}MB, max threads = {}\",\n                max_video_cache_size / 1024 / 1024,\n                payload.concurrency","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/compositor/rust/main.rs#L24-L60","documentation":"Thrown by the compositor binary's main function when it is launched with no command-line argument. Every invocation must pass a JSON-encoded CliInputCommand as its first positional arg.","triggerScenarios":"Running the compositor executable with zero arguments, or invoking it through a wrapper that strips argv. Remotion's Node side always supplies a payload, so seeing this means the binary was launched manually or a parent process dropped the argument.","commonSituations":"Manual debugging where the developer runs the binary directly without args; a broken spawn from a custom serverless runtime that mis-forwards argv; an older Node/Remotion version mismatched against a newer compositor binary expecting a payload shape.","solutions":["Do not run the compositor binary directly — let Remotion spawn it via the normal render path.","If debugging manually, pass a valid CliInputCommand JSON string as argv[1].","Upgrade Remotion so the Node layer and the compositor binary versions match."],"exampleFix":"// before\n$ ./compositor\n\n// after (manual debug only)\n$ ./compositor '{\"type\":\"...\",\"payload\":{...}}'","handlingStrategy":"validation","validationCode":"let args: Vec<String> = env::args().collect();\nif args.len() < 2 {\n    eprintln!(\"Usage: compositor <cli-input-command-json>\");\n    std::process::exit(2);\n}","typeGuard":"null","tryCatchPattern":"null","preventionTips":["Never invoke the compositor binary directly; let Remotion spawn it.","Keep the compositor binary version aligned with the Remotion Node package.","When debugging manually, always supply the JSON payload argument."],"tags":["rust","cli","compositor","argv","misuse"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}