Montréal, QC·lukesidney.me·Fresh 2 · DenoAucun témoin · aucun formulaire
Planche01

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.

Illustration riso : un questionnaire sur planchette devant un calendrier mural où seulement trois journées sont ouvertes, une enveloppe et un talon de billet près d'une sonnette.
Planche02

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
Planche03

Sous presse.Comment ça marche

5 étapes, dans l'ordre

Ce qu'un visiteur traverse, et ce que l'appli vérifie à chaque étape.

  1. 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.

    La première étape du formulaire de réservation : un courriel de travail avant tout calendrier.
  2. 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.

  3. Confirmer

    Le courriel porte une invitation d'agenda et un lien d'annulation.

  4. Annuler sans compte

    Le lien se prouve lui-même par une signature; l'invité ne s'inscrit jamais.

  5. Les réponses voyagent

    Les réponses sont enregistrées dans le CMS partagé, où mes applis de soumission et de contenu les lisent.

Planche04

L'épreuve.Le code

Un lien d'annulation qui se prouve lui-même

apps/skedual/src/lib/cancelToken.ts · lines 23–37source réelle
/** 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.

Planche05

La bobine.La démo

Le voir tourner

Démo du logiciel à venirEnviron 90 secondes : le formulaire, le calendrier, le courriel de confirmation, l'annulation en un clic.
Planche06

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é.

Planche07

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.

Illustration riso : des questions répondues sur papier avant qu'un calendrier s'ouvre.
Planche08

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.

QuoiLa moyenne du marchéCette appli
Les questions d'abordDes formulaires de routage, sur les forfaits payants.Intégré, à chaque réservation, avant le calendrier.page du fournisseur
Où vont les réponsesLa 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'annulationUn 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
ApparenceLa page du fournisseur avec ton logo et tes couleurs.Le thème propre à chaque site.page du fournisseur
Planche09

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
2025-12-05commits par semaine · record : 182026-09-27
  1. Premier commit : un clone de Calendly
  2. Déménagé dans le monorepo, historique compris
  3. 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.

Planche10

Colophon.Sa place au registre