ed750c8df1
* WIP-already-reschedule-success-emails-missing * WIP now saving bookingSeatsReferences and identifyin on reschedule/book page * Remove logs and created test * WIP saving progress * Select second slot to pass test * Delete attendee from event * Clean up * Update with main changes * Fix emails not being sent * Changed test end url from success to booking * Remove unused pkg * Fix new booking reschedule * remove log * Renable test * remove unused pkg * rename table name * review changes * Fix and and other test to reschedule with seats * Fix api for cancel booking * Typings * Update [uid].tsx * Abstracted common pattern into maybeGetBookingUidFromSeat * Reverts * Nitpicks * Update handleCancelBooking.ts * Adds missing cascades * Improve booking seats changes (#6858) * Create sendCancelledSeatEmails * Draft attendee cancelled seat email * Send no longer attendee email to attendee * Send email to organizer when attendee cancels * Pass cloned event data to emails * Send booked email for first seat * Add seat reference uid from email link * Query for seatReferenceUId and add to cancel & reschedule links * WIP * Display proper attendee when rescheduling seats * Remove console.logs * Only check for already invited when not rescheduling * WIP sending reschedule email to just single attendee and owner * Merge branch 'main' into send-email-on-seats-attendee-changes * Remove console.logs * Add cloned event to seat emails * Do not show manage link for calendar event * First seat, have both attendees on calendar * WIP refactor booking seats reschedule logic * WIP Refactor handleSeats * Change relation of attendee & seat reference to a one-to-one * Migration with relationship change * Booking page handling unique seat references * Abstract to handleSeats * Remove console.logs and clean up * New migration file, delete on cascade * Check if attendee is already a part of the booking * Move deleting booking logic to `handleSeats` * When owner reschedule, move whole booking * Prevent owner from rescheduling if not enough seats * Add owner reschedule * Send reschedule email when moving to new timeslot * Add event data to reschedule email for seats * Remove DB changes from event manager * When a booking has no attendees then delete * Update calendar when merging bookings * Move both attendees and seat references when merging * Remove guest list from seats booking page * Update original booking when moving an attendee * Delete calendar and video events if no more attendees * Update or delete integrations when attendees cancel * Show no longer attendee if a single attendee cancels * Change booking to accepted if an attendee books on an empty booking * If booking in same slot then just return the booking * Clean up * Clean up * Remove booking select * Typos --------- Co-authored-by: zomars <zomars@me.com> * Fix migration table name * Add missing trpc import * Rename bookingSeatReferences to bookingSeat * Change relationship between Attendee & BookingSeat to one to one * Fix some merge conflicts * Minor merge artifact fixup * Add the right 'Person' type * Check on email, less (although still) editable than name * Removed calEvent.attendeeUniqueId * rename referenceUId -> referenceUid * Squashes migrations * Run cached installs Should still be faster. Ensures prisma client is up to date. * Solve attendee form on booking page * Remove unused code * Some type fixes * Squash migrations * Type fixes * Fix for reschedule/[uid] redirect * Fix e2e test * Solve double declaration of host * Solve lint errors * Drop constraint only if exists * Renamed UId to Uid * Explicit vs. implicit * Attempt to work around text flakiness by adding a little break between animations * Various bugfixes * Persistently apply seatReferenceUid (#7545) * Persistently apply seatReferenceUid * Small ts fix * Setup guards correctly * Type fixes * Fix render 0 in conditional * Test refactoring * Fix type on handleSeats * Fix handle seats conditional * Fix type inference * Update packages/features/bookings/lib/handleNewBooking.ts * Update apps/web/components/booking/pages/BookingPage.tsx * Fix type and missing logic for reschedule * Fix delete of calendar event and booking * Add handleSeats return type * Fix seats booking creation * Fall through normal booking for initial booking, handleSeats for secondary/reschedule * Simplification of fetching booking * Enable seats for round-robin events * A lot harder than I expected * ignore-owner-if-seat-reference-given * Return seatReferenceUid when second seat * negate userIsOwner * Fix booking seats with a link without bookingUid * Needed a time check otherwise the attendee will be in the older booking * Can't open dialog twice in test.. * Allow passing the booking ID from the server * Fixed isCancelled check, fixed test * Delete through cascade instead of multiple deletes --------- Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com> Co-authored-by: Peer Richelsen <peer@cal.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Efraín Rochín <roae.85@gmail.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> |
||
---|---|---|
.devcontainer | ||
.github | ||
.husky | ||
.snaplet | ||
.vscode | ||
__checks__ | ||
apps | ||
deploy | ||
packages | ||
scripts | ||
tests/config | ||
.editorconfig | ||
.env.appStore.example | ||
.env.example | ||
.eslintrc.js | ||
.gitignore | ||
.infisical.json | ||
.kodiak.toml | ||
.npmrc | ||
.nvmrc | ||
.prettierignore | ||
.prettierrc.js | ||
CODE_OF_CONDUCT.md | ||
CONTRIBUTING.md | ||
LICENSE | ||
Procfile | ||
README.md | ||
SECURITY.md | ||
app.json | ||
crowdin.yml | ||
gh.env | ||
git-init.sh | ||
git-setup.sh | ||
jest.config.ts | ||
package.json | ||
playwright.config.ts | ||
turbo.json | ||
yarn.lock |
README.md
Cal.com (formerly Calendso)
The open-source Calendly alternative.
Learn more »
Slack
·
Website
·
Issues
·
Roadmap
About The Project
Scheduling infrastructure for absolutely everyone
The open source Calendly alternative. You are in charge of your own data, workflow and appearance.
Calendly and other scheduling tools are awesome. It made our lives massively easier. We're using it for business meetings, seminars, yoga classes and even calls with our families. However, most tools are very limited in terms of control and customisations.
That's where Cal.com comes in. Self-hosted or hosted by us. White-label by design. API-driven and ready to be deployed on your own domain. Full control of your events and data.
Recognition
Hacker News
Product Hunt
Built With
Stay Up-to-Date
Cal officially launched as v.1.0 on 15th of September, however a lot of new features are coming. Watch releases of this repository to be notified for future updates:
Getting Started
To get a local copy up and running, please follow these simple steps.
Prerequisites
Here is what you need to be able to run Cal.
- Node.js (Version: >=15.x <17)
- PostgreSQL
- Yarn (recommended)
If you want to enable any of the available integrations, you may want to obtain additional credentials for each one. More details on this can be found below under the integrations section.
Development
Setup
-
Clone the repo into a public GitHub repository (or fork https://github.com/calcom/cal.com/fork). If you plan to distribute the code, keep the source code public to comply with AGPLv3. To clone in a private repository, acquire a commercial license)
git clone https://github.com/calcom/cal.com.git
-
Go to the project folder
cd cal.com
-
Install packages with yarn
yarn
-
Set up your .env file
- Duplicate
.env.example
to.env
- Use
openssl rand -base64 32
to generate a key and add it underNEXTAUTH_SECRET
in the .env file. - Use
openssl rand -base64 24
to generate a key and add it underCALENDSO_ENCRYPTION_KEY
in the .env file.
- Duplicate
Quick start with yarn dx
- Requires Docker and Docker Compose to be installed
- Will start a local Postgres instance with a few test users - the credentials will be logged in the console
yarn dx
Development tip
Add
NEXT_PUBLIC_DEBUG=1
anywhere in your.env
to get logging information for all the queries and mutations driven by trpc.
echo 'NEXT_PUBLIC_DEBUG=1' >> .env
Manual setup
-
Configure environment variables in the
.env
file. Replace<user>
,<pass>
,<db-host>
,<db-port>
with their applicable valuesDATABASE_URL='postgresql://<user>:<pass>@<db-host>:<db-port>'
If you don't know how to configure the DATABASE_URL, then follow the steps here to create a quick DB using Heroku
-
Create a free account with Heroku.
-
Create a new app.
-
In your new app, go to
Overview
and next toInstalled add-ons
, clickConfigure Add-ons
. We need this to set up our database. -
Once you clicked on
Configure Add-ons
, click onFind more add-ons
and search forpostgres
. One of the options will beHeroku Postgres
- click on that option. -
Once the pop-up appears, click
Submit Order Form
- plan name should beHobby Dev - Free
. -
Once you completed the above steps, click on your newly created
Heroku Postgres
and go to itsSettings
. -
In
Settings
, copy your URI to your Cal.com .env file and replace thepostgresql://<user>:<pass>@<db-host>:<db-port>
with it. -
To view your DB, once you add new data in Prisma, you can use Heroku Data Explorer.
-
-
Set a 32 character random string in your .env file for the
CALENDSO_ENCRYPTION_KEY
(You can use a command likeopenssl rand -base64 24
to generate one). -
Set up the database using the Prisma schema (found in
packages/prisma/schema.prisma
)yarn workspace @calcom/prisma db-deploy
-
Run (in development mode)
yarn dev
Setting up your first user
-
Open Prisma Studio to look at or modify the database content:
yarn db-studio
-
Click on the
User
model to add a new user record. -
Fill out the fields
email
,username
,password
, and setmetadata
to empty{}
(remembering to encrypt your password with BCrypt) and clickSave 1 Record
to create your first user.New users are set on a
TRIAL
plan by default. You might want to adjust this behavior to your needs in thepackages/prisma/schema.prisma
file. -
Open a browser to http://localhost:3000 and login with your just created, first user.
E2E-Testing
Be sure to set the environment variable NEXTAUTH_URL
to the correct value. If you are running locally, as the documentation within .env.example
mentions, the value should be http://localhost:3000
.
# In a terminal just run:
yarn test-e2e
# To open last HTML report run:
yarn playwright show-report test-results/reports/playwright-html-report
Upgrading from earlier versions
-
Pull the current version:
git pull
-
Check if dependencies got added/updated/removed
yarn
-
Apply database migrations by running one of the following commands:
In a development environment, run:
yarn workspace @calcom/prisma db-migrate
(this can clear your development database in some cases)
In a production environment, run:
yarn workspace @calcom/prisma db-deploy
-
Check for
.env
variables changesyarn predev
-
Start the server. In a development environment, just do:
yarn dev
For a production build, run for example:
yarn build yarn start
-
Enjoy the new version.
Deployment
Docker
The Docker configuration for Cal is an effort powered by people within the community.
If you want to contribute to the Docker repository, reply here.
The Docker configuration can be found in our docker repository.
Issues with Docker? Find your answer or open a new discussion here to ask the community.
Cal.com, Inc. does not provide official support for Docker, but we will accept fixes and documentation. Use at your own risk.
Heroku
Railway
You can deploy Cal on Railway using the button above. The team at Railway also have a detailed blog post on deploying Cal on their platform.
Vercel
Currently Vercel Pro Plan is required to be able to Deploy this application with Vercel, due to limitations on the number of serverless functions on the free plan.
Render
Roadmap
See the roadmap project for a list of proposed features (and known issues). You can change the view to see planned tagged releases.
Repo Activity
Contributing
Please see our contributing guide.
Good First Issues
We have a list of help wanted that contain small features and bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.
Bounties
Contributors
Translations
Don't code but still want to contribute? Join our slack and join the #i18n channel and let us know what language you want to translate.
Enabling Content Security Policy
- Set CSP_POLICY="non-strict" env variable, which enables Strict CSP except for unsafe-inline in style-src . If you have some custom changes in your instance, you might have to make some code change to make your instance CSP compatible. Right now it enables strict CSP only on login page and on other SSR pages it is enabled in Report only mode to detect possible issues. On, SSG pages it is still not supported.
Integrations
Obtaining the Google API Credentials
- Open Google API Console. If you don't have a project in your Google Cloud subscription, you'll need to create one before proceeding further. Under Dashboard pane, select Enable APIS and Services.
- In the search box, type calendar and select the Google Calendar API search result.
- Enable the selected API.
- Next, go to the OAuth consent screen from the side pane. Select the app type (Internal or External) and enter the basic app details on the first page.
- In the second page on Scopes, select Add or Remove Scopes. Search for Calendar.event and select the scope with scope value
.../auth/calendar.events
,.../auth/calendar.readonly
and select Update. - In the third page (Test Users), add the Google account(s) you'll using. Make sure the details are correct on the last page of the wizard and your consent screen will be configured.
- Now select Credentials from the side pane and then select Create Credentials. Select the OAuth Client ID option.
- Select Web Application as the Application Type.
- Under Authorized redirect URI's, select Add URI and then add the URI
<Cal.com URL>/api/integrations/googlecalendar/callback
and<Cal.com URL>/api/auth/callback/google
replacing Cal.com URL with the URI at which your application runs. - The key will be created and you will be redirected back to the Credentials page. Select the newly generated client ID under OAuth 2.0 Client IDs.
- Select Download JSON. Copy the contents of this file and paste the entire JSON string in the .env file as the value for GOOGLE_API_CREDENTIALS key.
Adding google calendar to Cal.com App Store
After adding Google credentials, you can now Google Calendar App to the app store. You can repopulate the App store by running
cd packages/prisma
yarn seed-app-store
You will need to complete a few more steps to activate Google Calendar App. Make sure to complete section "Obtaining the Google API Credentials". After the do the following
- Add extra redirect URL
<Cal.com URL>/api/auth/callback/google
- Under 'OAuth concent screen', click "PUBLISH APP"
Obtaining Microsoft Graph Client ID and Secret
- Open Azure App Registration and select New registration
- Name your application
- Set Who can use this application or access this API? to Accounts in any organizational directory (Any Azure AD directory - Multitenant)
- Set the Web redirect URI to
<Cal.com URL>/api/integrations/office365calendar/callback
replacing Cal.com URL with the URI at which your application runs. - Use Application (client) ID as the MS_GRAPH_CLIENT_ID attribute value in .env
- Click Certificates & secrets create a new client secret and use the value as the MS_GRAPH_CLIENT_SECRET attribute
Obtaining Zoom Client ID and Secret
- Open Zoom Marketplace and sign in with your Zoom account.
- On the upper right, click "Develop" => "Build App".
- On "OAuth", select "Create".
- Name your App.
- Choose "User-managed app" as the app type.
- De-select the option to publish the app on the Zoom App Marketplace.
- Click "Create".
- Now copy the Client ID and Client Secret to your .env file into the
ZOOM_CLIENT_ID
andZOOM_CLIENT_SECRET
fields. - Set the Redirect URL for OAuth
<Cal.com URL>/api/integrations/zoomvideo/callback
replacing Cal.com URL with the URI at which your application runs. - Also add the redirect URL given above as a allow list URL and enable "Subdomain check". Make sure, it says "saved" below the form.
- You don't need to provide basic information about your app. Instead click at "Scopes" and then at "+ Add Scopes". On the left, click the category "Meeting" and check the scope
meeting:write
. - Click "Done".
- You're good to go. Now you can easily add your Zoom integration in the Cal.com settings.
Obtaining Daily API Credentials
- Open Daily and sign into your account.
- From within your dashboard, go to the developers tab.
- Copy your API key.
- Now paste the API key to your .env file into the
DAILY_API_KEY
field in your .env file. - If you have the Daily Scale Plan set the
DAILY_SCALE_PLAN
variable totrue
in order to use features like video recording.
Obtaining HubSpot Client ID and Secret
- Open HubSpot Developer and sign into your account, or create a new one.
- From within the home of the Developer account page, go to "Manage apps".
- Click "Create app" button top right.
- Fill in any information you want in the "App info" tab
- Go to tab "Auth"
- Now copy the Client ID and Client Secret to your .env file into the
HUBSPOT_CLIENT_ID
andHUBSPOT_CLIENT_SECRET
fields. - Set the Redirect URL for OAuth
<Cal.com URL>/api/integrations/hubspot/callback
replacing Cal.com URL with the URI at which your application runs. - In the "Scopes" section at the bottom of the page, make sure you select "Read" and "Write" for scope called
crm.objects.contacts
- Click the "Save" button at the bottom footer.
- You're good to go. Now you can see any booking in Cal.com created as a meeting in HubSpot for your contacts.
Workflows
Setting up SendGrid for Email reminders
- Create a SendGrid account (https://signup.sendgrid.com/)
- Go to Settings -> API keys and create an API key
- Copy API key to your .env file into the SENDGRID_API_KEY field
- Go to Settings -> Sender Authentication and verify a single sender
- Copy the verified E-Mail to your .env file into the SENDGRID_EMAIL field
- Add your custom sender name to the .env file into the NEXT_PUBLIC_SENDGRID_SENDER_NAME field (fallback is Cal.com)
Setting up Twilio for SMS reminders
- Create a Twilio account (https://www.twilio.com/try-twilio)
- Click ‘Get a Twilio phone number’
- Copy Account SID to your .env file into the TWILIO_SID field
- Copy Auth Token to your .env file into the TWILIO_TOKEN field
- Copy your Twilio phone number to your .env file into the TWILIO_PHONE_NUMBER field
- Add your own sender id to the .env file into the NEXT_PUBLIC_SENDER_ID field (fallback is Cal)
- Create a messaging service (Develop -> Messaging -> Services)
- Choose any name for the messaging service
- Click 'Add Senders'
- Choose phone number as sender type
- Add the listed phone number
- Leave all other fields as they are
- Complete setup and click ‘View my new Messaging Service’
- Copy Messaging Service SID to your .env file into the TWILIO_MESSAGING_SID field
- Create a verify service
- Copy Verify Service SID to your .env file into the TWILIO_VERIFY_SID field
License
Distributed under the AGPLv3 License. See LICENSE
for more information.
Acknowledgements
Special thanks to these amazing projects which help power Cal.com:
Cal.com is an open startup and Jitsu (an open-source Segment alternative) helps us to track most of the usage metrics.