La une.Ce que c'est
En ligne
skedual
Une réservation qui pose ses questions avant de montrer un calendrier.
Chaque bouton de clevrstart.com réserve par elle.

Composé.La pile techno
Sur quoi ça roule
Une petite appli Next.js sur la base de données partagée, avec Google Agenda et Stripe à ses bords.
Interface
- Next.js16.2les pages de réservation et les formulaires
- React19.2
Données
- Neon Postgresson propre schéma
- Drizzle0.45les requêtes
- Payload3.82les réponses aux formulaires, dans le CMS partagé
- Better Authla connexion du propriétaire
Bords
- Google Calendar APIles plages occupées
- Stripe20les dépôts facultatifs
- date-fns-tzles fuseaux horaires
- Zod3.23chaque entrée vérifiée
Hébergement
- Verceldéployé à partir du monorepo
Sous presse.Comment ça marche
5 étapes, dans l'ordre
Ce qu'un visiteur traverse, et ce que l'appli vérifie à chaque étape.
Répondre d'abord
Un court formulaire trie la demande : ce que c'est, la fourchette de budget, l'échéancier. Le texte libre est lu par l'IA avant l'appel.

Voir seulement le vrai temps libre
Les plages viennent des heures du propriétaire, moins les réservations existantes, moins les plages occupées dans Google Agenda.
Confirmer
Le courriel porte une invitation d'agenda et un lien d'annulation.
Annuler sans compte
Le lien se prouve lui-même par une signature; l'invité ne s'inscrit jamais.
Les réponses voyagent
Les réponses sont enregistrées dans le CMS partagé, où mes applis de soumission et de contenu les lisent.
L'épreuve.Le code
Un lien d'annulation qui se prouve lui-même
/** Scoped so a token minted here can never be replayed against another feature. */function sign(meetingId: string, party: CancelParty) { return createHmac("sha256", secret()) .update(`cancel:${meetingId}:${party}`) .digest("base64url")}export function cancelToken(meetingId: string, party: CancelParty) { return sign(meetingId, party)}export function cancelUrl(meetingId: string, party: CancelParty) { const base = process.env.NEXT_PUBLIC_APP_URL ?? "" return `${base}/book/cancel/${meetingId}?t=${cancelToken(meetingId, party)}`}Pas de table de jetons ni de ménage des expirations : l'identifiant signé de la rencontre est la preuve. Le lien de l'hôte et celui de l'invité sont deux jetons différents.
La bobine.La démo
Le voir tourner
Corrections.Ce que ça règle
Les problèmes que ça règle
Des appels réservés sans rien savoir d'avance.Les questions viennent d'abord; le brief est lu avant l'appel.
Des doubles réservations avec Google Agenda.Les plages occupées sont lues dans Google avant qu'une plage s'affiche.
Des invités envoyés vers le domaine et la marque de quelqu'un d'autre.La page de réservation porte le thème de chaque site.
Annuler demande un échange de courriels.Chaque confirmation porte un lien d'annulation signé.
Le mot de l'éditeur.Pourquoi je l'ai bâti
Pourquoi ça existe
« Rien n'est connu avant l'appel aujourd'hui. » Cette ligne de ma propre spec est la raison d'être de skedual.
Je voulais qu'un seul appel prenne les questions, présente, conclue et signe. Un Calendly intégré ne peut pas faire ça sans un deuxième formulaire boulonné devant; alors le formulaire et le calendrier sont devenus une seule appli. Ç'a commencé en décembre 2025 comme un clone de Calendly tiré d'un tutoriel.

Face au présentoir.Mieux que la moyenne
Face aux outils habituels
Face à Calendly et Cal.com. Leur côté a été lu sur les pages de chaque fournisseur le 2026-09-27.
| Quoi | La moyenne du marché | Cette appli |
|---|---|---|
| Les questions d'abord | Des formulaires de routage, sur les forfaits payants. | Intégré, à chaque réservation, avant le calendrier.page du fournisseur |
| Où vont les réponses | La base de données de l'outil, poussée vers un CRM ou un webhook si tu le branches. | Le même CMS que lisent mes applis de soumission et de contenu.page du fournisseur |
| Lien d'annulation | Un lien vers la page du fournisseur; ton propre domaine seulement au forfait le plus élevé de Cal.com. | Un lien signé sur ton propre domaine.page du fournisseur |
| Apparence | La page du fournisseur avec ton logo et tes couleurs. | Le thème propre à chaque site.page du fournisseur |
L'achevé d'imprimer.Le temps que ça a pris
67 commits en 297 jours
- commits
- 67
- jours avec un commit
- 23
- jours, du premier commit à aujourd'hui
- 297
- Premier commit : un clone de Calendly
- Déménagé dans le monorepo, historique compris
- Dernier commit
Mesuré : git log, mes propres commits sur l'appli et son historique importé, 2026-09-27. Les trois commits de l'auteur du tutoriel sont exclus.
Colophon.Sa place au registre