# Bigview

> Visualiseur CSV/logs géants pour macOS — ouvre en quelques secondes ce qu'Excel refuse d'ouvrir.

**Statut : v0.1.0 livrable.** Les fonctionnalités décrites ci-dessous sont implémentées et couvertes par la suite de tests automatisés. La release publique doit être produite via le flux signé/notarié décrit dans [RELEASE.md](RELEASE.md).

## Installation

Télécharge le `.dmg` de release : [releases/Bigview-v0.1.0.dmg](releases/Bigview-v0.1.0.dmg) (ou la page **[Releases](https://github.com/lberthod/bigview/releases)** GitHub). Ouvre-le, glisse `Bigview.app` dans `Applications`.

Les builds de développement produits localement par `packaging/macos/build_dmg.sh` sont non signés par défaut. Une release publique doit être signée avec un certificat Developer ID Apple, notariée, puis vérifiée avec Gatekeeper ; voir [RELEASE.md](RELEASE.md).

Configuration requise : macOS 11+ sur Apple Silicon (arm64 natif).

Pour compiler depuis les sources, voir [Développement](#développement) plus bas.

## Support cible

Bigview cible aujourd'hui macOS 11+ sur Apple Silicon. Les dépendances GUI (`egui`/`eframe`/`winit`) restent multiplateformes en grande partie, mais les builds Linux et Windows ne sont pas validés comme artefacts de release. Les chemins critiques de distribution, signature, notarisation et QA concernent macOS.

## En une phrase

Ouvrir un fichier CSV ou log de plusieurs gigaoctets instantanément, et le parcourir/filtrer sans jamais que ça rame ou plante.

## Le problème

Les fichiers de données ont grossi (exports, logs, dumps de plusieurs Go), mais les outils grand public n'ont pas suivi :

- **Excel/Numbers** plafonnent à ~1M lignes et saturent la RAM sur les gros fichiers.
- Les **éditeurs de texte** classiques chargent tout en mémoire et figent.
- Les outils rapides existants (**xsv**, **csview**, **HL**) sont en ligne de commande, pas de GUI native.
- Les solutions **cloud** (Gigasheet) demandent d'uploader des données parfois sensibles.

Personne n'a fait la vraie app GUI native macOS pour ce cas d'usage.

## Positionnement

| | Bigview | Excel/Numbers | CSView 2 | HL / csview | Cloud (Gigasheet) |
|---|---|---|---|---|---|
| Ouvre plusieurs Go | Oui, instant | Non (plante) | Oui (CSV) | Oui (terminal) | Oui (upload) |
| Interface | GUI native mac | GUI | GUI | Terminal | Web |
| CSV et logs | Les deux | CSV | CSV surtout | Logs (HL) / CSV | Variable |
| Local / privé | 100% local | Local | Local | Local | Cloud (upload) |
| Techno | Rust (perf = pitch) | — | Swift | Rust | Cloud |

On ne concurrence pas Excel sur l'édition de tableurs, ni pandas sur l'analyse. On gagne sur une chose précise et douloureuse : **inspecter vite un très gros fichier**.

## Fonctionnalités

Toutes livrées dans l'état produit actuel (voir [sprints.md](sprints.md) pour le détail sprint par sprint) :

### Ouverture & navigation

- Glisser-déposer / ⌘O sur CSV/TSV/log multi-Go, aperçu instantané des ~1000 premières lignes pendant que l'indexation complète tourne en tâche de fond.
- Détection automatique du séparateur, de l'encodage et de la ligne d'en-tête — corrigeable manuellement via **Réinterpréter avec…** si la détection se trompe.
- Table virtualisée : scroll fluide même sur des centaines de millions de lignes, saut direct au début/à la fin (⌘↑/⌘↓) ou à une ligne précise (⌘L).
- Colonnes redimensionnables ; type détecté par colonne (nombre/date/booléen/texte) avec alignement et icône adaptés.
- Cellules géantes (JSON, texte long) : tronquées à l'affichage, cliquables pour voir la valeur complète.

### Recherche, filtre, tri, export

- Recherche plein-texte sur tout le fichier (⌘F, navigation ⌘G/⇧⌘G), filtre "contient" par colonne, tri croissant/décroissant en cliquant sur l'en-tête.
- Copier une ligne sélectionnée (⌘C), exporter la vue filtrée/triée en CSV (⌘E).
- **Requêtes SQL** sur le fichier ouvert (moteur DataFusion, table nommée `data`).
- **Statistiques de colonne** : min/max/moyenne, valeurs distinctes, histogramme des valeurs les plus fréquentes.

### Mode logs

- Détection automatique du format (JSON par ligne / logfmt / texte brut), bascule manuelle Table ↔ Logs.
- Coloration par niveau (ERROR/WARN/INFO/DEBUG/TRACE), filtre par niveau et par plage horaire.
- **Live tail** : suit un fichier de log qui grossit en temps réel, avec filtre ré-appliqué automatiquement et défilement auto optionnel.

### Confort d'usage

- Onglets multi-fichiers (⌘T), fichiers récents mémorisés, fichier d'exemple intégré pour tester sans chercher un fichier.
- Thème clair/sombre (suit le système par défaut), option "réduire les animations", valeurs affichées en police monospace.
- Lecture seule : le fichier source n'est jamais modifié.

### Roadmap (au-delà de v1.0, non planifiée)

Parquet/JSONL/gzip, jointure de deux fichiers, graphiques rapides, profils de parsing enregistrés, diff de fichiers, indexation vraiment incrémentale pour le live tail sur fichiers multi-Go.

## Performance — le cœur du produit

Ici la performance n'est pas un détail technique, c'est la fonctionnalité vendue. Chiffres mesurés sur Apple M4 (voir [architecture.md](architecture.md) pour le détail et les benchs reproductibles dans `crates/engine/examples/`) :

| Métrique | Objectif | Mesuré |
|---|---|---|
| Indexation d'un fichier de 5 Go (108M lignes) | < 3 s | **2,3 à 2,7 s** |
| Fetch d'une fenêtre de lignes (scroll), fichier 5 Go indexé | fluide à 60 fps | **~360 µs** (pire cas) |
| Recherche plein-texte, fichier 20 Go (427M lignes) | rapide | **~7,5 s** (71M correspondances) |
| Filtre par colonne, fichier 20 Go | raisonnable | **~43 s** (61M lignes retenues) |
| Ouverture (mmap) | quasi instantané | **< 1 ms** |

**Comment** : `memmap2` pour les lectures aléatoires (rendu des lignes visibles), `pread` pour les scans séquentiels complets (indexation, recherche — mesuré plus rapide que scanner un mmap froid sur ce matériel), indexation et filtres parallélisés avec `rayon`, parsing paresseux (une cellule n'est découpée que si elle est affichée ou évaluée par un filtre actif).

**Limite connue à grande échelle** : sur un fichier dépassant la RAM disponible (testé à 20 Go sur une machine à 16 Go), l'export d'un grand nombre de lignes triées peut devenir lent (accès disque non séquentiel) — voir architecture.md §10 pour le diagnostic détaillé et la piste de correction.

> « Excel plante. Nous : quelques secondes, même sur 20 Go. »

## Principes de conception

1. **Perf tenue** — l'ouverture instantanée est la promesse ; tout le reste en découle.
2. **Zéro gel / zéro plantage** — l'UI reste vivante quoi qu'il arrive en fond (indexation, recherche, filtre, tri, export, live tail : tout tourne en tâche de fond).
3. **Lecture seule, local, sans friction** — rassurant pour des données sensibles/de prod ; aucune permission système sensible requise.

## Stack technique

- **Langage** : Rust
- **UI** : [egui](https://github.com/emilk/egui)/eframe, table virtualisée via `egui_extras::TableBuilder`
- **Accès fichier** : `memmap2` (lectures aléatoires) + `pread` natif (scans séquentiels)
- **Parallélisme** : `rayon` (indexation, recherche, filtres, tri, export), threads dédiés pour les tâches de fond (`crossbeam-channel`)
- **Recherche** : `memchr`/`bytecount` (SIMD)
- **Logs** : `chrono` (horodatages), `serde_json` (JSON par ligne)
- **SQL** : [DataFusion](https://github.com/apache/datafusion) (moteur de requêtes 100% Rust, exécuté dans un runtime Tokio local à chaque requête)
- **Config persistée** : `serde`/`serde_json`
- **Distribution** : `.dmg` signé (Developer ID Application) et notarié par Apple

## Documents du projet

- [architecture.md](architecture.md) — architecture technique détaillée, décisions et benchmarks
- [sprints.md](sprints.md) — découpage en sprints (0 à 7, MVP → v1.0)

## Développement

```bash
cargo build --workspace          # compiler engine + app + générateur de fichiers de test
cargo test --workspace           # suite de tests engine + app
cargo clippy --workspace --all-targets
cargo run -p bigview-app         # lancer l'app en debug
```

### Vérifications avant merge/release

```bash
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo audit --ignore RUSTSEC-2026-0194 --ignore RUSTSEC-2026-0195
```

Les exceptions `quick-xml` sont documentées dans [SECURITY.md](SECURITY.md) et doivent être réévaluées à chaque mise à jour `eframe/winit`.

### Packaging local (.dmg non signé, pour tester)

```bash
./packaging/macos/build_dmg.sh --unsigned-dev
```

### Release signée + notariée (mainteneurs, manuel)

Nécessite un compte Apple Developer Program, un certificat *Developer ID Application* installé et un profil `notarytool` enregistré dans le trousseau :

```bash
SIGN_IDENTITY="Developer ID Application: <Nom> (<TEAMID>)" \
NOTARY_PROFILE="<profil-notarytool>" \
./packaging/macos/build_dmg.sh
```

Le `.dmg` signé/notarié est produit dans `dist/Bigview.dmg`. Pour le publier, copier le fichier dans `releases/` (suivi par git, voir `.gitignore`) sous un nom versionné, par exemple :

```bash
cp dist/Bigview.dmg releases/Bigview-vX.Y.Z.dmg
git add -f releases/Bigview-vX.Y.Z.dmg
```
