calit

Self-hosted, multi-user Calendly alternative. Scheduling you own

  • ghcr.io/hsinghhira/calit:latest
  • v1.28.1
  • Updated 29 Oct 2026
  • port 6137
  • amd64 · arm64
  • Productivity
  • 11 stars

Screenshots

calit screenshot 1: Public landing pagecalit screenshot 2: Booking pagecalit screenshot 3: Owner dashboardcalit screenshot 4: Booking confirmation

Open the app

Dashboard

http://localhost:6137/me

First Setup

http://localhost:6137/setup

About calit

calit is a scheduling app you host yourself, like Calendly. Every user gets their own booking pages: people pick a free time and book, and both sides get an email. This is calit in a single container, with PostgreSQL inside, one port and one data folder. Secret keys are made for you on first start.

Features

  • Booking pages per user and meeting type, with buffers, minimum notice and how far ahead people can book
  • Weekly availability with date-by-date changes
  • Optional approval before a booking is confirmed
  • Extra questions on the booking form, reminder emails
  • Optional Google Calendar sync with Google Meet links, and CalDAV
  • Several users, with an admin to manage them; optional sign-in with OIDC (Authelia, Authentik, Pocket ID)
  • Spam protection (Cloudflare Turnstile or self-hosted ALTCHA), notifications to Telegram, Slack, Discord, ntfy or Gotify
  • PostgreSQL inside

How to use

  1. Open calit from your dashboard. The first visit goes to /setup.
  2. Create the first user. It is the admin.
  3. Make a meeting type and set when you are free.
  4. Share your booking page, http://[ZIMAOS-IP-ADDRESS]:6137/<your user name>.

Before you install

Change localhost in PUBLIC_URL to your ZimaOS IP, like http://192.168.1.20:6137; every booking link and email link starts with it. Fill in MAIL_HOST, MAIL_USERNAME, MAIL_PASSWORD and MAIL_FROM with your email server: calit sends every confirmation and reminder by email, and without them bookings still work but nobody is told (the mail waits and goes out once you set them). There is no default password: the first visit goes to /setup, where you make the admin account. Google Calendar sync needs an https address. Every other setting is optional and listed in the Variables tab. To use one, add it in the app settings with your value; a setting you leave out keeps its default. The first start takes about a minute.

The settings in the first table are already in the app settings. To use any other one, open the app settings, add the variable with your value, save, and the app restarts with it. A setting you leave out uses its default.

In the app settings

VariableDefault valueDescription
TZ$TZYour time zone. It is filled in from your ZimaOS time zone. Leave it unless you need another.
PUBLIC_URLhttp://localhost:6137The address people open your booking pages at. Every booking link and email link starts with it. It starts as localhost, which only works on this device: change localhost to your ZimaOS IP, like http://192.168.1.20:6137, or set your https address. Keep the port at 6137 unless you use a domain.
MAIL_HOST—Your email server, like smtp.gmail.com. calit sends every booking confirmation, reminder and password reset by email. Left blank, bookings still work but nobody gets an email; the mail waits and goes out once you set this.
MAIL_USERNAME—The user name for your email server, usually your email address.
MAIL_PASSWORD—The password for your email server. For Gmail, use an app password.
MAIL_FROM—The address emails come from, like [email protected].

Email (SMTP)

VariableDefault valueDescription
MAIL_PORT587Your email server port. For 465, also set MAIL_TLS to true and MAIL_START_TLS to OPTIONAL.
MAIL_START_TLSREQUIREDREQUIRED for port 587 (STARTTLS), OPTIONAL for port 465.
MAIL_TLSfalseSet to true for port 465 (TLS from the start).

Sign-up and accounts

VariableDefault valueDescription
SIGNUP_ENABLEDfalseSet to true to let anyone make an account. Otherwise the admin adds users at /me/users.

Sign in with OIDC

VariableDefault valueDescription
OIDC_ENABLEDfalseSet to true to show "Sign in with SSO" (Authelia, Authentik, Pocket ID and others).
OIDC_ISSUER_URL—Your provider's address, like https://auth.example.com.
OIDC_CLIENT_ID—The client ID from your provider.
OIDC_CLIENT_SECRET—The client secret from your provider.
OIDC_ADMIN_GROUP—Members of this provider group become calit admins. Leave it out for none.

Google Calendar

VariableDefault valueDescription
GOOGLE_OAUTH_CLIENT_ID—Your Google OAuth client ID, for Calendar sync and Meet links. In Google, add PUBLIC_URL/api/google/callback and PUBLIC_URL/api/google/login/callback as redirect URIs. Google needs an https address or localhost.
GOOGLE_OAUTH_CLIENT_SECRET—Your Google OAuth client secret.
GOOGLE_PROBE_INTERVAL1hHow often each Google connection is checked, like 30m or 1h.

Calendars

VariableDefault valueDescription
CALDAV_ALLOW_PRIVATE_HOSTSfalseSet to true to use a CalDAV server on your own network.

Bookings

VariableDefault valueDescription
REMINDER_LEAD_MINUTES1440How many minutes before a meeting the reminder email goes out.
APPROVAL_HOLD_HOURS24How many hours a booking waits for approval before it expires.
PER_EMAIL_DAILY_CAP10Most bookings one email address can make in a day.
INVITEE_ERASUREtrueSet to false so guests can't erase their own data from the manage link.
BOOKING_RETENTION_DAYS—Anonymise bookings this many days after they end, like 730. Leave it out to keep them.

Spam protection

VariableDefault valueDescription
CAPTCHA_PROVIDERnonenone, turnstile or altcha (self-hosted, no outside service).
ALTCHA_HMAC_KEY—A long random secret. Needed when CAPTCHA_PROVIDER is altcha.
ALTCHA_MAX_NUMBER100000How hard the ALTCHA puzzle is.
TURNSTILE_ENABLEDfalseSet to true to use Cloudflare Turnstile.
TURNSTILE_SITE_KEY—Your Turnstile site key.
TURNSTILE_SECRET_KEY—Your Turnstile secret key.

Notifications

VariableDefault valueDescription
NOTIFY_ALLOWED_SCHEMES*Which notification channels users may add, like telegram,slack,discord,gotify,ntfy. * allows all.
NOTIFY_ALLOW_PRIVATEtrueSet to false so users can't send notifications to addresses on your network.
NOTIFY_MAX_ATTEMPTS3How many times a notification is tried.

Privacy page

VariableDefault valueDescription
OPERATOR_NAME—Your name or company, shown on /privacy and /terms.
PRIVACY_CONTACT_EMAIL—The email shown on /privacy for data requests.
GOOGLE_SITE_VERIFICATION—A Google Search Console verification token.

Keys

VariableDefault valueDescription
SESSION_ENCRYPTION_KEY—Leave it out: each install makes its own on first start. Changing it signs everyone out.
TOKEN_ENCRYPTION_KEY—64 hex characters. Leave it out: each install makes its own on first start. Never change it afterwards, or Google connections stop working.

Logs

VariableDefault valueDescription
QUARKUS_LOG_LEVELINFODEBUG, INFO, WARN or ERROR.
docker-compose.yml
name: calit

services:
  calit:
    image: ghcr.io/hsinghhira/calit:latest
    container_name: calit
    restart: unless-stopped
    stop_grace_period: 90s
    privileged: true
    environment:
      - TZ=$TZ
      - PUBLIC_URL=http://localhost:6137
      - MAIL_HOST=
      - MAIL_USERNAME=
      - MAIL_PASSWORD=
      - MAIL_FROM=
    ports:
      - target: 8080
        published: "6137"
        protocol: tcp
    volumes:
      - type: bind
        source: /DATA/AppData/$AppID/data
        target: /data
        bind:
          create_host_path: true
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:8080/q/health/live"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 180s
    deploy:
      resources:
        limits:
          cpus: "2.00"
          memory: 1536M
        reservations:
          cpus: "0.00"
          memory: 384M
    labels:
      icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/icon.png
    x-casaos:
      id: com.icestore.calit
      envs:
        - container: TZ
          description:
            en_US: >-
              Your time zone. It is filled in from your ZimaOS time zone.
              Leave it unless you need another.
        - container: PUBLIC_URL
          description:
            en_US: >-
              The address people open your booking pages at. Every booking
              link and email link starts with it. It starts as localhost,
              which only works on this device: change `localhost` to your
              ZimaOS IP, like http://192.168.1.20:6137, or set your https
              address. Keep the port at 6137 unless you use a domain.
        - container: MAIL_HOST
          description:
            en_US: >-
              Your email server, like smtp.gmail.com. calit sends every
              booking confirmation, reminder and password reset by email.
              Left blank, bookings still work but nobody gets an email; the
              mail waits and goes out once you set this.
        - container: MAIL_USERNAME
          description:
            en_US: >-
              The user name for your email server, usually your email
              address.
        - container: MAIL_PASSWORD
          description:
            en_US: >-
              The password for your email server. For Gmail, use an app
              password.
        - container: MAIL_FROM
          description:
            en_US: >-
              The address emails come from, like [email protected].
      ports:
        - container: "8080"
          description:
            en_US: calit web pages (booking pages and dashboard), published on host as 6137
      volumes:
        - container: /data
          description:
            en_US: >-
              The PostgreSQL database (postgres) and this install's own keys
              (state/secrets.env). Back this folder up; Google connections
              can't be read without the keys.

x-casaos:
  id: com.icestore.calit
  architectures:
    - amd64
    - arm64
  main: calit
  author: HSinghHira
  category: Productivity
  developer: asm0dey
  icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/icon.png
  thumbnail: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/screenshot-1.png
  screenshot_link:
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/screenshot-1.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/screenshot-2.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/screenshot-3.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/calit/screenshot-4.png
  title:
    en_US: calit
  tagline:
    en_US: Self-hosted, multi-user Calendly alternative. Scheduling you own
  description:
    en_US: >-
      calit is a scheduling app you host yourself, like Calendly. Every user
      gets their own booking pages: people pick a free time and book, and
      both sides get an email. This is calit in a single container, with
      PostgreSQL inside, one port and one data folder. Secret keys are made
      for you on first start.


      **Features**


      - Booking pages per user and meeting type, with buffers, minimum
        notice and how far ahead people can book

      - Weekly availability with date-by-date changes

      - Optional approval before a booking is confirmed

      - Extra questions on the booking form, reminder emails

      - Optional Google Calendar sync with Google Meet links, and CalDAV

      - Several users, with an admin to manage them; optional sign-in with
        OIDC (Authelia, Authentik, Pocket ID)

      - Spam protection (Cloudflare Turnstile or self-hosted ALTCHA),
        notifications to Telegram, Slack, Discord, ntfy or Gotify


      **How to use?**


      1. Open calit from the Zima OS dashboard. The first visit goes to
         /setup.

      2. Create the first user. It is the admin.

      3. Make a meeting type and set when you are free.

      4. Share your booking page, http://[ZIMAOS-IP-ADDRESS]:6137/<your user
         name>.
  tips:
    before_install:
      en_US: >-
        1. Set PUBLIC_URL. Change `localhost` to your ZimaOS IP, like
           http://192.168.1.20:6137 (booking links and email links use it).


        2. Fill in MAIL_HOST, MAIL_USERNAME, MAIL_PASSWORD and MAIL_FROM with
           your email server. Without them nobody gets booking emails.


        3. If your email server uses port 465 instead of 587, add MAIL_PORT,
           MAIL_TLS and MAIL_START_TLS (see the Variables tab below).


        4. More settings, like Google Calendar, sign-up and single sign-on,
           are listed on the calit page at
           https://icestore.hsinghhira.me/app/calit/ (Variables tab). You can
           add them now or later in the app settings.


        5. Start the installation. The first start takes about 1 minute.


        6. Open http://[ZIMAOS-IP-ADDRESS]:6137 and you land on the setup
           page.


        7. Create your account. The first account is the admin.
  index: /
  port_map: "6137"
  scheme: http
  is_uncontrolled: false
  version: "1.28.1"
  update_at: "2026-10-29"
  release_notes:
    en_US: |-
      - First version in IceStore, on port 6137
      - Single container: calit and PostgreSQL 18 inside, one data folder
      - Built on ghcr.io/asm0dey/calit 1.28.1
      - Session, token and Google state keys are made on first start and kept in /data/state/secrets.env
      - Works on a plain http:// address on your network (the CSRF cookie is only forced secure on https)
  repo: "https://github.com/asm0dey/calit"
  support: "https://github.com/asm0dey/calit/issues"
  docs: "https://asm0dey.github.io/calit/"

Install calit

Something not working with calit? Report a problem or request another app.

More Productivity apps

See all