14 KiB
14 KiB
Analyse et Améliorations - ShaarIt
📋 Résumé de l'Analyse du Projet
Architecture Actuelle
ShaarIt est un client Android moderne pour Shaarli développé avec les meilleures pratiques Android :
graph TB
subgraph "Présentation [Jetpack Compose]"
A[FeedScreen] --> B[AddLinkScreen]
A --> C[EditLinkScreen]
A --> D[TagsScreen]
E[LoginScreen] --> A
end
subgraph "Domaine [Clean Architecture]"
F[LinkRepository]
G[AuthRepository]
H[UseCases]
end
subgraph "Data [API + Local]"
I[ShaarliApi - Retrofit]
J[LinkPagingSource]
K[TokenManager - Crypto]
end
A --> F
F --> I
I --> L[(Shaarli Server)]
Stack Technique
| Couche | Technologie |
|---|---|
| Langage | Kotlin 1.9.20 |
| UI | Jetpack Compose + Material Design 3 |
| Architecture | Clean Architecture + MVVM |
| DI | Dagger Hilt 2.48 |
| Réseau | Retrofit 2.9 + Moshi + OkHttp |
| Pagination | Paging 3 |
| Stockage | EncryptedSharedPreferences |
| Async | Coroutines & Flow |
Fonctionnalités Existantes
- Authentification sécurisée - JWT avec stockage chiffré
- Gestion des liens - CRUD complet avec pagination infinie
- Recherche avancée - Par termes et filtres multi-tags
- Intégration système - Share Intent Android
- UI premium - Thème sombre avec glassmorphism
- Détection de doublons - Alertes lors de l'ajout
- Modes d'affichage - Liste, grille, compact
🚀 Propositions d'Améliorations
1. Gestion des Notes Markdown Natif
Problème actuel : Shaarli supporte les notes markdown mais l'app ne les affiche pas de manière enrichie.
Améliorations proposées :
| Fonctionnalité | Description | Priorité |
|---|---|---|
| Éditeur Markdown WYSIWYG | Éditeur visuel avec preview temps réel | Haute |
| Rendu Markdown enrichi | Support complet : tableaux, math (KaTeX), diagrammes Mermaid | Haute |
| Mode lecture focus | Vue distraction-free pour lire les longues notes | Moyenne |
| Export PDF/HTML | Générer des documents depuis les notes | Moyenne |
| Templates de notes | Templates pré-définis (meeting, todo, journal) | Basse |
Implementation suggérée :
// Nouveau composant
@Composable
fun MarkdownEditor(
value: String,
onValueChange: (String) -> Unit,
mode: EditorMode = EditorMode.SPLIT // EDIT, PREVIEW, SPLIT
)
2. Système de Collections/Workspaces
Concept : Organiser les liens en collections thématiques au-delà des simples tags.
Fonctionnalités :
- Collections intelligentes : Requêtes sauvegardées (ex: "tag:work AND tag:urgent")
- Workspaces contextuels : Séparer vie pro/perso/projets
- Collections partagées : Synchroniser certaines collections avec d'autres utilisateurs Shaarli
- Collection aléatoire : "Lire plus tard" avec sélection aléatoire
UI proposée :
┌─────────────────────────────────────┐
│ 📁 Mes Collections │
├─────────────────────────────────────┤
│ 💼 Work [42 items] ▸ │
│ 🏠 Personal [128 items] ▸ │
│ 📚 Reading [15 unread] ▸ │
│ ⭐ Favorites [23 items] ▸ │
│ 🔥 Hot Today [Auto] ▸ │
└─────────────────────────────────────┘
3. Intelligence et Automatisation
3.1 Extraction Métadonnées Intelligente
// Service d'enrichissement automatique
interface LinkEnrichmentService {
suspend fun enrich(url: String): EnrichedMetadata
}
data class EnrichedMetadata(
val title: String,
val description: String,
val thumbnailUrl: String?,
val siteName: String?,
val readingTime: Int?, // minutes estimées
val contentType: ContentType, // ARTICLE, VIDEO, PODCAST, PAPER
val suggestedTags: List<String>, // ML-based suggestions
val summary: String? // Auto-résumé avec AI locale
)
Fonctionnalités :
- Détection automatique du type de contenu (article, vidéo, papier scientifique)
- Extraction de thumbnail et preview visuelle
- Suggestion de tags basée sur le contenu analysé
- Estimation du temps de lecture
- Résumé automatique via modèle ML local (Gemini Nano, ML Kit)
3.2 Rappels et Suivi de Lecture
| Feature | Description |
|---|---|
| Read Later avancé | Rappels programmables ("Relire dans 3 jours") |
| Suivi de progression | Marquer comme "en cours de lecture" |
| ** streaks de lecture** | Gamification pour lire les liens sauvegardés |
| Archivage automatique : | Déplacer les vieux liens non lus après X jours |
4. Recherche et Découverte Avancées
4.1 Moteur de Recherche Full-Text
Améliorations :
- Recherche sémantique : Trouver des liens par concept, pas juste par mots-clés
- Filtres temporels : "Cette semaine", "Le mois dernier", "Avant 2023"
- Recherche dans le contenu : Indexer le contenu des pages web (via service externe ou Poche/Readwise)
- Historique de recherche : Suggestions basées sur les recherches passées
- Recherches sauvegardées : Alertes sur nouveaux liens correspondant
4.2 Visualisations et Analytics
graph LR
A[Dashboard Analytics] --> B[Graphique d'activité]
A --> C[Tag cloud interactive]
A --> D[Tendances temporelles]
A --> E[Sources les plus sauvegardées]
A --> F[Réseau de connexions entre liens]
Idées de visualisations :
- Timeline visuelle des ajouts
- Graph de relations entre tags
- Carte des domaines les plus sauvegardés
- Statistiques d'utilisation hebdomadaires/mensuelles
5. Synchronisation et Offline-First
5.1 Architecture Offline
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ UI Layer │────▶│ Repository │────▶│ Room DB │
│ Compose │ │ SyncEngine │ │ Local Cache │
└──────────────┘ └──────┬───────┘ └──────────────┘
│
▼
┌──────────────┐
│ Shaarli API │
│ REST API │
└──────────────┘
Fonctionnalités :
- Cache local Room : Accès instantané aux liens même hors-ligne
- File d'attente de sync : Ajouter/modifier hors-ligne, synchroniser automatiquement
- Résolution de conflits : UI pour gérer les conflits de modification
- Sync sélective : Choisir quelles collections synchroniser
- Compression des données : Sync delta pour économiser la bande passante
5.2 Multi-Instance Support
| Feature | Description |
|---|---|
| Multi-comptes | Gérer plusieurs instances Shaarli (perso, travail, projet) |
| Switch rapide | Changer de compte en 1 tap |
| Vue unifiée | Voir tous les liens de toutes les instances (optionnel) |
| Migration d'instance | Transférer des liens entre instances |
6. Intégrations et API
6.1 Services Tierces
interface ThirdPartyIntegration {
// Pocket/Instapaper - Import/export
// Raindrop.io - Sync bidirectionnel
// Notion - Export vers base de données
// Obsidian - Export markdown avec liens
// Readwise - Envoi vers Reader
}
Intégrations souhaitées :
- Import/Export : Pocket, Delicious, Browser bookmarks (HTML)
- Sync bidirectionnelle : Raindrop.io, Pinboard
- Export vers : Notion, Obsidian, Logseq
- Services de lecture : Envoi vers Kindle, Readwise Reader
- Webhook personnalisés : Déclencher des actions IFTTT/Zapier
6.2 Widgets et Shortcuts
| Type | Fonctionnalité |
|---|---|
| Home Widget | Derniers liens ajoutés, quick-add, aléatoire |
| Quick Settings Tile | Ajouter le presse-papiers en 1 tap |
| App Shortcuts | "Ajouter lien", "Rechercher", "Aléatoire" |
| Wear OS | Vue minimaliste, voice input pour ajout rapide |
7. Personnalisation et Accessibilité
7.1 Thèmes et Apparence
- Thèmes dynamiques : Material You (Monet) sur Android 12+
- Mode OLED pur : Noir véritable pour économiser batterie
- Taille de texte adaptable : Accessibilité améliorée
- Police personnalisable : Serif pour lecture longue, monospace pour code
- Animations réduites : Mode accessibilité
7.2 Gestion des Données
| Feature | Description |
|---|---|
| Backup cloud | Export chiffré vers Google Drive/Dropbox |
| Export JSON/XML | Sauvegarde complète avec métadonnées |
| Historique des modifications | Versioning des liens modifiés |
| Corbeille | Restauration des liens supprimés (30 jours) |
8. Fonctionnalités Avancées de Contenu
8.1 Support Média Étendu
sealed class LinkContent {
data class Article(val url: String, val content: String)
data class Video(
val platform: VideoPlatform, // YOUTUBE, VIMEO, PEERTUBE
val duration: Duration?,
val transcriptUrl: String?
)
data class Podcast(
val episodeInfo: EpisodeInfo,
val audioUrl: String
)
data class ScientificPaper(
val doi: String?,
val authors: List<String>,
val abstract: String,
val pdfUrl: String?
)
}
Fonctionnalités :
- Lecteur intégré vidéo : Mini-player pour vidéos YouTube
- Extraction PDF : Viewer intégré pour les PDF sauvegardés
- Podcast player : Lecture directe avec bookmarks temporels
- Galerie d'images : Vue grille pour liens image (Pinterest-style)
8.2 Collaboration et Partage
| Feature | Description |
|---|---|
| Liens publics | Générer une URL publique pour un lien privé |
| Commentaires | Annoter les liens avec notes personnelles |
| Partage sécurisé : | Expiration des liens partagés |
| Collaboration : | Partager une collection avec édition |
9. Sécurité et Confidentialité
9.1 Fonctionnalités de Sécurité
- Verrouillage biométrique : FaceID/Fingerprint pour accès
- Mode privé : Section chiffrée séparée pour liens sensibles
- Session management : Historique des connexions, révocation à distance
- Audit log : Historique de toutes les actions
9.2 Confidentialité
| Feature | Description |
|---|---|
| Anonymisation | Masquer les métadonnées d'origine |
| Proxy intégré | Prévisualisation sans révéler l'IP |
| Auto-expiration | Suppression automatique après durée définie |
| Zero-knowledge | Chiffrement client-side des descriptions |
10. Roadmap Priorisée
gantt
title Roadmap ShaarIt - Améliorations
dateFormat YYYY-MM
section Phase 1 - Fondations
Room Database (Offline) :done, p1_1, 2026-02, 4w
Markdown Rendering :active, p1_2, 2026-02, 3w
Amélioration Recherche :p1_3, 2026-03, 3w
section Phase 2 - Intelligence
Métadonnées Auto-Extract :p2_1, 2026-04, 4w
Suggestions Tags ML :p2_2, after p2_1, 3w
Collections/Workspaces :p2_3, 2026-05, 4w
section Phase 3 - Intégrations
Widgets & Shortcuts :p3_1, 2026-06, 2w
Import/Export Services :p3_2, 2026-06, 4w
Multi-Instance Support :p3_3, 2026-07, 3w
section Phase 4 - Avancé
Sync Bidirectionnelle :p4_1, 2026-08, 4w
Analytics Dashboard :p4_2, 2026-09, 3w
Wear OS App :p4_3, 2026-10, 4w
💡 Recommandations Immédiates
Top 5 Priorités (Quick Wins)
- Éditeur Markdown Rich - Impact utilisateur élevé, effort moyen
- Base de données Room - Fondation pour offline et performances
- Widgets Android - Visibilité app et accessibilité rapide
- Extraction métadonnées - Auto-complétion intelligente des liens
- Mode lecture focus - Amélioration UX majeure pour les notes
Architecture Proposée pour Room
@Entity(tableName = "links")
data class CachedLink(
@PrimaryKey val id: Int,
val url: String,
val title: String,
val description: String,
val tags: List<String>,
val isPrivate: Boolean,
val createdAt: Long,
val updatedAt: Long,
val syncStatus: SyncStatus // SYNCED, PENDING_CREATE, PENDING_UPDATE, PENDING_DELETE
)
@Entity(tableName = "link_content")
data class LinkContentEntity(
@PrimaryKey val linkId: Int,
val thumbnailUrl: String?,
val readingTime: Int?,
val contentType: String,
val cachedHtml: String?, // Pour offline reading
val extractedText: String? // Pour recherche full-text
)
📊 Synthèse
Forces Actuelles
- Architecture moderne et maintenable
- UI premium avec Material Design 3
- Sécurité robuste (chiffrement, JWT)
- Intégration système Android native
Opportunités d'Amélioration
- Offline-first : Sync robuste avec gestion de conflits
- Markdown natif : Exploiter pleinement le support Shaarli
- Intelligence : ML local pour suggestions et enrichissement
- Écosystème : Intégrations avec outils de productivité
- Accessibilité : Widgets, raccourcis, multi-plateformes
Impact Utilisateur Attendu
Avec ces améliorations, ShaarIt deviendrait :
- Le meilleur client Android pour Shaarli
- Un outil de productivité complet (pas juste un bookmark manager)
- Une alternative viable à Pocket, Raindrop.io, Notion Web Clipper
Document créé le 28 janvier 2026 Analyse basée sur le code source ShaarIt v1.0