* users can be array of user when roundrobin team booking is there with availablity of multiple people
* Return empty array
* Add comments
* checktype fix
* removed extra condition
Co-authored-by: Syed Ali Shahbaz <alishahbaz7@gmail.com>
* patch applied
* patch applied
* We shouldn't pollute global css
* Build fixes
* Updates typings
* WIP extracting zoom to package
* Revert "Upgrades next to 12.1 (#1895)" (#1903)
This reverts commit ede0e98e1f.
* Tweak/gitignore prisma zod (#1905)
* Extracts ignored createEventTypeBaseInput
* Adds postinstall script
* Revert "Tweak/gitignore prisma zod (#1905)" (#1906)
This reverts commit 15bfeb30d7.
* Eslint fixes (#1898)
* Eslint fixes
* Docs build fixes
* Upgrade to next 12.1 (#1904)
* Upgrades next to 12.1
* Fixes build
* Updaters e2e test pipelines
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Fix URL by removing slash and backslash (#1733)
* Fix URl by removing slash and backslash
* Implement slugify
* Add data type
* Fixing folder structure
* Solve zod-utils conflict
* Build fixes (#1929)
* Build fixes
* Fixes type error
* WIP
* Conflict fixes
* Removes unused file
* TODO
* WIP
* Type fixes
* Linting
* WIP
* Moved App definition to types
* WIP
* WIP
* WIP
* WIP WIP
* Renamed zoomvideo app
* Import fix
* Daily.co app (#2022)
* Daily.co app
* Update packages/app-store/dailyvideo/lib/VideoApiAdapter.ts
Co-authored-by: Omar López <zomars@me.com>
* Update packages/app-store/dailyvideo/lib/VideoApiAdapter.ts
Co-authored-by: Omar López <zomars@me.com>
* Missing deps for newly added contants to lib
Co-authored-by: Omar López <zomars@me.com>
* WIP
* WIP
* WIP
* Daily fixes
* Updated type info
* Slack Oauth integration - api route ideas
* Adds getLocationOptions
* Type fixes
* Adds location option for daily video
* Revert "Slack Oauth integration - api route ideas"
This reverts commit 35ffa78e929339c4badb98cdab4e4b953ecc7cca.
* Slack Oauth + verify sig
* Slack Oauth + verify sig
Implementing connect slack with workspace OAuth
Implemented the ability for slack to send requests on events (commands etc) - This only works if slacks signature matches with our signature
* Revert "Slack Oauth + verify sig"
This reverts commit ee95795e0f0ae6d06be4e0a423afb8c315d9af7d.
* WIP - Signature verifiaction failure
* Huddle01 migration to app store (#2038)
* Jitsi Video App migration
* Removing uneeded dependencies
* Missed unused reference
* Missing dependency
`@calcom/lib` is needed in the `locationOption.ts` file
* Huddle01 migration to app store
* WIP: PostData for creating event
* Optimising Query
Vital as we only have 3 seconds max to return the response to slack.
* Jitsi Video App migration (#2027)
* Jitsi Video App migration
* Removing uneeded dependencies
* Missed unused reference
* Missing dependency
`@calcom/lib` is needed in the `locationOption.ts` file
Co-authored-by: Omar López <zomars@me.com>
* Monorepo/app store MS Teams Integration (#2080)
* Create teamsvideo package
* Remove zoom specific refrences
* Add teams video files
* Rename to office365_video
* Add call back to add crednetial type office365_teams
* Rename to office_video to match type
* Add MS Teams as a location option
* Rename files
* Add teams reponse interface and create meeting
* Comment out Daily imports
* Add check for Teams integration
* Add token checking functions
* Change template to create event rather than meeting
* Add comment to test between create link and event
* Add teams URL to booking
* Ask for just onlineMeeting permission
* Add MS Teams logo
* Add message to have an enterprise account
* Remove comments
* Comment back hasDailyIntegration
* Comment back daily credentials
* Update link to MS Graph section of README
* Move API calls to package
Co-authored-by: Omar López <zomars@me.com>
* Re-adds missing module for transpiling
* Adding connect button if there is on user
* Adds email as required field for app store metadata
* WIP: migrates tandem to app store
* Cleanup
* Migrates tandem api routes to app store
* Fixes tandem api handlers
* Big WIP WIP
* Show todays bookings.
* No booking message to json
* Transition into modals
Better UX for submitting forms.
* Create Bookings - Working
* Fixing /today to show today and not all upcoming
* Fixing message
* Build fixes
* WIP
* Fixes annoying circular dependency bug
I've spent a whole day on this....
* Location option cleanup
* Type fixes
* Update EventManager.ts
* Update CalendarManager.ts
* Merge branch 'monorepo/app-store' into sean-monorepo-slack-oauth
* Moves CalendarService back to lib
* Moves apple calendar to App Store
* Cleanup
* Booking Success
* Merge branch 'main' into sean-monorepo-slack-oauth
* Restored moved file
* Delete TeamRole.tsx
* Undoing unrelated changes
* Cleanup
* Cleanup
* Updates website
* Delete .env.example
* Update yarn.lock
* Adds instructions to README
* Build fixes
* Uses generic app store api handler
* Adds install button and cleanup
* Updates .env.example
* Update README.md
* Renames slackapp to slackmessaing
* Update InstallAppButton.tsx
* Delete locationOption.ts
* Type fixes
* Build fixes
* Links + Fixing connection issue
* fixed merge conflict
* fixed merge conflict
* Type fixes
* Update index.ts
Co-authored-by: zomars <zomars@me.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Co-authored-by: Juan Esteban Nieto Cifuentes <89233604+Jenietoc@users.noreply.github.com>
Co-authored-by: Leo Giovanetti <hello@leog.me>
Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peer@cal.com>
* Moves locations to App Store and Core
* LocationType fixes
* Update App.d.ts
* Re-add Google Meet
* Moves location labels to the app store
* Renames labels to locationLabels
* Update utils.ts
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Bug - link not showing
* Added where location as link on emails
* Location URL test fixes
* URLs validator fixes
Co-authored-by: Alan <alannnc@gmail.com>
Co-authored-by: zomars <zomars@me.com>
* fix: 🐛 Set a default for create events on
* fix: 🐛 Save default value to db
* Revert fixes in frontend
* fix: 🐛 Set a default for "create events on" from backend"
* fix: 🐛 Update frontend when destinationCalendar is disconnected
* username update from getting-started when received as query param
* Added test for onboarding username update
* Now saving username saved in localStorage
* remove username field
* Removed wordlist
* Implement checkoutUsername as api endpoint
* Remove unused lib utils not empty
Co-authored-by: zomars <zomars@me.com>
* added emptyscreen component to availability
* added emptyscreen for event-types too
* added placeholder for adding new schedule
* didnt realise we had a Working Hours string alredy
* nit
* remove white background from empty availability
* Concluded merge
* Applied stash to newly merged
* Always disconnect + remove redundant success message
* Added named dialog to replace new=1
* Merged with main p2
* Set eventTypeId to @unique
* WIP
* Undo vscode changes
* Availability dropdown works
* Remove console.log + set schedule to null as it is unneeded
* Added schedule to availability endpoint
* Reduce one refresh; hotfix state inconsistency with forced refresh for now
* Add missing translations
* Fixed some type errors I missed
* Ditch outdated remnant from before packages/prisma
* Remove Availability section for teams
* Bringing back the Availability section temporarily to teams to allow configuration
* Migrated getting-started to new availability system + updated translations + updated seed
* Fixed type error coming from main
* Titlecase 'default' by providing translation
* Fixed broken 'radio' buttons.
* schedule deleted translation added
* Added empty state for when no schedules are configured
* Added correct created message + hotfix reload hard on delete to refresh state
* Removed index renames
* Type fixes
* Update NewScheduleButton.tsx
Co-authored-by: zomars <zomars@me.com>
Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* --init
* refactored more dialogs --WIP
* more modals replaced by dialogs --WIP
* fix for new dialog location import
* --WIP
* lint fix
* final dialog refactor
* added more width to max-w for dialog in sm screen
* clean-up
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* checking if username is premium on google sign up
* Removed test validating query input value, but it's no longer required
* undo code that was moved to a function for reuse
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Omar López <zomars@me.com>
* MVP zendesk provider
* hide zendesk on mobile
* hide zendesk chat bubble on mobile too
* made mobile selector more robust
* made user menu full width
* removed zendesk react and instead use Nextjs Script
* updated NEXT_PUBLIC_ZENDESK_KEY env in example
* Add contributing to app store docs
* Edit file structure diagram and fix build
* Add doc to meta
* Wrap example variabels in code block
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
* feat: pre-fill name and email if user loggedIn in booking page
* feat: add name to next-auth autoMergeIdentiteies response
* fix: Update booking page so if you're in your own booking, it doesn't prefill
Co-authored-by: Agusti Fernandez Pardo <git@agusti.me>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* convert the email to lowercase
this code will prevent the email check from failing if the user email contain capitalisation.
* Updated Readme to contain warning.
* Revert "Updated Readme to contain warning."
This reverts commit c406587c73c07c613d1c8091bfdd17bd691b00e8.
Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
* modified buffer checks
* added custom interval consideration in getSlots fn
* further getslot call fixes
* added check for end of day availability slots
* removed debug remnants
* moved slot filtering into a function
* improved readability of code
* improved readability
* extracted getFilteredTimes outside useSlot
* added a buffer test
* added another buffer test
* edge case fix for eod availability and test fix
* removed unnecessary comments
* verbose comment
* fixed eod logic and updated expected test value
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* init dark brand color addition
* added dark mode css vars
* added contrast brand colors
* minor fixes
* added dark branding to loader, button
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Avoid crypto to land in the browser
* Avoid prefetching as it has Crypto code bundled in AvatarGroup
* Use md5 directly if avatar not available
Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
* Event Types - Mobile Ui
* Removing Daily video from default list
Added this for testing purposes
* Removing ZOD + mt on clock
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
* before and after buffer added to handleAvailableSlots function
* --WIP
* added migration
* pull buffer data from DB
* cleanup
* added buffer input in form
* removed unused functions in controller field
* improved the buffer time check
* fixed default value and added preceding event afterbuffer consideration
* fixed e2e test issue
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* fix/booking-first-day-of-next-mont
* Change minimum wait time for booking next month first day test
* Change minimum wait time for booking next month first day test
* Change minimum wait time for booking next month first day test
* Added Todo note for future improvement
* Apply same timeout change in others change of month action test
* Revert "Revert "Webhooks to support event type association (#1889)" (#2032)"
This reverts commit 71e74b8320.
* Fixes turbo DB deploy
* Update turbo.json
* Fixes connectionIntegration undefined bug
* fixes adding NEXT_PUBLIC_BASE_URL to consts and using that
Co-authored-by: Agusti Fernandez Pardo <git@agusti.me>
* fix: adds new isBrowserLocal24h timeFormat util, uses in BookingPage
* fix: adds new time format locale detector in available times
* fix: removes 24h clock from availabletimes
* chore: move timeFormat to lib util, add to payment page
* chore: remove commented out is24h
* fix: adds timeFormat to success page
* fix: adds timeFormat to cancel page
* fix: adds timeFormat to video meeting ended/not started pages
* fix: removes added typo in success page
* fix: reverts back to use of is24h Switch in available times / time options, renames timeFormat to detectBrowserTimeFormat to avoid collisions
* fix: moves use uf isBrowserLocal24h() to clock util initClock() itself, by calling it only if no localStorage settings are set
* chore: move back timeFormat props to line it was so no change
* chore: remove empty line in timeOptions
* chore: move back timeFormat where it was in TimeOptions props
* chore: add back empty line before selectedTimeZone return
* fix: reverts back to use of is24h in payments page
* feat: adds browser locale as default in payment page in case there's no settings set by the customer
* feat: adds browser locale as default in success page
* fix: deconstruct props so eslint passes
* fix: lint issue for extra empty line in meeting-ended uid page
Co-authored-by: Agusti Fernandez <git@agusti.me>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Update prisma commands
Prisma commands have changed due to the new project structure
* Set the type of code block to have code block style
* Apply required changes
* Update README
* Add fast access to start Prisma Studio
* Updates docs
* Minor fixes in docs
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* initial
* scale plan instructions in the readme and removed the buffer for entering a video call
* readme update for Daily Scale Plan users
Co-authored-by: Lola-Ojabowale <lola.ojabowale@gmail.com>
Co-authored-by: Omar López <zomars@me.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Upgrades prisma
* Extends Stripe paid booking timeout
* Stripe test fixes
* Disables cache for db-reset
* Disabled cache from db-seed
* Avatar fixes
* Fixes paid booking test once and for all
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Add navigator.share in mobile
* Validate navigator.share in useEffect
* Add new Button with navigator.share condition
* Add new Icons
* Solve check types
* username slug should be lowercase
* if logging in via a non-CAL identity provider then show username during onboarding
* type fix
Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
* Remove intercom from public pages
* remove from success and cancel pages as well
* remove from Reschedule page as well
* Fix comment
Co-authored-by: Omar López <zomars@me.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* fix: remove use of window.location in redirect of callbackUrl in Login Page
* Adds WEBSITE_URL constant to callbackUrl in login page
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
* Avoid Theme Flicker. Render Server Side
* Add back isReady implementation
* Use shorter syntax for Tag
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Omar López <zomars@me.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* added base logic for team billing
- moved Stripe customer related logic to customer.ts
- implemented unstable logic for team owner upgrading, downgrading and adding/removing seats
* logic improvements
* - improved Alert style
- hide free team members on public team page
- upgraded textarea to ui component TextArea in SAML setup
- added Alert on team settings for hidden members
- hide CreateEventTypeButton if not admin
- fixed missing locale strings in team settings
* remove random import
* - show hidden status on team list
- refactor team pill
* - improved logic (mostly functional)
- added Alerts for members & owners
- added local strings
- created upgrade modal
- added info notice on invite member modal
- fixed router redirect after leaving team
* - improved logic in team-billing
- error display on upgrade modal
- added better launch.json for VSCode debugger
- fixed bug with missing inviteeUserId
* code cleanup
* nit pick fixes i should sleep now
* fixed leave team bug
- quantity would not decrease upon leave or removal
* added stripe billing callback handler
* - better launch.json
- teams empty component
* - fixed error not removing after successful pro upgrade
- fixed silent fail on team create name conflict
- fixed input border radius on member invite modal
* updated local strings
* improved logic for edge cases, such as:
- team owned by member sponsored by another team can smoothly upgrade to pro if kicked from sponsored team
- logic to calculate if owner is specifically missing pro subscription (ownerIsMissingSeat)
- corrected calculation of members missing seats, shouldn't care for proPaidForByTeamId as that only matters for removing member and preserving pro if they pay for it themselves
- added react query devtools
- added missing locale string
* - allow type override for LinkIconButton
- consolidate filter logic for getMembersMissingSeats
* - only activate team billing for hosted cal
- fix prod price keys
* fix requiresUpgrade when not hosted by cal
* added HOSTED_CAL_FEATURES
* fixed failing build
- fixed broken import path
- added support for premium price plan. (will consider premium as a valid seat)
- remove rouge console log
* fix customer id type error
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* updated saml-jackson
* if logged in redirect to getting-started page with username in the query param
* fixed issue with mixed up Google login, profile.id is undefined and this is causing the first record to be retrieved instead of the AND query failing
* updated updated saml-jackson
* document PGSSLMODE for Heroku
* tweaks to PGSSLMODE doc
* for self-hosted instance just allow user to signin with any identity (as long as email matches)
* fixed submitting flag
* added username to onboarding flow (if requested during signup)
* added telemetry for google login, saml login, saml config
* check if firstName and lastName are defined
* convert mutation to an async op
* added e2e test to ensure username query param gets picked up during onboarding
* fixed minor typo and added note about configuring Google integration as an Internal app when self-hosting
* cleaned up unnecessary ssr in sso signup routes
* renamed function
* Revert "cleaned up unnecessary ssr in sso signup routes"
This reverts commit 3607ffef79542d8ca4277a64be38d35bd9457960.
* moved client side code to useEffect hook
* - format
- fixed Save button in SAML config component
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Fixed import of web3 dir
* Invalid way of including the zodResolver, exposed by updating 2.8.3 to 2.8.5 in @hookform/resolvers
* smartContractAddress is added conditionally, so added check to reflect this in the updateMutation
* added rtl to body
* added locale checkker in _document.tsx to check for ar or he locale
* added rtl modifiers for event-types
* added rtl classes
* wip
* wip
Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
* Crypto events (#1390)
* update schemas, functions & ui to allow creating and updating events with a smart contract property
* remove adding sc address in the dialog that first pops-up when creating a new event, since its an advanced option
* add sc to booking ui
* some more ts && error handling
* fetch erc20s and nfts list in event-type page
* some cleanup within time limit
* ts fix 1
* more ts fixes
* added web3 section to integrations
* added web3 wrapper, needs connection to user_settings db
* extract to api
* Update eventType.ts
* Update components/CryptoSection.tsx
Change comment from // to /** as @zomars suggested
Co-authored-by: Omar López <zomars@me.com>
* convert axios to fetch, change scAddress to smartContractAddress, load bloxy from next_public_env
* Fix branch conflict
* add enable/disable btn web3
* fixed away user causing duplicate entries
* Remove web3 validation
* renamed web3 button in integrations
* remove unused variable
* Add metadata column
* added loader and showToast to the web3 btn
* fix: remove smartContractAddress from info sended
* send to user events when the contract is missing
* use window.web3 instead of web3
* use NEXT_PUBLIC_WEB3_AUTH_MSG
* remove web3 auth from .env
* wip
* wip
* Add metamask not installed msg and success redirect
* add redirect when verified
* styled web3 button and added i18n to web3
* fixed redirect after verification
* wip
* wip
* moved crypto section to ee
Co-authored-by: Yuval Drori <53199044+yuvd@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@richelsen.net>
Co-authored-by: Yuval Drori <yuvald29@protonmail.com>
Co-authored-by: Omar López <zomars@me.com>
Co-authored-by: Edward Fernandez <edward.fernandez@rappi.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
* added new line fix, minor email validation
* fix: reorder controls hidden on more than 1 events #1452
Signed-off-by: arnabtarwani <arnab.tarwani@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* feat: add option to provide cancellation reason for email
* chore: move pos of getCancellationReason method in classes
* fix: only show cancellation reason if given
* test --wip
* --wip
* --wip
* --wip
* split language into organizer-attendees
* name fix for tAttendees
* --WIP
* added attendee locale migration, --WIP
* --wip
* fixed check types --wip
* updated person language type
* test snapshot updated
* --wip
* --WIP
* --WIP
* --WIP
* test changes revert
* cleanup
* removed extra space from test
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* Remove emailVerified not null from query
* Improve query to find existing user
* Add test suite to Signup from a Team Invite
* Allow importing modules with aliases
* Delete created data after all tests
* Resolve conflicts
* Use teampro instead of pro user and refactor code
* Use days start of the day offset minutes over days.utc()
* We do not need to set startOf("day") as day.utc() already starts from the beginning of the day with respective +h value
* do not use startOf if the invite date is already set with utc value, otherwise, it will double the utc +h * 2
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
- Before jumping into a PR be sure to search [existing PRs](https://github.com/calcom/cal.com/pulls) or [issues](https://github.com/calcom/cal.com/issues) for an open or closed item that relates to your submission.
## Developing
The development branch is `main`. This is the branch that all pull
requests should be made against. The changes on the `main`
branch are tagged into a release monthly.
To develop locally:
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your
own GitHub account and then
[clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
2. Create a new branch:
```sh
git checkout -b MY_BRANCH_NAME
```
3. Install yarn:
```sh
npm install -g yarn
```
4. Install the dependencies with:
```sh
yarn
```
5. Start developing and watch for code changes:
```sh
yarn dev
```
## Building
You can build the project with:
```bash
yarn build
```
Please be sure that you can make a full production build before pushing code.
## Testing
More info on how to add new tests coming soon.
### Running tests
This will run and test all flows in multiple Chromium windows to verify that no critical flow breaks:
```sh
yarn test-e2e
```
## Linting
To check the formatting of your code:
```sh
yarn lint
```
If you get errors, be sure to fix them before committing.
## Making a Pull Request
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating you PR.
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. Se more about [Linking a pull request to an issue
@@ -2,7 +2,7 @@ Copyright (c) 2020-present Cal.com, Inc.
Portions of this software are licensed as follows:
* All content that resides under "ee/" directory of this repository (Enterprise Edition) is licensed under the license defined in "ee/LICENSE".
* All content that resides under "apps/web/ee/" (https://github.com/calcom/cal.com/tree/main/apps/web/ee) directory of this repository (Enterprise Edition) is licensed under the license defined in "ee/LICENSE".
* All third party components incorporated into the Cal.com Software are licensed under the original license provided by the owner of the applicable component.
* Content outside of the above mentioned directories or restrictions above is available under the "AGPLv3" license as defined below.
@@ -666,4 +666,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
# Scheduling infrastructure for absolutely everyone.
# Scheduling infrastructure for absolutely everyone
The open source Calendly alternative. You are in charge
of your own data, workflow and appearance.
@@ -48,7 +51,7 @@ Calendly and other scheduling tools are awesome. It made our lives massively eas
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.
### Product of the Month: April
## Product of the Month: April
#### Support us on [Product Hunt](https://www.producthunt.com/posts/calendso?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-calendso)
@@ -65,7 +68,7 @@ That's where Cal.com comes in. Self-hosted or hosted by us. White-label by desig
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:
@@ -77,49 +80,68 @@ To get a local copy up and running, please follow these simple steps.
Here is what you need to be able to run Cal.
- Node.js
- Node.js (Version: >=14.x <15)
- PostgreSQL
- Yarn _(recommended)_
You will also need Google API credentials. You can get this from the [Google API Console](https://console.cloud.google.com/apis/dashboard). More details on this can be found below under the [Obtaining the Google API Credentials section](#Obtaining-the-Google-API-Credentials).
> 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](#integrations).
## Development
### Setup
1. Clone the repo into a public GitHub repository (to comply with AGPLv3. To clone in a private repository, [acquire a commercial license](https://cal.com/sales))
```sh
git clone https://github.com/calcom/cal.com.git
```
1. Go to the project folder
```sh
cd cal.com
```
1. Copy `apps/web/.env.example` to `apps/web/.env`
<summary>If you don't know how to configure the DATABASE_URL, then follow the steps here</summary>
<summary>If you don't know how to configure the DATABASE_URL, then follow the steps here to create a quick DB using Heroku</summary>
1. Create a free account with [Heroku](https://www.heroku.com/).
@@ -145,52 +167,66 @@ yarn dx
8. To view your DB, once you add new data in Prisma, you can use [Heroku Data Explorer](https://heroku-data-explorer.herokuapp.com/).
</details>
5. Set up the database using the Prisma schema (found in `prisma/schema.prisma`)
1. Set a 32 character random string in your .env file for the `CALENDSO_ENCRYPTION_KEY` (You can use a command like `openssl rand -base64 24` to generate one).
1. Set up the database using the Prisma schema (found in `apps/web/prisma/schema.prisma`)
```sh
npx prisma migrate deploy
yarn workspace @calcom/prisma db-deploy
```
6. Run (in development mode)
1. Run (in development mode)
```sh
yarn dev
```
7. Open [Prisma Studio](https://www.prisma.io/studio) to look at or modify the database content:
#### Setting up your first user
1. Open [Prisma Studio](https://www.prisma.io/studio) to look at or modify the database content:
```sh
yarn db-studio
```
npx prisma studio
```
8. Click on the `User` model to add a new user record.
9. Fill out the fields `email`, `username`, `password`, and set `metadata` to empty `{}` (remembering to encrypt your password with [BCrypt](https://bcrypt-generator.com/)) and click `Save 1 Record` to create your first user.
10. Open a browser to [http://localhost:3000](http://localhost:3000) and login with your just created, first user.
11. Set a 32 character random string in your .env file for the CALENDSO_ENCRYPTION_KEY.
1. Click on the `User` model to add a new user record.
1. Fill out the fields `email`, `username`, `password`, and set `metadata` to empty `{}` (remembering to encrypt your password with [BCrypt](https://bcrypt-generator.com/)) and click `Save 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 the `apps/web/prisma/schema.prisma` file.
1. Open a browser to [http://localhost:3000](http://localhost:3000) and login with your just created, first user.
### E2E-Testing
```bash
# In first terminal
```sh
# In first terminal. Must run on port 3000.
yarn dx
# In second terminal
yarn test-playwright
yarn workspace @calcom/web test-e2e
# To open last HTML report run:
yarn workspace @calcom/web playwright-report
```
### Upgrading from earlier versions
1. Pull the current version:
```
```sh
git pull
```
2. Apply database migrations by running <b>one of</b> the following commands:
In a development environment, run:
```
npx prisma migrate dev
```sh
yarn workspace @calcom/prisma db-migrate
```
(this can clear your development database in some cases)
In a production environment, run:
```
npx prisma migrate deploy
```sh
yarn workspace @calcom/prisma db-deploy
```
3. Check the `.env.example` and compare it to your current `.env` file. In case there are any fields not present
@@ -203,14 +239,18 @@ yarn test-playwright
```
4. Start the server. In a development environment, just do:
```
```sh
yarn dev
```
For a production build, run for example:
```
```sh
yarn build
yarn start
```
5. Enjoy the new version.
<!-- DEPLOYMENT -->
@@ -220,9 +260,15 @@ yarn test-playwright
The Docker configuration for Cal is an effort powered by people within the community. Cal.com, Inc. does not provide official support for Docker, but we will accept fixes and documentation. Use at your own risk.
If you want to contribute to the Docker repository, [reply here](https://github.com/calendso/docker/discussions/32).
If you want to contribute to the Docker repository, [reply here](https://github.com/calcom/docker/discussions/32).
The Docker configuration can be found [in our docker repository](https://github.com/calendso/docker).
The Docker configuration can be found [in our docker repository](https://github.com/calcom/docker).
@@ -234,22 +280,21 @@ You can deploy Cal on [Railway](https://railway.app/) using the button above. Th
## Roadmap
See the [open issues](https://github.com/calendso/calendso/issues) for a list of proposed features (and known issues).
See the [roadmap project](https://github.com/orgs/calcom/projects/1) for a list of proposed features (and known issues). You can change the view to see planned tagged releases.
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
Please see our [contributing guide](/CONTRIBUTING.md).
1. Fork the project
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Make your changes
4. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
5. Push to the branch (`git push origin feature/AmazingFeature`)
6. Open a pull request
### Good First Issues
## Obtaining the Google API Credentials
We have a list of [good first issues](https://github.com/calcom/cal.com/labels/✅%20good%20first%20issue) that contain bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.
## Integrations
### Obtaining the Google API Credentials
1. Open [Google API Console](https://console.cloud.google.com/apis/dashboard). 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.
2. In the search box, type calendar and select the Google Calendar API search result.
@@ -263,7 +308,7 @@ Contributions are what make the open source community such an amazing place to b
10. 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.
11. 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.
## Obtaining Microsoft Graph Client ID and Secret
### Obtaining Microsoft Graph Client ID and Secret
1. Open [Azure App Registration](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) and select New registration
2. Name your application
@@ -272,7 +317,57 @@ Contributions are what make the open source community such an amazing place to b
5. Use **Application (client) ID** as the **MS_GRAPH_CLIENT_ID** attribute value in .env
6. 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
### Obtaining Slack Client ID and Secret and Signing Secret
To test this you will need to create a Slack app for yourself on [their apps website](https://api.slack.com/apps).
Copy and paste the app manifest below into the setting on your slack app. Be sure to replace `YOUR_DOMAIN` with your own domain or your proxy host if you're testing locally.
Add the integration as normal - slack app - add. Follow the oauth flow to add it to a server.
Next make sure you have your app running `yarn dx`. Then in the slack chat type one of these commands: `/create-event` or `/today`
> NOTE: Next you will need to setup a proxy server like [ngrok](https://ngrok.com/) to allow your local host machine to be hosted on a public https server.
### Obtaining Zoom Client ID and Secret
1. Open [Zoom Marketplace](https://marketplace.zoom.us/) and sign in with your Zoom account.
2. On the upper right, click "Develop" => "Build App".
@@ -288,12 +383,13 @@ Contributions are what make the open source community such an amazing place to b
12. Click "Done".
13. You're good to go. Now you can easily add your Zoom integration in the Cal.com settings.
## Obtaining Daily API Credentials
### Obtaining Daily API Credentials
1. Open [Daily](https://www.daily.co/) and sign into your account.
2. From within your dashboard, go to the [developers](https://dashboard.daily.co/developers) tab.
3. Copy your API key.
4. Now paste the API key to your .env file into the `DAILY_API_KEY` field in your .env file.
1. Open [Daily](https://www.daily.co/) and sign into your account.
2. From within your dashboard, go to the [developers](https://dashboard.daily.co/developers) tab.
3. Copy your API key.
4. Now paste the API key to your .env file into the `DAILY_API_KEY` field in your .env file.
5. If you have the [Daily Scale Plan](https://www.daily.co/pricing) set the `DAILY_SCALE_PLAN` variable to `true` in order to use features like video recording.
<!-- LICENSE -->
@@ -314,3 +410,7 @@ Special thanks to these amazing projects which help power Cal.com:
Cal.com is an [open startup](https://jitsu.com) and [Jitsu](https://github.com/jitsucom/jitsu) (an open-source Segment alternative) helps us to track most of the usage metrics.
The official product, support and developer documentation, containing information and guides about using the product as well as support for self-hosted installations. This documentation site runs on [Nextra](https://nextra.vercel.app), so you may refer to their documentation should you need information on anything that isn't covered here.
## Prerequisites
- Git
- Node.js & npm
- Yarn
## Installation
Firstly, clone the repository using Git:
```console
git clone https://github.com/calcom/docs.git
```
Now, you can install the dependencies with yarn:
```console
yarn install
```
## Editing
To create, edit and delete documentation pages, you can simply create markdown (.mdx) files in the `pages/` folder. You can edit Markdown with any text editor, but VS Code and WebStorm have side-by-side previews so you can see your formatted content whilst writing markdown.
You will also need to add it as an entry to the `meta.json` file found in whichever directory that the .mdx file is in.
## Local Development
```console
yarn dev
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
## Build
```console
yarn build
```
This command generates static content into the `build` directory and can be served using any static content hosting service.
## How to easily contribute
## Existing Page
1. From the documentation's GitHub repository, head to the folder called 'pages' and open it.
2. From here you can view all current pages on the documentation site. Select the page you would like to contribute to.
3. You should now be able to view the page you have selected. Located at the top right of the page will be a pencil icon. Pressing this will bring you up an editor to edit and make changes. You can add formatting using the buttons at the top, which will automatically insert the relevant markdown content needed to style the text.
4. From here make the changes you wish to make.
5. At the bottom of the screen will be a 'Propose Changes' box, fill in all the relevant details such as title and description then press the green 'Propose Changes' button.
6. Your changes have been saved, to submit them for review, located on your screen, press the green 'Create Pull Request' button.
7. Fill in all the relevant details such as title and description and after finalize the submission.
You have now successfully edited and submitted changes to our documentation site.
## Creating a New Page
1. From the documentation's GitHub repository, head to the folder called 'pages' and open it.
2. From here you can view all current pages on the documentation site. At the top of your screen press the 'New file' button.
3. You should now be able to view the page you have created. Remember when renaming the document to put .mdx at the end of the file name.
4. From here make the changes you wish to make. Such as creating a title, sub-title and body text.
5. At the bottom of the screen will be a 'Propose Changes' box, fill in all the relevant details such as title and description then press the green 'Propose Changes' button.
6. Your changes have been saved, to submit them for review, located on your screen, press the greem 'Create Pull Request' button.
7. Fill in all the relevant details such as title and description and after finalize the submission.
You have now successfully created and submitted changes to our documentation site.
1. Go to [Your Availability](https://app.cal.com/availability) page within your cal.com account.
2. On the availability page you can manage your availability to suit your working day accordingly.
You can also troubleshoot your availability if your calendar does not look like it is blocking out the correct times.
## Troubleshooting availability
This will tell you when your calendar shows you as busy, so you can understand why Cal is blocking certain times.
## How to troubleshoot availability
1. Go to [Your Availability](https://app.cal.com/availability).
2. To the right of your screen a box saying 'Something doesn't look right?' will appear. Press the button 'Launch Troubleshooter'.
3. After pressing this, your availability will appear according to your calendar and inform you of the times booked up for that day!
By doing this you will know understand why certain times are available and others are blocked.
## In team settings availability set to only Mondays but the calendar shows availability on other days as well
It’s showing as available on days other than Monday because only you have set your availability to only Mondays, whereas the rest of the team haven't made that setting.
You are given FREE access for 14 days of our PRO subscription, you can use this to test and try out our product and see if it works for you. No credit card is required to sign up and you decide if you want to upgrade to a PRO subscription afterwards.
## How to cancel the trial
If you are looking to cancel the trial and want to downgrade to the free option you can contact our support team where we will be happy to help you make that change!
## How to upgrade
If you are looking at upgrading from our FREE subscription to our PRO subscription, head over to cal.com/upgrade where you can easily upgrade hassle free.
## How to downgrade
1. Go to your [Billing Settings](https://app.cal.com/settings/billing).
2. From here you can press the button called `Go to the billing Portal`. That will take you to the page where you can upgrade/downgrade your plan.
## How to delete your account
You can delete your account from within the [Settings](https://app.cal.com/settings/profile) option. Just scroll all the way down and click on `Delete Account`.
## Purchasing a premium username
We've reserved a ton of premium usernames, such as short handles or first names to prevent name squatters. To find out if your username is premium, head over to [cal.com/signup](https://cal.com/signup) and choose your desired username. From here you will be taken straight to checkout and after proceeding your Cal.com account will be created with your desired username.
## Manage your subscription
1. Go to your [Billing Settings](https://app.cal.com/settings/billing).
2. From here you can press the button called `Go to the billing Portal`.
3. This will take you to an external site provided by Stripe as they deal with all our payments.
Some users may not be able to access Billing as their billing email is different to their account email. If this is the case, you can change the email associated with your account in [Profile Settings](https://app.cal.com/settings/profile).
## Subscription for each team member
If your team requires multiple event types then each team member has to be subscribed to our paid plan. If that is something that isn’t necessary for your team, you can proceed with your FREE plan.
## Discount for non-profits and students
We offer 50% for non-profit organizations and students. Just raise a ticket with our support team and submit the necessary proof of status.
On the bookings page you are able to see upcoming and past events booked through your event type links. This page also lets you cancel or reschedule upcoming events users have scheduled.
## How to view bookings
1. Go to [your upcoming and past bookings](https://app.cal.com/bookings/upcoming).
2. On this page you can see upcoming and past events booked through your event type links.
## Reschedule bookings
1. Go to [your rescheduled bookings](https://app.cal.com/bookings/upcoming).
2. Hovering over the event you want to reschedule, click the button saying 'Reschedule'
3. Clicking 'Reschedule' will bring you to your Cal booking page. Select a new Time and Date.
4. After selecting this you can go ahead and click that 'Reschedule' Button!
5. After, you and your attendee will receive a new confirmation email of your new date and time.
## Cancel bookings
1. Go to [your cancelled](https://app.cal.com/bookings/cancelled).
2. Hovering over the event you want to cancel, click the button saying 'Cancel'
3. Once done, you will receive a confirmation message saying 'Really cancel your booking?'. After confirming you can go ahead and click the red 'Cancel' button at the bottom of your screen.
4. After, you and your attendee will receive a new confirmation email of your event being cancelled.
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
- Before jumping into a PR be sure to search [existing PRs](https://github.com/calcom/cal.com/pulls) or [issues](https://github.com/calcom/cal.com/issues) for an open or closed item that relates to your submission.
## Developing
The development branch is `main`. This is the branch that all pull
requests should be made against. The changes on the `main`
branch are tagged into a release monthly.
To develop locally:
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your
own GitHub account and then
[clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
2. Create a new branch:
```sh
git checkout -b MY_BRANCH_NAME
```
3. Install yarn:
```sh
npm install -g yarn
```
4. Install the dependencies with:
```sh
yarn
```
5. Start developing and watch for code changes:
```sh
yarn dev
```
## Building
You can build the project with:
```bash
yarn build
```
Please be sure that you can make a full production build before pushing code.
## Testing
More info on how to add new tests coming soon.
### Running tests
This will run and test all flows in multiple Chromium windows to verify that no critical flow breaks:
```sh
yarn test-e2e
```
## Linting
To check the formatting of your code:
```sh
yarn lint
```
If you get errors, be sure to fix them before comitting.
## Making a Pull Request
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating you PR.
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. Se more about [Linking a pull request to an issue
Adding or modifying CSS counts as changing the code, so as per [our license](https://github.com/calcom/cal.com/blob/main/LICENSE) you must either open-source your modified version or purchase an enterprise license.
</Callout>
Cal.com uses [TailwindCSS](https://tailwindcss.com) as a replacement for traditional CSS styling within the application, but some people prefer to add CSS styles themselves.
CSS files should be stored in the `styles` directory within the codebase.
Within the `styles` directory, you will find two CSS files, `fonts.css` and `global.css`. We suggest not to add to these files, and instead create new CSS files and import them into the application. This helps reduce conflicts when pulling in changes that we've made to either of the existing CSS files.
## Adding new stylesheets
Firstly, create the CSS file inside the `styles` directory.
Then, open the `pages/_app.tsx` file, and you will see the following two lines:
```javascript
import "../styles/fonts.css";
import "../styles/globals.css";
```
Duplicate one of these import statements and change the path to link to your new CSS stylesheet, like so:
```javascript
import "../styles/your-new-stylesheet.css";
```
<Callout type="warning" emoji="⚠️">
These styles will apply to all pages and components in your application.
</Callout>
Due to the global nature of stylesheets, and to avoid conflicts, you may **only import them inside `pages/_app.tsx`**.
Since Cal.com is open source we encourage developers to create new apps for others to use. This guide is to help you get started.
## Structure
All apps can be found under `packages/app-store`. In this folder is `_example` which shows the general structure of an app.
```sh
├──_example
|
| ├──api
| | ├──example.ts
| | ├──index.ts
|
| ├──components
| | ├──InstallAppButton.tsx
| | ├──index.ts
|
| ├──lib
| | ├──adaptor.ts
| | ├──index.ts
|
| ├──static
| | ├──icon.svg
|
| ├──index.ts
| ├──package.json
| ├──.env.example
| ├──README.mdx
```
## Getting Started
In the `package.json` name your package appropriately and list the dependencies needed for the package.
Next in the `.env.example` specify the environmental variables (ex. auth token, API secrets) that your app will need. In a comment add a link to instructions on how to obtain the credentials. Create a `.env` with your the filled in environmental variables.
In `index.js` fill out the meta data that will be rendered on the app page. Under `packages/app-store/index.ts`, import your app and add it under `appStore`. Your app should now appear in the app store.
Under the `/api` folder, this is where any API calls that are associated with your app will be handled. Since cal.com uses Next.js we use dynamic API routes. In this example if we want to hit `/api/example.ts` the route would be `{BASE_URL}/api/integrations/_example/example`. Export your endpoints in an `index.ts` file under `/api` folder and import them in your main `index.ts` file.
Under the `/components` folder, this is where the install button for your app should live. Follow the template under `_example` to add your on click action (ex. Redirecting to a log in page or opening a modal).
The `/lib` folder is where the functions of your app live. For example, when creating a booking with a MS Teams link the function to make the call to grab the link lives in the `/lib` folder. Export your endpoints in an `index.ts` file under `/lib` folder and import them in your main `index.ts` file.
On the app store page you can customize your apps description by adding a markdown file called `README.mdx`. If you do not add one then the description from you `package.json` will be used instead.
The `/static` folder is where you can store your app icon and any images that your `README.mdx` may use.
## Adding Your App to the App Store
To render your app on the app store page, go to `packages/app-store/index.ts`. Import your app into the file and add it to the `appStore` object.
Under `packages/app-store/components.tsx`, in the `InstallAppButtonMap` object dynamically import your install button. Your install button should live under `{your_app}/components`.
If you need any help feel free to join us on [Slack](https://cal.com/slack)
Keeping our code styles consistent is key to making the repository easy to read and work with.
We use a number of style guides written by other amazing companies, simply because they are widely used and because we like working with them.
We don't expect you to study every single rule of each style guide, but these are great reference points as to how your code should be styled. We may reject a pull request if your code style significantly differs from these style guides however.
## ESLint & Prettier
Calendso uses the ESLint and Prettier formatting tools, and the repository comes with defined rules for each tool. We recommend setting up both tools and using these to help automatically style your code to our guidelines.
## JavaScript/TypeScript
We use the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript) for all JavaScript and Typescript code.
## HTML & CSS
We use the [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.html) for any HTML and CSS markup. However, exceptions to the HTML guide apply where JSX differentiates from standard HTML.
As described in the [upgrade guide](https://docs.cal.com/self-hosting/upgrade), you should use the `yarn workspace @calcom/prisma db-migrate` or `yarn workspace @calcom/prisma db-deploy` command to update the database.
We use database migrations in order to handle changes to the database schema in a more secure and stable way. This is actually very common. The thing is that when just changing the schema in `schema.prisma` without creating migrations, the update to the newer database schema can damage or delete all data in production mode, since the system sometimes doesn't know how to transform the data from A to B. Using migrations, each step is reproducable, transparent and can be undone in a simple way.
## Creating migrations
If you are modifying the codebase and make a change to the `schema.prisma` file, you must create a migration.
To create a migration for your previously changed `schema.prisma`, simply run the following:
```sh
yarn workspace @calcom/prisma db-migrate
```
Now, you must create a short name for your migration to describe what changed (for example, "user_add_email_verified"). Then just add and commit it with the corresponding code that uses your new database schema.
:::caution
Always keep an eye on what migrations Prisma is generating. Prisma often happily will drop entire columns of data because it can't figure out what to do.
:::
## Error: The database schema is not empty
Prisma uses a database called `_prisma_migrations` to keep track of which migrations have been applied and which haven't. If your local migrations database doesn't match up with what's in the actual database, then Prisma will throw the following error:
```text
Error: P3005
The database schema for `localhost:5432` is not empty. Read more about how to baseline an existing production database: https://pris.ly/d/migrate-baseline
```
In order to fix this, we need to tell Prisma which migrations have already been applied.
This can be done by running the following command, replacing `migration_name` with each migration that you have already applied:
You can pre-fill a number of fields on the booking form by using their corresponding URL parameters. This can include the user’s name, email, or guests to be added to the booking.
Usually when they go to the link, all that is needed will be the time of the booking, and the form will be pre-filled with the information given.
Pre-filling booking fields can save a lot of time and speed up processes with filling out these forms, and assist with a smooth integration with your existing website or app.
You can pre-fill a user’s name and email address like so:
We have a number of requirements for PRs to ensure they are as easy to review as possible and to ensure that they are up to standard with the code.
### Title & Content
Start by providing a short and concise title. Don’t put something generic (e.g. bug fixes), and instead mention more specifically what your PR achieves, for instance “Fixes dropdown not expanding on settings page”.
For the PR description, you should go into much greater detail about what your PR adds or fixes. Firstly, the description should include a link to any relevant issues or discussions surrounding the feature or bug that your PR addresses.
#### Feature PRs
Give a functional overview of how your feature works, including how the user can use the feature. Then, share any technical details in an overview of how the PR works (e.g. “Once the user enters their password, the password is hashed using BCrypt and stored in the Users database field”).
#### Bug Fix PRs
Give an overview of how your PR fixes the bug both as a high-level overview and a technical explanation of what caused the issue and how your PR resolves this.
Feel free to add a short video or screenshots of what your PR achieves. Loom is a great way of sharing short videos.
### Code Quality & Styling
All submitted code must match our [code styling](/docs/code-styling) standards. We will reject pull requests that differ significantly from our standardised code styles.
All code is automatically checked by Codacy and our linting process, and will notify you if there are any issues with the code that you submit. We require that code passes these quality checks before merging.
## PR review process
At least two members of the Calendso team should review and approve any PR before it is merged.
Once two members of the team have approved this, someone from the team will merge the PR. If you are part of the Calendso team, you should merge your own PRs once you have received both approvals.
Event types allow you to create different events for different occasions when booking a time with you in your calendar. These can be named differently, have different time durations and the choice of platform can change.
## Creating an event type
1. Go to [Your Event Types](https://app.cal.com/event-types).
2. Click the button at the top right of your screen saying '+ New Event Type'.
3. Create the title of your new event.
4. Confirm the auto-generated event type URL.
5. Create a description on what your event will be used for.
6. Decide on the amount of minutes you wish for this event to last for.
7. Press 'Continue'
8. Your event has now been created!
## Editing event types
1. Go to [Your Event Types](https://app.cal.com/event-types).
2. Click anywhere within the box of the event you would like to edit.
(From here you can edit the basic settings of your event)
3. To get the advanced options, at the bottom of your event setting click 'Show Advanced Settings'
4. After you have finished editing the event type, scroll to the bottom of your page and select 'Update'
5. Your event type has now been updated.
## Deleting event types
1. Go to [Your Event Types](https://app.cal.com/event-types).
2. Click anywhere within the box of the event, just like you would if you were editing the event.
3. From this page, just to the right, a button saying 'delete' will appear. Click this and your event will be deleted!
## How to block a time slot before/after a meeting
You can block out a time frame in your calendar only after the meeting. You can do this by selecting `Show advanced settings` of your Event Type. The setting is labeled `Time-slot intervals`.
## Setting up specific availability for each type of Event
Head to `Show advanced settings` of your event. At the bottom you can set up specific availability for different Event Types.
## Availability not showing on a certain day in your calendar
Head over to your event and once you click on `Show advanced settings`, make sure your time zones are correct. Also, check if you have any calendar events scheduled that could overlap with your availability.
## People can't book me even though there is still a couple of hours left on my availability for today
Head over to your event and once you click on `Show advanced settings`, have a look at the `Minimum booking notice`. It probably overlaps with your availability so make sure that notice fits your desired time frame for meetings. For example, if someone wants to book a meeting with you at 16:15 and it’s already 15:30, your 90 minutes minimum booking notice doesn’t allow that meeting to be booked.
## Is there a possibility of multi-bookings for events where more people can book at the same time?
As it stands this is currently not possible. We always keep an eye on the limitations like these that our users point to us. We’ve had requests in the past for the multi-booking feature and this is on our priority list.
## How to quickly block further bookings?
1. Click on the lower left corner of your dashboard where your username is displayed.
2. That initates a dropdown menu. Click on `Set youself as away`.
This is a method to disable your Cal.com account which won't allow any bookings once initiated. However, bookings made before turning on *away mode* will still be booked.
When setting up your Cal.com account via the onboarding process, you can import data from other scheduling tools, such as Calendly or SavvyCal. All that you need to import your data is an access token, which you can retrieve from your Calendly/SavvyCal account.
Once you've pasted your access token, we import your account data in less than a second.
Naturally, we take security very seriously when it comes to importing your data from other accounts, so that's why we never store your access token, and use it once to query the Calendly/SavvyCal APIs, populate your account with the data it returns, and then your key is destroyed from memory. All of the importer code can be [freely viewed on GitHub](https://github.com/calcom/cal.com/tree/main/pages/api/import), so you can be assured we're not using your data for malicious purposes.
## Calendly
The following steps will help you retrieve your Calendly access token, which you will need to present at the import screen of the onboarding process.
1. Go to the Calendly website and click on **My Account** in the top right
2. Now click on **Integrations** in the top right
3. Scroll to the bottom and click on **API & Webhooks**
4. Click the blue **Generate new token** button and type in anything you'd like as the app name
5. Press **Copy token** and then paste it into the Cal.com importer
<Callout>
Even though we don't store your access token, you can press **Revoke** to destroy the access token from the **API & Webhooks** page once the import is complete.
</Callout>
## SavvyCal
The following steps will help you retrieve your SavvyCal access token, which you will need to present at the import screen of the onboarding process.
1. Head to the SavvyCal website and click **Settings** in the sidebar
2. Click the **Developers** tab, and under **Personal access tokens**, click the blue **Create a token** link
3. Give the token any name you'd like, and then confirm
4. Click to copy the token, and then paste the token into the Cal.com importer
<Callout>
Even though we don't store your access token, you can press the trash icon to revoke the access token from the **Developers** tab once the import is complete.
Welcome to our product documentation, where you can explore advice and explanations for all of our features, as well as discover new tips and tricks to get the most out of your subscription.
This is also the home of our design system documentation and developer docs.
If you don't already know what Cal.com is about, please head over to [our website](https://cal.com), where you can learn more about the product before venturing into the documentation.
Want to help make these docs even better? This site is fully open source, and the source code is available on [GitHub](https://github.com/calcom/docs). You can also click the edit button at the bottom of any page to start editing the source code and start a pull request.
Consider an instruction as a function with that name and that would be called with the given arguments.
### `inline`
Appends embed inline as the child of the element.
```javascript
Cal("inline", { elementOrSelector, calLink });
````
- `elementOrSelector` - Give it either a valid CSS selector or an HTMLElement instance directly
- `calLink` - Cal Link that you want to embed e.g. john. Just give the username. No need to give the full URL [https://cal.com/john](). It makes it easy to configure the calendar host once and use as many links you want with just usernames
### `ui`
Configure UI for embed. Make it look part of your webpage.
```javascript
Cal("inline", { styles });
```
- `styles` - It supports styling for `body` and `eventTypeListItem`. Right now we support just background on these two.
### preload
Usage:
If you want to open cal link on some action. Make it pop open instantly by preloading it.
```javascript
Cal("preload", { calLink });
```
- `calLink` - Cal Link that you want to embed e.g. john. Just give the username. No need to give the full URL [https://cal.com/john]()
## Actions
You can listen to an action that occurs in embedded cal link as follows. You can think of them as DOM events. We are avoiding the term events to not confuse it with Cal Events.
```javascript
Cal("on", {
action: "ANY_ACTION_NAME",
callback: (e)=>{
// `data` is properties for the event.
// `type` is the name of the action(You can also call it type of the action.) This would be same as "ANY_ACTION_NAME" except when ANY_ACTION_NAME="*" which listens to all the events.
// `namespace` tells you the Cal namespace for which the event is fired/
| eventTypeSelected | When user chooses an event-type from the listing. | eventType:object // Event Type that has been selected" |
| bookingSuccessful | When the booking is successfully done. It might not be confirmed. | confirmed: boolean; //Whether confirmation from organizer is pending or not <br/><br/>eventType: "Object for Event Type that has been booked"; <br/><br/>date: string; // Date of Event <br/><br/>duration: number; //Duration of booked Event <br/><br/>organizer: object //Organizer details like name, timezone, email |
| linkReady | Tells that the link is ready to be shown now. | None |
| linkFailed | Fired if link fails to load | code: number; // Error Code <br/><br/>msg: string; //Human Readable msg <br/><br/>data: object // More details to debug the error |
| __iframeReady | It is fired when the embedded iframe is ready to communicate with parent snippet. This is mostly for internal use by Embed Snippet | None |
| __windowLoadComplete | Tells that window load for iframe is complete | None |
| __dimensionChanged | Tells that dimensions of the content inside the iframe changed. | iframeWidth:number, iframeHeight:number |
The Google Calendar integration checks for availability in your Google Calendars and creates bookings for you.
## Removing Permissions for Cal to access your Google Account
1. Go to your [Google Account](https://myaccount.google.com/).
2. On the left, click Data & privacy.
3. Scroll to "Data from apps and services you use."
4. Under "Download or delete your data," click Delete a Google service. You may need to sign in again.
5. Next to the product you want to remove, click Delete.
6. Follow the steps on the screen.
To remove a product from your account that isn't listed in your Google Account, visit [Google Support](https://support.google.com) for more info on a specific product.
## Obtaining the Google API Credentials
1. Open [Google API Console](https://console.cloud.google.com/apis/dashboard). 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.
2. In the search box, type calendar and select the Google Calendar API search result.
3. Enable the selected API.
4. Next, go to the [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent) from the side pane. Select the app type (Internal or External) and enter the basic app details on the first page.
5. 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`, `.../auth/calendar` and select Update.
6. 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.
7. Now select [Credentials](https://console.cloud.google.com/apis/credentials) from the side pane and then select Create Credentials. Select the OAuth Client ID option.
8. Select Web Application as the Application Type.
9. Under Authorized redirect URI's, select Add URI and then add the URI `<CALENDSO URL>/api/integrations/googlecalendar/callback` replacing CALENDSO URL with the URI at which your application runs.
10. 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.
11. 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.
## Where to find the Google Meet integration?
Google Meet is a part of the Google Calendar integration and it should be available once you've added your Google Calendar. Just select Google Meet as location for your Event Type:
1. Go to your `Event Types`.
2. Click on the `Location` drop-down menu.
3. Select Google Meet as the location of your meeting.
Once your Event Type slot is booked, it will automatically generate the Google Meet link for the meeting.
The Outlook integration enables you to use your outlook.com or Microsoft 365 account to use for conflict checking and event bookings.
## Obtaining Microsoft Graph Client ID and Secret
1. Open [Azure App Registration](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) and select New registration
2. Name your application
3. Set **Who can use this application or access this API?** to **Accounts in any organizational directory (Any Azure AD directory - Multitenant)**
4. Set the **Web** redirect URI to `<CALENDSO URL>/api/integrations/office365calendar/callback` replacing CALENDSO URL with the URI at which your application runs.
5. Use **Application (client) ID** as the **MS_GRAPH_CLIENT_ID** attribute value in .env
6. Click **Certificates & secrets** create a new client secret and use the value as the **MS_GRAPH_CLIENT_SECRET** attribute
## Removing Permissions for Cal to access your Microsoft Workplace Account
Hover over Cal.com in the my apps portal, then select `manage your application`.
The top part of permissions window shows what you personally consented to. Examples of apps permissions include the ability to access your calendar, contacts, or camera.
You can revoke any of the permissions you consented to by selecting `Revoke Permissions`, however removing a permission may break some of the apps functionality. If you have problems after you remove permissions or accounts, contact your organization's Helpdesk for additional assistance.
If you require more help, head over the Microsoft Documentation Page about [Managing Applications](https://docs.microsoft.com/en-us/azure/active-directory/user-help/my-applications-portal-permissions-saved-accounts)
The Zoom integration automatically creates Zoom meetings for your bookings.
## Connecting your Zoom account
1. Go to the App Store page, and click the 'Add new integration' button.
2. Next to Zoom, go ahead and click the 'Add' button.
3. You will now be taken to Zoom to sign into your account and authorize Cal.
## Disconnecting your Zoom account
1. Go to the App Store page, and click on your Zoom integration in the list.
2. On the right hand side, click the Delete App button.
This will remove the integration from Cal. Cal will not perform any actions on your account once the integration is removed. However, if you want to revoke Cal's permissions from your Zoom account, perform the following steps:
1. Log into your Zoom account and navigate to the App Marketplace
2. Click Manage > Installed Apps or search for the Cal app
3. Click on the Cal app
4. Click Uninstall
## How we interact with your Zoom account
We only need the ability to create meetings, so when somebody books an event with you, Cal can communicate with Zoom and create the corresponding meeting.
## Setting up Zoom on your self-hosted instance
1. Open [Zoom Marketplace](https://marketplace.zoom.us/) and sign in with your Zoom account.
2. On the upper right, click "Develop" => "Build App".
3. On "OAuth", select "Create".
4. Name your App.
5. Choose "User-managed app" as the app type.
6. De-select the option to publish the app on the Zoom App Marketplace.
7. Click "Create".
8. Now copy the Client ID and Client Secret to your .env file into the `ZOOM_CLIENT_ID` and `ZOOM_CLIENT_SECRET` fields.
9. Set the Redirect URL for OAuth `<CALENDSO URL>/api/integrations/zoomvideo/callback` replacing CALENDSO URL with the URI at which your application runs.
10. Also add the redirect URL given above as an allowlist URL and enable "Subdomain check". Make sure it says "saved" below the form.
11. 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`.
12. Click "Done".
13. You're good to go. Now you can easily add your Zoom integration in the Cal settings.
The Docker configuration for Cal is an effort powered by people within the community. Cal does not provide official support for Docker, but we will accept fixes and documentation. Use at your own risk.
The Docker configuration can be found [in our docker repository](https://github.com/calcom/docker).
## Requirements
Make sure you have `docker` & `docker-compose` installed on the server / system.
5. Open a browser to [port 5555](http://localhost:5555) on your localhost to look at or modify the database content.
6. Click on the `User` model to add a new user record.
7. Fill out the fields (remembering to encrypt your password with [BCrypt](https://bcrypt-generator.com/)) and click `Save 1 Record` to create your first user.
8. Open a browser to [port 3000](http://localhost:3000) on your localhost and login with your just created, first user.
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
- 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 category.
4. Once you clicked on `Configure Add-ons`, click on `Find more add-ons` and search for `postgres`. One of the options will be `Heroku Postgres` - click on that option.
8. To view your DB, once you add new data in Prisma, you can use [Heroku Data Explorer](https://heroku-data-explorer.herokuapp.com/).
</details>
1. Set a 32 character random string in your `apps/web/.env` file for the `CALENDSO_ENCRYPTION_KEY` (You can use a command like `openssl rand -base64 24` to generate one).
1. Set up the database using the Prisma schema (found in `packages/prisma/schema.prisma`)
```sh
yarn workspace @calcom/prisma db-deploy
```
1. Run (in development mode)
```sh
yarn dev
```
### Setting up your first user
1. Open [Prisma Studio](https://www.prisma.io/studio) to look at or modify the database content:
```sh
yarn db-studio
```
1. Click on the `User` model to add a new user record.
1. Fill out the fields `email`, `username`, `password`, and set `metadata` to empty `{}` (remembering to encrypt your password with [BCrypt](https://bcrypt-generator.com/)) and click `Save 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 the `prisma/schema.prisma` file.
1. Open a browser to [port 3000](http://localhost:3000) and login with your just created, first user.
2. Copy the `.env.example` file in `apps/web`, rename it to `.env` and fill it with your settings ([See manual setup](https://github.com/calcom/cal.com#manual) and [Obtaining the Google API Credentials](https://github.com/calcom/cal.com#obtaining-the-google-api-credentials))
3. Install packages with `yarn`
```bash
yarn install
```
4. Set up the database using the Prisma schema (found in `packages/prisma/schema.prisma`)
```sh
yarn workspace @calcom/prisma db-deploy
```
5. Open [Prisma Studio](https://www.prisma.io/studio) to look at or modify the database content:
```
yarn db-studio
```
6. Click on the `User` model to add a new user record.
7. Fill out the fields (remembering to encrypt your password with [BCrypt](https://bcrypt-generator.com/)) and click `Save 1 Record` to create your first user.
8. Open a browser to [port 3000](http://localhost:3000) on your localhost and login with your just created, first user.
### Deployment
1. Create a new project on Vercel
1. Import from your forked repository
1. Set the Environment Variables
1. Set the root directory to `apps/web`
1. Override the build command to `cd ../.. && yarn build`
1. Go to your [Profile Settings](https://app.cal.com/settings/profile).
2. From this page you are able to edit the following:
- Your URL Username
- Your Display Name
- Your About Information
- Change your Profile Picture
- Your Local Time Zone
- Your Chosen 'First Day Of The Week'
- Light or Dark Mode for your Booking Page
- Enabling or Disabling cal.com Branding on your Booking Page
3. Once you have completed all your changes, press that 'save' button located at the bottom right of your page.
## Reset your password
1. Go to [your account security settings](https://app.cal.com/settings/security).
2. Located at the top of your screen, you will see two boxes.
3. Enter your Old Password and New Password.
4. Click the button 'Save' located to the bottom right of your new password.
5. You have now successfully changed your password!
## Change your email
Go to [Profile Settings](https://app.cal.com/settings/profile). There, you will see the email associated with your account which you can then update. You’d just need to log out and back in to see the change take effect.
## Enable 2FA
1. Go to [Your Account Security Settings](https://app.cal.com/settings/security).
2. Located at the bottom of your screen, click on the tab labeled 'Enable Two-Factor Authentication'.
3. Enter your Password.
4. In your authenticator app, scan the QR Code presented on your screen.
5. Once Scanned, press 'Next' and then enter the code presented within your Authentication App
6. Press 'Enabled'
You have now successfully enabled Two-Factor Authentication
## Disable 2FA
1. Go to [Your Account Security Settings](https://app.cal.com/settings/security).
2. Located at the bottom of your screen, click on the tab labeled 'Disable Two-Factor Authentication'.
3. Enter your Password.
You have now successfully disabled Two-Factor Authentication
## How to delete my account
You can delete your account from within the [Settings](https://app.cal.com/settings/profile) option. Just scroll all the way down and click on `Delete Account`.
## How to change the language
Go to your [Profile Settings](https://app.cal.com/settings/profile). Under `Language` you will see the dropdown menu and you can use it to select your desired language.
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams).
2. Press the button displayed on your screen called '+ New Team'
3. Enter the name you wish to call your team.
4. After entering the name press the 'Create Team' button located just under your new team name.
5. You have now created your new team.
Creating a team will allow you to create new event types for the team, invite team members and much more!
## How do I change my teams URL?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams) and select the team you wish to edit.
2. Located at the top of your teams settings will be a team-url bar, from here you can input your requested teams url.
3. Once complete make sure you press 'save' at the bottom of the page.
## How do I change my teams name?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams) and select the team you wish to edit.
2. Located in the 2nd row of your teams settings will be a Team Name bar, from here you can input your requested team name.
3. Once complete make sure you press 'save' at the bottom of the page.
## How do I add and remove a description of my team?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams) and select the team you wish to edit.
2. Located below your team name entry box is a large text box labeled 'About',
## How do I upload my team logo?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams) and select the team you wish to edit.
2. Located under your teams subscription will be a box that says 'Upload a logo', press this box.
3. Press 'choose a file' and locate a file from your machine you wish to use as your team logo.
4. Once complete make sure you press 'save' at the bottom of the page.
## How do I manage team members?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams) and select the team you wish to edit.
2. Located at the bottom of your page is your team members, from here you can choose to add or remove team members and even change their role which could be Member, Admin or Owner.
## How do I delete my team I created?
1. Go to [Your Teams Settings](https://app.cal.com/settings/teams).
2. From here you will be able to see a list of teams you have created or apart of, located to the right of the team you wish to delete you can find three dots (...)
3. Press the 3 dots (...) then 'Disband Team'
4. This will brin gup a prompt confirming if you wish to disband your team, if your are sure you can press the button labeled 'Yes, disband team'
Your team has now successfully been deleted.
## Where can I find my team's Event Types?
Once you open `Event Types` on your dashboard, you will find your team's Event Types below your individual ones.
1. Go to [Your Integrations](https://app.cal.com/integrations).
2. Scrolling down to the bottom of the page you will see a button called ‘New Webhook’. Press this button to open up the box which will ask for details on creating the new webhooks.
3. Select whatever event this triggers, this may be Create, Cancelled or Reschedule.
4. Once this is completed, insert the Subscriber URL then click 'Save' located at the bottom right of the box.
## Edit an existing Webhook
1. Go to [Your Integrations](https://app.cal.com/integrations).
2. Scrolling down to the bottom of the page you will see an icon to the right of your webhook, this will be labeled edit webhook.
3. Press the button and from here you can change any of the webhook settings. This could be changing the event that is triggered and this may be Create, Cancelled or Reschedule. Or you can change the Subscriber URL.
## Delete an existing Webhook
1. Go to [Your Integrations](https://app.cal.com/integrations).
2. Scrolling down to the bottom of the page you will see an icon to the right of your webhook, this will be labeled delete webhook.
3. Press the button and from here your webhook will no longer work and be deleted.
## Webhook metadata
Metadata is a way to pass extra information to Cal.com about a booking that is returned through a webhook.
### Example
The best way to explain this is with an example. Let's say you're a bank, and people register an account on your website, but you want them to book an onboarding call with your team to get set up. You could send them to your Cal.com booking link as part of your onboarding process, but when the webhook is returned, it may be difficult to match up which user booked a meeting with the user's account in your own database. Hence, you can pass a `user_id` value for instance as a URL parameter, which makes no difference to the booking process, but when the webhook is returned, you will receive the metadata as part of the webhook payload.
Metadata is passed as a URL parameter on top of your booking link and follows the following syntax:
```text
metadata[key_name]=value
```
For example, if your booking link is `cal.com/rick/quick-chat`, you can pass a user ID of 123 like so:
```text
cal.com/rick/quick-chat?metadata[user_id]=123
```
As a result, the webhook will be returned in this format:
Customizable webhooks are a great way reduce the development effort and in many cases remove the need for a developer to build an additional integration service. Using a custom template you can easily decide what data you receive in your webhook endpoint, manage the payload and setup related workflows accordingly. Here’s a breakdown of the payload that you would receive via an incoming webhook.
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.