One signed OpenAI package is the upstream source
ChatGPT Community for Linux accepts 1 package from OpenAI's stable APT repository. Its verifier checks the pinned repository key, signed InRelease, package-index digest, package SHA-256, control metadata, architecture, and payload layout. The scripts extract the application without running the upstream maintainer scripts. Users may supply a previously downloaded .deb, but then they assume responsibility for where it came from.
With every optional feature disabled, resources/app.asar stays byte-for-byte identical to OpenAI's payload. The wrapper changes the desktop identity to ChatGPT Community, installs under /opt/codex-desktop, and keeps upstream Electron, native modules, Codex, ripgrep, locales, and plugins. This is a careful repackaging boundary. The MIT license covers the wrapper and community code, while OpenAI retains rights to its application and services.
Five package formats cover common Linux systems
The project produces 5 package types: deb, RPM, pacman, AppImage, and Nix. make bootstrap-native installs prerequisites, verifies the current package, builds the application tree, creates the detected native package, and installs it. Debian and Ubuntu users get deb; Fedora and openSUSE use RPM; Arch-family systems use pacman. Nix has a flake, while atomic desktops can build an AppImage.
That convenience still means compiling and packaging locally. Baseline tools include Node.js 20 or newer, npm, Python 3, GnuPG verification, dpkg-deb, tar, make, and a C/C++ compiler. Rust enters the picture for the update manager and native feature helpers. No Dockerfile is present, so contributors use their Linux host, Nix, or the project's documented dependency scripts rather than a single container recipe.
What happened when we ran it
Our measurement setup in the sandbox installed 253 packages in 31 seconds and completed the build in 175 seconds. cargo test then ran for 76 seconds and reported 1,578 passed with 0 failures. commit 80366e5 cleared every install, build, and test command in the supplied lab record. The 3-CPU, 12 GB environment was an unprivileged container with no secrets.
The checked-out source was 5.5 MB before dependencies, with 467 files and about 119,945 lines. We also counted 8 CI workflow files and a tests directory. Those figures fit the project's real scope: shell packaging, JavaScript patch logic, Rust helpers, updater code, and cross-format tests. They do not measure desktop responsiveness, feature quality, or behavior inside a graphical Wayland or X11 session.
Thirty-three optional features trade stability for Linux extras
The current README lists 33 features for Linux, all disabled in committed configuration. They include global dictation, read aloud, app screenshots, authenticated proxies, record and replay, computer control, remote mobile control, tray usage, and several cleanup or performance helpers. Users select features in linux-features/features.json, then rebuild. Private features can use a gitignored local directory under the same manifest contract.
Features that patch the application archive face a strict drift check. The build unpacks a temporary copy, applies declared descriptors, repacks it deterministically, and rejects the candidate if an enabled required surface no longer matches. That failure is safer than silently claiming a feature works, but it also means an upstream ChatGPT package can interrupt your chosen configuration until its descriptor is repaired or the feature is disabled.
One rollback artifact protects native updates
The Rust updater retains 1 package for rollback. It watches the same signed APT metadata, caches a package by version, architecture, and SHA-256, builds a sibling candidate, and waits for ChatGPT to exit before promotion. A journal handles interrupted exchanges. AppImage, Nix, and repository-only trees use different replacement workflows and do not receive this native-package updater.
Updater complexity is visible in current maintenance. Pull request 1430 addresses a Debian upgrade path where the package removal hook could stop the updater that launched the transaction, leading to repeated rebuilds and authentication prompts. A separate issue closed on September 6 covered a replaced updater binary whose kernel path gained a deleted marker. These repairs are specific and fast-moving, so automatic updates deserve ordinary package-manager monitoring.
Two desktop identities still share one Codex profile
The project installs 2 packages with distinct identities: official ChatGPT and ChatGPT Community. Both intentionally use the upstream Codex profile. The README warns users not to run them together because the single-instance lock can route a second launch to the process already open. Uninstalling the wrapper preserves that shared user data, and deleting ~/.codex would also remove configuration, plugins, and project state used by both.
AppImage brings another hard boundary. The launcher never adds Electron's --no-sandbox switch automatically. A distribution that disables unprivileged user namespaces needs the native package or a documented sandbox fix. The launcher also sends at most 1 anonymous GoatCounter event per UTC day. It contains a fixed path and user agent, and CODEX_LINUX_DISABLE_USAGE_REPORTING=1 disables the request.
September 6 pushes and 9 open items show active maintenance
GitHub recorded the last push on September 6, 2026, with 3,768 stars and 9 combined open issues and pull requests. Six of those open items were pull requests, including updater and Linux computer-control fixes; 3 were issues. The latest-release endpoint returned no release. That matches the documented distribution model, where users build from source instead of downloading a tagged binary from GitHub Releases.
The 1,578 passing tests make this a credible choice for a Linux developer who wants the desktop product and accepts an unofficial packaging layer. The source-verification chain, clean-ASAR rule, optional feature isolation, and rollback design are specific safeguards. The price is ongoing attention to OpenAI package changes, Linux sandbox policy, and the updater's package transactions. For a terminal-first coding workflow, openai/codex is the simpler decision.

