A short note on a missing screen
Practice Buddy login: there is no sign-in screen, by design.
If you signed up for the Practice Buddy program on vipassana.cool and went looking for a login, you would not have found one. The site has no accounts, no passwords, and no sessions. This page explains what handles authentication in their place, at the level of the actual endpoints in the repo.
Short answer
Practice Buddy on vipassana.cool has no login URL. You authenticate by holding the email inbox the system mailed your tokens to. To check your row, go to /practice-buddy and submit the form again with the same email; you will see your existing answers prefilled and your match status if any. To act on a pending match, find the intro or confirmation email in your inbox and click the button there.
Why this page exists
A meditator who matched through vipassana.cool sometimes lands here asking the same thing the rest of the web assumes: where do I sign back in? Most pages currently surfaced for this topic answer some other product. A piano studio practice tool. A GP rota planner used by UK clinics. A music school's parent portal. A meditation buddy app like Headspace, evernow, or Yoga Buddy where the buddy feature lives behind a normal account. None of those are the program that paired you with someone for daily Vipassana over Google Meet.
The honest answer for the vipassana.cool program is that the login you are looking for never existed. The system was built deliberately without one. There is nothing to recover, nothing to reset, and no dashboard hidden behind a forgotten password. What follows is a tour of what handles your row, your match, and your daily Meet link in place of a login.
What this Practice Buddy does not have
This is the explicit list. Each absence is a deliberate choice in the code, not an unfinished feature.
Surfaces that do not exist on this site
- No /login or /signin route. The path returns 404.
- No password column on waitlist_entries.
- No session cookie. No Set-Cookie auth header anywhere.
- No JWT signing or verifying outside admin tooling.
- No OAuth provider, no Google sign-in, no Apple sign-in.
- No mobile app to install. iOS and Android stores have nothing to log into.
- No personal dashboard. /practice-buddy is the same page for every visitor.
- No streak counter, no points, no profile to defend.
What replaces login: email plus one-use tokens
Authentication on the practitioner side is split across two primitives. The first is the email address itself, which is the primary key on the waitlist row. The second is a small set of unguessable tokens that get written once into the row when an email goes out, and validated on the link click. Possession of the inbox where those emails landed is the credential.
From signup to your buddy's Meet link
Five surfaces touch authentication, and four of them validate by looking up a single token column: matches.person_a_token, matches.person_b_token, waitlist_entries.unsubscribe_token, and meet_links.token. The fifth, the lookup endpoint, validates by email. There is no shared session anywhere in the stack.
The lookup endpoint, in full
The clearest evidence that there is no login is the file at src/app/api/waitlist/lookup/route.ts. It is the entire status-check surface for a returning practitioner. A fresh repo grep for password, bcrypt, getServerSession, or jwt.sign across the user-facing routes returns zero matches. The only password input in the entire codebase sits at src/components/admin/matching-dashboard.tsx:209, and that gates the operator's review screen at /admin, not any practitioner flow.
Note what is not there. No header check, no IP allowlist, no rate limit specific to this endpoint, no per-user auth context. The handler accepts an email, validates its shape, lowercases and trims it, and returns the row if there is one. Returned fields exclude the email itself and the last name; the rest is already on the public waitlist at /practice-buddy under “Who's Waiting.” That is on purpose. The endpoint exists to prefill the signup form when a returning practitioner types their email, not to gate access to anything private.
The /meet/[token] redirect
The other endpoint worth reading in full is the daily one. After a match confirms, both people receive an intro email containing a permanent Google Meet URL plus a per-person tracking redirect at /meet/[token]. The redirect is what gets bookmarked on the phone home screen, and is what carries the daily flow.
Same idea. Read a token from the URL, look up the row, log the click, redirect. The token here is per-person rather than per-pair, so the operator can tell whether one side is showing up more than the other without prompting either to log in. The Google Meet URL itself has no tie to vipassana.cool's auth: anyone holding the link can join the call. This is intentional. The friction the system is trying to remove is the friction of getting two people into the same video room at the same time, every morning, for years.
Sign-in flow versus what is here
Side by side, with no implication that either is wrong in general. One is right for products with private state per user; the other is right for a free, donation-funded peer-pairing tool that owns almost no per-user state in the first place.
| Feature | A typical login-based product | Practice Buddy on vipassana.cool |
|---|---|---|
| Identity primitive | username + password (or OAuth provider) | email address, plus single-use tokens written into emails |
| Session model | server session or signed JWT, refreshed periodically | no session at all; each request carries its own credential |
| Forgot-password flow | email a reset link, set new password, log in again | no password to forget; just sign up again with the working email |
| Daily sit access | open app, log in if expired, navigate to today's session | click the bookmarked /meet/[token] redirect, land in Google Meet |
| Code surface that handles auth | auth middleware, session store, password hashing, CSRF | four route handlers that read one token column or one email each |
| What a hijacked credential exposes | account, history, settings, sometimes payment info | ability to confirm or decline one match, or unsubscribe one row |
| What an operator gets out of it | user dashboard, retention loops, churn metrics | an inbox of intro-email replies and a /admin/matching console |
The practical answer if you came here looking for a login
If you signed up for Practice Buddy and want to come back, the path is short. Open /practice-buddy, type the email you used originally into the form, and the page will fetch your existing row and prefill the answers. You can update your sit times, your time zone, your frequency, anything that the matcher uses, and resubmit. There is no “account screen” to land on first.
If you have a pending match and the confirmation email is still unanswered, search your inbox for messages frommatt@vipassana.coolorhello@vipassana.cooland click the “Yes, introduce me” or “No thanks” button there. The token in that link is the only thing that lets you act on the match. Once a match has been mutually confirmed, the intro email contains the permanent Google Meet link and the per-user /meet/[token] redirect; that is where the daily sit lives. Bookmark the redirect.
If you have lost access to the email you signed up under, the straightforward fix is to fill the form again with the working email. There is no profile to migrate, no streak to keep. The operator (Matt) reviews every signup by hand and will spot the duplicate; if there is anything to merge, that is the moment it happens, by hand, in a reply.
Why a no-login design fits this specific tool
The thing the program is in the business of is two meditators showing up at the same Google Meet URL, every morning, for as long as the partnership lasts. Anything between waking up and that URL is drag. Account creation is drag. Login expiry is drag. A profile dashboard is drag. The cost of those things is paid every day; the benefit is paid once if at all.
The operator's side of the system also runs better without accounts. There is no churn surface to inspect, because there is no login event to count. The signal that a match is alive is /meet/[token] click rows in the database; the signal that it is dead is silence on the email thread, an unsubscribe click, or a fresh signup with new times. The operator does not need a per-user dashboard for the practitioner because they can read the underlying tables directly.
The trade-offs are real and worth naming. The lookup endpoint surfaces a public-waitlist subset of fields without authentication. The confirmation flow trusts whoever holds the inbox. There is no two-factor auth, because there is no auth. For a free pairing program serving meditators in the Goenka tradition, those costs have been deemed proportionate to the simplicity gained. They could be revisited; the lookup endpoint in particular is the obvious place to add a magic-link step the day that public-waitlist subset stops feeling acceptable.
A note on this site: vipassana.cool does not teach the technique. The S.N. Goenka tradition reserves transmission of the technique for authorized assistant teachers inside 10-day residential courses. For anything about how to sit, how to work with what comes up, or how to structure a daily practice, the right place is dhamma.org and an authorized assistant teacher.
Want to talk it through before signing up?
If you have questions about the program, the matching, or this no-login model, book 15 minutes with the operator (Matt). He runs the system you would be on the other side of.
Frequently asked questions
Why does vipassana.cool have no Practice Buddy login at all?
Because adding accounts would have been a feature that did nothing for the user and added a real obstacle for the operator. The whole product is one form, one human review, one intro email, and one permanent Google Meet link per pair. Nothing else needs gating. A login screen would only protect a personal dashboard that does not exist on this site, and the operator (Matt) does not want a dashboard sitting between a meditator and their sit. The unauthenticated flow also matches the spirit of the tradition: courses run on dana, signups are read by a human, and the relationship that does the work is the one between you and the buddy you got matched with, not between you and a profile screen.
What identifies me on the site if not a username and password?
Your email address, plus single-use tokens that get written into emails sent to that address. The signup form at /practice-buddy stores your email in the waitlist_entries table. After that, every endpoint that mutates anything about your row checks one of two things: either it accepts an email and looks up the row by email (status checks), or it accepts a token from the URL and looks up the row by that token (everything else, including yes/no on a match, the redirect to your buddy's Google Meet link, and unsubscribing). Tokens are unguessable strings written once when an email is sent and validated on click. Possession of the email inbox is treated as proof you are the row.
Where exactly does the login I expected get replaced?
Four endpoints, in this order. /api/waitlist (POST) creates your row when you sign up; no auth, validated by email format and basic name sanity. /api/waitlist/lookup (GET) takes ?email= and returns your status, name, time zone, sit times, and frequency, with no header check at all. /api/confirm-match (GET) takes ?token=... and ?response=yes|no, and validates the token against matches.person_a_token or matches.person_b_token. /api/unsubscribe (GET) takes ?token=... and validates against waitlist_entries.unsubscribe_token. The /meet/[token] route validates against meet_links.token, logs the click, and 302-redirects to the actual Google Meet URL. Five surfaces, four token columns, zero session cookies.
Is the lookup endpoint really unauthenticated? What if I type a stranger's email?
The endpoint is unauthenticated, and you can paste a stranger's email and see their first name, city, time zone, sit times, and old-student status. Email and last name are not returned. The reasoning is that those fields are already shown publicly on the waitlist table at /practice-buddy under 'Who's Waiting' for any pending row, so the lookup endpoint is not surfacing anything more than the public waitlist already does. It exists so a returning practitioner can prefill the signup form without retyping every preference, not to gate access to private data. If that trade-off ever stops being acceptable, the endpoint becomes the obvious place to add a magic-link step. As of this page it has not been added.
What happens if I lose access to the email I signed up with?
You sign up again with the new email. There is no profile to migrate, no badge to keep, no streak to recover. The cron's prior-pair guard works on row IDs in the matches table, so the new row is treated as a separate person at the matching layer. If you previously confirmed a match (status = 'ready') under the old email, that flag does not transfer; the new row starts as 'pending'. The two real consequences are that any old confirmation tokens already mailed to the old address become useless once that match expires, and any /meet/[token] link tied to the old row stops being yours. The Google Meet URL itself still works for your buddy because Google Meet's URL is independent of our token.
If anyone with the token can act, what stops a stranger from clicking my confirmation link?
Nothing stops a person who already has the token, which is exactly how email magic links work everywhere. The defense is that the token is sent to one inbox, is unguessable (UUID-grade), and is single-use for state changes. /api/confirm-match marks the row as 'engaged' on first 'yes' click and refuses to flip the state again. /api/unsubscribe is idempotent: a second hit on an already-unsubscribed token redirects to the success page without re-firing emails or PostHog events, which is in the route at lines 36 to 39. So the threat model is the same as any password-reset link: if your inbox is compromised, the attacker can act on your behalf, and there is no second factor here. For a free, donation-funded peer-pairing tool serving meditators, that has been deemed proportionate.
How does the daily sit work without a login persisting state across days?
It does not need to. Each matched pair gets a permanent Google Meet URL written into the meet_links table once, at confirmation time. Each person also gets their own /meet/[token] redirect URL, which is what shows up in their intro email. Every morning, you click that link, the route reads the token, logs a row in meet_clicks (so the operator can tell whether anyone showed up this week), and 302s you to the same Google Meet URL as yesterday. There is no session, no daily login, no auth state to refresh. Bookmark the redirect, add it to a phone home screen, and the daily flow is one tap.
Does any of this teach how to meditate?
No. Nothing on vipassana.cool teaches the technique. The S.N. Goenka tradition reserves transmission of the technique for authorized assistant teachers inside 10-day residential courses at dhamma.org. This page describes the authentication model of one tool that helps old students sit together. Any question about how to sit, how to work with a sensation, how to handle difficulty on the cushion, or how to structure a daily practice goes to dhamma.org and to an authorized assistant teacher at a 10-day course, not here.
Want to actually be in this system instead of reading about it?
Signing up takes about two minutes. There is one form, one human review, and one email when a match shows up.
Go to /practice-buddy
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.