{"id":43432672,"url":"https://github.com/raphplt/quori","last_synced_at":"2026-02-02T19:29:54.794Z","repository":{"id":303072102,"uuid":"1014003307","full_name":"raphplt/quori","owner":"raphplt","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-02T22:31:05.000Z","size":10154,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-02T23:31:16.317Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.quori.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raphplt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-04T21:20:31.000Z","updated_at":"2025-08-02T22:31:08.000Z","dependencies_parsed_at":"2025-07-19T16:07:28.219Z","dependency_job_id":"aef2f339-da25-48a5-b8e8-aea85464e01a","html_url":"https://github.com/raphplt/quori","commit_stats":null,"previous_names":["raphplt/quori"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/raphplt/quori","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphplt%2Fquori","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphplt%2Fquori/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphplt%2Fquori/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphplt%2Fquori/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raphplt","download_url":"https://codeload.github.com/raphplt/quori/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphplt%2Fquori/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29017965,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T18:51:31.335Z","status":"ssl_error","status_checked_at":"2026-02-02T18:49:20.777Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-02T19:29:54.725Z","updated_at":"2026-02-02T19:29:54.788Z","avatar_url":"https://github.com/raphplt.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quori\n\n**Quori** convertit automatiquement vos commits \u0026 pull-requests GitHub/GitLab\nen posts LinkedIn prêts à publier.\n\n## Monorepo\n\n| Path        | Stack                        | Rôle                       |\n| ----------- | ---------------------------- | -------------------------- |\n| apps/web    | Next 15, Tailwind, shadcn/ui | Interface utilisateur      |\n| apps/api    | NestJS 10, TypeORM, Redis    | API REST + Webhooks GitHub |\n| apps/docs   | Next static export           | Documentation publique     |\n| packages/\\* | Core logic, UI, configs      | Code partagé               |\n\n## Démarrage rapide\n\n```bash\nnpm install        # à la racine\nnpm run dev        # lance l'application\n```\n\n### Tester les webhooks GitHub\n\nConfigurez l'URL `https://\u003csous-domaine\u003e.loca.lt/github/events` dans les\nparamètres de votre GitHub App puis installez l'app depuis le dashboard.\n\n## Architecture\n\n### Frontend (apps/web)\n\n- **Next.js 15** avec App Router et React Server Components\n- **Tailwind CSS v4** pour le styling\n- **shadcn/ui** pour les composants\n- **Zustand** pour la gestion d'état\n- **React Query** pour la gestion des données\n- **React Hook Form + Zod** pour les formulaires\n- **Framer Motion** pour les animations\n\n### Backend (apps/api)\n\n- **NestJS 10** avec TypeScript strict\n- **TypeORM** avec PostgreSQL\n- **Redis** pour le cache et les queues\n- **Passport** pour l'authentification\n- **Swagger** pour la documentation API\n- **BullMQ** pour les tâches asynchrones\n\n## Scripts disponibles\n\n```bash\n# Développement\nnpm run dev:web     # Lance le frontend Next.js\nnpm run dev:api     # Lance l'API NestJS en mode watch\n\n# Build \u0026 Test\nnpm run build       # Build tous les projets\nnpm run lint        # Lint tous les projets\nnpm run test        # Test tous les projets\nnpm run check-types # Vérification TypeScript\n\n# Format\nnpm run format      # Format avec Prettier\n```\n\n## Configuration\n\n### Variables d'environnement\n\n**apps/api/.env**\n\n```bash\n# Database\nDATABASE_URL=\"postgresql://user:password@localhost:5432/quori\"\n\n# Redis\nREDIS_URL=\"redis://localhost:6379\"\n\n# GitHub\nGITHUB_APP_ID=\"your_github_app_id\"\nGITHUB_CLIENT_ID=\"your_github_client_id\"\nGITHUB_CLIENT_SECRET=\"your_github_client_secret\"\nGITHUB_WEBHOOK_SECRET=\"your_webhook_secret\"\n\n# OpenAI\nOPENAI_API_KEY=\"sk-...\"\nGENERATE_PROMPT=\"...\"\nGENERATE_REPOSITORY_PROMPT=\"...\"\n\n# Sessions \u0026 Encryption\nSESSION_SECRET=\"your-session-secret-key\"\nENCRYPTION_KEY=\"change-me\"\n```\n\n**apps/web/.env.local**\n```bash\nNEXT_PUBLIC_API_URL=\"http://localhost:3001\"\nNEXTAUTH_URL=\"http://localhost:3000\"\nNEXTAUTH_SECRET=\"your_nextauth_secret\"\nGITHUB_APP_ID=\"your_github_app_id\"\nGITHUB_CLIENT_ID=\"your_github_client_id\"\nGITHUB_CLIENT_SECRET=\"your_github_client_secret\"\n```\n\n## API Quota\n\nDeux routes sont disponibles pour suivre la consommation d'appels OpenAI :\n\n```http\nPOST /api/generate\nGET  /api/quota\n```\n\n- `POST /api/generate` : génère un contenu et consomme 1 quota. Authentification JWT requise.\n- `GET /api/quota` : retourne l'utilisation courante `{ used: number, remaining: number }`.\n- `GET /api/templates` : liste les templates de style disponibles.\n\nLa limite est fixée à **5 requêtes par utilisateur et par jour**. Au-delà, l'API renvoie `429 Quota journalier dépassé`.\n\nPour ajouter un nouveau template global, insérez un enregistrement dans la table `templates` (nom, description, promptModifier). Les templates rattachés à une installation doivent renseigner la colonne `installation_id`.\n\n## Configuration LinkedIn\n\nDéfinissez les variables d'environnement suivantes dans `apps/api/.env` pour activer la connexion LinkedIn :\n\n```\nLINKEDIN_CLIENT_ID=\u003cvotre id\u003e\nLINKEDIN_CLIENT_SECRET=\u003cvotre secret\u003e\nLINKEDIN_REDIRECT_URI=http://localhost:3001/api/auth/linkedin/callback\n```\n\n## Workflow de développement\n\n1. **Webhook GitHub** reçoit push/PR → parse les changements\n2. **Queue BullMQ** traite les événements de manière asynchrone\n3. **OpenAI GPT-4** génère le post LinkedIn en français\n4. **Frontend** affiche les posts avec options d'édition\n5. **Utilisateur** copie/colle ou publie directement\n\n## Roadmap (30 jours)\n\n### Week 1: Foundation\n\n- [x] Setup monorepo with Turbo\n- [x] NestJS API with Prisma\n- [x] Next.js frontend with Tailwind\n- [ ] GitHub webhook endpoint\n- [ ] Basic authentication\n\n### Week 2: Core Features\n\n- [ ] Git event parsing logic\n- [ ] OpenAI integration for post generation\n- [ ] Basic UI for post management\n- [ ] Redis queues for async processing\n\n### Week 3: Polish\n\n- [ ] Post editing interface\n- [ ] LinkedIn formatting preview\n- [ ] Error handling \u0026 monitoring\n- [ ] Basic analytics\n\n### Week 4: Launch\n\n- [ ] Stripe integration (freemium model)\n- [ ] Production deployment\n- [ ] Documentation complète\n- [ ] Beta testing\n\n## Contributing\n\n```bash\n# Clone\ngit clone \u003crepo-url\u003e\ncd quori\n\n# Install\nnpm install\n\n# Setup databases (local development)\ndocker-compose up -d  # PostgreSQL + Redis\n\n# Run migrations\ncd apps/api\nnpx prisma migrate dev\n\n# Start development\nnpm run dev:api    # Terminal 1\nnpm run dev:web    # Terminal 2\n```\n\n## Tech Stack\n\n### Frontend\n\n- **Framework**: Next.js 15 (App Router)\n- **Styling**: Tailwind CSS v4\n- **Components**: shadcn/ui, Radix UI\n- **State**: Zustand + React Query\n- **Forms**: React Hook Form + Zod\n- **Animation**: Framer Motion\n- **Auth**: NextAuth.js (future)\n\n### Backend\n\n- **Framework**: NestJS 10\n- **Database**: PostgreSQL + Prisma\n- **Cache**: Redis + BullMQ\n- **Auth**: Passport.js (JWT + OAuth)\n- **API Docs**: Swagger/OpenAPI\n- **Validation**: class-validator\n\n### DevOps\n\n- **Monorepo**: Turborepo\n- **Package Manager**: npm workspaces\n- **Linting**: ESLint + Prettier\n- **Git Hooks**: Husky + lint-staged\n- **CI/CD**: GitHub Actions\n- **Deployment**: Vercel (frontend) + Railway (backend)\n\n## License\n\nMIT © Quori Team\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraphplt%2Fquori","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraphplt%2Fquori","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraphplt%2Fquori/lists"}