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 ```