https://github.com/jordan-bourillot/teddy-mail
Calm, sovereign, deeply customizable mail client. React + Tauri + Rust.
https://github.com/jordan-bourillot/teddy-mail
desktop-app email mail-client privacy react rust tauri typescript
Last synced: about 1 month ago
JSON representation
Calm, sovereign, deeply customizable mail client. React + Tauri + Rust.
- Host: GitHub
- URL: https://github.com/jordan-bourillot/teddy-mail
- Owner: Jordan-Bourillot
- License: other
- Created: 2026-05-06T16:22:11.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-05-06T19:31:50.000Z (about 1 month ago)
- Last Synced: 2026-05-06T19:38:28.115Z (about 1 month ago)
- Topics: desktop-app, email, mail-client, privacy, react, rust, tauri, typescript
- Language: TypeScript
- Homepage: https://github.com/Jordan-Bourillot/pite-lafe-mail/releases/latest
- Size: 1.81 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Teddy Mail
Client mail calme, souverain, profondément personnalisable.
> **Statut** : prototype V1, exécution en mode UI seul (mocked data). Le cœur Rust est scaffolded mais pas encore branché à Tauri.
## Pourquoi
- Gmail = puissance + tracking publicitaire.
- Outlook = lourdeur entreprise.
- ProtonMail = chiffrement austère.
- Hey = workflow opinionné, peu personnalisable.
Teddy vise le créneau **personnalisation profonde + plaisir d'usage + souveraineté des données**.
## Stack
| Couche | Choix |
|---|---|
| Shell desktop | Tauri 2 |
| UI | React 19 + TypeScript strict + Tailwind |
| State | Zustand |
| Recherche client | Fuse.js (V1) → SQLite FTS5 (V1.5) |
| Cœur sync | Rust : `async-imap`, `lettre`, `mail-parser` |
| Store | SQLite + SQLCipher |
| Auth | OAuth2 PKCE, keyring OS |
## Démarrage rapide (UI seule, sans backend)
```bash
npm install
npm run dev
```
Ouvre http://localhost:5173. La boîte est peuplée de données fictives : 8 mails, 2 comptes, des traceurs simulés.
## Tests
```bash
npm run test
```
Couvre : classification (smartSort), threading JWZ, recherche DSL, blocage traceurs, snooze, undo send, hotkeys, détection d'engagements.
## Structure
```
teddy_mail/
├── src/
│ ├── App.tsx # Shell 3 colonnes
│ ├── components/ # Sidebar, MailList, MailReader, Composer, CommandPalette, StatusBar, Toast, SettingsPanel, Avatar
│ ├── lib/ # store, smartSort, threading, search, snooze, trackers, themes, hotkeys, undoSend, engagements, mockData
│ ├── styles/index.css # Thèmes, densités, tokens CSS
│ └── types.ts # Types domaine
├── rust-core/
│ ├── Cargo.toml
│ └── src/
│ ├── lib.rs # Erreurs, logging
│ ├── auth.rs # OAuth2 + keyring
│ ├── parser.rs # MIME parsing safe
│ ├── store.rs # SQLite/SQLCipher + FTS5
│ ├── imap_sync.rs # Worker IMAP IDLE
│ ├── smtp.rs # Envoi sortant
│ └── commands.rs # Surface IPC Tauri
├── src-tauri/tauri.conf.json # Config Tauri
├── PROJECT_STATE.md # État courant et reprises
├── BACKLOG.md # Idées hors scope V1
└── README.md
```
## Fonctionnalités V1 implémentées (UI + logique)
- Vue 3 colonnes (sidebar + liste + lecteur).
- Tri intelligent local par catégories (work, personal, notifications, newsletters, promotions).
- Threading JWZ avec fallback sujet.
- Recherche DSL : `from:`, `to:`, `subject:`, `label:`, `is:unread|starred|snoozed`, `has:attachment|trackers|engagement`, `before:`, `after:` + recherche floue Fuse.js.
- Blocage de pixels traceurs et sanitization HTML (DOMPurify).
- Détection d'engagements ("Je t'envoie ça vendredi").
- Snooze avec presets (ce soir, demain, weekend, lundi, semaine, un jour).
- Undo Send (5/10/30s configurable) avec annulation toast.
- Compositeur avec auto-save, alerte pièce jointe oubliée, raccourci Cmd+Entrée.
- Palette de commandes (Cmd+K) avec actions et résultats mêlés.
- 6 thèmes (clair, sombre, sépia, solarized, contraste, nocturne) + densité (compact/cozy/spacious) + taille de police.
- 4 profils clavier (teddy, gmail, outlook, mutt).
- Mode focus.
- Statut bas avec compteurs.
## Fonctionnalités Rust core (skeleton, non encore appelé depuis l'UI)
- Worker IMAP IDLE async par compte avec backoff exponentiel.
- Authentification XOAUTH2 + IMAP simple.
- Store SQLite chiffré (SQLCipher) avec FTS5 et triggers.
- Parser MIME tolérant aux mails malformés.
- Envoi SMTP via lettre.
## Sécurité et vie privée
- Tous les contenus locaux sont chiffrés au repos (SQLCipher, dérivation de clé depuis passphrase ou keyring OS).
- Pixels traceurs détectés et neutralisés au rendu.
- Images distantes bloquées par défaut (configurable : toujours / expéditeurs de confiance / jamais).
- HTML rendu après passage par DOMPurify, scripts/iframes interdits.
- OAuth tokens dans le keyring OS (Credential Manager / Keychain / libsecret).
- Aucun envoi de télémétrie sans opt-in explicite.
## Licence
À définir avant lancement public. Candidat principal : MPL-2.0 (modifiable côté code, copyleft sur le fichier).