refactor progress

This commit is contained in:
Hampus Kraft
2026-02-17 12:22:36 +00:00
parent cb31608523
commit d5abd1a7e4
8257 changed files with 1190207 additions and 761040 deletions

19
fluxer_desktop/.gitignore vendored Normal file
View File

@@ -0,0 +1,19 @@
# Dependencies
node_modules/
# Build outputs
dist/
dist-electron/
# IDE
.idea/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Logs
*.log

2
fluxer_desktop/.npmrc Normal file
View File

@@ -0,0 +1,2 @@
link-workspace-packages=false
shared-workspace-lockfile=false

31
fluxer_desktop/README.md Normal file
View File

@@ -0,0 +1,31 @@
# Fluxer Desktop
Electron desktop client for Fluxer. Wraps the web application with native platform integrations including notifications, global shortcuts, screen sharing, passkeys, and auto-updates.
## Configuration
The desktop client reads an optional `settings.json` file from the user data directory on startup. If the file does not exist, defaults are used.
### User data directory locations
| Platform | Stable | Canary |
| -------- | ---------------------------------------------------- | ---------------------------------------------------------- |
| Windows | `%APPDATA%\fluxer\settings.json` | `%APPDATA%\fluxercanary\settings.json` |
| macOS | `~/Library/Application Support/fluxer/settings.json` | `~/Library/Application Support/fluxercanary/settings.json` |
| Linux | `~/.config/fluxer/settings.json` | `~/.config/fluxercanary/settings.json` |
### Available options
| Key | Type | Default (Stable) | Default (Canary) | Description |
| --------- | ------ | ------------------------ | ------------------------------- | ----------------------------------- |
| `app_url` | string | `https://web.fluxer.app` | `https://web.canary.fluxer.app` | URL of the web application to load. |
### Example
```json
{
"app_url": "https://my-instance.example.com"
}
```
When `app_url` is set, the desktop client loads that URL instead of the default and treats its origin as trusted for permissions, navigation, and the local RPC server.

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Required for Electron on arm64 -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<!-- Microphone: need BOTH audio-input (hardened runtime) AND microphone (sandbox) -->
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<!-- Camera -->
<key>com.apple.security.device.camera</key>
<true/>
<!-- Network -->
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<!-- Passkeys: application identifier and associated domains (restricted entitlements) -->
<key>com.apple.application-identifier</key>
<string>3G5837T29K.app.fluxer.canary</string>
<key>com.apple.developer.associated-domains</key>
<array>
<string>webcredentials:web.canary.fluxer.app</string>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Required for Electron on arm64 -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<!-- Microphone: need BOTH audio-input (hardened runtime) AND microphone (sandbox) -->
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<!-- Camera -->
<key>com.apple.security.device.camera</key>
<true/>
<!-- Network -->
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<!-- NOTE: No restricted entitlements (associated-domains, application-identifier) here.
This file is for helper apps/frameworks which don't need passkey capabilities. -->
</dict>
</plist>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Required for Electron on arm64 -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<!-- Microphone: need BOTH audio-input (hardened runtime) AND microphone (sandbox) -->
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<!-- Camera -->
<key>com.apple.security.device.camera</key>
<true/>
<!-- Network -->
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<!-- Passkeys: application identifier and associated domains (restricted entitlements) -->
<key>com.apple.application-identifier</key>
<string>3G5837T29K.app.fluxer</string>
<key>com.apple.developer.associated-domains</key>
<array>
<string>webcredentials:fluxer.app</string>
<string>webcredentials:web.fluxer.app</string>
</array>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,3 @@
<svg width="633" height="512" viewBox="0 0 633 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M46.3631 210.286C19.4771 210.286 -2.98429 188.554 0.324514 161.87C3.90111 133.034 11.3051 108.486 22.5371 88.228C39.9071 57.448 62.4611 35.048 90.1931 21.028C118.231 7.01002 147.793 0 178.879 0C209.965 0 238.155 7.01002 263.451 21.028C289.051 34.742 318.765 55.772 352.593 84.114C375.451 103.314 393.431 117.028 406.537 125.258C419.945 133.18 434.879 137.142 451.337 137.142C477.851 137.142 498.727 127.696 513.965 108.8C521.231 99.79 526.661 88.77 530.255 75.74C537.627 49.008 558.305 25.6 586.033 25.6C612.817 25.6 635.309 47.078 632.223 73.684C628.861 102.664 621.441 127.322 609.965 147.658C592.593 178.438 569.889 200.838 541.851 214.858C513.813 228.876 484.251 235.886 453.165 235.886C422.079 235.886 393.737 229.334 368.137 216.228C342.537 202.82 312.975 181.334 279.451 151.772C257.507 132.572 239.679 119.01 225.965 111.086C212.251 102.858 197.165 98.742 180.707 98.742C156.021 98.742 135.603 107.276 119.451 124.342C111.043 133.226 104.947 145.246 101.165 160.404C94.4911 187.138 73.9191 210.286 46.3631 210.286ZM46.3631 486.4C19.4771 486.4 -2.98429 464.668 0.324514 437.986C3.90111 409.148 11.3051 384.6 22.5371 364.342C39.9071 333.562 62.4611 311.162 90.1931 297.142C118.231 283.124 147.793 276.114 178.879 276.114C209.965 276.114 238.155 283.124 263.451 297.142C289.051 310.858 318.765 331.886 352.593 360.228C375.451 379.428 393.431 393.142 406.537 401.372C419.945 409.296 434.879 413.258 451.337 413.258C477.851 413.258 498.727 403.81 513.965 384.914C521.231 375.904 526.661 364.884 530.255 351.854C537.627 325.122 558.305 301.714 586.033 301.714C612.817 301.714 635.309 323.194 632.223 349.798C628.861 378.778 621.441 403.436 609.965 423.772C592.593 454.552 569.889 476.952 541.851 490.972C513.813 504.99 484.251 512 453.165 512C422.079 512 393.737 505.448 368.137 492.342C342.537 478.934 312.975 457.448 279.451 427.886C257.507 408.686 239.679 395.124 225.965 387.2C212.251 378.972 197.165 374.858 180.707 374.858C156.021 374.858 135.603 383.39 119.451 400.458C111.043 409.34 104.947 421.36 101.165 436.518C94.4911 463.252 73.9191 486.4 46.3631 486.4Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,27 @@
{
"fill": {
"solid": "display-p3:0.95215,0.66553,0.23462,1.00000"
},
"groups": [
{
"layers": [
{
"image-name": "Vector.svg",
"name": "Vector"
}
],
"shadow": {
"kind": "neutral",
"opacity": 0.5
},
"translucency": {
"enabled": true,
"value": 0.5
}
}
],
"supported-platforms": {
"circles": ["watchOS"],
"squares": "shared"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 883 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,3 @@
<svg width="633" height="512" viewBox="0 0 633 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M46.3631 210.286C19.4771 210.286 -2.98429 188.554 0.324514 161.87C3.90111 133.034 11.3051 108.486 22.5371 88.228C39.9071 57.448 62.4611 35.048 90.1931 21.028C118.231 7.01002 147.793 0 178.879 0C209.965 0 238.155 7.01002 263.451 21.028C289.051 34.742 318.765 55.772 352.593 84.114C375.451 103.314 393.431 117.028 406.537 125.258C419.945 133.18 434.879 137.142 451.337 137.142C477.851 137.142 498.727 127.696 513.965 108.8C521.231 99.79 526.661 88.77 530.255 75.74C537.627 49.008 558.305 25.6 586.033 25.6C612.817 25.6 635.309 47.078 632.223 73.684C628.861 102.664 621.441 127.322 609.965 147.658C592.593 178.438 569.889 200.838 541.851 214.858C513.813 228.876 484.251 235.886 453.165 235.886C422.079 235.886 393.737 229.334 368.137 216.228C342.537 202.82 312.975 181.334 279.451 151.772C257.507 132.572 239.679 119.01 225.965 111.086C212.251 102.858 197.165 98.742 180.707 98.742C156.021 98.742 135.603 107.276 119.451 124.342C111.043 133.226 104.947 145.246 101.165 160.404C94.4911 187.138 73.9191 210.286 46.3631 210.286ZM46.3631 486.4C19.4771 486.4 -2.98429 464.668 0.324514 437.986C3.90111 409.148 11.3051 384.6 22.5371 364.342C39.9071 333.562 62.4611 311.162 90.1931 297.142C118.231 283.124 147.793 276.114 178.879 276.114C209.965 276.114 238.155 283.124 263.451 297.142C289.051 310.858 318.765 331.886 352.593 360.228C375.451 379.428 393.431 393.142 406.537 401.372C419.945 409.296 434.879 413.258 451.337 413.258C477.851 413.258 498.727 403.81 513.965 384.914C521.231 375.904 526.661 364.884 530.255 351.854C537.627 325.122 558.305 301.714 586.033 301.714C612.817 301.714 635.309 323.194 632.223 349.798C628.861 378.778 621.441 403.436 609.965 423.772C592.593 454.552 569.889 476.952 541.851 490.972C513.813 504.99 484.251 512 453.165 512C422.079 512 393.737 505.448 368.137 492.342C342.537 478.934 312.975 457.448 279.451 427.886C257.507 408.686 239.679 395.124 225.965 387.2C212.251 378.972 197.165 374.858 180.707 374.858C156.021 374.858 135.603 383.39 119.451 400.458C111.043 409.34 104.947 421.36 101.165 436.518C94.4911 463.252 73.9191 486.4 46.3631 486.4Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,28 @@
{
"fill": {
"solid": "display-p3:0.27100,0.25562,0.81934,1.00000"
},
"groups": [
{
"layers": [
{
"fill": "automatic",
"image-name": "Vector.svg",
"name": "Vector"
}
],
"shadow": {
"kind": "neutral",
"opacity": 0.5
},
"translucency": {
"enabled": true,
"value": 0.5
}
}
],
"supported-platforms": {
"circles": ["watchOS"],
"squares": "shared"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
const {notarize} = require('@electron/notarize');
exports.default = async function notarizing(context) {
const {electronPlatformName, appOutDir} = context;
if (electronPlatformName !== 'darwin') {
return;
}
if (!process.env.APPLE_ID || !process.env.APPLE_APP_SPECIFIC_PASSWORD || !process.env.APPLE_TEAM_ID) {
console.log('Skipping notarization: Apple credentials not set');
return;
}
const appName = context.packager.appInfo.productFilename;
const appPath = `${appOutDir}/${appName}.app`;
console.log(`Notarizing ${appPath}...`);
try {
await notarize({
tool: 'notarytool',
appPath,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
teamId: process.env.APPLE_TEAM_ID,
});
console.log('Notarization complete');
} catch (error) {
console.error('Notarization failed:', error);
throw error;
}
};

View File

@@ -0,0 +1,185 @@
/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
const isCanary = process.env.BUILD_CHANNEL === 'canary';
const productName = isCanary ? 'Fluxer Canary' : 'Fluxer';
const appId = isCanary ? 'app.fluxer.canary' : 'app.fluxer';
const iconDir = isCanary ? 'icons-canary' : 'icons-stable';
const packageName = isCanary ? 'fluxer_desktop_canary' : 'fluxer_desktop';
/** @type {import('electron-builder').Configuration} */
module.exports = {
appId,
productName,
// biome-ignore lint/suspicious/noTemplateCurlyInString: electron-builder placeholder syntax
artifactName: '${productName}-${version}-${os}-${arch}.${ext}',
directories: {
buildResources: 'build_resources',
output: 'dist-electron',
},
files: ['dist/**/*', 'package.json'],
extraMetadata: {
main: 'dist/main/index.js',
name: packageName,
},
extraResources: [
{
from: `build_resources/${iconDir}/badges/`,
to: 'badges',
filter: ['**/*'],
},
],
asar: true,
compression: 'maximum',
mac: {
category: 'public.app-category.social-networking',
icon: `build_resources/${iconDir}/_compiled/AppIcon.icns`,
darkModeSupport: true,
hardenedRuntime: true,
gatekeeperAssess: false,
entitlements: isCanary
? 'build_resources/entitlements.mac.canary.plist'
: 'build_resources/entitlements.mac.stable.plist',
entitlementsInherit: 'build_resources/entitlements.mac.inherit.plist',
target: [
{
target: 'dmg',
arch: ['x64', 'arm64'],
},
{
target: 'zip',
arch: ['x64', 'arm64'],
},
],
extendInfo: {
NSMicrophoneUsageDescription: 'Fluxer needs access to your microphone to enable voice chat features.',
NSCameraUsageDescription: 'Fluxer needs access to your camera to enable video chat features.',
NSAppleEventsUsageDescription: 'Fluxer needs access to Apple Events for automation features.',
},
},
dmg: {
contents: [
{
x: 130,
y: 220,
},
{
x: 410,
y: 220,
type: 'link',
path: '/Applications',
},
],
},
win: {
icon: `build_resources/${iconDir}/icon.ico`,
target: [
{
target: 'nsis',
arch: ['x64', 'arm64'],
},
{
target: 'squirrel',
arch: ['x64'],
},
],
},
nsis: {
oneClick: false,
perMachine: false,
allowToChangeInstallationDirectory: true,
deleteAppDataOnUninstall: false,
createDesktopShortcut: true,
createStartMenuShortcut: true,
},
squirrelWindows: {
iconUrl: `https://fluxerstatic.com/desktop/${iconDir}/icon.ico`,
name: packageName,
},
linux: {
icon: `build_resources/${iconDir}/icon.png`,
category: 'Network;InstantMessaging;',
target: [
{
target: 'AppImage',
arch: ['x64', 'arm64'],
},
{
target: 'deb',
arch: ['x64', 'arm64'],
},
{
target: 'rpm',
arch: ['x64', 'arm64'],
},
{
target: 'tar.gz',
arch: ['x64', 'arm64'],
},
],
desktop: {
Name: productName,
Comment: 'Instant messaging and VoIP application',
Categories: 'Network;InstantMessaging;',
StartupWMClass: isCanary ? 'fluxer-canary' : 'fluxer',
},
},
deb: {
depends: [
'libgtk-3-0',
'libnotify4',
'libnss3',
'libxss1',
'libxtst6',
'xdg-utils',
'libatspi2.0-0',
'libuuid1',
'libsecret-1-0',
],
},
rpm: {
depends: [
'gtk3',
'libnotify',
'nss',
'libXScrnSaver',
'libXtst',
'xdg-utils',
'at-spi2-core',
'libuuid',
'libsecret',
],
},
publish: null,
};

View File

@@ -0,0 +1,33 @@
{
"name": "fluxer_desktop",
"version": "0.0.0",
"private": true,
"type": "module",
"main": "dist/main/index.js",
"scripts": {
"build": "node scripts/build.mjs",
"set-channel": "node scripts/set-build-channel.mjs",
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"@electron-webauthn/native": "0.0.6",
"@simplewebauthn/browser": "13.2.2",
"electron-squirrel-startup": "1.0.1",
"electron-webauthn-mac": "1.0.0",
"node-mac-permissions": "2.5.0",
"update-electron-app": "3.1.2",
"ws": "8.19.0"
},
"devDependencies": {
"@types/ws": "8.18.1",
"@typescript/native-preview": "7.0.0-dev.20260130.1",
"electron": "40.0.0",
"electron-builder": "26.4.0",
"electron-builder-squirrel-windows": "26.4.0",
"esbuild": "0.27.2"
},
"optionalDependencies": {
"electron-log": "5.4.3",
"uiohook-napi": "1.5.4"
}
}

View File

@@ -0,0 +1,51 @@
# Maintainer: Fluxer Contributors <developers@fluxer.app>
pkgname=fluxer-bin
pkgver=PLACEHOLDER_VERSION
pkgrel=1
pkgdesc='Instant messaging and VoIP application'
arch=('x86_64' 'aarch64')
url='https://fluxer.app'
license=('AGPL-3.0-or-later')
depends=('gtk3' 'libnotify' 'nss' 'libxss' 'libxtst' 'xdg-utils'
'at-spi2-core' 'util-linux-libs' 'libsecret' 'libappindicator-gtk3')
optdepends=('libpipewire: screen sharing via PipeWire')
provides=('fluxer')
conflicts=('fluxer')
options=('!strip' '!debug')
_filename_x86_64="fluxer-stable-${pkgver}-x86_64.tar.gz"
_filename_aarch64="fluxer-stable-${pkgver}-aarch64.tar.gz"
source_x86_64=("${_filename_x86_64}::https://api.fluxer.app/dl/desktop/stable/linux/x64/${pkgver}/tar_gz")
source_aarch64=("${_filename_aarch64}::https://api.fluxer.app/dl/desktop/stable/linux/arm64/${pkgver}/tar_gz")
sha256sums_x86_64=('PLACEHOLDER_SHA256_X64')
sha256sums_aarch64=('PLACEHOLDER_SHA256_ARM64')
package() {
install -d "${pkgdir}/opt/fluxer"
cp -r "${srcdir}/"* "${pkgdir}/opt/fluxer/"
chmod +x "${pkgdir}/opt/fluxer/fluxer"
install -d "${pkgdir}/usr/bin"
ln -s /opt/fluxer/fluxer "${pkgdir}/usr/bin/fluxer"
install -Dm644 /dev/stdin "${pkgdir}/usr/share/applications/fluxer.desktop" <<EOF
[Desktop Entry]
Name=Fluxer
Comment=Instant messaging and VoIP application
Exec=/opt/fluxer/fluxer %U
Icon=fluxer
Type=Application
Categories=Network;InstantMessaging;
StartupWMClass=fluxer
MimeType=x-scheme-handler/fluxer;
Terminal=false
EOF
for size in 16 32 48 64 128 256 512; do
if [ -f "${srcdir}/resources/icons/${size}x${size}.png" ]; then
install -Dm644 "${srcdir}/resources/icons/${size}x${size}.png" \
"${pkgdir}/usr/share/icons/hicolor/${size}x${size}/apps/fluxer.png"
fi
done
}

View File

@@ -0,0 +1,24 @@
# Fluxer AUR package
PKGBUILD for the `fluxer-bin` AUR binary package. This installs pre-built binaries rather than building from source, since Electron apps are impractical to compile within the AUR build system.
## Placeholders
The `pkgver` and `sha256sums` fields are set to placeholder values. Update them before publishing:
- Run `updpkgsums` to fetch and fill checksums automatically.
- Alternatively, query the latest version from the API and update manually.
## Testing locally
```bash
makepkg -si
```
## Fetching the latest version
```bash
curl -s https://api.fluxer.app/dl/desktop/stable/linux/x64/latest | jq
```
This returns a JSON object containing `version`, `pub_date`, and `files` with download URLs and SHA256 checksums for each format.

View File

@@ -0,0 +1,48 @@
# Fluxer Flatpak packaging
These files are for submitting Fluxer to [Flathub](https://flathub.org), the centralised Flatpak application repository.
## Files
- **`app.fluxer.json`** -- Flatpak manifest defining the build, runtime, permissions, and sources.
- **`app.fluxer.metainfo.xml`** -- AppStream metadata for the app store listing (description, categories, content rating, etc.).
- **`app.fluxer.desktop`** -- XDG desktop entry so the app appears in desktop launchers.
- **`icon-256.png`** -- Application icon (256x256). This file must be extracted from the build resources or provided separately; it is not checked in.
## Placeholder SHA256 hashes
The `sha256` values in `app.fluxer.json` are set to `PLACEHOLDER_SHA256_X64` and `PLACEHOLDER_SHA256_ARM64`. These are updated automatically by [flatpak-external-data-checker](https://github.com/nickvdp/flatpak-external-data-checker) via the `x-checker-data` configuration on each source. When preparing a manual build, replace them with the actual SHA256 checksums of the downloaded tar.gz archives.
## Icon
The `icon-256.png` file needs to be provided before building. You can extract it from the Electron build resources:
```sh
cp ../../build_resources/icons/256x256.png icon-256.png
```
Or generate it from the source SVG/PNG in the build resources directory.
## Testing locally
Install the required runtime and base app if you haven't already:
```sh
flatpak install flathub org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08 org.electronjs.Electron2.BaseApp//24.08
```
Then build and install:
```sh
flatpak-builder --user --install build-dir app.fluxer.json
```
Run the app:
```sh
flatpak run app.fluxer
```
## Flathub submission
To submit to Flathub, fork the [flathub/flathub](https://github.com/flathub/flathub) repository and open a pull request adding `app.fluxer.json` along with the supporting files. Refer to the [Flathub submission guide](https://docs.flathub.org/docs/for-app-authors/submission/) for current requirements.

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=Fluxer
Comment=Instant messaging and VoIP application
Exec=fluxer %U
Icon=app.fluxer
Type=Application
Categories=Network;InstantMessaging;
StartupWMClass=fluxer
MimeType=x-scheme-handler/fluxer;
Terminal=false

View File

@@ -0,0 +1,78 @@
{
"id": "app.fluxer",
"runtime": "org.freedesktop.Platform",
"runtime-version": "24.08",
"sdk": "org.freedesktop.Sdk",
"base": "org.electronjs.Electron2.BaseApp",
"base-version": "24.08",
"command": "fluxer",
"separate-locales": false,
"finish-args": [
"--share=ipc",
"--share=network",
"--socket=x11",
"--socket=wayland",
"--socket=pulseaudio",
"--device=all",
"--talk-name=org.freedesktop.Notifications",
"--talk-name=org.kde.StatusNotifierWatcher",
"--talk-name=org.freedesktop.secrets",
"--filesystem=xdg-run/pipewire-0",
"--env=XCURSOR_PATH=/run/host/user-share/icons:/run/host/share/icons"
],
"modules": [
{
"name": "fluxer",
"buildsystem": "simple",
"build-commands": [
"install -d /app/lib/fluxer",
"cp -r ./* /app/lib/fluxer/",
"chmod +x /app/lib/fluxer/fluxer",
"install -Dm644 /app/lib/fluxer/resources/app.asar.unpacked/node_modules/electron/dist/chrome-sandbox /app/lib/fluxer/chrome-sandbox || true",
"install -d /app/bin",
"ln -s /app/lib/fluxer/fluxer /app/bin/fluxer",
"install -Dm644 app.fluxer.metainfo.xml /app/share/metainfo/app.fluxer.metainfo.xml",
"install -Dm644 app.fluxer.desktop /app/share/applications/app.fluxer.desktop",
"install -Dm644 icon-256.png /app/share/icons/hicolor/256x256/apps/app.fluxer.png"
],
"sources": [
{
"type": "archive",
"only-arches": ["x86_64"],
"url": "https://api.fluxer.app/dl/desktop/stable/linux/x64/latest/tar_gz",
"sha256": "PLACEHOLDER_SHA256_X64",
"x-checker-data": {
"type": "json",
"url": "https://api.fluxer.app/dl/desktop/stable/linux/x64/latest",
"version-query": ".version",
"url-query": ".files.tar_gz.url"
}
},
{
"type": "archive",
"only-arches": ["aarch64"],
"url": "https://api.fluxer.app/dl/desktop/stable/linux/arm64/latest/tar_gz",
"sha256": "PLACEHOLDER_SHA256_ARM64",
"x-checker-data": {
"type": "json",
"url": "https://api.fluxer.app/dl/desktop/stable/linux/arm64/latest",
"version-query": ".version",
"url-query": ".files.tar_gz.url"
}
},
{
"type": "file",
"path": "app.fluxer.metainfo.xml"
},
{
"type": "file",
"path": "app.fluxer.desktop"
},
{
"type": "file",
"path": "icon-256.png"
}
]
}
]
}

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>app.fluxer</id>
<name>Fluxer</name>
<summary>Instant messaging and VoIP application</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>AGPL-3.0-or-later</project_license>
<description>
<p>Fluxer is a free and open-source instant messaging and voice-over-IP application. It provides text chat, voice calls, video calls, and screen sharing in a modern interface.</p>
<p>Features include:</p>
<ul>
<li>Text messaging with rich formatting and media support</li>
<li>Voice and video calls</li>
<li>Screen sharing</li>
<li>Communities with channels</li>
<li>Direct messages and group chats</li>
<li>Custom emoji and reactions</li>
</ul>
</description>
<url type="homepage">https://fluxer.app</url>
<url type="bugtracker">https://github.com/fluxerapp/fluxer/issues</url>
<url type="help">https://fluxer.app/help</url>
<launchable type="desktop-id">app.fluxer.desktop</launchable>
<categories>
<category>Network</category>
<category>InstantMessaging</category>
</categories>
<provides>
<binary>fluxer</binary>
</provides>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">intense</content_attribute>
<content_attribute id="social-audio">intense</content_attribute>
<content_attribute id="social-contacts">intense</content_attribute>
<content_attribute id="social-info">moderate</content_attribute>
</content_rating>
<supports>
<control>pointing</control>
<control>keyboard</control>
</supports>
</component>

View File

@@ -0,0 +1,25 @@
# Fluxer Homebrew cask
Homebrew cask definition for installing Fluxer on macOS.
## Placeholders
The `version` and `sha256` fields are set to placeholder values. Update them before publishing or submitting to a tap.
## Livecheck
The cask includes a `livecheck` block that queries the Fluxer download API for the latest stable version. Homebrew's automated tooling uses this to detect new releases.
## Testing locally
```bash
brew install --cask ./fluxer.rb
```
## Fetching the latest version
```bash
curl -s https://api.fluxer.app/dl/desktop/stable/darwin/arm64/latest | jq
```
This returns a JSON object containing `version`, `pub_date`, and `files` with download URLs and SHA256 checksums for each format.

View File

@@ -0,0 +1,37 @@
cask "fluxer" do
arch arm: "arm64", intel: "x64"
version "PLACEHOLDER_VERSION"
on_arm do
sha256 "PLACEHOLDER_SHA256_ARM64"
end
on_intel do
sha256 "PLACEHOLDER_SHA256_X64"
end
url "https://api.fluxer.app/dl/desktop/stable/darwin/#{arch}/#{version}/dmg"
name "Fluxer"
desc "Instant messaging and VoIP application"
homepage "https://fluxer.app"
livecheck do
url "https://api.fluxer.app/dl/desktop/stable/darwin/arm64/latest"
strategy :json do |json|
json["version"]
end
end
auto_updates true
depends_on macos: ">= :catalina"
app "Fluxer.app"
zap trash: [
"~/Library/Application Support/Fluxer",
"~/Library/Caches/app.fluxer",
"~/Library/Caches/app.fluxer.ShipIt",
"~/Library/Preferences/app.fluxer.plist",
"~/Library/Saved Application State/app.fluxer.savedState",
]
end

View File

@@ -0,0 +1,19 @@
PackageIdentifier: Fluxer.Fluxer
PackageVersion: PLACEHOLDER_VERSION
MinimumOSVersion: 10.0.17763.0
InstallerType: nullsoft
Scope: user
InstallModes:
- interactive
- silent
- silentWithProgress
UpgradeBehavior: install
Installers:
- Architecture: x64
InstallerUrl: https://api.fluxer.app/dl/desktop/stable/win32/x64/PLACEHOLDER_VERSION/setup
InstallerSha256: PLACEHOLDER_SHA256_X64
- Architecture: arm64
InstallerUrl: https://api.fluxer.app/dl/desktop/stable/win32/arm64/PLACEHOLDER_VERSION/setup
InstallerSha256: PLACEHOLDER_SHA256_ARM64
ManifestType: installer
ManifestVersion: 1.6.0

View File

@@ -0,0 +1,22 @@
PackageIdentifier: Fluxer.Fluxer
PackageVersion: PLACEHOLDER_VERSION
PackageLocale: en-US
Publisher: Fluxer Contributors
PublisherUrl: https://fluxer.app
PublisherSupportUrl: https://github.com/fluxerapp/fluxer/issues
PackageName: Fluxer
PackageUrl: https://fluxer.app
License: AGPL-3.0-or-later
LicenseUrl: https://github.com/fluxerapp/fluxer/blob/main/LICENCE
ShortDescription: Instant messaging and VoIP application
Description: Fluxer is a free and open-source instant messaging and voice-over-IP application. It provides text chat, voice calls, video calls, and screen sharing in a modern, privacy-respecting interface.
Tags:
- chat
- messaging
- voip
- voice
- video
- communication
- open-source
ManifestType: defaultLocale
ManifestVersion: 1.6.0

View File

@@ -0,0 +1,5 @@
PackageIdentifier: Fluxer.Fluxer
PackageVersion: PLACEHOLDER_VERSION
DefaultLocale: en-US
ManifestType: version
ManifestVersion: 1.6.0

Some files were not shown because too many files have changed in this diff Show More