# 📚 Public Notes - Documentation
## Vue d'ensemble
La fonctionnalité **Public Notes** permet de partager certaines notes sélectionnées avec le public, sans authentification requise. Ces notes sont converties en HTML côté serveur avec `goldmark` et sont accessibles via des URLs dédiées.
## 🔒 Architecture de sécurité
### Routes publiques (sans authentification)
Les routes suivantes sont **publiques** et **accessibles à tous** :
- `GET /public` - Liste de toutes les notes publiques
- `GET /public/view/{path}` - Affichage d'une note publique en HTML
### Routes protégées (nécessitent authentification en production)
Toutes les autres routes doivent être protégées par authentification :
- `/` - Interface principale de l'application
- `/api/*` - Toutes les API (édition, création, suppression)
- `/api/public/toggle` - Toggle du statut public (création/retrait)
**IMPORTANT** : L'endpoint `/api/public/toggle` doit être protégé car il permet de publier/dépublier des notes.
## 🛡️ Recommandations de sécurité
### Option 1 : Authelia / Authentik (Recommandé)
Utilisez un reverse proxy avec authentification devant Personotes :
```nginx
# Nginx avec Authelia
location /public {
proxy_pass http://localhost:8080;
# Pas d'auth pour /public
}
location / {
proxy_pass http://localhost:8080;
# Rediriger vers Authelia pour authentification
auth_request /authelia;
error_page 401 =302 https://auth.example.com;
}
```
### Option 2 : Basic Auth Nginx
Configuration minimale pour protéger l'édition :
```nginx
location /public {
proxy_pass http://localhost:8080;
}
location / {
proxy_pass http://localhost:8080;
auth_basic "Personotes Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
}
```
### Option 3 : Cloudflare Access / Zero Trust
Utilisez Cloudflare Access pour protéger toutes les routes sauf `/public`.
## 📝 Utilisation
### 1. Publier une note
1. Ouvrez une note dans l'éditeur
2. Cliquez sur le bouton **🔒 Privé**
3. Le bouton devient **🌐 Public** (vert)
4. La note est maintenant visible sur `/public`
**Note** : Le titre et les tags sont automatiquement extraits du front matter.
### 2. Retirer une note du public
1. Ouvrez la note publiée
2. Cliquez sur le bouton **🌐 Public**
3. Le bouton redevient **🔒 Privé**
4. La note n'est plus visible sur `/public`
### 3. Voir les notes publiques
Accédez à : `http://votre-domaine.com/public`
## 🌍 Internationalisation
La fonctionnalité est entièrement internationalisée :
- **Anglais** : Public Notes, Published on, etc.
- **Français** : Notes Publiques, Publié le, etc.
La langue est détectée automatiquement depuis :
1. localStorage (`language` key)
2. Navigateur (navigator.language)
3. Par défaut : Anglais
## 📂 Fichiers techniques
### Backend
- `internal/api/public.go` - Handlers pour les notes publiques
- `notes/.public.json` - Liste des notes publiques (auto-généré)
### Frontend
- `frontend/src/public-toggle.js` - Gestion du bouton Public/Privé
- `templates/public-list.html` - Liste des notes publiques
- `templates/public-view.html` - Vue d'une note publique
### Traductions
- `locales/en.json` - Traductions anglaises (section `public`)
- `locales/fr.json` - Traductions françaises (section `public`)
## 🎨 Rendu HTML
Les notes publiques sont rendues avec **goldmark** (bibliothèque Go) :
- ✅ GitHub Flavored Markdown (GFM)
- ✅ Tables, strikethrough, task lists
- ✅ Syntax highlighting (highlight.js)
- ✅ Typographie intelligente (smart quotes, dashes)
- ✅ Auto-génération des IDs pour les titres
**Avantages** :
- SEO-friendly (HTML pré-rendu)
- Performance optimale (pas de JS requis)
- Sécurité renforcée (rendu côté serveur)
- Cache facile (HTML statique)
## 🔗 URLs et partage
### Structure des URLs
- Liste : `https://votre-domaine.com/public`
- Note : `https://votre-domaine.com/public/view/path/to/note.md`
### Partage sur réseaux sociaux
Pour améliorer le partage, vous pouvez ajouter des meta tags Open Graph dans `templates/public-view.html` :
```html
```
## 🚀 Évolutions futures possibles
- [ ] Export PDF des notes publiques
- [ ] RSS feed des notes publiques
- [ ] Sitemap XML pour SEO
- [ ] Commentaires sur les notes publiques
- [ ] Analytics (pages vues, etc.)
- [ ] Bouton "Partager" avec liens directs
## ❓ FAQ
### Q: Les notes publiques peuvent-elles contenir des liens vers des notes privées ?
**R:** Oui, mais les liens vers des notes privées ne fonctionneront que pour les utilisateurs authentifiés. Pour les visiteurs publics, ils verront une erreur 403.
### Q: Puis-je changer le thème des pages publiques ?
**R:** Oui, modifiez les templates `public-list.html` et `public-view.html`. Ils utilisent les mêmes CSS que l'application principale (`static/theme.css`).
### Q: Comment savoir quelles notes sont publiques ?
**R:** Consultez le fichier `notes/.public.json` ou accédez à `/public` pour voir la liste complète.
### Q: Les images dans les notes publiques fonctionnent-elles ?
**R:** Oui, si les images sont référencées avec des chemins absolus ou des URLs. Les chemins relatifs ne fonctionneront que si les images sont dans `static/`.
### Q: Peut-on avoir plusieurs niveaux d'accès (public, privé, semi-privé) ?
**R:** Actuellement non. Il y a uniquement 2 niveaux : **privé** (nécessite auth) et **public** (accessible à tous). Pour plus de granularité, utilisez un système d'authentification avec rôles (Authelia, Authentik).
## 📞 Support
Pour toute question ou problème :
- GitHub Issues : https://github.com/mathieu/personotes/issues
- Documentation complète : `/docs/USAGE_GUIDE.md`