Factory Desktop running natively on Linux, with .deb, .rpm, and AppImage
packages built from Factory's official Desktop release.
This community port keeps the familiar Factory interface and adds Linux-native window controls, updates, and daemon integration. It is unofficial and is not affiliated with or supported by Factory.
Open the latest release and download the package for your distribution.
Download the file ending in _amd64.deb, then run:
sudo apt install ~/Downloads/factory-desktop_*_amd64.debIf your browser saved it somewhere else, replace ~/Downloads/ with that
directory.
Download the file ending in .x86_64.rpm, then run:
sudo dnf install ~/Downloads/factory-desktop-*.x86_64.rpmOn openSUSE, use:
sudo zypper install ~/Downloads/factory-desktop-*.x86_64.rpmDownload the .AppImage, then run:
chmod +x ~/Downloads/Factory-*.AppImage
~/Downloads/Factory-*.AppImageThe AppImage is portable, but it does not install the native background update
service. Use .deb or .rpm for the complete experience.
Open Factory Desktop from your application menu. You can also launch a native-package installation from a terminal:
/opt/Factory/factory-desktopFactory Desktop uses the global droid CLI already installed on your computer.
It checks PATH, ~/.local/bin/droid, /usr/local/bin/droid, and
/usr/bin/droid.
If Droid is missing, Factory Desktop runs Factory's official Linux installer once. The resulting global CLI is shared by your terminal, Factory Desktop, Droid Computers, and the background daemon. The Desktop package never contains its own copy of Droid.
Check the active CLI at any time:
command -v droid
droid --versionWhen an update is available, Factory shows its native orange Update button beside the Back and Forward buttons at the top of the window.
Click Update and Factory Desktop will:
- Download and prepare the latest Linux package.
- Ask for administrator authorization when installation is ready.
- Close Factory Desktop.
- Install the package.
- Open Factory Desktop again.
You do not need to download another package manually for normal updates.
The global Droid CLI remains separate from Desktop releases. Update it with:
droid updateNative packages install factory-droid-daemon.service as a systemd user
service. Both the service and Factory Desktop use the same global droid
executable and the same daemon identity on port 37643.
Check it with:
systemctl --user status factory-droid-daemon.service
ps -eo args | grep '[d]roid daemon'Factory first adopts an already healthy global daemon. If Droid was missing, Desktop installs it globally, restarts the service, and waits for it to become healthy before considering a direct fallback.
Run it from a terminal to see the startup error:
/opt/Factory/factory-desktopcommand -v droid
droid --version
systemctl --user restart factory-droid-daemon.service
systemctl --user status factory-droid-daemon.service
journalctl --user -u factory-droid-daemon.service -n 100 --no-pagerThe button only appears when a newer release is available. Check the update service and request an immediate check:
systemctl --user status factory-update-manager.service
factory-update-manager check-now
factory-update-manager status --jsonClose Factory Desktop, then run:
factory-update-manager rollbackMost users should install a package from Releases. Building locally is intended for contributors and unsupported distributions.
- Node.js 18 or newer; Node.js 22 is recommended
- npm
- Rust
file,sha256sum,dpkg-debor RPM toolsdesktop-file-validate,xdg-mime, andxvfb-run- 7-Zip 21 or newer; do not use
p7zip-full16.02
Clone and prepare the project:
git clone https://github.com/ThewindMom/factory-desktop-linux.git
cd factory-desktop-linux
npm ci
npm run buildBuild and install the native package for your distribution:
make build-app
make package
make installThe builder fetches Factory's current official macOS DMG, extracts the Electron application, applies the Linux compatibility patches, and creates Linux packages. It never copies the DMG's Droid binary into the Linux application.
| Command | Purpose |
|---|---|
make build-app |
Fetch the current Factory DMG and assemble the Linux app |
make build-app DMG=/path/Factory.dmg |
Build from a specific local DMG |
make deb |
Build a Debian package in dist/ |
make rpm |
Build an RPM package in dist/ |
make appimage |
Build an AppImage in dist/ |
make package |
Auto-detect and build the native package format |
make install |
Install the newest locally built native package |
make run-app |
Run the assembled application |
make test |
Run the Rust updater tests |
make clean |
Remove generated build artifacts |
Build without the native update manager:
PACKAGE_WITH_UPDATER=0 make build-app
PACKAGE_WITH_UPDATER=0 make package
make installnpm ci
npm run build
npm run typecheck
npm run lint
npm test -- --runInBand
cd updater
cargo fmt --all -- --check
cargo clippy --bin factory-update-manager -- -D warnings
cargo testLinux compatibility changes are applied through the patch registry in
src/patches/registry.ts. Package validation rejects any accidental
resources/bin/droid, ensuring Desktop always uses the global CLI.
Every push to master that changes the application, packaging, updater, or
release workflow triggers a GitHub Actions build. The workflow publishes .deb,
.rpm, and AppImage assets to the current Factory Desktop release.
It also checks Factory's upstream version daily and creates a new Linux release when Factory Desktop changes.
This is an unofficial community project. Factory Desktop and Droid are products of Factory. Use this port at your own risk and report Linux-port issues in this repository rather than to Factory support.
MIT