focal status License: GPL v3


Focal is a desktop calendar application for Linux.

Focal intends to be a powerful but lightweight calendar suitable for busy work environments. This means 1st-class support for remotely hosted calendars (CalDAV), a complete week view, and advanced scheduling features.

Focal is implemented in C and depends only on GTK, libical, libcurl, libxml2, json-glib, and libsecret.

Focal is in very early stages of development and needs a lot more work before it will be useful. You can help! All contributions are welcome, including those from beginner developers. Please see for more information on how to get involved.

Building from source

# Install dependencies
sudo apt-get install build-essential git cmake gperf libgtk-3-dev libxml2-dev libical-dev libcurl4-gnutls-dev libjson-glib-dev libsecret-1-dev
# Clone the sources
git clone [email protected]:ohwgiles/focal.git
# Create a build directory and generate Makefiles
mkdir focal-build && cd focal-build && cmake ../focal
# Build and run focal
make && ./focal
# The external authentication for Google Calendar requires an installed copy of focal:
sudo make install && sudo update-desktop-database
# Alternatively, you can copy res/focal.desktop to ~/.local/share/applications, modify
# it to set the correct path to the focal executable, and run update-desktop-database

Debugging with Valgrind

Valgrind is a useful tool for finding memory management bugs. Unfortunately, many libraries used by focal perform one-time static allocations, which makes it difficult to separate them from real memory leaks. To that end, the focal.suppression file may be used to suppress these errors when hunting down memory leaks:

valgrind --suppressions=focal.suppression --leak-check=full ./build/focal

CalDAV servers

This section describes how to run common CalDAV servers in docker and connect to them with focal.

Nextcloud (SabreDAV):

docker run --name focal-test-nextcloud -d --rm -p 7772:80 nextcloud
docker exec -it focal-test-nextcloud runuser -u www-data -- /var/www/html/occ maintenance:install --admin-pass=admin
# focal.conf snippet

Apple Calendar and Contacts Server:

docker run --name focal-test-ccs -d --rm -p 7771:8008 $(docker build -qf - . <<-EOF
  FROM pluies/ccs-calendarserver
  RUN bash -c "cd /opt/ccs && curl -L | tar xz --strip-components=1 ccs-calendarserver-CalendarServer-9.2/conf && cp /opt/ccs/conf/caldavd-{test,dev}.plist"
# focal.conf snippet


docker run --name focal-test-radicale -d --rm -p 7773:5232 tomsquest/docker-radicale
curl localhost:7773/admin/personal -X MKCOL -d '<?xml version="1.0" encoding="UTF-8" ?><mkcol xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:CR="urn:ietf:params:xml:ns:carddav" xmlns:I="" xmlns:INF=""><set><prop><resourcetype><collection /><C:calendar /></resourcetype><C:supported-calendar-component-set><C:comp name="VEVENT" /></C:supported-calendar-component-set><displayname>Personal</displayname><C:calendar-description>i</C:calendar-description></prop></set></mkcol>'
# focal.conf snippet


Calendar application for Linux with CalDAV

Focal Info

⭐ Stars 20
🔗 Source Code
🕒 Last Update 9 months ago
🕒 Created 3 years ago
🐞 Open Issues 12
➗ Star-Issue Ratio 2
😎 Author ohwgiles