jafoers/kalkee

A minimal, customizable, keyboard-first calendar with Google Calendar and CalDAV sync.

JavaScript

1

0 commits

updated Sep 9, 2026

See the code

See what people are saying

README

Kalkee

A fast, minimal, customizable, keyboard-first calendar web app. Kalkee provides remappable shortcuts, quick and intuitive navigation, as well as Google Calendar or CalDAV sync.

Kalkee week view using Frosted Glass with white and plum events

See more themes and calendar views

Ochre Forest · Week

Kalkee week view using the Ochre Forest theme

Midnight · Month

Kalkee month view using Midnight with cobalt and coral events

Ochre Forest · Month

Kalkee month view using the Ochre Forest theme

Features

  • Intuitive only keyboard navigation across week, month, and multi-day views
  • Dependency-free browser client
  • Remappable actions in a dedicated shortcut editor
  • Two-way Google Calendar and CalDAV event sync
  • Customizable appearance settings and preset themes
  • Docker and native Node.js deployment

Run locally

Requirement: Node.js 20 or newer. Provider credentials are only needed for synchronization.

cp .env.example .env
npm install
npm start

Open http://localhost:3000. Without a connected provider, Kalkee starts in local preview mode with sample events.

Generate a session-encryption secret if you intend to use CalDAV or want a key independent of the Google client secret:

openssl rand -hex 32

Save it as CALENDAR_SESSION_SECRET in .env. Without an encryption secret, CalDAV still works, but its login only lasts until the server restarts.

Google Calendar

To connect Google Calendar:

  1. Create a Google OAuth web client and enable the Google Calendar API.
  2. Add http://localhost:3000 as an authorized redirect URI.
  3. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in .env.
  4. Restart Kalkee and select Google.

For another hostname or port, set GOOGLE_REDIRECT_URI and register that exact HTTPS URI in Google Cloud. The scheme, host, port, path, and trailing slash must match.

CalDAV

Select CalDAV and enter a server or calendar URL, your username, and a password or app password. Kalkee discovers the available event calendars and lets you choose which one to connect. For example, a Nextcloud collection commonly looks like:

https://cloud.example.com/remote.php/dav/calendars/username/calendar-name/

Kalkee currently uses CalDAV Basic authentication, which is intended for HTTPS and commonly paired with an app-specific password. Plain HTTP is accepted only for localhost unless CALDAV_ALLOW_HTTP=1 is explicitly set for development.

Run with Docker

cp .env.example .env
docker compose up --build -d

The app is available at http://localhost:3000. Encrypted calendar sessions are stored in the kalkee-data Docker volume rather than the container filesystem.

To publish on another port, set KALKEE_PORT. Also set GOOGLE_REDIRECT_URI to the public address and register it with Google:

KALKEE_PORT=8080 docker compose up --build -d

Useful commands:

docker compose logs -f kalkee
docker compose restart kalkee
docker compose down

Keyboard workflow

The defaults are:

ActionKey
Move through days and timesH / J / K / L
Confirm or open a selectionEnter
New eventN
Mark an event rangeM
Move an eventG
Resize event start / endS / E
Delete selected eventDelete
Go to todayT
Previous / next period[ / ]
Week / month / days viewW / V / D
Search events/
Settings,

Every listed binding can be changed under Settings → Shortcuts.

Data and security

Calendar events remain with the connected provider. OAuth tokens and CalDAV credentials stay on the Node.js server; the browser receives an HTTP-only session cookie. When CALENDAR_SESSION_SECRET (or, for Google-only setups, GOOGLE_CLIENT_SECRET) is available, sessions are encrypted with AES-256-GCM and persisted in the ignored .calendar-sessions.enc file or /data/sessions.enc in Docker.

Calendar ranges are cached in browser memory and adjacent periods are prefetched. Local preview edits remain in the browser session and reset on reload.

Development

npm run dev
npm run check
npm run test:e2e

The included kalkee.service is an example systemd user unit for this checkout path. Adjust its paths when installing elsewhere.

See SECURITY.md for reporting vulnerabilities.

License

MIT

caldav
caldav-calendar
caldav-client
caldav-server
calendar
calendar-app
calendar-events
calendars
calendar-sync
calendar-view
configurable
configurable-app
configurable-hotkeys
gcal
google-calendar
keybindings
keyboard-navigation
keyboard-shortcuts
ricing
self-hosted

jafoers/kalkee

A minimal, customizable, keyboard-first calendar with Google Calendar and CalDAV sync.

JavaScript

1

0 commits

updated Sep 9, 2026

See the code

See what people are saying

README

Kalkee

A fast, minimal, customizable, keyboard-first calendar web app. Kalkee provides remappable shortcuts, quick and intuitive navigation, as well as Google Calendar or CalDAV sync.

Kalkee week view using Frosted Glass with white and plum events

See more themes and calendar views

Ochre Forest · Week

Kalkee week view using the Ochre Forest theme

Midnight · Month

Kalkee month view using Midnight with cobalt and coral events

Ochre Forest · Month

Kalkee month view using the Ochre Forest theme

Features

  • Intuitive only keyboard navigation across week, month, and multi-day views
  • Dependency-free browser client
  • Remappable actions in a dedicated shortcut editor
  • Two-way Google Calendar and CalDAV event sync
  • Customizable appearance settings and preset themes
  • Docker and native Node.js deployment

Run locally

Requirement: Node.js 20 or newer. Provider credentials are only needed for synchronization.

cp .env.example .env
npm install
npm start

Open http://localhost:3000. Without a connected provider, Kalkee starts in local preview mode with sample events.

Generate a session-encryption secret if you intend to use CalDAV or want a key independent of the Google client secret:

openssl rand -hex 32

Save it as CALENDAR_SESSION_SECRET in .env. Without an encryption secret, CalDAV still works, but its login only lasts until the server restarts.

Google Calendar

To connect Google Calendar:

  1. Create a Google OAuth web client and enable the Google Calendar API.
  2. Add http://localhost:3000 as an authorized redirect URI.
  3. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in .env.
  4. Restart Kalkee and select Google.

For another hostname or port, set GOOGLE_REDIRECT_URI and register that exact HTTPS URI in Google Cloud. The scheme, host, port, path, and trailing slash must match.

CalDAV

Select CalDAV and enter a server or calendar URL, your username, and a password or app password. Kalkee discovers the available event calendars and lets you choose which one to connect. For example, a Nextcloud collection commonly looks like:

https://cloud.example.com/remote.php/dav/calendars/username/calendar-name/

Kalkee currently uses CalDAV Basic authentication, which is intended for HTTPS and commonly paired with an app-specific password. Plain HTTP is accepted only for localhost unless CALDAV_ALLOW_HTTP=1 is explicitly set for development.

Run with Docker

cp .env.example .env
docker compose up --build -d

The app is available at http://localhost:3000. Encrypted calendar sessions are stored in the kalkee-data Docker volume rather than the container filesystem.

To publish on another port, set KALKEE_PORT. Also set GOOGLE_REDIRECT_URI to the public address and register it with Google:

KALKEE_PORT=8080 docker compose up --build -d

Useful commands:

docker compose logs -f kalkee
docker compose restart kalkee
docker compose down

Keyboard workflow

The defaults are:

ActionKey
Move through days and timesH / J / K / L
Confirm or open a selectionEnter
New eventN
Mark an event rangeM
Move an eventG
Resize event start / endS / E
Delete selected eventDelete
Go to todayT
Previous / next period[ / ]
Week / month / days viewW / V / D
Search events/
Settings,

Every listed binding can be changed under Settings → Shortcuts.

Data and security

Calendar events remain with the connected provider. OAuth tokens and CalDAV credentials stay on the Node.js server; the browser receives an HTTP-only session cookie. When CALENDAR_SESSION_SECRET (or, for Google-only setups, GOOGLE_CLIENT_SECRET) is available, sessions are encrypted with AES-256-GCM and persisted in the ignored .calendar-sessions.enc file or /data/sessions.enc in Docker.

Calendar ranges are cached in browser memory and adjacent periods are prefetched. Local preview edits remain in the browser session and reset on reload.

Development

npm run dev
npm run check
npm run test:e2e

The included kalkee.service is an example systemd user unit for this checkout path. Adjust its paths when installing elsewhere.

See SECURITY.md for reporting vulnerabilities.

License

MIT

caldav
caldav-calendar
caldav-client
caldav-server
calendar
calendar-app
calendar-events
calendars
calendar-sync
calendar-view
configurable
configurable-app
configurable-hotkeys
gcal
google-calendar
keybindings
keyboard-navigation
keyboard-shortcuts
ricing
self-hosted

Languages

JavaScript

77.3%

CSS

15.9%

HTML

6.4%