Why does blindmeet.me exist?
I used to use when2meet frequently but there seemed to be a pattern of certain people choosing their availability in "dead zones". Making it near impossible to include them and essentially giving them a free pass to not have to attend. As such, this website was made to blind all users from being able to see each others availability. Only the orgainser can see the final outcome.
Note
Yes blindmeet is indeed mobile friendly :)
- Name your event
- Choose Specific Dates or Days of Week
- Set the earliest and latest time
- Set an admin password
- Sign in with your name (password is optional but recommended)
- Click or drag across the grid to mark your availability
- Changes are saved automatically
- Enter the admin password to unlock
- Shows a colour coded heatmap (the darker the green = the more people free)
- Hover any slot to see exactly who is/isn't available
- Lists all participants who have responded by name
Supabase's free tier has storage/bandwidth limits, so BlindMeet compresses the two largest data structures before they are stored or transmitted.
When a user picks 41 consecutive days, the initial approach stored the full 41 dates as separate strings. Now they are encoded runs of consecutive dates in the format "YYYY-MM-DD/N"
| Before | After |
|---|---|
[ "2026-06-21", "2026-06-22", "2026-06-23", "2026-06-24", "2026-06-25", "2026-06-26", "2026-06-27", "2026-06-28", "2026-06-29", "2026-06-30", "2026-07-01", "2026-07-02", "2026-07-03", "2026-07-04", "2026-07-05", "2026-07-06", ... ] |
[ "2026-06-21/41" ] |
~36× smaller on average*
Note
Non-consecutive selections produce multiple ranges ["2026-06-21/5", "2026-07-01/3"]
Each participant's availability are in sets of 30 minute slots originally identified by and array of "YYYY-MM-DD|HH:MM". For a 9AM to 5PM window that's 16 possible slots per day. Storing each slot was around 18 bytes so just for a fully "available day" that would make roughly 288 bytes :(
Instead of that absolutely amateur way of storing the dates, they are now one entry per date, containing a base64 encoded bitmask, where each bit represents each 30-minute slot
| Before | After |
|---|---|
[ "2026-06-22\09:00", "2026-06-22\09:30", "2026-06-22\10:00", "2026-06-22\10:30", "2026-06-22\11:00", "2026-06-22\11:30", "2026-06-22\12:00", "2026-06-22\12:30", "2026-06-22\13:00", "2026-06-22\13:30", "2026-06-22\14:00", ... ] |
[ "2026-06-22://8=", "2026-06-23://8=", "2026-06-24://8=" ] |
~16× smaller per fully selected day*
Note
The number of bytes in each mask is ⌈slots_per_day / 8⌉, a 16-slot (9–17 h) event needs 2 bytes per date; a 48-slot (24-hour) event needs 6 bytes. I love this compression as the ratio only improves with the more slots that are selected as the bitmask size is fixed regardless of how many bits are set.
If you care to look at how this is achieved then check (codec.js or public/codec.js they are both the same). They handle encoding/decoding on both the server and in the browser with no external dependencies.
This project uses supabase for its DB, if you don't like it, fork it and change it 😘
It's free and quick. To setup supabase, just copy the contents of setup.sql into the SQL Editor of your chosesn project and your gtg.
Caution
This project will not work if you do not setup supabase and update the .env (see below) with the required supabase info
Rename the provided .env.example to .env and fill out the given values.
Tip
ORIGIN is used for the OG meta tags. Don't worry about it for local development but make sure to update if you are deploying publicly
You will need node installed. Once you have setup all the above, then install deps and fire her up.
npm install
npm run devShould output something like blindmeet up @ http://localhost:3003 in the console 🤙
This is so when you post the link in discord/teams etc it shows a cool preview.
Tries to make the site feel more premium.
The source metadata is all in the index.html 👆, the event metadata 👇 is controlled by the server.js
Caution
This will not work on a local deployment as discord/teams will not be able to access your server hosted on localhost. Either expose your IP (not recomended) or host it on a server somewhere.

