Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
953a1e9
Go fuse daemon: Skeleton, mount and unix socket connection (#303)
AlexisMora Apr 15, 2026
c3251f6
feat: Get Attributes operation + Electron 21 (#315)
AlexisMora Apr 20, 2026
bf07ed2
Merge remote-tracking branch 'origin/main' into feat/go-fuse-daemon
AlexisMora Apr 20, 2026
ac30a33
feat: add RPM as an install method and include necessary build tools …
egalvis27 Apr 21, 2026
6f56be4
feat/remove-linter-warnings (#286)
egalvis27 Apr 23, 2026
058da8a
feat(localization): remove unused translations from English, Spanish,…
egalvis27 Apr 23, 2026
fe8b5bb
Feat/move antivirus logs to new file (#304)
egalvis27 Apr 23, 2026
1312580
Refactor/auto launch app (#289)
egalvis27 Apr 23, 2026
0e82007
feat: remove non-Linux system references and clean up platform-specif…
egalvis27 Apr 23, 2026
d7b1d86
feat: implement main process bootstrap and update IPC handlers for ap…
egalvis27 Apr 23, 2026
af456c5
Chore: add golang lint + testing pipline + testing http server (#317)
AlexisMora Apr 23, 2026
1531068
feat: refactor tray menu implementation and add tests for tray (#293)
egalvis27 Apr 27, 2026
625e08a
reafctor: device service.ts (#316)
egalvis27 Apr 27, 2026
e00ae96
fix: [PB-6255] implement PendingFolderCreationTracker to manage folde…
egalvis27 Apr 27, 2026
51955b2
feat: Implement Open and OpenDir FUSE opeartions (#319)
AlexisMora Apr 28, 2026
cba73ee
read operation + blocklist processes (#321)
AlexisMora Apr 28, 2026
08bde93
feat: release operation + read tests (#323)
AlexisMora Apr 29, 2026
ac0b989
feat: add unlink and rmdir operations with corresponding controllers,…
egalvis27 Apr 29, 2026
1727771
feat: implement create and write operations with corresponding contro…
egalvis27 Apr 30, 2026
1047f76
feat: implement mkdir operation with controller, service, and tests (…
egalvis27 Apr 30, 2026
a9ea950
feat: add rename operation with controller, service, routes, and test…
egalvis27 May 5, 2026
79a4c28
Feat/add truncate callback (#326)
egalvis27 May 5, 2026
6473589
feat: update version to 2.6.0 and modify deeplink handling to use roo…
egalvis27 May 5, 2026
846e138
Feat/add statfs and fsync (#327)
egalvis27 May 6, 2026
c5611de
chore: update readme (#329)
AlexisMora May 7, 2026
96a78c3
Fix/fuse demon route (#328)
egalvis27 May 7, 2026
dc21c19
Feat: update to electron 23 (#330)
AlexisMora May 7, 2026
f52702c
Feat: upgrade electron to version 25 and enforce source compilation f…
egalvis27 May 8, 2026
8fca1a7
[PB-6217]: Implement range requests reads for hydrating virtual files…
AlexisMora May 8, 2026
9dc31ea
feat: update drive destkop linux to electron 29 and node 20 (#332)
AlexisMora May 8, 2026
a5795ed
feat: add option to disable antivirus setup via environment variable …
egalvis27 May 8, 2026
10409c8
fix: unhandled rejection on logout 'database connection already close…
AlexisMora May 8, 2026
1e6693f
feat: add NameLen field to StatFs response and update related tests (…
egalvis27 May 11, 2026
8339345
fix: remove process block (#336)
AlexisMora May 11, 2026
1a7a226
fix: update FileTrasher to call remote.trash for zero-byte files (#338)
egalvis27 May 12, 2026
d9f2bf3
fix: update write controller to handle base64 encoded file paths (#340)
egalvis27 May 12, 2026
d04b712
Feat/add thumnails range requests (#337)
egalvis27 May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion .erb/configs/webpack.config.base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import webpackPaths from './webpack.paths';
// Only packages that were in release/app/package.json should be external
// These are native modules or runtime dependencies that cannot/should not be bundled
const nativeExternals = [
'@gcas/fuse',
'better-sqlite3',
'reflect-metadata',
'typeorm',
Expand Down
13 changes: 5 additions & 8 deletions .erb/scripts/electron-rebuild.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,11 @@ if (
Object.keys(dependencies || {}).length > 0 &&
fs.existsSync(path.join(webpackPaths.rootPath, 'node_modules'))
) {
const electronRebuildCmd =
'./node_modules/.bin/electron-rebuild --sequential --force --types prod,dev,optional --module-dir .';
const cmd =
process.platform === 'win32'
? electronRebuildCmd.replace(/\//g, '\\')
: electronRebuildCmd;
execSync(cmd, {
execSync(
'./node_modules/.bin/electron-rebuild --sequential --force --types prod,dev,optional --module-dir .',
{
cwd: webpackPaths.rootPath,
stdio: 'inherit',
});
}
);
}
5 changes: 5 additions & 0 deletions .erb/scripts/start-main-dev.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Electron 29 runs on Node 20, whose ESM entrypoint loader does not understand
// .ts files through the CommonJS ts-node/register hook. Keep the dev main
// process on the repo's CommonJS ts-node path by loading a JS bootstrap first.
require('ts-node/register/transpile-only');
require('../../src/apps/main/main.ts');
4 changes: 2 additions & 2 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = {
extends: ['@internxt/eslint-config-internxt'],
ignorePatterns: ['src/infra/schemas.d.ts'],
ignorePatterns: ['src/infra/schemas.d.ts', 'assets/assets.d.ts'],
overrides: [
{
files: ['*.ts', '*.tsx'],
Expand All @@ -14,7 +14,7 @@ module.exports = {
],
rules: {
'no-await-in-loop': 'warn',
'no-use-before-define': 'warn',
'@typescript-eslint/no-use-before-define': ['warn', { functions: false, classes: true, variables: true }],
'array-callback-return': 'warn',
'max-len': [
'warn', // TODO: Change back to 'error' after fixing existing violations
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/find-dead-code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'

- name: Install dependencies
run: npm ci --ignore-scripts
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/go-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Golang Lint

on:
pull_request:
types: [opened, synchronize, reopened]

jobs:
lint:
name: 🐹 Golang Lint
runs-on: ubuntu-latest

steps:
- name: Check out Git repository
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: packages/fuse-daemon/go.mod

- name: Run golangci-lint
uses: golangci/golangci-lint-action@v7
with:
version: v2.11.4
working-directory: packages/fuse-daemon
23 changes: 23 additions & 0 deletions .github/workflows/go-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Golang Test

on:
pull_request:
types: [opened, synchronize, reopened]

jobs:
test:
name: 🐹 Golang Test
runs-on: ubuntu-latest

steps:
- name: Check out Git repository
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: packages/fuse-daemon/go.mod

- name: Run tests
run: go test ./...
working-directory: packages/fuse-daemon
6 changes: 3 additions & 3 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand All @@ -36,7 +36,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand All @@ -56,7 +56,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18.x'
node-version-file: '.nvmrc'

- name: Create .npmrc file
run: |
echo "@internxt:registry=https://npm.pkg.github.com/" > .npmrc
echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc

- name: Install rpm build tools
run: sudo apt-get install -y rpm

- name: Install dependencies
run: npm ci

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sonar-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'

- name: Install system dependencies
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install system dependencies
Expand Down Expand Up @@ -47,7 +47,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@ enable-sso.sh
.github/copilot-instructions.md
.github/instructions/contributing.instructions.md
.github/instructions/testing.instructions.md
.codex
1 change: 1 addition & 0 deletions .husky/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
npm run lint
npm run type-check
npm run format
cd packages/fuse-daemon && make lint
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20
15 changes: 15 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,25 @@
"group": "dev"
}
},
{
"label": "Build Daemon",
"type": "npm",
"script": "build:daemon",
"options": {
"cwd": "${workspaceFolder}"
},
"presentation": {
"reveal": "always",
"panel": "dedicated",
"clear": true,
"group": "dev"
}
},
{
"label": "Start Dev Environment",
"dependsOrder": "sequence",
"dependsOn": [
"Build Daemon",
"Start Renderer (Debug Mode)",
"Start Main Process (Debug)"
],
Expand Down
84 changes: 47 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,11 @@
[![DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/internxt/drive-desktop-linux)

## Compatibility

As of right now, Internxt Drive Desktop for Linux is only compatible with Ubuntu and Debian with the File explorer **Nautilus** (The default file explorer for Gnome).

We cannot guarantee that the app will work properly on other Linux distributions or with other file explorers as our development and testing efforts are focused on ensuring the best experience for Ubuntu and Debian users.

### FUSE 2
This application requires **FUSE 2** for the virtual drive functionality. FUSE 3 is not supported. On recent Ubuntu versions, `libfuse2` may need to be installed manually:

#### For example, on Debian (>= 13) and Ubuntu (>= 24.04):
```bash
sudo add-apt-repository universe
sudo apt install libfuse2t64
```
**Note:** In Ubuntu 24.04, the libfuse2 package was renamed to libfuse2t64.

#### For example, on Ubuntu (>= 22.04):
```bash
sudo add-apt-repository universe
sudo apt install libfuse2
```
**Warning:** While libfuse2 is OK, do not install the fuse package as of 22.04 or you may break your system. If the fuse package did break your system, you can recover as described [here](https://github.com/orgs/AppImage/discussions/1339).

#### For example, on Ubuntu (<= 21.10):
```bash
sudo apt install fuse libfuse2
sudo modprobe fuse
sudo groupadd fuse

user="$(whoami)"
sudo usermod -a -G fuse $user
```

## Installation

Internxt Drive is available for Linux in two formats:
Expand All @@ -43,16 +17,16 @@ Internxt Drive is available for Linux in two formats:
Download and install the `.deb` package for full compatibility:

```bash
sudo dpkg -i internxt_2.5.1_amd64.deb
sudo dpkg -i internxt_2.6.0_amd64.deb
```

### AppImage

Alternatively, you can use the AppImage format:

```bash
chmod +x Internxt-2.5.1.AppImage
./Internxt-2.5.1.AppImage
chmod +x Internxt-2.6.0.AppImage
./Internxt-2.6.0.AppImage
```

#### ⚠️ Important Note about AppImage and SSO Login:
Expand All @@ -66,7 +40,9 @@ For the best experience with SSO authentication, we recommend using the .deb pac
### Prerequisites

- [NVM](https://github.com/nvm-sh/nvm) (Node Version Manager)
- Node.js 18
- Node.js 20

If working on the FUSE daemon (Go), see [packages/fuse-daemon/README.md](packages/fuse-daemon/README.md) for Go and linting tool prerequisites.

### Install

Expand Down Expand Up @@ -94,11 +70,13 @@ To package apps for the local platform:
npm run package
```

## Login Configuration Using Deeplink
Building the `.rpm` package requires `rpmbuild`. On Ubuntu or Debian, install the `rpm` package before running the packaging command:

To log in via deeplink in development mode, special configuration is required due to limitations in Electron 19.
```bash
sudo apt-get install rpm
```

### Create Entry-Point Script
## Login Configuration Using Deeplink

Create a script in the root of the project named `enable-sso.sh` and add the following content:

Expand All @@ -108,9 +86,9 @@ export NVM_DIR="$HOME/.nvm"
# Load nvm manually
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

cd "/your-project-path/drive-desktop-linux"
nvm use 18
npm run start:main "$@"
cd "/your-project-path/drive-desktop-linux/"
nvm use 20
npm run start:main -- "$@"
```

Use the following command to give the script execution permissions:
Expand Down Expand Up @@ -150,3 +128,35 @@ Check that the internxt protocol is correctly registered:
`gio mime x-scheme-handler/internxt`

Verify by logging into the application.

### Troubleshooting SSO in Development

If opening an `internxt://` URL launches the development command but Electron exits with an error like this:

```
The SUID sandbox helper binary was found, but is not configured correctly.
You need to make sure that node_modules/electron/dist/chrome-sandbox is owned by root and has mode 4755.
```

Or the dev app does not open at all, it may be that the deeplink registration is working, but Electron is aborting before the main process starts because Chromium's Linux sandbox helper has the wrong owner or permissions.

Confirm the current permissions (in the project root):

```bash
ls -l node_modules/electron/dist/chrome-sandbox
```

Fix them from the project root:

```bash
sudo chown root:root node_modules/electron/dist/chrome-sandbox
sudo chmod 4755 node_modules/electron/dist/chrome-sandbox
```

The expected result is that `chrome-sandbox` is owned by `root` and has the setuid bit enabled:

```bash
-rwsr-xr-x 1 root root ... node_modules/electron/dist/chrome-sandbox
```

This may need to be repeated after reinstalling dependencies, because `node_modules/electron` can be recreated with regular user ownership.
10 changes: 0 additions & 10 deletions assets/entitlements.mac.plist

This file was deleted.

9 changes: 7 additions & 2 deletions beforeBuild.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
const electronRebuild = require('electron-rebuild');
const electronRebuild = require('@electron/rebuild');

module.exports = async (context) => {
const { appDir, electronVersion, arch } = context;
await electronRebuild.rebuild({ buildPath: appDir, electronVersion, arch });
// Force compilation from source so native modules are built against the
// exact Electron V8 headers rather than using a generic prebuilt. Without
// this, prebuild-install downloads an Electron-v116 prebuilt compiled for
// Electron 24 (V8 11.0) which segfaults under Electron 25+ (V8 11.4).
process.env.npm_config_build_from_source = 'true';
await electronRebuild.rebuild({ buildPath: appDir, electronVersion, arch, force: true });

return false;
};
1 change: 1 addition & 0 deletions env.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ declare global {
NOTIFICATIONS_URL: string;
LOCK_REFRESH_INTERVAL: string;
DRIVE_API_URL: string;
ENABLE_ANTIVIRUS?: string;
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion knip.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"ignore": ["**/*.test.{ts,tsx}"],
"ignoreBinaries": ["esbuild"],
"ignoreExportsUsedInFile": true,
"project": ["src/**/*.{ts,tsx}"],
"project": ["src/**/*.{ts,tsx}", "!src/**/*.test.{ts,tsx}"],
"vitest": false,
"webpack": false,
"rules": {
Expand Down
Loading
Loading