Skip to content

fakturapp/faktur-desktop

Faktur Desktop

Site App Release Licence

Client de bureau Electron pour Faktur. Authentification OAuth2 + PKCE via le navigateur système, stockage des jetons dans le coffre-fort sécurisé du système d'exploitation, et aucun mot de passe ne transite par l'application.

Faktur Desktop n'est pas un logiciel séparé : c'est le dashboard Faktur embarqué dans une fenêtre native, avec tous les avantages d'une app de bureau (auto-update, icône dans la barre des tâches, raccourci clavier) et sans compromettre la sécurité zero-access du coffre-fort.


Important

Utilisateurs macOS & Linux

Si vous êtes sur Mac, l'application affichera une erreur au premier lancement. Pour la débloquer, ouvrez votre Terminal et exécutez ces deux commandes :

xattr -d com.apple.quarantine "/Applications/Faktur Desktop.app"
codesign --force --deep --sign - "/Applications/Faktur Desktop.app"

Si vous êtes sur Linux, n'oubliez pas de rendre l'AppImage exécutable : chmod +x FakturDesktop-linux-x86_64.AppImage


Pourquoi une app de bureau

  • Sessions longue durée — les jetons OAuth2 sont conservés dans le Keychain macOS, DPAPI Windows ou libsecret Linux, pas dans un cookie de navigateur qui peut disparaître
  • Lancement direct — un clic sur l'icône te redonne Faktur, pas besoin d'ouvrir un navigateur, taper une URL et te connecter
  • Mises à jour automatiques — l'app vérifie les nouvelles releases GitHub et propose l'update dans la sidebar
  • Pas de mot de passe dans Electron — toute l'authentification passe par le navigateur système, seul le jeton OAuth arrive dans l'app
  • Intégrité vérifiée — le binaire officiel est signé par le maintainer, le dashboard affiche un badge ✓ bleu à côté de "Faktur Desktop" quand la signature Ed25519 correspond

Architecture

faktur-desktop/
├── src/
│   ├── config/          Chargement .env + constantes + clés publiques
│   ├── crypto/          Wrapper safeStorage (OS-backed encryption)
│   ├── loopback/        Serveur HTTP éphémère pour le callback OAuth
│   ├── oauth/           Client OAuth2, PKCE, rotation des jetons
│   ├── store/           Stockage clé-valeur chiffré persistant
│   ├── ipc/             Bridge main ↔ renderer
│   ├── security/        Durcissement Electron + attestation + desktop proof
│   ├── update/          Auto-updater via GitHub Releases
│   ├── windows/         Factories BrowserWindow (login, shell, update)
│   └── main/            Point d'entrée app
├── renderer/
│   ├── login.html       Page de connexion OAuth (avant auth)
│   ├── loading.html     Splash pendant exchange-session
│   ├── update.html      Écran de téléchargement de mise à jour
│   ├── js/              Scripts UI renderer
│   ├── preload/         Ponts contextBridge
│   └── assets/          Logos, favicons
├── scripts/
│   ├── compile-env.js       Chiffre .env en bundle AES-256-GCM
│   ├── generate-icon.js     Génère icon.png 512x512 depuis le logo
│   ├── generate-signing-key.js  Crée la keypair Ed25519 one-shot
│   ├── afterPack.js         Hook electron-builder : signe l'asar
│   └── strip-comments.js    Nettoie les commentaires du code source
└── build/                   Entitlements macOS + icônes générés

Sécurité

Faktur Desktop combine plusieurs couches :

Couche Rôle
OAuth2 + PKCE (RFC 7636) Aucun mot de passe dans l'app, code_verifier éphémère par flow
safeStorage OS-backed Jetons persistés via Keychain/DPAPI/libsecret, refus du mode basic_text
Ed25519 attestation Signature de l'asar au build, vérifiée au runtime, badge ✓ si officiel
HMAC desktop proof Header signé sur chaque requête API → backend distingue vrai client vs bot
Electron sandbox contextIsolation, nodeIntegration: false, sandbox: true sur toutes les fenêtres
Electron fuses runAsNode: false, onlyLoadAppFromAsar: true, ASAR integrity
CSP strict default-src 'none' sur tous les HTML locaux
Launch flag policy Refuse --inspect, --remote-debugging-port, etc.
Inspector watchdog Détection runtime d'un inspecteur Node via inspector.url()
Permission blocker Caméra, micro, géoloc, notifs bloquées par défaut
HTTPS-only guard Bloque tout trafic non-HTTPS sauf loopback OAuth
TLS certificate verify Hook setCertificateVerifyProc pour logger les anomalies
Total wipe au logout Cookies + localStorage + cache + indexedDB + jetons OAuth
env.bundle.bin chiffré Le .env est compilé en AES-256-GCM au build, jamais en clair sur disque

Pour la politique complète, voir SECURITY.md.

Installation (utilisateur)

  1. Télécharge la dernière release sur github.com/fakturapp/faktur-desktop/releases/latest
  2. Lance FakturDesktop-Installer.exe (Windows) ou le .dmg/.AppImage équivalent
  3. Au premier démarrage, clique sur Se connecter avec Faktur
  4. Ton navigateur s'ouvre sur dash.fakturapp.cc/oauth/authorize → tu autorises → retour auto dans l'app

Développement

git clone https://github.com/fakturapp/faktur-desktop
cd faktur-desktop
cp .env.example .env
# Remplis FAKTUR_OAUTH_CLIENT_ID avec la valeur générée depuis
# dash.fakturapp.cc → Admin → Applications OAuth → Nouvelle
npm install
npm run start:dev

En mode start:dev, les DevTools s'ouvrent automatiquement, tous les raccourcis clavier (F12, Ctrl+R) fonctionnent, et les protections anti-debug sont désactivées.

Build production

# Génère icon.png/ico, compile l'env chiffré, puis packe
npm run build:win      # Windows NSIS installer
npm run build:mac      # macOS DMG
npm run build:linux    # Linux AppImage

Chaque build :

  1. scripts/generate-icon.jsbuild/icon.png + build/icon.ico (512×512)
  2. scripts/compile-env.jssrc/config/env.bundle.bin (AES-256-GCM)
  3. electron-builderdist/FakturDesktop-Installer.exe

Pour signer aussi le binaire comme "officiel" (nécessaire pour que le badge ✓ apparaisse dans la sidebar Faktur), définis FAKTUR_DESKTOP_SIGNING_KEY dans l'environnement avant le build. Voir generate-signing-key.js pour générer une keypair Ed25519.

Publier une release

  1. Bump la version dans package.json (ex : "version": "2.4.3")
  2. npm run build:win
  3. Va sur github.com/fakturapp/faktur-desktop/releases/new
  4. Tag : v2.4.3 (le préfixe v est optionnel, mais le tag DOIT contenir un numéro de version)
  5. Title : Faktur 2.4.3 (contient aussi le numéro de version — sert de fallback si le tag est mal formé)
  6. Upload dist/FakturDesktop-Installer.exe comme asset
  7. Coche Set as the latest release
  8. Publie

Important : ne tague JAMAIS une release avec un label non-numérique comme latest, stable, etc. L'auto-updater cherche un semver dans le tag OU dans le titre de la release. Si ni l'un ni l'autre ne contient de version parsable, aucun client ne verra l'update.

Auto-update

L'app interroge l'API GitHub toutes les heures :

GET https://api.github.com/repos/fakturapp/faktur-desktop/releases/latest

Si la version distante est supérieure à la version locale ET que l'asset correspondant à la plateforme existe (.exe, .zip ou .AppImage), une carte "Mise à jour disponible" apparaît dans l'écran de connexion. Un clic sur "Télécharger" télécharge l'installeur dans le dossier temporaire et le lance via un script trampoline qui gère le remplacement des fichiers et le redémarrage de l'app.

Licence

Faktur Desktop — Personal Use License © 2026 danbenba. Voir LICENSE.

Usage personnel uniquement. Pas d'utilisation commerciale, pas de redistribution, pas de produits dérivés.

About

The Desktop Application for Faktur

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors