{"id":49178301,"url":"https://github.com/alphaluppi/fakt","last_synced_at":"2026-04-25T00:05:07.897Z","repository":{"id":352965768,"uuid":"1217049683","full_name":"AlphaLuppi/FAKT","owner":"AlphaLuppi","description":"Devis, factures, signes. App desktop open-source pour freelance FR. Tauri 2, Claude CLI, signature PAdES maison.","archived":false,"fork":false,"pushed_at":"2026-04-21T23:10:58.000Z","size":687,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T23:30:34.606Z","etag":null,"topics":["brutalist","bsl","claude-code","desktop-app","devis","e-signature","facturation","freelance","french","invoicing","open-source","pades","quote","rust","tauri","tauri2","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlphaLuppi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-21T13:49:30.000Z","updated_at":"2026-04-21T23:11:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AlphaLuppi/FAKT","commit_stats":null,"previous_names":["alphaluppi/fakt"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/AlphaLuppi/FAKT","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLuppi%2FFAKT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLuppi%2FFAKT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLuppi%2FFAKT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLuppi%2FFAKT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlphaLuppi","download_url":"https://codeload.github.com/AlphaLuppi/FAKT/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLuppi%2FFAKT/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32159962,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T17:06:48.269Z","status":"ssl_error","status_checked_at":"2026-04-22T17:06:19.037Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brutalist","bsl","claude-code","desktop-app","devis","e-signature","facturation","freelance","french","invoicing","open-source","pades","quote","rust","tauri","tauri2","typescript"],"created_at":"2026-04-23T00:00:25.441Z","updated_at":"2026-04-23T00:00:54.428Z","avatar_url":"https://github.com/AlphaLuppi.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FAKT\n\n**Facturez et signez en local. Open source.**\n\n[![CI](https://github.com/AlphaLuppi/FAKT/actions/workflows/ci.yml/badge.svg)](https://github.com/AlphaLuppi/FAKT/actions/workflows/ci.yml)\n[![License BSL 1.1](https://img.shields.io/badge/license-BSL%201.1-yellow)](LICENSE)\n[![Version](https://img.shields.io/github/v/release/AlphaLuppi/FAKT)](https://github.com/AlphaLuppi/FAKT/releases/latest)\n\nFAKT est une application desktop (Windows, macOS, Linux) open-source pour freelances et\npetites agences francophones. De ton brief client à un PDF signé, en 3 minutes au lieu de 30.\n\n**Yousign + Indy + Google Drive fusionnés en une app desktop de ~100 Mo. Hors-ligne par défaut.**\n\n---\n\n## Qu'est-ce que FAKT ?\n\nLes freelances français qui facturent sérieusement jonglent entre 4 à 7 outils distincts pour\nun cycle simple : un éditeur pour le devis, un service de signature (Yousign, Docusign),\nun tableur pour le suivi, un logiciel de compta pour la numérotation légale et l'archivage.\n\nFAKT réunit tout ça dans un seul outil desktop :\n\n- **Génération de devis et factures** conformes à la législation française (CGI art. 289, TVA\n  micro-entreprise, mentions obligatoires, archivage 10 ans).\n- **Signature PAdES avancée** maison en Rust (niveau eIDAS AdES-B-T) — pas de dépendance Yousign\n  ni Docusign. Horodatage RFC 3161. Vérifiable dans Adobe Reader.\n- **IA via Claude Code CLI** : extraction de devis depuis un brief texte, rédaction de relances.\n  Votre propre token Anthropic. Vos données ne quittent jamais votre machine.\n- **SQLite local** dans `~/.fakt/` — zéro cloud obligatoire, zéro abonnement.\n\n---\n\n## Fonctionnalités v0.1.0\n\n- Création de devis (D2026-XXX) avec numérotation séquentielle automatique\n- Génération IA du contenu depuis un brief client (subprocess Claude Code CLI)\n- Édition manuelle complète (clients, prestations, lignes, conditions)\n- Rendu PDF déterministe via Typst — fidèle aux templates des skills `/devis-freelance` et `/facture-freelance`\n- Conversion devis signé → facture en un clic\n- Suivi cycle factures : émise → envoyée → payée / en retard\n- Signature électronique avancée PAdES B-T (RSA 4096 + TSA RFC 3161 + audit trail SHA-256)\n- Brouillon email `.eml` avec PDF en pièce jointe, ouvert via le client mail de l'OS\n- Archive et compliance : export ZIP workspace (clients.csv + prestations.csv + PDFs)\n- Dashboard KPIs + activity feed\n- Bibliothèque de prestations réutilisables\n- Gestion clients (SIRET, forme sociale, adresse)\n- Design system Brutal Invoice : mémorable et unique\n\n---\n\n## Installation\n\n**Taille installer :** ~100 Mo (sidecar Bun bundlé, cohérent avec les apps desktop modernes\ntype Slack, Discord, Obsidian qui pèsent 100-200 Mo). Un port Rust du sidecar est envisagé\nen v0.2 pour réduire la taille à ~20 Mo.\n\n### Télécharger depuis GitHub Releases\n\nRendez-vous sur la page [Releases](https://github.com/AlphaLuppi/FAKT/releases/latest) et\ntéléchargez l'installeur correspondant à votre OS.\n\n**Windows** — fichier `.msi`\n\n\u003e **Note v0.1.0 :** l'installeur Windows n'est pas signé (signature Authenticode en v0.1.1).\n\u003e Windows SmartScreen affichera « Unknown Publisher ». Clic droit → Exécuter quand même.\n\n**macOS** — fichier `.dmg` (Universal : Intel + Apple Silicon)\n\n\u003e Si Gatekeeper bloque : clic droit sur l'app → Ouvrir.\n\n**Linux** — fichier `.AppImage` ou `.deb`\n\n```bash\n# AppImage\nchmod +x FAKT_0.1.0_amd64.AppImage\n./FAKT_0.1.0_amd64.AppImage\n\n# .deb (Debian/Ubuntu)\nsudo dpkg -i FAKT_0.1.0_amd64.deb\n```\n\n### Premier lancement\n\nAu premier lancement, FAKT affiche un wizard d'onboarding (~2 minutes) pour configurer\nvotre workspace : nom légal, SIRET, adresse, régime fiscal. Un certificat X.509 de signature\nest généré automatiquement et stocké dans le keychain de l'OS.\n\n---\n\n## Usage\n\n1. **Créer un client** — menu Clients → Nouveau client.\n2. **Créer un devis** — menu Devis → Nouveau devis. Sélectionner un client, ajouter des lignes\n   de prestations depuis la bibliothèque ou manuellement.\n3. **Générer avec IA** — ouvrir le Composer IA (sidebar droite), coller un brief, cliquer Extraire.\n4. **Signer** — menu Actions → Signer le document. Signature PAdES générée localement.\n5. **Préparer l'email** — menu Actions → Préparer email. Brouillon `.eml` ouvert dans votre client mail.\n6. **Créer la facture** — depuis un devis signé, un clic génère la facture liée.\n7. **Archiver** — menu Archive → Exporter workspace (ZIP) pour la compliance 10 ans.\n\n---\n\n## Troubleshooting\n\n**L'app ne démarre pas (fenêtre blanche)**\nLe sidecar api-server n'a pas pu se lancer. Logs dans :\n- Windows : `%APPDATA%\\fakt\\logs\\sidecar.log`\n- macOS : `~/Library/Application Support/fakt/logs/sidecar.log`\n- Linux : `~/.local/share/fakt/logs/sidecar.log`\n\n**Port 3117 déjà occupé**\nUne instance précédente est peut-être encore en arrière-plan. Sur Windows : `netstat -ano | findstr :3117` puis `taskkill /PID \u003cpid\u003e`. Sur macOS/Linux : `lsof -ti:3117 | xargs kill`.\n\n**Erreur 401 UNAUTHORIZED en dev**\nLe token `window.__FAKT_API_TOKEN__` n'a pas été injecté. Relancer via `bun run dev` (qui injecte) au lieu de `bun --cwd apps/desktop run dev` (Vite standalone sans token).\n\n**Sidecar crash-loop (l'app se ferme 3× de suite en \u003c60s)**\nVérifier les logs sidecar ci-dessus. Causes courantes : DB corrompue (supprimer `~/.fakt/db.sqlite` et relancer pour regénérer), migration cassée, port 3117 pris.\n\n---\n\n## Développement local\n\n**Prérequis :**\n- [Bun](https://bun.sh) \u003e= 1.3\n- [Rust](https://rustup.rs) \u003e= 1.75 (stable)\n- [Tauri CLI v2](https://tauri.app)\n- [Claude Code CLI](https://claude.ai/code) (optionnel, pour les features IA)\n\n```bash\ngit clone https://github.com/AlphaLuppi/FAKT.git\ncd FAKT\nbun install\nbun run dev\n```\n\n**Commandes utiles :**\n\n```bash\nbun run typecheck   # Vérification TypeScript strict\nbun run lint        # Biome (zéro warning)\nbun run test        # Vitest (tous les packages)\nbun run build       # Build production Vite\nbun run release     # Build Tauri complet (installers)\n```\n\n---\n\n## Contribution\n\nFAKT est open-source et les contributions sont bienvenues.\n\nFormat obligatoire : DCO (Developer Certificate of Origin).\nChaque commit doit inclure `Signed-off-by: Nom \u003cemail\u003e` — ajouté automatiquement via `git commit -s`.\n\nVoir [CONTRIBUTING.md](CONTRIBUTING.md) pour le workflow complet, les standards de code\net le texte complet du DCO.\n\n---\n\n## Architecture\n\nFAKT est pensé pour **trois modes de déploiement** qui partagent le même code serveur\n(`packages/api-server/` — Bun + Hono + Drizzle) et les mêmes queries DB. Seuls l'adapter\nDB et la couche auth changent entre modes.\n\n### Mode 1 — Solo desktop (v0.1, MVP)\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│  Desktop Tauri (installer .msi / .dmg / .AppImage, ~100 Mo)  │\n│                                                              │\n│  ┌────────────────┐   HTTP localhost   ┌──────────────────┐  │\n│  │ React webview │ ─────────────────▶ │ Bun api-server   │  │\n│  │ (Vite build)  │  fetch + X-FAKT-   │ Hono REST        │  │\n│  │               │    Token header    │ Drizzle SQLite   │  │\n│  └────────────────┘ ◀───────────────── └──────────────────┘  │\n│         │                                        │           │\n│         │ Tauri invoke (signature / email /      │           │\n│         │        archive / PDF Typst)            ▼           │\n│         ▼                                 ~/.fakt/db.sqlite  │\n│  ┌──────────────────────────────┐                            │\n│  │ Rust core                    │                            │\n│  │  - PAdES B-T + keychain OS   │                            │\n│  │  - open_email_draft (.eml)   │                            │\n│  │  - build_workspace_zip       │                            │\n│  │  - render_pdf (Typst)        │                            │\n│  └──────────────────────────────┘                            │\n└──────────────────────────────────────────────────────────────┘\n\nBind api-server : 127.0.0.1:RANDOM_PORT (jamais exposé LAN)\nToken : 32 bytes crypto-random au spawn, partagé Rust ↔ webview\n```\n\n### Mode 2 — Self-host entreprise (v0.2+)\n\n```\n┌─────────────────────┐              ┌──────────────────────────┐\n│ Desktop Tauri       │    HTTPS     │ VPS Docker               │\n│ (utilisateur équipe)│ ───────────▶ │ api-server (Bun)         │\n│ FAKT_API_URL=https  │  JWT header  │ Drizzle Postgres 16      │\n│ ://fakt.agence.com  │              │ Reverse proxy : Caddy    │\n└─────────────────────┘              └──────────────────────────┘\n```\n\nMême binaire api-server (bundle Bun compile standalone).\nDifférence : `DATABASE_URL=postgres://...`, `AUTH_MODE=jwt`, `BIND=0.0.0.0:3000`.\nLe Rust core reste en desktop (signature et email OS locaux).\n\n### Mode 3 — SaaS hébergé (v0.3+)\n\n```\n┌──────────────────┐          ┌────────────────────────────────┐\n│ Desktop Tauri    │          │ fakt.com (Cloud Run / Fly.io)  │\n│ ou navigateur    │ ──HTTPS─▶│ api-server scalable            │\n│ multi-tenant     │  OAuth   │ Drizzle Postgres + RLS         │\n└──────────────────┘          │ Stripe · Clerk · Sentry        │\n                              └────────────────────────────────┘\n```\n\nMêmes endpoints REST, auth = OAuth / session cookie,\n`workspace_id` résolu server-side (RLS policies par workspace).\n\n### Structure monorepo\n\n```\nfakt/\n├── apps/desktop/          # Application Tauri 2 (React 19 + Rust)\n├── packages/\n│   ├── api-server/        # Sidecar Bun + Hono (55 endpoints REST)\n│   ├── ui/                # Design system Brutal Invoice (primitives React)\n│   ├── db/                # Schéma Drizzle + migrations (SQLite / Postgres)\n│   ├── core/              # Modèles métier TS (Quote, Invoice, Client)\n│   ├── pdf/               # Wrapper Typst → PDF\n│   ├── crypto/            # Interfaces signature PAdES\n│   ├── ai/                # Subprocess Claude CLI\n│   ├── email/             # Générateur .eml RFC 5322 + 4 templates FR\n│   ├── legal/             # Validateurs mentions légales FR\n│   ├── design-tokens/     # Tokens Brutal Invoice (Tailwind plugin)\n│   └── shared/            # Types partagés + i18n FR\n├── landing/               # Landing page Astro (fakt.alphaluppi.com)\n└── docs-site/             # Documentation Mintlify\n```\n\nStack : Tauri 2 · Bun · Hono · React 19 · Vite · Tailwind v4 · Drizzle ORM · SQLite · Typst · Rust\n\nDétails architecturaux : [`docs/architecture.md`](docs/architecture.md) ·\nSpec refacto sidecar : [`docs/refacto-spec/architecture.md`](docs/refacto-spec/architecture.md) ·\nCatalogue REST : [`docs/refacto-spec/api-endpoints.md`](docs/refacto-spec/api-endpoints.md)\n\nCI : GitHub Actions matrix 3 OS · tauri-apps/tauri-action@v2\n\n---\n\n## Licence\n\n[Business Source License 1.1](LICENSE) · Change Date **2030-04-21** → Apache License 2.0\n\nLa BSL autorise : usage personnel, self-host dans votre organisation, fork, contribution, lecture du code.\nLa BSL interdit pendant 4 ans : revente en SaaS concurrent payant basé sur FAKT.\n\nPour une licence commerciale : contact@alphaluppi.com\n\n---\n\n## Support\n\n- **Issues** : [github.com/AlphaLuppi/FAKT/issues](https://github.com/AlphaLuppi/FAKT/issues)\n- **Discussions** : [github.com/AlphaLuppi/FAKT/discussions](https://github.com/AlphaLuppi/FAKT/discussions)\n- **Email** : contact@alphaluppi.com\n\n---\n\n## Reconnaissance\n\nMerci aux équipes dont les projets rendent FAKT possible :\n- [Tauri](https://tauri.app) — framework desktop Rust + webview\n- [Typst](https://typst.app) — rendu PDF déterministe sans headless Chrome\n- [Anthropic](https://anthropic.com) — Claude Code CLI pour la génération IA\n- [FreeTSA](https://freetsa.org) — horodatage RFC 3161 gratuit\n- [Biome](https://biomejs.dev) — lint et format ultra-rapide\n\n---\n\nFAKT est fait par [AlphaLuppi](https://alphaluppi.com), petite agence tech à Avignon.\nMême pattern que [MnM](https://github.com/AlphaLuppi/mnm) : triple déploiement, open-source, francophone.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphaluppi%2Ffakt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falphaluppi%2Ffakt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphaluppi%2Ffakt/lists"}