calendar

A HTML/PHP project for a self-hosted (family)-calendar.
Log | Files | Refs | README

README.md (1833B)


      1 # Calendar
      2 
      3 Self-hosted personal and shared calendar, served at [calendar.piribauer.ch](https://calendar.piribauer.ch).
      4 
      5 ## Stack
      6 
      7 - Backend: FastAPI (Python 3.10+) with SQLAlchemy and SQLite
      8 - Frontend: Vanilla JS/HTML/CSS (Nord theme)
      9 - Auth: Authentik forward-auth via nginx
     10 
     11 ## Features
     12 
     13 Each user gets a personal calendar created automatically on first login. Shared calendars can be created and other members added directly by their Authentik username via the "Manage members" modal.
     14 
     15 The interface shows a monthly grid with a collapsible sidebar listing subscribed calendars. Clicking a day opens a daily time-grid view (6 AM – 10 PM). Events have a title, optional start/end time, optional notes, and a list of attendees. An **All day** toggle creates events that span the whole day and appear in a dedicated strip above the time grid.
     16 
     17 ## Installation
     18 
     19 A full installation guide is available at [technotes.piribauer.ch/calendar.html](https://technotes.piribauer.ch/calendar.html). The short version:
     20 
     21 ```console
     22 $ python -m venv venv
     23 $ venv/bin/pip install -r requirements.txt
     24 ```
     25 
     26 Create the database directory:
     27 
     28 ```console
     29 # mkdir -p /var/lib/calendar
     30 # chown julian:julian /var/lib/calendar
     31 ```
     32 
     33 Create `.env` from `.env.example`, then install the service and nginx config:
     34 
     35 ```console
     36 # cp calendar.service /etc/systemd/system/
     37 # systemctl daemon-reload && systemctl enable --now calendar
     38 # cp nginx/calendar /etc/nginx/sites-available/calendar
     39 # ln -s /etc/nginx/sites-available/calendar /etc/nginx/sites-enabled/calendar
     40 # nginx -t && systemctl reload nginx
     41 ```
     42 
     43 ## Schema migrations
     44 
     45 SQLAlchemy creates missing tables on startup but does not alter existing ones. Any new columns must be added manually, e.g.:
     46 
     47 ```console
     48 $ sqlite3 /var/lib/calendar/calendar.db "ALTER TABLE events ADD COLUMN description TEXT;"
     49 ```