For full-time workers, April 2026
Daily meditation practice working full time: two buddies, not one, bracketing the workday from both ends
Most articles on this question treat daily practice as a single block: pick a time, install an app, stack a habit. After enough quarters inside a real 9 to 5, that single block stops holding. The matching engine on this site treats it differently. It is session-keyed, not person-keyed. A full-timer who sits twice a day gets matched with two different humans, one for the morning slot and one for the evening slot, on two independent permanent Meet links. This page is the long version of why that one design choice is the whole game for working professionals, and where to read the seven lines of code that enforce it.
The anchor fact: the slot key is ‘personId:session’, not ‘personId’
The cron job that pairs people runs every two hours. Before it tries to match anyone, it builds a list of session slots, not a list of people. A full-timer who told the form they sit twice a day appears in that list as two rows: one row for the morning sit (their morning local time, converted to UTC at write time) and one row for the evening sit. The greedy pairing loop then tracks which slots have been consumed using a Set keyed by the string ‘personId:session’. That single design choice is the difference between a one-buddy system and a two-buddy system.
For anything operational about the sits themselves (length, posture, what to do during a sit) the redirect is to dhamma.org and an authorized assistant teacher at a 10-day residential course. This site does not teach the technique.
The seven lines of code that bracket your day
Anyone can grep for these names in the open repo. The whole two-buddy design is enforced inside a single greedy loop. The comment in the source spells out the intent. The two Sets do the work.
usedSlots stops the loop from booking your morning slot twice. usedPersonPairs stops the loop from accidentally giving you the same person for both slots. The two together are why a full-timer ends up with two different humans on two different Meet links rather than one person on both.
The two real windows around a 9 to 5
The matcher cares about UTC, not about your job. But the reason the dual-session split is the right design for working professionals comes down to which hours of the day a 9 to 5 actually leaves alone. Two of them are usable. One of them is a trap.
Pre-9 AM window
The hour before the work calendar wakes up. The slot a manager cannot drop a meeting on. For most full-timers this lands between 5:30 and 7:30 AM local. The morning buddy comes from this pool.
Post-7 PM window
The hour after the last call drops, before dinner takes the room. For most full-timers this lands between 7 and 9:30 PM local. The evening buddy comes from a different pool entirely.
The midday gap is not a third sit
Lunchbreak meditation is the classic recommendation in articles for working professionals. The matching engine does not offer it as a slot, because the lunch hour is the most negotiable hour in a corporate week and the partnerships that get scheduled there die first.
Two humans, two appointments
Each window is matched independently. The morning buddy never sees the evening sit and the evening buddy never sees the morning sit. The relationships are scoped to their slot, which is also why one can pause without disturbing the other.
Travel breaks one slot at a time
If a work trip pulls your evening UTC outside the +/- 60 minute window with the evening buddy, that match expires on the 3-day rule and re-enters the pool. The morning match is unaffected because it lives in a different row.
What enters the engine, what comes back out
The diagram below names the three things you give the matcher, and the three independent outputs you get back across the year. Each output is a Meet link with a different human on the other end. None of the three outputs share state.
Inputs and outputs of the dual-session matcher
A reader who expects an app dashboard with a single big number on it is going to be disappointed. A reader who wants two appointments on the calendar with two different humans is going to be exactly served.
A normal weekday for a full-timer with two buddies
The shape of a working day with the dual-session split is not ambitious. It brackets the workday on both ends and then leaves the workday alone. There is no third sit, no lunchbreak slot, no notification at 2 PM.
What the matcher does and does not schedule
Pre-dawn (your local 5:00 to 7:30)
Morning buddy is on the Meet link. Cameras on. Silent sit at the agreed time. After the bell, you both leave the call without a word.
9:00 to 17:30 (the workday)
The matcher does nothing for you here. There is no scheduled sit. The site does not push notifications during the workday. The instrument's job is to bracket the workday, not to interrupt it.
Post-call wind-down (your local 19:00 to 21:30)
Evening buddy is on a different Meet link. Different human. Independent appointment that the morning buddy never sees. Same +/- 60 minute UTC overlap rule, different candidate pool.
Wind-down to sleep
Phone is down. No streak number to check. No engagement metric. The page on the wall stays where it was.
One buddy vs two buddies, for a 9 to 5 worker
You pick a single sit time. You match with one person at +/- 60 min UTC. That one relationship has to absorb everything: travel, sick days, on-call rotations, holidays. When the relationship pauses, all of your accountability for the day pauses with it. There is no second human in the system who notices an empty cushion.
- All accountability concentrated in a single relationship
- When the morning blows up, the day's structure goes with it
- No bracketing of the workday from the evening side
The full sequence: from signup to two Meet links
Read top to bottom. The matcher acts on its own schedule, not on yours. The two intro emails go to two different humans, with the same first name as you on both, but the rest of the threads are scoped to their own slot.
What happens after a full-timer signs up with two times
The part this site will never give you
The dual-session design is a calendar choice, not a teaching choice. Three things this page deliberately does not provide, and where to go for each.
- Technique instruction. What you do during a sit was given to you at a 10-day course. If you have not sat one yet, the entry point is dhamma.org. If you have, your assistant teacher is the right address for anything operational.
- A prescribed daily schedule. The matcher does not tell you when to sit, how long to sit, or which session to prioritize when both blow up in the same week. It only holds the two appointments you asked for.
- A streak score. Neither match has a counter on it. There is no badge, no leaderboard, no shareable graphic. The morning and evening relationships are scoped to their own threads, and an empty Meet room is something the other person notices, not something the system scores.
What is left, after those three are subtracted, is small. Two appointments. Two humans. Two Meet links. Either one can pause without disturbing the other. Both are built around the working professional's actual constraint: the workday is going to take whatever it wants, and the practice has to live in the hours on either side of it.
Twelve concrete details, all greppable in the repo
Every name below maps to a real symbol in src/app/api/auto-match/route.ts or src/lib/db.ts. The whole matcher is around three hundred lines of TypeScript and reads top to bottom.
A short, honest note for full-time engineers, founders, and knowledge workers
The morning hour is the only block of the day a working professional has the cleanest claim on, and the late evening is the second cleanest. By 9 AM the calendar has been rewritten by other people; by 7 PM it has been rewritten back. The matcher puts a real human on a Meet link in each of those two slots, because they are the two slots a full-timer can actually defend across 0 years of career arcs. It does not put a third one in the middle of the workday, because the midday slot is the first thing a busy quarter eats.
The honest position of this page is that the technique is the tradition's job, the appointments are the calendar's job, and the practice is yours. The matching engine on this site is a small piece of code for the second of those three. It is not a teacher, not an app, not a streak system, and not a replacement for a 10-day residential course. It is a way to have two real humans on two Meet links bracketing the workday, which is the part of the calendar full-timers cannot move.
For anything operational about the sit itself, the redirect is dhamma.org and an authorized assistant teacher at a 10-day course. For the buddy side, the entry point is /practice-buddy and the open-source matcher lives at src/app/api/auto-match/route.ts.
Want help picking your two windows before you sign up?
Book a short call. We can walk through your workday shape, decide whether dual-session makes sense for your week, and pick two UTC slots the matcher can actually find buddies for.
Frequently asked questions
Why does this site give a full-time worker two different practice buddies instead of one?
Because the morning and evening windows around a 9 to 5 are two different problems. The morning slot competes with sleep and a meeting calendar that wakes up at 9. The evening slot competes with dinner, family, and decompression. They almost never converge to the same UTC overlap with the same other human. The match engine in src/app/api/auto-match/route.ts treats each session as its own slot in the candidate pool, so your morning sit can be matched with one person on the planet and your evening sit with someone else entirely. The relevant code lives in lines 191 to 209, and the comment in the source reads 'twice-a-day practitioners should get two different buddies, per design'.
What does session-keyed matching actually mean in the source code?
The matching cron builds a list of session slots, not a list of people. A person who sits twice a day appears as two rows in the slot list, one for morning and one for evening. The greedy pairing loop tracks usedSlots as a Set of strings of the form 'personId:session', not just 'personId'. So when your morning slot is consumed by a match with person X, your evening slot is still available to be matched with a completely different person Y. The same loop also tracks usedPersonPairs to make sure X and Y are not the same human, even by accident. Both Sets are visible in src/app/api/auto-match/route.ts.
What does the +/- 60 minute UTC window have to do with full-time workers?
It is the only filter the engine applies as a hard cut. Your morning sit time is converted to UTC at signup using your provided timezone, and the matcher rejects every candidate whose own UTC slot is more than 60 minutes off. For a working professional, this means a 6 AM local sit on the US West Coast can match a person whose 6 AM local is up to an hour away in UTC, but not a person whose 7:30 AM is on a different continent. The same +/- 60 minute test runs independently for the evening slot, against an entirely different candidate pool. The hard filter lives at line 164 of src/app/api/auto-match/route.ts.
If I work full time, how long should my daily sit actually be?
That question is for an authorized assistant teacher at a 10-day course, not for this site. The Goenka tradition's recommendation for old students is two hours per day, and the right address for any operational question about your sit is dhamma.org and your assistant teacher. What this site can speak to is the calendar layer: the matcher does not care about duration as a hard filter, but it does soft-prefer same-duration pairings via the session_duration field on waitlist_entries. If you and your buddy both put down 60 minutes, the engine ranks that pairing above one where you put down 60 and the other person put down 30.
What happens if my work week destroys my morning sit?
Three things, in order. First, an empty morning leaves the cell empty in any logging instrument; the page does not punish you. Second, if you cannot show up at the agreed Meet time for several days running, your buddy's signal will tell you the partnership is paused, not failed. Third, the system has a 3-day expiry rule for matches that never get confirmed, after which both people are returned to the pool with no penalty and a new match attempt starts. The expiry logic lives in expireStaleMatches in src/lib/db.ts. The whole architecture is built around the assumption that working calendars blow up, not around the assumption that they will not.
Can I keep one buddy and ditch the second one if my evening turns into work calls?
Yes. The morning and evening matches are independent records. You can let the evening match expire on its own without touching the morning relationship, and re-enter the pool for evening only when your calendar gives that hour back. There is no streak counter in the system to penalize the gap, no leaderboard, no churn metric pointed at you. The morning buddy never sees the evening match, and the evening buddy never sees the morning one.
Why not just use a meditation app and a single 7 AM reminder?
An app reminder pings your phone. A buddy notices an empty Meet room. The asymmetry is the entire point. For working professionals the binding constraint is not motivation, it is whether something other than yourself notices the absence. The matcher engineers that 'something' as a real human, twice a day if you want, on a permanent Google Meet link that does not expire and does not need a subscription. Apps are addressed in more detail at /t/best-meditation-apps-april-2026.
What if my morning and evening slots are both very early or very late by US standards?
The matcher does not care about US time zones at all. It cares about UTC. A 5 AM morning sit in Singapore and a 5 AM morning sit in Berlin are not the same UTC slot, and they will not match each other; they will each match a different cohort, possibly someone in India for one and someone in Egypt for the other. The point of converting to UTC at write time is that the pool is global. A working professional in any time zone has a real chance of finding two different humans, one for each session, somewhere on the planet whose day is shaped to overlap.
I have not sat a 10-day course yet. Can I still ask for a buddy match?
The site is built for old students of S.N. Goenka 10-day courses, because the technique itself is transmitted at those courses by an authorized assistant teacher and not on this site. The signup form has an old-student field for that reason. If you have not sat a course yet, the right next step is dhamma.org. Once you have sat one, the buddy match is here, free, and the dual-session option is there for full-timers from the start.
How do I see the actual algorithm? I want to read it myself before signing up.
The repo is open. The cron handler is /src/app/api/auto-match/route.ts, the eligibility filter starts around line 78, the +/- 60 minute UTC test is at line 164, and the dual-session pairing logic is at lines 191 to 209. The companion offline runner is /scripts/find-matches.mjs, which executes the same algorithm against the database for inspection. Everything described on this page can be read in a few hundred lines of TypeScript. There is no opaque ranking model, no engagement score, no upsell path.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.