Ponos - Reseau Social Professionnel
Version 0.3.0 | Reseau social professionnel minimaliste europeen.
Stack Technique
- Frontend: Next.js 16 + React 19 + TypeScript
- Backend: API Routes Next.js
- Base de donnees: PostgreSQL (driver
pg natif, SQL brut)
- Styling: Tailwind CSS
- Authentification: JWT + bcryptjs + cookies HttpOnly
- Architecture: Hexagonale (Ports & Adapters)
- Tests: pytest (API) + Playwright (E2E) + Vitest (unitaires)
Fonctionnalites
Publications
- Posts limites a 140 caracteres (URLs comptees comme 20 caracteres)
- Edition des posts (fenetre de 5 minutes)
- Citations de posts
- Hashtags cliquables (#Tech, #Dev)
- Mentions d'utilisateurs (@nom)
- Filtres du feed : Mon reseau / Tout le flux / Mentions
Social
- Connexions entre utilisateurs (demandes avec message optionnel)
- Le message de demande devient le premier message de conversation
- Chat en temps reel (SSE) avec messages expires apres 3 mois
- Abonnements aux utilisateurs et hashtags
- Suggestions et questions a l'equipe
Profils
- Profil public avec slug personnalise
- Avatar (upload/suppression)
- Experiences professionnelles
- Liens externes (pointers)
- Visibilite configurable
- Flux RSS personnel
Federation
- Crossposting vers Mastodon
- Crossposting vers Bluesky
Connecteurs d'emploi
- France Travail (offres d'emploi France)
- FOREM (offres d'emploi Belgique)
- BOAMP (marches publics)
Autres
- Internationalisation (11 langues, incluant les emails)
- Suppression de compte RGPD
- Mode maintenance
- Panel d'administration
Installation
Prerequis
Etapes
# 1. Cloner et installer
npm install
# 2. Configurer l'environnement
cp .env.example .env
# Editer .env avec vos valeurs
# 3. Generer le secret JWT
openssl rand -base64 32
# Copier dans NEXTAUTH_SECRET
# 4. Initialiser la base de donnees (migrations SQL, dans l'ordre)
for f in migrations-sql/migrations/*/migration.sql; do psql "$DATABASE_URL" -f "$f"; done
# 5. (Optionnel) Charger les donnees de test
npm run db:reset
# 6. Lancer le serveur
npm run dev
Le site sera accessible sur http://localhost:3000
Commandes
Developpement
| Commande |
Description |
npm run dev |
Serveur de developpement (Turbopack) |
npm run build |
Build production (webpack) |
npm run start |
Demarrer en production |
npm run db:reset |
Reset + seed base de donnees |
psql $DATABASE_URL |
Acces direct a la base |
Tests
| Commande |
Description |
npm run agents:test |
Tests API (pytest) |
npm run test:e2e |
Tests E2E (Playwright) |
npm run test:unit |
Tests unitaires (Vitest) |
Agents de qualite
| Commande |
Description |
npm run agents |
Tous les agents |
npm run agents:security |
Audit securite (18 categories) |
npm run agents:pentest |
Tests de penetration |
npm run agents:test |
Tests automatiques (pytest) |
npm run agents:perf |
Performance |
npm run agents:a11y |
Accessibilite WCAG |
npm run agents:i18n |
Verification traductions |
npm run agents:charte |
Charte graphique |
npm run agents:hardcode |
Detection valeurs hardcodees |
npm run agents:optimize |
Optimisation code |
npm run agents:loadtest |
Tests de charge (k6) |
npm run agents:changelog |
Maintenance journal de bord |
npm run agents:message-cleanup |
Nettoyage messages expires |
Maintenance
| Commande |
Description |
npm run maintenance:on |
Activer mode maintenance |
npm run maintenance:off |
Desactiver mode maintenance |
npm run maintenance:attack |
Mode securite (attaque) |
Connecteurs (cron)
| Commande |
Description |
npm run cron:france-travail |
Publier une offre France Travail |
npm run cron:forem |
Publier une offre FOREM |
npm run cron:boamp |
Publier un marche public |
npm run cron:update-keywords |
Mettre a jour les mots-cles |
Structure du projet
ponos/
├── app/ # Pages et API Routes Next.js
│ ├── api/ # API endpoints
│ │ ├── auth/ # Authentification
│ │ ├── admin/ # Administration
│ │ ├── private/ # Routes authentifiees
│ │ └── public/ # Routes publiques
│ ├── feed/ # Page du feed
│ ├── chat/ # Messagerie
│ ├── admin/ # Panel admin
│ └── ...
├── src/ # Architecture hexagonale
│ ├── domain/ # Coeur metier
│ │ ├── models/ # Entites
│ │ ├── services/ # Services de domaine
│ │ └── ports/ # Interfaces (contracts)
│ ├── application/ # Cas d'utilisation
│ └── infrastructure/ # Implementations
├── lib/ # Utilitaires
│ ├── config.ts # Configuration centralisee
│ ├── db.ts # Pool PostgreSQL (pg)
│ ├── auth.ts # Authentification
│ ├── validations.ts # Schemas Zod
│ ├── rate-limit.ts # Rate limiting
│ ├── email.ts # Envoi d'emails
│ └── i18n-server.ts # Traductions serveur
├── components/ # Composants React
├── locales/ # Fichiers i18n (11 langues)
├── agents/ # Agents de qualite
├── tests/ # Tests API (pytest)
├── e2e/ # Tests E2E (Playwright)
├── loadtests/ # Tests de charge (k6)
├── connecteurs/ # Connecteurs emploi
├── migrations-sql/ # Schema et seeds
└── docs/ # Documentation
API Endpoints (principales)
Authentification
POST /api/auth/register - Inscription
POST /api/auth/login - Connexion
POST /api/auth/logout - Deconnexion
POST /api/auth/forgot-password - Demander reset mot de passe
POST /api/auth/reset-password - Reinitialiser mot de passe
DELETE /api/account - Supprimer son compte (RGPD)
Posts
GET /api/posts - Liste des posts (pagination, filtres)
POST /api/private/posts - Creer un post
PUT /api/private/posts/[id] - Modifier un post
DELETE /api/private/posts/[id] - Supprimer un post
Connexions
GET /api/private/connections - Mes connexions
POST /api/private/connections - Demander une connexion
POST /api/private/connections/accept - Accepter
DELETE /api/private/connections - Supprimer
Chat
GET /api/chat/conversations - Mes conversations
POST /api/chat/conversations/[id]/messages - Envoyer un message
GET /api/chat/sse - Flux temps reel (SSE)
Profil
GET /api/public/profiles/[userId] - Profil public
PUT /api/private/profile - Modifier son profil
POST /api/avatar - Upload avatar
Configuration
Toutes les valeurs sont centralisees dans lib/config.ts :
| Parametre |
Valeur |
Description |
post.maxLength |
140 |
Caracteres max par post |
post.editWindowMinutes |
5 |
Fenetre d'edition |
post.urlFixedLength |
20 |
Comptage URLs |
message.maxLength |
2000 |
Caracteres max par message |
message.expirationMonths |
3 |
Expiration messages |
pagination.postsPerPage |
20 |
Posts par page |
Securite
- Validation Zod : Toutes les entrees API validees
- Rate Limiting : Protection contre les abus
- Protection CSRF : Verification origine des requetes
- Cookies HttpOnly : Sessions non accessibles via JS
- Headers de securite : X-Frame-Options, CSP, etc.
- Hachage bcrypt : 12 rounds
- Honeypot : Protection anti-bot inscription
Documentation
Licence
Ce projet est distribue sous licence GNU AGPL v3.