I'm a teacher using Arduino in a Linux-based computer lab (Debian 12.x). For exams, we use a special student account that does not have internet access to ensure academic integrity.
Here’s what I’ve done so far:
On the exam account with internet, I installed Arduino IDE 2.3.6.
The IDE launches correctly, detects the Arduino Mega, and successfully uploads the Blink sketch.
Everything functions normally during setup.
However, when switching to exam mode (same account, but no internet connection), the IDE hangs indefinitely on the pulsing Arduino logo during startup.
Question:
Is there a known workaround or configuration setting to allow Arduino IDE 2.x to launch properly offline?
Is it trying to reach out to a service during startup? Can this be disabled?
Type the following command in the terminal window:
./arduino-ide_<version>_Linux_64bit.AppImage
(where <version> is the Arduino IDE version number)
Press the Enter key.
Debug output should now be printed to the terminal window as Arduino IDE starts (or fails to start).
Wait until you are sure the IDE startup has gone into the hang state
(as indicated by no additional output being printed to the terminal).
Switch back to the terminal window.
Use the mouse to select all the text in the terminal window. Make sure to scroll all the way up to the top.
Press the Ctrl+Shift+C keyboard shortcut.
This will copy the selected text to the clipboard.
Open a reply here on this forum topic by clicking the "Reply" button.
Click the <CODE/> icon on the post composer toolbar.
This will add the forum's code block markup (```) to your reply to make sure the error messages are correctly formatted.
dse1_exam@1133A-MULET:~/Downloads$ ./arduino-ide_2.3.6_Linux_64bit.AppImage
Arduino IDE 2.3.6
Checking for frontend application configuration customizations. Module path: /tmp/.mount_arduinPXrbn6/resources/app/lib/backend/electron-main.js, destination 'package.json': /tmp/.mount_arduinPXrbn6/resources/app/package.json
Setting 'theia.frontend.config.appVersion' application configuration value to: "2.3.6" (type of string)
Setting 'theia.frontend.config.cliVersion' application configuration value to: "1.2.0" (type of string)
Setting 'theia.frontend.config.buildDate' application configuration value to: "2025-04-09T11:24:04.835Z" (type of string)
Frontend application configuration after modifications: {"applicationName":"Arduino IDE","defaultTheme":{"light":"arduino-theme","dark":"arduino-theme-dark"},"defaultIconTheme":"none","electron":{"windowOptions":{},"showWindowEarly":true,"splashScreenOptions":{},"uriScheme":"arduino-ide"},"defaultLocale":"","validatePreferencesSchema":false,"reloadOnReconnect":true,"uriScheme":"theia","preferences":{"window.title":"${rootName}${activeEditorShort}${appName}","files.autoSave":"afterDelay","editor.minimap.enabled":false,"editor.tabSize":2,"editor.scrollBeyondLastLine":false,"editor.quickSuggestions":{"other":false,"comments":false,"strings":false},"editor.maxTokenizationLineLength":500,"editor.bracketPairColorization.enabled":false,"breadcrumbs.enabled":false,"workbench.tree.renderIndentGuides":"none","explorer.compactFolders":false},"appVersion":"2.3.6","cliVersion":"1.2.0","buildDate":"2025-04-09T11:24:04.835Z"}
Starting backend process. PID: 21670
Showing main window early
Using browser-only version of superagent in non-browser environment
Configuration directory URI: 'file:///home/dse1_exam/.arduinoIDE'
Configuring to accept webviews on '^.+\.webview\..+$' hostname.
2025-06-10T15:37:48.874Z root INFO Backend u.initialize: 28.1 ms [Finished 0.415 s after backend start]
2025-06-10T15:37:48.877Z root INFO Backend Object.initialize: 27.1 ms [Finished 0.415 s after backend start]
2025-06-10T15:37:48.877Z root INFO Backend a.initialize: 1.1 ms [Finished 0.415 s after backend start]
2025-06-10T15:37:48.877Z root INFO Backend a.initialize: 0.9 ms [Finished 0.415 s after backend start]
2025-06-10T15:37:48.877Z root INFO Backend u.initialize: 1.1 ms [Finished 0.415 s after backend start]
2025-06-10T15:37:48.878Z root INFO Backend l.initialize: 28.0 ms [Finished 0.416 s after backend start]
2025-06-10T15:37:48.882Z root INFO configured all backend app contributions
2025-06-10T15:37:48.882Z root INFO Backend l.onStart: 0.8 ms [Finished 0.424 s after backend start]
2025-06-10T15:37:48.883Z root INFO Backend d.onStart: 0.1 ms [Finished 0.424 s after backend start]
2025-06-10T15:37:48.883Z root INFO Backend a.onStart: 0.2 ms [Finished 0.424 s after backend start]
2025-06-10T15:37:48.883Z config INFO >>> Initializing CLI configuration...
2025-06-10T15:37:48.883Z root INFO Backend x.onStart: 0.2 ms [Finished 0.424 s after backend start]
2025-06-10T15:37:48.883Z config INFO Loading CLI configuration from /home/dse1_exam/.arduinoIDE/arduino-cli.yaml...
2025-06-10T15:37:48.883Z daemon INFO Starting daemon from /tmp/.mount_arduinPXrbn6/resources/app/lib/backend/resources/arduino-cli...
2025-06-10T15:37:48.883Z root INFO Backend w.onStart: 0.2 ms [Finished 0.425 s after backend start]
2025-06-10T15:37:48.883Z discovery-log INFO start
2025-06-10T15:37:48.883Z discovery-log INFO start new deferred
2025-06-10T15:37:48.883Z root INFO Backend v.onStart: 0.1 ms [Finished 0.425 s after backend start]
2025-06-10T15:37:48.883Z root INFO Backend a.onStart: 0.0 ms [Finished 0.425 s after backend start]
2025-06-10T15:37:48.885Z root INFO Theia app listening on http://127.0.0.1:45187.
2025-06-10T15:37:48.885Z root INFO Finished starting backend application: 2.1 ms [Finished 0.427 s after backend start]
2025-06-10T15:37:48.886Z root WARN The local plugin referenced by local-dir:/home/dse1_exam/.arduinoIDE/plugins does not exist.
2025-06-10T15:37:48.886Z root WARN The local plugin referenced by local-dir:/home/dse1_exam/.arduinoIDE/deployedPlugins does not exist.
2025-06-10T15:37:48.888Z config INFO Loaded CLI configuration: {"board_manager":{"additional_urls":[]},"directories":{"builtin":{"libraries":"/home/dse1_exam/.arduino15/libraries"},"data":"/home/dse1_exam/.arduino15","user":"/home/dse1_exam/Arduino"},"locale":"en"}
2025-06-10T15:37:48.888Z config INFO 'directories.data' and 'directories.user' are set in the CLI configuration model.
2025-06-10T15:37:48.888Z config INFO Loaded the CLI configuration.
2025-06-10T15:37:48.893Z config INFO Mapped the CLI configuration: {"dataDirUri":"file:///home/dse1_exam/.arduino15","sketchDirUri":"file:///home/dse1_exam/Arduino","additionalUrls":[],"network":"none","locale":"en"}
2025-06-10T15:37:48.893Z config INFO Validating the CLI configuration...
2025-06-10T15:37:48.893Z config INFO The CLI config is valid.
2025-06-10T15:37:48.893Z config INFO <<< Initialized the CLI configuration.
2025-06-10T15:37:48.983Z root INFO Resolve plugins list: 98.7 ms [Finished 0.524 s after backend start]
2025-06-10T15:37:49.116Z daemon INFO time="2025-06-10T11:37:49-04:00" level=info msg="arduino-cli version 1.2.0"
2025-06-10T15:37:49.116Z daemon INFO time="2025-06-10T11:37:49-04:00" level=info msg="Using config file: /home/dse1_exam/.arduinoIDE/arduino-cli.yaml"
time="2025-06-10T11:37:49-04:00" level=info msg="Executing `arduino-cli daemon`"
2025-06-10T15:37:49.125Z daemon INFO Daemon is now listening on 127.0.0.1:37869
{"IP":"127.0.0.1","Port":"37869"}
2025-06-10T15:37:49.125Z daemon INFO Daemon is running.
2025-06-10T15:37:49.133Z root ERROR Uncaught Exception: Error: 14 UNAVAILABLE: No connection established. Last error: Protocol error (2025-06-10T15:37:49.132Z)
2025-06-10T15:37:49.133Z root ERROR Error: 14 UNAVAILABLE: No connection established. Last error: Protocol error (2025-06-10T15:37:49.132Z)
at t.callErrorFromStatus (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:987037)
at Object.onReceiveStatus (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:3783461)
at Object.onReceiveStatus (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:2216666)
at Object.onReceiveStatus (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:2216111)
at /tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:4354680
at processTicksAndRejections (node:internal/process/task_queues:77:11)
at runNextTicks (node:internal/process/task_queues:64:3)
at process.processImmediate (node:internal/timers:449:9)
for call at
at s.makeUnaryRequest (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:3782992)
at s.create (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:3311624)
at instance (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:102990)
at new Promise (<anonymous>)
at y.createClient (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:102967)
at y.create (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:101875)
at /tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:100771
at /tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:6419737
at s.invoke (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:6419827)
at a.fire (/tmp/.mount_arduinPXrbn6/resources/app/lib/backend/main.js:2:6421630)
2025-06-10T15:37:49.616Z root INFO Deploy plugins list: 732.5 ms [Finished 1.158 s after backend start]
2025-06-10T15:37:49.764Z root INFO creating connection for 1
2025-06-10T15:37:50.281Z root WARN A command editor.action.toggleStickyScroll is already registered.
Opening channel for service path '/services/electron-window'.
Opening channel for service path '/services/ide-updater'.
2025-06-10T15:37:50.345Z root INFO Start frontend contributions: 163.9 ms [Finished 1.445 s after frontend start]
2025-06-10T15:37:50.345Z root INFO Changed application state from 'init' to 'started_contributions'.
2025-06-10T15:37:50.359Z root INFO Changed application state from 'started_contributions' to 'attached_shell'.
2025-06-10T15:37:50.359Z root INFO >>> Restoring the layout state...
2025-06-10T15:37:50.374Z root INFO [6ecd7691-397f-4b9e-a4ee-5c7ea858db30] Waiting for backend deployment: 35.7 ms [Finished 1.478 s after frontend start]
2025-06-10T15:37:50.657Z root INFO [hosted-plugin: 21770] PLUGIN_HOST(21770) starting instance
[Object: null prototype] {}
2025-06-10T15:37:50.988Z root INFO [6ecd7691-397f-4b9e-a4ee-5c7ea858db30] Sync of 23 plugins: 617.2 ms [Finished 2.095 s after frontend start]
As long as the essential components that Arduino IDE normally downloads from the Internet on the first run after a fresh installation are already present, there is no need for Internet access to use Arduino IDE.
However, Arduino IDE does use the network for communication between its components. This is purely internal to the machine, not using the external network interface in any way. So it would not really be accurate to describe it as "reaching out". However, it is still possible for the network configuration to interfere with its ability to make these essential communications. The error message shown in the logs you provided is a bit vague, but it might indicate that the inability to communicate via the network is the cause of the problem.
Please provide details about exactly how the user account has been configured to block Internet access. Are you using a proxy? Have you made any modifications, or is there anything notable about your "hosts file", especially in regards to the definition of localhost?
If so, you should be able to work around the problem by define an environment variable named no_proxy with the value localhost in the environment in which Arduino IDE is invoked.
When you use the Flatpak package of Arduino IDE, the application runs in a "sandbox", isolated from your normal system environment. I suspect this means that the environment variable you export into that normal system environment has no effect on the application running in the sandbox.
Unfortunately I'm not knowledgeable on the subject of Flatpak. It looks like the flatpak run command might be useful, something like this:
flatpak run --env=no_proxy="localhost" arduino-ide