Draft reminder email: email organizers once about a draft they haven't published
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- postgresql, typescript
- Área
- backend, database, documentation
Línea de trabajo
Start with src/lib/draft-nudge.ts and src/jobs/due-rules.ts, then inspect the referenced #532 diff and its database tests on claude/issue-506-draft-email. Check the migration numbering against main and follow the listed job, email, unsubscribe, privacy, telemetry, help, and CLAUDE.md entry points. Done when the eligibility cases, one-send behavior, template rendering, legal wording, and listed checks all pass.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Why
Nothing brings an organizer back to a draft they didn't finish. #532 built an email for this, but it sat on top of the review-page stack, which is closed while the draft → publish → share flow is redesigned (#498). The automatic email doesn't depend on that design, so it can ship on its own.
What to do
Rebuild #532's email as a new PR from main. The code is on the branch claude/issue-506-draft-email, and #532's diff shows only the email.
Bring over:
- The scheduled email. It goes out 3 hours after a draft is started (
DRAFT_NUDGE_DELAY_HOURSinsrc/lib/draft-nudge.ts), and only while the signup is still an undeleted draft, has a slot filled in, and its organizer can still edit it. Drafts started more than 48 hours ago get none, so the first deploy doesn't email every old draft. - Not for drafts an AI connector created. The assistant already gives the organizer the links.
- Jobs.
draft-nudges.dispatch(a scan every 10 minutes) anddraft-nudges.send(one job per due draft, which checks every rule again first). Adraft.nudge_sentactivity row stops a second send. The shared "which rules failed" SQL issrc/jobs/due-rules.ts. - The template and subject ("Ready to publish: {title}"), in
src/email/subjects.ts. - Turning it off. Each email has a link and
List-Unsubscribeheaders. The link opens/unsubscribe/drafts, which asks first and can turn the emails back on. One-click unsubscribe posts toPOST /api/public/draft-email-optout. Both are token-checked and rate-limited per IP. The setting is one column,organizers.draft_emails_opted_out_at. Its migration needs a new number after main's latest. - Docs. The privacy page (bump "Last updated"),
docs/telemetry.md, the help page line, and the jobs section of CLAUDE.md. pnpm drafts:due, likepnpm reminders:due.
Leave for the redesign (#498, #506):
- "Not yet. Email me a link to finish later". It was a button on the review page.
Changes from #532:
- The main button. "Check it and publish" opened the review page. On main,
/app/signups/[id]opens the Build tab, so the button should say something that fits, such as "Finish and publish". - The "So far" line. "12 slots · 3 days · 3 people each" used the review page's headline helper (
signupHeadline, from #528). Either bring that small pure function over with its tests, or drop the line.
Decisions (defaults from #532)
- Delay: 3 hours, and only for drafts started in the last 48 hours.
- Off switch: per organizer, through the link in the email. There's no settings page for it.
- AI connector drafts: they don't get the email.
- New: keep the "So far" line, or drop it?
Watch for
- One worker. As with reminders, the check that stops a second email holds only with one worker process.
- Trust docs change in the same PR.
Done when
- A due draft gets exactly one email. A published, deleted, empty, opted-out, connector-made or too-old draft gets none. #532 has a DB test for each case.
- The template renders in the worker test.
- The legal pages say organizers may get one email about an unpublished draft.
pnpm lint && pnpm typecheck && pnpm knip && pnpm testandpnpm test:dbpass.
- Lenguaje dominante
- TypeScript
- Estrellas
- 19
- Forks
- 4
- Merge medio
- 22 h 46 min
- PR fusionados (30 d)
- 170
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de richshaw/OpenSignup
-
bug pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
richshaw/OpenSignup#711 ·
Los mantenedores suelen responder en 1 día
-
Participant name and notes limits are typed twice, in the schemas and on the participant pagesPosiblemente ocupada @bfs2021 la tomó hace 2 días. Abiertoenhancement good first issue pipeline:ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
richshaw/OpenSignup#705 ·
Los mantenedores suelen responder en 1 día
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
richshaw/OpenSignup#654 ·
Los mantenedores suelen responder en 1 día
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
richshaw/OpenSignup#652 ·
Los mantenedores suelen responder en 1 día
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
richshaw/OpenSignup#589 ·
Los mantenedores suelen responder en 1 día
Todos los issues de richshaw/OpenSignup
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
better-auth/better-auth#12132 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
o8 next debug build aborts on Glass to Dark appearance switch (nil identifier messaged before check)Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
hurttlocker/o8#5112 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
webrecorder/wabac.js#386 ·
-
needs-triage
Dificultad 1/5 1-3 horas Aptitud para principiantes 92/100
agent-of-empires/agent-of-empires#5098 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día