SaaS simple pour fixer des objectifs, les découper en tâches (todo list) et les suivre dans un calendrier synchronisé avec Google Calendar. UX pensée mobile et desktop : barre d'onglets en bas sur mobile, barre latérale sur desktop.
- 🎯 Objectifs : titre, description, couleur, échéance, progression calculée à partir des tâches (barre de progression).
- ✅ Todo list : tâches rapides, rattachables à un objectif, avec ou sans date.
- 📅 Calendrier mensuel : les tâches datées apparaissent sur leurs jours ; un tap sur un jour ouvre la liste filtrée pour ajouter/cocher.
- 🔄 Synchro Google Calendar : chaque tâche datée devient un événement « journée entière » dans le calendrier principal (création, mise à jour, suppression, ✓ quand terminée). Synchro automatique à la création + bouton « Synchro Google » pour tout repousser.
- 📱 Mobile-first : navigation par onglets, safe-area iOS, cibles tactiles généreuses ; layout desktop avec sidebar.
- Next.js 16 (App Router, Server Actions, React 19)
- Auth.js (NextAuth v5) — connexion Google OAuth
- Prisma — PostgreSQL (migrations versionnées)
- Tailwind CSS v4
- Google Calendar API (REST, sans SDK)
cp .env.example .env # puis remplir les valeurs (voir ci-dessous)
npm install
# Lancer un PostgreSQL local, par exemple :
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=day postgres:16
npx prisma migrate deploy # applique les migrations
npm run dev # http://localhost:3000- Créez un projet sur Google Cloud Console.
- Activez l'API Google Calendar API.
- Écran de consentement OAuth : ajoutez les scopes
openid,email,profileethttps://www.googleapis.com/auth/calendar.events. - Créez un identifiant OAuth 2.0 Client ID (application Web) avec l'URI de
redirection
http://localhost:3000/api/auth/callback/google. - Renseignez
AUTH_GOOGLE_IDetAUTH_GOOGLE_SECRETdans.env, et générezAUTH_SECRETavecnpx auth secret.
- Base : projet Vercel → Storage → Create Database → Neon (Postgres) ;
DATABASE_URLest injectée automatiquement. - Variables d'env Vercel (Production) :
AUTH_SECRET,AUTH_GOOGLE_ID,AUTH_GOOGLE_SECRET. - Ajoutez l'URI de redirection de prod dans Google Cloud Console :
https://<domaine>/api/auth/callback/google. - Les migrations Prisma sont appliquées automatiquement pendant le build
Vercel (script
vercel-build:prisma migrate deployavantnext build). Elles tournent sur l'infra Vercel car laDATABASE_URLcréée via Storage est marquée « Sensitive » et n'est déchiffrable que là-bas.
src/
auth.ts # Config Auth.js (Google + scope Calendar)
lib/
prisma.ts # Client Prisma singleton
actions.ts # Server Actions (CRUD objectifs/tâches, synchro)
google-calendar.ts # Synchro Google Calendar (refresh token, upsert/delete)
queries.ts # Helpers de requêtes/sérialisation
app/
page.tsx # Landing + connexion Google
app/ # Espace connecté (guard dans layout.tsx)
page.tsx # Aujourd'hui : tâches du jour, retards, objectifs
goals/ # Liste + détail d'objectif
todos/ # Todo list complète (filtrable par date)
calendar/ # Vue mensuelle
components/ # UI (nav, tâches, formulaires, progression)
prisma/schema.prisma # User/Account/Session + Goal + Task
La synchro calendrier est best effort : si Google est indisponible ou le token expiré, l'app reste pleinement utilisable ; le bouton « Synchro Google » rattrape le retard.
Le workflow ci.yml tourne sur chaque PR et sur
main :
| Job | Contenu |
|---|---|
| Build | npm run build (Prisma generate + Next build + type-check) |
| Tests unitaires | Vitest — npm test (tests/unit/) |
| Sécurité | npm audit (deps prod, high+) + scan de secrets gitleaks |
| Tests e2e | Playwright (Chromium, projets desktop + mobile, tests/e2e/) |
| Deploy | Uniquement sur push main, après succès des 4 jobs — déploie sur Vercel |
Commandes locales : npm test (unitaires) et npm run test:e2e (e2e ;
nécessite un npm run build préalable).
Le job deploy utilise Vercel. Configurez ces secrets GitHub (Settings → Secrets and variables → Actions) :
VERCEL_TOKEN— token d'accès VercelVERCEL_ORG_IDetVERCEL_PROJECT_ID— depuis.vercel/project.jsonaprèsvercel link
Sans VERCEL_TOKEN, le job se termine en succès avec un avertissement (aucun
déploiement) — utile tant que l'hébergement n'est pas choisi.