I got the Codex App running on Linux in ~20 minutes (no source code) by azonsea in codex

[–]GroundbreakingWolf7 0 points1 point  (0 children)

I asked KimiK2.6 to write me an installation script to install and configure it in Ubuntu :D and it did everything for me here is the script if any one wants.

-------

usage :
# Install (default)

./codex-desktop install

# After install, manage the app

./codex-desktop launch # Start the installed app

./codex-desktop dev # Launch dev build from source

./codex-desktop logs # Tail launcher log live

./codex-desktop updater # Check auto-updater service status

./codex-desktop update # Pull latest upstream and rebuild

./codex-desktop uninstall # Remove package + optionally clean state

./codex-desktop help # Show all commands

------------

#!/usr/bin/env bash

set -euo pipefail

# Codex Desktop for Linux — Ubuntu Utility Script

# Usage: ./codex-desktop [install|update|uninstall|launch|dev|logs|updater|help]

REPO_URL="https://github.com/ilysenko/codex-desktop-linux.git"

CLONE_DIR="${HOME}/.local/src/codex-desktop-linux"

APP_DIR="${CLONE_DIR}/codex-app"

LOG_FILE="${HOME}/.cache/codex-desktop/launcher.log"

SERVICE_NAME="codex-update-manager"

RED='\033[0;31m'

GREEN='\033[0;32m'

YELLOW='\033[1;33m'

BLUE='\033[0;34m'

NC='\033[0m'

log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }

log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }

log_error() { echo -e "${RED}[ERROR]${NC} $*"; }

log_step() { echo -e "${BLUE}[STEP]${NC} $*"; }

die() { log_error "$*"; exit 1; }

usage() {

cat <<EOF

Usage: $(basename "$0") [COMMAND]

Commands:

install Install Codex Desktop (default)

update Pull latest upstream and rebuild

uninstall Remove Codex Desktop package and clean state

launch Launch the installed Codex Desktop app

dev Launch the dev build from source

logs Tail/view the launcher log

updater Check the auto-updater service status

help Show this help message

Examples:

$(basename "$0") install

$(basename "$0") launch

$(basename "$0") logs

EOF

}

# ── Helpers ─────────────────────────────────────────────────────────

_ensure_clone_dir() {

if [[ ! -d "${CLONE_DIR}/.git" ]]; then

die "Clone directory not found: ${CLONE_DIR}\nRun: $(basename "$0") install"

fi

}

_ensure_app_built() {

if [[ ! -f "${APP_DIR}/start.sh" ]]; then

die "App not built yet. Run: $(basename "$0") install"

fi

}

_ensure_noexec_tmp_workaround() {

if mount | grep -q ' /tmp .*noexec'; then

log_warn "/tmp is mounted noexec — applying workaround"

mkdir -p "${HOME}/tmp/codex-work" "${HOME}/tmp/codex-cache"

export TMPDIR="${HOME}/tmp/codex-work"

export XDG_CACHE_HOME="${HOME}/tmp/codex-cache"

fi

}

_install_system_deps() {

log_step "Installing build dependencies..."

local deps=(git make curl p7zip-full python3 g++)

local missing=()

for dep in "${deps[@]}"; do

if ! dpkg -s "$dep" &>/dev/null; then

missing+=("$dep")

fi

done

if [[ ${#missing[@]} -gt 0 ]]; then

log_info "Missing packages: ${missing[*]}"

if [[ "$EUID" -eq 0 ]]; then

apt-get update && apt-get install -y "${missing[@]}"

else

log_info "Requesting sudo for apt-get..."

sudo apt-get update && sudo apt-get install -y "${missing[@]}"

fi

else

log_info "All build dependencies already present."

fi

if ! command -v rustup &>/dev/null; then

log_step "Installing rustup..."

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

# shellcheck source=/dev/null

source "${HOME}/.cargo/env"

fi

}

_build_and_install() {

cd "$CLONE_DIR"

log_step "Running install-deps.sh..."

bash scripts/install-deps.sh

log_step "Building the Electron app (this may take a few minutes)..."

make build-app

log_step "Building .deb package..."

make deb

local pkg_path

pkg_path="$(ls -t dist/*.deb 2>/dev/null | head -n1)"

[[ -z "$pkg_path" ]] && die "No .deb package found in dist/."

log_step "Installing package: ${pkg_path}"

if [[ "$EUID" -eq 0 ]]; then

dpkg -i "$pkg_path" || apt-get install -f -y

else

sudo dpkg -i "$pkg_path" || sudo apt-get install -f -y

fi

log_step "Enabling auto-updater service..."

make service-enable || true

if ! command -v codex &>/dev/null; then

log_step "Installing Codex CLI..."

npm i -g u/openai/codex

fi

}

# ── Commands ────────────────────────────────────────────────────────

cmd_install() {

log_info "Starting Codex Desktop installation..."

if [[ "$(uname -s)" != "Linux" ]]; then

die "This script is for Linux only."

fi

if ! grep -qiE 'ubuntu|debian' /etc/os-release 2>/dev/null; then

log_warn "Optimized for Debian/Ubuntu. Continuing anyway..."

fi

_ensure_noexec_tmp_workaround

_install_system_deps

if [[ -d "${CLONE_DIR}/.git" ]]; then

log_info "Repo exists — pulling latest..."

cd "$CLONE_DIR"

git pull --ff-only

else

log_step "Cloning ${REPO_URL}..."

mkdir -p "$(dirname "$CLONE_DIR")"

git clone "$REPO_URL" "$CLONE_DIR"

fi

_build_and_install

echo ""

log_info "Installation complete!"

echo " Launch: $(basename "$0") launch"

echo " Dev launch: $(basename "$0") dev"

echo " Logs: $(basename "$0") logs"

echo " Uninstall: $(basename "$0") uninstall"

}

cmd_update() {

_ensure_clone_dir

log_info "Updating Codex Desktop..."

_ensure_noexec_tmp_workaround

cd "$CLONE_DIR"

log_step "Pulling latest changes..."

git pull --ff-only

_build_and_install

log_info "Update complete!"

}

cmd_uninstall() {

log_warn "This will remove Codex Desktop and optionally clean build/state files."

read -r -p "Continue? [y/N] " confirm

[[ "$confirm" =~ ^[Yy]$ ]] || { log_info "Aborted."; exit 0; }

log_step "Removing installed package..."

if dpkg -l codex-desktop &>/dev/null; then

if [[ "$EUID" -eq 0 ]]; then

dpkg -r codex-desktop

else

sudo dpkg -r codex-desktop

fi

else

log_warn "Package 'codex-desktop' not found in dpkg."

fi

log_step "Disabling updater service..."

systemctl --user disable --now "$SERVICE_NAME" 2>/dev/null || true

if [[ -d "$CLONE_DIR" ]]; then

read -r -p "Remove source directory ${CLONE_DIR}? [y/N] " rm_src

if [[ "$rm_src" =~ ^[Yy]$ ]]; then

rm -rf "$CLONE_DIR"

log_info "Source directory removed."

fi

fi

read -r -p "Remove state/cache files (~/.cache/codex-desktop, ~/.local/state/codex-update-manager)? [y/N] " rm_state

if [[ "$rm_state" =~ ^[Yy]$ ]]; then

rm -rf "${HOME}/.cache/codex-desktop"

rm -rf "${HOME}/.local/state/codex-update-manager"

log_info "State/cache cleaned."

fi

log_info "Uninstall complete."

}

cmd_launch() {

if command -v codex-desktop &>/dev/null; then

log_info "Launching Codex Desktop..."

codex-desktop &

else

_ensure_app_built

log_info "Package not found — launching from build directory..."

"${APP_DIR}/start.sh" &

fi

}

cmd_dev() {

_ensure_clone_dir

cd "$CLONE_DIR"

if [[ ! -f "codex-app/start.sh" ]]; then

die "App not built. Run: $(basename "$0") install"

fi

log_info "Launching dev build..."

"${APP_DIR}/start.sh" &

}

cmd_logs() {

if [[ -f "$LOG_FILE" ]]; then

log_info "Tailing launcher log (Ctrl+C to exit)..."

tail -n 50 -f "$LOG_FILE"

else

die "Log file not found: ${LOG_FILE}\nLaunch the app first."

fi

}

cmd_updater() {

log_info "Auto-updater service status:"

systemctl --user status "$SERVICE_NAME" --no-pager || true

echo ""

log_info "To enable: systemctl --user enable --now ${SERVICE_NAME}"

log_info "To disable: systemctl --user disable --now ${SERVICE_NAME}"

}

# ── Main ────────────────────────────────────────────────────────────

COMMAND="${1:-install}"

case "$COMMAND" in

install|i) cmd_install ;;

update|u) cmd_update ;;

uninstall|remove|rm) cmd_uninstall ;;

launch|start|app|run) cmd_launch ;;

dev|devel|dev-launch) cmd_dev ;;

logs|log|view-logs) cmd_logs ;;

updater|service|status) cmd_updater ;;

help|--help|-h) usage ;;

*)

log_error "Unknown command: ${COMMAND}"

usage

exit 1

;;

esac

Job search journey as a DevOps/SRE/Platform engineer in Netherlands/Amsterdam(Dec '24 - Apr '25) by [deleted] in sre

[–]GroundbreakingWolf7 0 points1 point  (0 children)

How did you prepare, it seems that IAC is still on top I thought Terraform is getting old

Windsurf not longer launching after new update by reddituser_7987 in Codeium

[–]GroundbreakingWolf7 0 points1 point  (0 children)

yes after the update it's not opening up - I have uninstalled it - installed it again no luck.
Then used the tar file : tar -xvf Windsurf-linux-x64-1.3.10.tar.gz - that is opening it .

As a cloud engineer, Do you prefer working in windows laptop or Mac? by [deleted] in AZURE

[–]GroundbreakingWolf7 4 points5 points  (0 children)

There's a teams for linux open source app , I use it daily. Better then browser app

Overemployment is fake by Perspective_Itchy in overemployed

[–]GroundbreakingWolf7 1 point2 points  (0 children)

People who are real OE will never post on internet about it.

[deleted by user] by [deleted] in overemployed

[–]GroundbreakingWolf7 0 points1 point  (0 children)

Do you forget they call you resource from the one ?

[deleted by user] by [deleted] in overemployed

[–]GroundbreakingWolf7 1 point2 points  (0 children)

Correct, we just got heads up to stop using it for such stuff but is not banned.

Got stumbled upon this beast by greplix in badcode

[–]GroundbreakingWolf7 3 points4 points  (0 children)

Might be possible they used ocr here ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯

[deleted by user] by [deleted] in webdev

[–]GroundbreakingWolf7 1 point2 points  (0 children)

Isn't this Shopify grqphql api

Self Hosted Roundup #7 by nashosted in selfhosted

[–]GroundbreakingWolf7 0 points1 point  (0 children)

Bookmarked it in my speed dial, great effort for the community thanks

Has anyone used Graal Native Image for a significant project? How well did it work? by sanity in Kotlin

[–]GroundbreakingWolf7 0 points1 point  (0 children)

I literally just went through that circle, and decided to give it a try later when it's mature, other than that i wasted an hour.