CCCB Website (https://berlin.ccc.de/)
  • JavaScript 49%
  • HTML 29.6%
  • CSS 15.8%
  • Nix 4.5%
  • Shell 1.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Hauke Mehrtens aca6f0eb38 Parse the calendar with ical.js
The calendar page brought its own ICS parser and its own RRULE expansion. Both
only covered the cases that happened to be needed when they were written, and
the calendar has moved on since. Against the published calendar, for September
2026:

  Spieleabend  FREQ=WEEKLY;INTERVAL=2;BYDAY=SA  shown 05. 12. 19. 26., correct 05. 19.
  CCCB Plenum  FREQ=MONTHLY;BYDAY=TU;BYSETPOS=2 shown 01.,               correct 08.
  CCCB Plenum  FREQ=MONTHLY;BYDAY=TU;BYSETPOS=4 shown 01.,               correct 22.

INTERVAL was only read for monthly rules, so the Spieleabend was shown twice as
often as it takes place. BYSETPOS was not implemented at all, and since
parseInt("TU") is NaN the fallback turned both Plenum rules into "first
Tuesday", putting two Plenums on a day without one and none on the two days
with one. UNTIL, COUNT, EXDATE, RECURRENCE-ID, BYMONTHDAY and a BYDAY listing
more than one weekday were not handled either.

The text was no better. Content lines longer than 75 characters are continued
on the next line, of which there are 477 in the calendar, and the parser did
not join them, so it cut values off in the middle of a word. It also split
every line at the first colon, which lands inside the parameter of
DESCRIPTION;ALTREP="data:text/html,...". And it never resolved the escaping, so
"\n" was shown as those two characters. 30 of 31 descriptions were wrong:

  before: "Der Club Discordia ist ein öffentliches Treffen in den Clubr"
  after:  "Der Club Discordia ist ein öffentliches Treffen in den Clubräumen des CCC Berlin"

Hand the parsing and the expansion to ical.js, which is vendored for the start
page anyway. The month view now asks the library for the occurrences that touch
the month, which removes the reimplementation along with all of the above.

While the events are being reduced to what the view needs:

- An event is entered on every day it covers, so the Amateurfunk trip from
  30.10. to 01.11. is no longer marked on 30.10. alone. The end of an event is
  not part of it, so one ending at midnight stays on the day before.
- Days and times are derived in Europe/Berlin instead of from the digits of the
  ICS string. Every event currently carries TZID=Europe/Berlin, so the wall
  clock time shown does not change, but a UTC timestamp would have been shown
  in UTC.
- The URL of the event is used for the link in the detail panel. Events without
  one are shown without a link, as on the start page. This replaces
  createEventLink(), which guessed URLs from the title and was never called,
  and the panel no longer builds an <h> element, which is not an element.

Descriptions may contain line breaks, so keep them in the panel.

Fixes: 4068fab5b1ea ("improved calendar and fixed url temporarily")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-08-22 21:03:01 +02:00
.forgejo/workflows Delete .forgejo/workflows/test.yaml 2026-08-22 15:22:52 +02:00
archetypes Move out datengartens into their own section 2018-05-21 18:31:39 +02:00
assets Parse the calendar with ical.js 2026-08-22 21:03:01 +02:00
config/_default switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
content Vendor ical.js instead of loading it from unpkg.com 2026-08-22 21:03:01 +02:00
i18n fix 404 2025-06-06 18:39:07 +02:00
layouts Parse the calendar with ical.js 2026-08-22 21:03:01 +02:00
static Vendor ical.js instead of loading it from unpkg.com 2026-08-22 21:03:01 +02:00
themes add optional nix flake 2025-06-05 21:51:31 +02:00
tools switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
.editorconfig switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
.gitignore switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
.gitmodules removed old beautifulhugo theme 2025-03-12 12:50:25 +01:00
.hugo-params improved calendar and fixed url temporarily 2025-03-12 16:06:29 +01:00
build.sh switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
devShells.nix split flake into multiple files 2025-06-07 15:40:38 +02:00
flake.lock switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
flake.nix switch to ics files; make calendars work; fix some minor issues 2026-08-12 02:01:58 +02:00
LICENSE Add LICENSE 2018-08-14 23:11:06 +02:00
old_config.yaml.txt new images, new content, new theme almost finished 2025-02-27 00:21:42 +01:00
packages.nix flake lib.mkWwwContent 2025-06-07 19:22:56 +02:00
README.md Vendor ical.js instead of loading it from unpkg.com 2026-08-22 21:03:01 +02:00
TODO.md update readme, markdown lint 2025-06-07 15:35:43 +02:00

CCCB Website

This is the website of the CCCB.

CCCB logo

Getting started

  1. Get Hugo: https://gohugo.io/getting-started/installing

  2. Clone this repo (--recursive is needed to check out submodules)

    git clone --recursive https://git.berlin.ccc.de/cccb-website-team/www.git cccb-website
    
  3. Switch directory

    cd cccb-website
    
  4. Run hugo webserver

    hugo serve
    
  5. Point your browser to: http://localhost:1313/

Every change you make on the project will be reflected in your browser as long as hugo serve is running.

The "Nächste Veranstaltungen" table on the home page and the calendar under /verein/calendar/ are rendered in the browser by assets/js/upcoming.js and assets/js/calendar.js. Both fetch /calendars/all.ics, which is not generated by Hugo and is not part of this repo — it is published separately on the web server. Locally those two tables therefore stay empty; check them on the staging site instead.

Hugo does generate an .ics feed per section (for example /veranstaltungen/index.ics) from the dtstart, dtend and rrule front matter of the pages in content/veranstaltungen/, using the .ics templates under layouts/.

The site must not make the browser load anything from an external server, so third party JavaScript is checked into assets/js/vendor/ and bundled in by Hugo instead of being pulled from a CDN. See the README there before updating it.

To build the site for upload, run:

./build.sh

This deletes public/ and runs hugo with the parameters from .hugo-params. To build with nix instead: nix build '.?submodules=1#production-content'

Making a change

  1. Use your local dev setup (see Getting started) or via the Forgejo editor.
  2. Make your change in staging branch.
  3. Commit (and push) your change.
  4. GitHub Actions is running the release workflow.
  5. Create a merge request to merge changes from staging to production branch. Ask somebody to check merge request or if small change, merge yourself.
  6. GitHub Actions is running the release workflow.
    • If successfull, check Website if change is correct.
  7. Profit!

Nix stuff

  • After entering the shell with nix develop, hugo is available and hugo serve and ./build.sh should work
  • You can build the staging and production builds with nix build .#staging-content and nix build .#production-content
  • Do not update the nixpkgs branch - 25.05 contains a newer hugo version that is incompatible with the theme (last checked June 2025)

Made with ❤️ and Hugo.