Invite others to grab times on your calendar. Choose a date. Make appointments as easy as it gets. https://appointment.tb.pro
  • Python 50.2%
  • Vue 23.1%
  • TypeScript 13.1%
  • HCL 3.9%
  • JavaScript 3.2%
  • Other 6.4%
Find a file
Andreas 476c797f18
Improve setup instructions (#1523)
* 📜 Simplify setup instructions (wip)

* 📜 Simplify setup instructions

* 📜 Enumerate installation steps

* 🔨 Improve step 2 description

* 🔨 Improve step 1 commands
2026-02-26 21:33:19 +01:00
.github First set of E2E tests on iOS (#1377) 2026-01-06 16:49:59 -05:00
backend Bump version to v1.2.1 (#1536) 2026-02-25 17:07:11 -06:00
docs Improve setup instructions (#1523) 2026-02-26 21:33:19 +01:00
frontend Bump the npm_and_yarn group across 2 directories with 2 updates (#1537) 2026-02-26 10:56:37 -06:00
legal Update Privacy Policy + Legal Tweaks (#790) (Fixes #789) 2024-12-11 15:05:27 -08:00
pulumi Add Davi to admin list (#1530) 2026-02-25 12:57:10 -06:00
test/e2e Bump the npm_and_yarn group across 2 directories with 2 updates (#1537) 2026-02-26 10:56:37 -06:00
tofu Lock TF IAM module version (#1186) 2025-08-14 11:23:21 -06:00
.editorconfig First Time User Experience (#502) 2024-07-02 14:49:27 -07:00
.gitignore Thunderbird Accounts Auth (#955) 2025-03-26 10:36:12 -07:00
docker-compose.yml Remove old JSONified secrets from prod (#1278) 2025-09-30 12:08:03 -06:00
LICENSE Add MPL 2.0 license file. 2024-01-17 14:57:15 -08:00
README.md Improve setup instructions (#1523) 2026-02-26 21:33:19 +01:00

Thunderbird Appointment

Invite others to grab times on your calendar. Choose a date. Make appointments as easy as it gets.

Feedback and Support

If you'd like to give feedback or need support, please see our Topicbox.

Get started

Using Docker is the recommended and for now the only supported method of building and developing Thunderbird Appointment. A detailed technical documentation of the application architecture can be found in the docs folder (still work-in-progress).

Installation

  1. Get the application files and create your .env files from the examples:

    git clone https://github.com/thunderbird/appointment
    cd appointment
    cp backend/.env.example backend/.env
    cp frontend/.env.example frontend/.env
    
  2. Make sure, that the backend/.env file contains APP_ALLOW_FIRST_TIME_REGISTER=True. This will enable the creation of your first admin user. If you want to be able to access admin-only pages, add your account's email address to the APP_ADMIN_ALLOW_LIST env variable.

  3. Build and run the service in docker:

    docker-compose up -d --build
    

    This will create and start 5 different containers (backend, frontend, postgres, redis and mailpit).

  4. Check if all containers are running. On first-run the database will initialize, and a first time setup command will be triggered (going forward database migrations will automatically run on docker-compose up). Check if the database contains tables, e.g. the subscriber table (still empty at this point).

Authentication

Appointment includes simple password-based authentication. This is meant for developing and testing Appointment, but can also be used when self-hosting the app.

When you access the frontend the first time, you will see a first-time-user login form. Enter the email address you configured in your allow list (see Step 2 in the installation process above) and a password. This login will create the first user (also called 'subscriber' in Appointment) granting you access to the application. Any login attempts with other email addresses after that will check against existing credentials.

Note

For Thunderbird Services, we use our own OIDC provider Thunderbird Accounts. If you're starting fresh with Thunderbird Accounts, please review the documentations setting it up.

Contributing

Contributions are very welcome. Please lint/format code before creating PRs.

Check out the project's respective readmes:

Localization

This project uses Fluent for localization. Files are located in their respective l10n/<locale>/*.ftl.

Deployment

When changes are merged to main, a new release is cut, and the changes are deployed to stage.appointment.day.

After you've checked staging and it's ready to push to production, edit the release entry, and press the 'Publish release' button.