Merge branch 'staging' into production

This commit is contained in:
Marek Krug 2025-03-02 00:51:18 +01:00
commit 9a92b873da
87 changed files with 1326 additions and 95 deletions

1
.forgejo/CODEOWNERS Normal file
View file

@ -0,0 +1 @@
* @cccb/web

28
.forgejo/dependabot.yml Normal file
View file

@ -0,0 +1,28 @@
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
target-branch: "staging"
schedule:
interval: "weekly"
commit-message:
prefix: "gh-action"
labels:
- "gh-action"
- "dependencies"
reviewers:
- "cccb/web"
- package-ecosystem: "pip"
directory: "/"
target-branch: "dev"
schedule:
interval: "weekly"
commit-message:
prefix: "python"
labels:
- "python"
- "dependencies"
reviewers:
- "cccb/web"

View file

@ -0,0 +1,73 @@
name: Release website
on:
schedule:
- cron: "0 4 * * *"
push:
branches:
- staging
- production
pull_request:
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: 'latest'
- name: Build pages
run: hugo $(cat .hugo-params)
- name: Add de_DE.UTF-8 locale
run: |
sudo apt-get update
sudo apt-get -y install locales
sudo locale-gen de_DE.UTF-8
- name: Setup Python
uses: actions/setup-python@v5
with:
cache: 'pip'
- name: Install dependencies
run: |
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
- name: Generate calendars
run: python tools/merge_cals.py
- name: Copy calendar to output dir
run: cp static/all.ics public/all.ics
- name: Update homepage with latest event
run: upcoming="$(python tools/gen_upcoming.py static/all.ics 20 5 | tr '\n' ' ')" && sed -i "s#CALENDAR#$upcoming#g" public/index.html
- name: Generate timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H%M%SZ')" >> $GITHUB_ENV
- name: Create Release Archive
uses: thedoctor0/zip-release@0.7.6
with:
type: zip
filename: ../release-${{ github.ref_name }}-${{ env.timestamp }}.zip
directory: public
- name: Create Release
uses: ncipollo/release-action@v1.16.0
with:
tag: ${{ github.ref_name }}-${{ env.timestamp }}
name: Website ${{ github.ref_name }} version ${{ env.timestamp }}
body: Website ${{ github.ref_name }} version ${{ env.timestamp }}
artifacts: release-${{ github.ref_name }}-${{ env.timestamp }}.zip
token: ${{ secrets.GITEA_TOKEN }}

View file

@ -74,7 +74,7 @@ jobs:
needs: [ calendar ]
runs-on: ubuntu-latest
environment: staging
if: github.ref == 'refs/heads/staging' && github.event_name == 'push'
if: (github.ref == 'refs/heads/staging' && github.event_name == 'push') || github.event_name == 'schedule'
steps:
- name: Download pages
uses: actions/download-artifact@v4
@ -90,7 +90,7 @@ jobs:
filename: ../release-staging-${{ env.timestamp }}.zip
directory: public
- name: Create Release
uses: ncipollo/release-action@v1.14.0
uses: ncipollo/release-action@v1.16.0
with:
tag: staging-${{ env.timestamp }}
name: Website staging version ${{ env.timestamp }}
@ -102,7 +102,7 @@ jobs:
needs: [ calendar ]
runs-on: ubuntu-latest
environment: production
if: github.ref == 'refs/heads/production' && github.event_name == 'push'
if: (github.ref == 'refs/heads/production' && github.event_name == 'push') || github.event_name == 'schedule'
steps:
- name: Download pages
uses: actions/download-artifact@v4
@ -118,7 +118,7 @@ jobs:
filename: ../release-production-${{ env.timestamp }}.zip
directory: public
- name: Create Release
uses: ncipollo/release-action@v1.14.0
uses: ncipollo/release-action@v1.16.0
with:
makeLatest: true
tag: production-${{ env.timestamp }}
@ -126,3 +126,4 @@ jobs:
body: Website production version ${{ env.timestamp }}
artifacts: release-production-${{ env.timestamp }}.zip
token: ${{ secrets.GITHUB_TOKEN }}

11
.gitignore vendored
View file

@ -40,7 +40,8 @@ hugo.linux
.LSOverride
# Icon must end with two \r
Icon
Icon
# Thumbnails
._*
@ -92,3 +93,11 @@ $RECYCLE.BIN/
*.lnk
# End of https://www.toptal.com/developers/gitignore/api/windows,linux,macos,hugo
# NixOS:
.envrc
shell.nix
.direnv
# Python
.venv

4
.gitmodules vendored
View file

@ -1,3 +1,7 @@
[submodule "beautifulhugo"]
path = themes/beautifulhugo
url = https://github.com/cccb/beautifulhugo.git
[submodule "themes/blowfish"]
path = themes/blowfish
url = https://github.com/nunocoracao/blowfish.git
branch = main

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
assets/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -4,5 +4,4 @@ hugo $(cat .hugo-params)
./tools/merge_cals.py
upcoming="$(tools/gen_upcoming.py static/all.ics 20 5 | tr '\n' ' ')"
cp static/all.ics public/all.ics
sed -i "s#CALENDAR#$upcoming#g" public/index.html
sed -i "s#CALENDAR#$upcoming#g" public/index.html

100
config/_default/hugo.toml Normal file
View file

@ -0,0 +1,100 @@
# -- Site Configuration --
# Refer to the theme docs for more details about each of these parameters.
# https://blowfish.page/docs/getting-started/
theme = "blowfish" # UNCOMMENT THIS LINE
baseURL = "https://berlin.ccc.de/"
defaultContentLanguage = "de"
RelativeURLs = true
CanonifyURLs = true
pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
enableRobotsTXT = true
summaryLength = 0
buildDrafts = false
buildFuture = false
enableEmoji = true
# googleAnalytics = "G-XXXXXXXXX"
[pagination]
pagerSize = 100
[imaging]
anchor = 'Center'
[taxonomies]
tag = "tags"
category = "categories"
author = "authors"
series = "series"
[sitemap]
changefreq = 'daily'
filename = 'sitemap.xml'
priority = 0.5
[permalinks]
post = "/post/:year/:month/:day/:title/"
[outputs]
home = ["HTML", "RSS", "JSON"]
section = ["HTML", "Calendar", "RSS", "XML"]
page = ["HTML", "Calendar"]
# Output Formats Configuration
[outputFormats.Calendar]
mediaType = "text/calendar"
baseName = "index"
isPlainText = true
notAlternative = true
[outputFormats.XML]
mediaType = "application/xml"
baseName = "index"
isPlainText = true
[outputFormats.RSS]
mediaType = "application/rss+xml"
# Media Types Configuration
[mediaTypes]
[mediaTypes."text/calendar"]
suffixes = ["ics"]
[mediaTypes."application/rss"]
suffixes = ["rss"]
[mediaTypes."application/xml"]
suffixes = ["xml"]
[related]
threshold = 0
toLower = false
[[related.indices]]
name = "tags"
weight = 100
[[related.indices]]
name = "categories"
weight = 100
[[related.indices]]
name = "series"
weight = 50
[[related.indices]]
name = "authors"
weight = 20
[[related.indices]]
name = "date"
weight = 10
[[related.indices]]
applyFilter = false
name = 'fragmentrefs'
type = 'fragments'
weight = 10

View file

@ -0,0 +1,77 @@
disabled = false
languageCode = "de"
languageName = "Deutsch"
weight = 1
title = "Chaos Computer Club Berlin"
[params]
displayName = "DE"
isoCode = "de"
rtl = false
dateFormat = "January 2, 2006"
DateForm = "30.12.2006"
logo = "img/logo.png"
# secondaryLogo = "img/avatar-CCCB-Logo.png"
description = "Willkommen! Wir sind ein Erfa-Kreis des Chaos Computer Club e.V. und die örtliche Niederlassung des CCC in Berlin."
copyright = "CCC-BY"
selfHosted = true
mainSections = ["post", "datengarten"]
[params.author]
# name = "Your name here"
email = "mail2025@berlin.ccc.de"
image = "img/logo.png"
# imageQuality = 96
headline = "Willkommen! Wir sind ein Erfa-Kreis des Chaos Computer Club e.V. und die örtliche Niederlassung des CCC in Berlin."
# bio = "A little bit about you"
links = [
{ email = "mailto:mail2025@berlin.ccc.de" },
# { link = "https://link-to-some-website.com/" },
# { amazon = "https://www.amazon.com/hz/wishlist/ls/wishlist-id" },
# { apple = "https://www.apple.com" },
# { blogger = "https://username.blogspot.com/" },
# { bluesky = "https://bsky.app/profile/username" },
# { codepen = "https://codepen.io/username" },
# { dev = "https://dev.to/username" },
# { discord = "https://discord.gg/invitecode" },
# { dribbble = "https://dribbble.com/username" },
# { facebook = "https://facebook.com/username" },
# { flickr = "https://www.flickr.com/photos/username/" },
# { foursquare = "https://foursquare.com/username" },
{ github = "https://github.com/cccb/" },
{ gitlab = "https://git.berlin.ccc.de/explore/repos" },
# { google = "https://www.google.com/" },
# { hashnode = "https://username.hashnode.dev" },
# { instagram = "https://instagram.com/username" },
# { itch-io = "https://username.itch.io" },
# { keybase = "https://keybase.io/username" },
# { kickstarter = "https://www.kickstarter.com/profile/username" },
# { lastfm = "https://lastfm.com/user/username" },
# { linkedin = "https://linkedin.com/in/username" },
{ mastodon = "https://chaos.social/@clubdiscordia" },
# { irc = "https://webirc.hackint.org/#ircs://irc.hackint.org/#cccb" },
# { medium = "https://medium.com/username" },
# { microsoft = "https://www.microsoft.com/" },
# { orcid = "https://orcid.org/userid" },
# { patreon = "https://www.patreon.com/username" },
# { pinterest = "https://pinterest.com/username" },
# { reddit = "https://reddit.com/user/username" },
# { researchgate = "https://www.researchgate.net/profile/username" },
# { slack = "https://workspace.url/team/userid" },
# { snapchat = "https://snapchat.com/add/username" },
# { soundcloud = "https://soundcloud.com/username" },
# { spotify = "https://open.spotify.com/user/userid" },
# { stack-overflow = "https://stackoverflow.com/users/userid/username" },
# { steam = "https://steamcommunity.com/profiles/userid" },
# { telegram = "https://t.me/username" },
# { threads = "https://www.threads.net/@username" },
# { tiktok = "https://tiktok.com/@username" },
# { tumblr = "https://username.tumblr.com" },
# { twitch = "https://twitch.tv/username" },
# { twitter = "https://twitter.com/username" },
# { x-twitter = "https://twitter.com/username" },
# { whatsapp = "https://wa.me/phone-number" },
# { youtube = "https://youtube.com/username" },
# { ko-fi = "https://ko-fi.com/username" },
# { codeberg = "https://codeberg.org/username"},
]

View file

@ -0,0 +1,13 @@
# -- Markup --
# These settings are required for the theme to function.
[goldmark]
[goldmark.renderer]
unsafe = true
[highlight]
noClasses = false
[tableOfContents]
startLevel = 2
endLevel = 4

View file

@ -0,0 +1,61 @@
# -- Main Menu --
# The main menu is displayed in the header at the top of the page.
# Acceptable parameters are name, pageRef, page, url, title, weight.
#
# The simplest menu configuration is to provide:
# name = The name to be displayed for this menu link
# pageRef = The identifier of the page or section to link to
#
# By default the menu is ordered alphabetically. This can be
# overridden by providing a weight value. The menu will then be
# ordered by weight from lowest to highest.
#[[main]]
# name = "Blog"
# pageRef = "posts"
# weight = 10
[[main]]
name = "Verein"
pageRef = "verein"
weight = 200
[[main]]
name = "Veranstaltungen"
pageRef = "veranstaltungen"
weight = 300
[[main]]
name = "Mitgliedschaft"
pageRef = "mitgliedschaft"
weight = 400
[[main]]
name = "News"
pageRef = "post"
weight = 500
# -- Footer Menu --
# The footer menu is displayed at the bottom of the page, just before
# the copyright notice. Configure as per the main menu above.
[[footer]]
name = "Tags"
pageRef = "tags"
weight = 10
[[footer]]
name = "Categories"
pageRef = "categories"
weight = 20
[[footer]]
name = "Impressum"
pageRef = "impressum"
weight = 500
[[footer]]
name = "Privacy"
pageRef = "datenschutz"
weight = 600

172
config/_default/params.toml Normal file
View file

@ -0,0 +1,172 @@
# -- Theme Options --
# These options control how the theme functions and allow you to
# customise the display of your website.
#
# Refer to the theme docs for more details about each of these parameters.
# https://blowfish.page/docs/configuration/#theme-parameters
colorScheme = "fira" # "congo"
defaultAppearance = "dark" # valid options: light or dark
autoSwitchAppearance = false
enableSearch = true
enableCodeCopy = false
replyByEmail = false
# mainSections = ["section1", "section2"]
# robots = ""
[params]
disableImageOptimization = false
disableTextInHeader = false
backgroundImageWidth = 1200
# defaultBackgroundImage = "/img/cccb-im-winter.jpg" # used as default for background images
defaultFeaturedImage = "/img/avatar-CCCB-Logo.png" # used as default for featured images in all articles
# highlightCurrentMenuArea = true
# smartTOC = true
# smartTOCHideUnfocusedChildren = true
giteaDefaultServer = "https://git.fsfe.org"
forgejoDefaultServer = "https://v8.next.forgejo.org"
[header]
layout = "basic" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur
[footer]
showMenu = true
showCopyright = true
showThemeAttribution = true
showAppearanceSwitcher = true
showScrollToTop = true
[homepage]
layout = "background" # valid options: page, profile, hero, card, background, custom
homepageImage = "img/cccb-im-winter.jpg" # used in: hero, and card
showRecent = true
showRecentItems = 8
showMoreLink = true
showMoreLinkDest = "/post/"
cardView = false
cardViewScreenWidth = false
layoutBackgroundBlur = false # only used when layout equals background
[article]
showDate = true
showViews = false
showLikes = false
showDateOnlyInArticle = false
showDateUpdated = true
showAuthor = false
showAuthorBottom = true
showHero = false
# heroStyle = "basic" # valid options: basic, big, background, thumbAndBackground
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
showBreadcrumbs = true
showDraftLabel = true
showEdit = true
editURL = "https://github.com/cccb/www/tree/staging/content/"
editAppendPath = true
seriesOpened = false
showHeadingAnchors = true
showPagination = false
invertPagination = false
showReadingTime = true
showTableOfContents = true
# showRelatedContent = false
# relatedContentLimit = 3
showTaxonomies = true
showAuthorsBadges = false
showWordCount = true
# sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram"]
showZenMode = false
[list]
showHero = false
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
showBreadcrumbs = false
showSummary = false
showViews = false
showLikes = false
showTableOfContents = false
showCards = false
orderByWeight = false
groupByYear = true
cardView = false
cardViewScreenWidth = false
constrainItemsWidth = false
[sitemap]
excludedKinds = ["taxonomy", "term"]
[taxonomy]
showTermCount = true
showHero = false
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
showBreadcrumbs = false
showViews = false
showLikes = false
showTableOfContents = false
cardView = false
category = "categories"
series = "series"
tag = "tags"
[term]
showHero = false
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
showBreadcrumbs = false
showViews = false
showLikes = false
showTableOfContents = true
groupByYear = false
cardView = false
cardViewScreenWidth = false
[firebase]
# apiKey = "XXXXXX"
# authDomain = "XXXXXX"
# projectId = "XXXXXX"
# storageBucket = "XXXXXX"
# messagingSenderId = "XXXXXX"
# appId = "XXXXXX"
# measurementId = "XXXXXX"
[fathomAnalytics]
# site = "ABC12345"
# domain = "llama.yoursite.com"
[umamiAnalytics]
# websiteid = "ABC12345"
# domain = "llama.yoursite.com"
# dataDomains = "yoursite.com,yoursite2.com"
# scriptName = ""
# enableTrackEvent = true
[selineAnalytics]
# token = "XXXXXX"
# enableTrackEvent = true
[buymeacoffee]
# identifier = ""
# globalWidget = true
# globalWidgetMessage = "Hello"
# globalWidgetColor = "#FFDD00"
# globalWidgetPosition = "Right"
[verification]
# google = ""
# bing = ""
# pinterest = ""
# yandex = ""
# fediverse = ""
[rssnext]
# feedId = ""
# userId = ""

View file

@ -0,0 +1,56 @@
---
categories: ["Datengarten"]
tags: ["Open Politics", "Political Science", "Engineering", "Machine Learning"]
series: "Datengarten"
title: "Datengarten 111"
no: 111
subtitle: "Open Source Political Intelligence - What is it and why does it matter?"
speaker: "Jim-Vincent Wagner"
date: 2025-01-23T19:00:00+01:00
event:
start: 2025-02-05T19:00:00+01:00
end: 2025-02-05T20:30:00+01:00
location: CCCB
language: en
streaming: true
recording: https://streaming.media.ccc.de/datengarten/cccb
---
> 🇬🇧 English Version
#### **Open Politics – Collaborative Tools for Open Political Data**
Politics is complex, and making sense of it requires access to good information. The **Open Politics Project **is working on and operationalising open-source tools that help analyse political structures, decisions, and developments—so that journalists, researchers, activists, and engaged citizens can better understand and interpret them.
Our goal is to make political data more accessible and useful. We bring together existing methods from data analysis, political science, and AI, while also experimenting with new approaches—always in the open, documented, and improved through collaboration. From user-friendly visualisations to structured databases, we explore ways to work with political data in a way that’s practical and meaningful.
We call it: **Open Source Political Intelligence**
At *Datengarten *on **February 5, 2025**, we’ll share our latest progress, discuss challenges, and give a behind-the-scenes look at our work.
📍**Chaos Computer Club Berlin (CCCB), Marienstraße 11, 10117 Berlin**
Let’s talk about how we can make political information more open and useful for everyone.
🔗 Open Politics Project: https://open-politics.org/about, https://github.com/open-politics/open-politics, https://github.com/open-politics/opol
***
> 🇧🇪 German Version
#### **Open Politics – Offene Werkzeuge für politische Daten**
Politik ist oft schwer durchschaubar – aber mit den richtigen Werkzeugen lassen sich Strukturen, Entscheidungen und Entwicklungen besser verstehen. Das **Open Politics Project **entwickelt und operationalisiert Open-Source-Methoden zur Analyse politischer Daten, um Journalist:innen, Forschenden, Aktivist:innen und interessierten Bürger:innen den Zugang zu politischen Informationen zu erleichtern.
Unser Ziel ist es, politische Daten verständlich und nutzbar zu machen. Wir verbinden bestehende Ansätze aus Datenanalyse, Politikwissenschaft und KI, probieren neue Methoden aus und dokumentieren alles offen, um es gemeinsam weiterzuentwickeln. Von interaktiven Visualisierungen bis zu strukturierten Datensammlungen – wir experimentieren mit Wegen, politische Informationen alltagstauglicher zu gestalten.
We call it: **Open Source Political Intelligence**
Beim *Datengarten *am **05. Februar 2025 **sprechen wir über unseren aktuellen Stand, diskutieren Herausforderungen und geben einen Einblick in unsere Arbeit.
📍**Chaos Computer Club Berlin (CCCB), Marienstraße 11, 10117 Berlin**
Lasst uns gemeinsam überlegen, wie politische Informationen offener und zugänglicher werden können.
🔗 Open Politics Project: https://open-politics.org/about, https://github.com/open-politics/open-politics, https://github.com/open-politics/opol

View file

@ -1,12 +0,0 @@
<!-- ---
title: "Amateurfunkkurs Klasse A"
subtitle: "Teil 2"
date: 2018-05-17T22:41:48+02:00
dtstart: 20190110T180000
dtend: 20190110T203000
rrule: "FREQ=WEEKLY;BYDAY=MO;INTERVAL=1;COUNT=14"
---
Nach einer kleinen Verschnaufpause über Weihnachten und dem Chaos Communication Congress machen wir mit dem Lehrgang zur Vorbereitung auf die Klasse A weiter. Der Zeitraum ist vom 7. Januar 2019 bis zum 8. April 2019.
Die genauen Inhalte pro Einheit sind ebenso im [Unterrichtsplan A](https://www.chaoswelle.de/Lehrgang_Berlin_2019/Unterrichtsplan_A) detaillierter aufgelistet. -->

View file

@ -1,15 +0,0 @@
<!-- ---
title: "Amateurfunkkurs Klasse E"
subtitle: "Teil 2"
date: 2018-05-17T22:41:48+02:00
dtstart: 20180910T180000
dtend: 20180910T203000
rrule: "FREQ=WEEKLY;BYDAY=MO;INTERVAL=1;COUNT=15"
---
Im ersten Teil wird für die Prüfung Klasse E vorbereitet. Der Zeitraum ist vom 17. September bis zum 17. Dezember.
An einem Termin werden neben dem großen Teil der zu erlernenden Technik immer Themen aus dem Bereich Betriebstechnik und Vorschriften behandelt. Diese sind für die Prüfung notwendig, aber leider etwas trockener. Durch die Abwechslung sollte der Spaß nicht verloren gehen.
Die genauen Inhalte pro Einheit sind im [Unterrichtsplan E](https://www.chaoswelle.de/Lehrgang_Berlin_2018/Unterrichtsplan_E) detaillierter aufgelistet.
-->

View file

@ -1,38 +1,14 @@
<!-- ---
---
title: "Amateurfunk"
subtitle: "Funken und Löten im CCCB"
date: 2018-05-17T22:41:48+02:00
menu:
main:
parent: "veranstaltungen"
---
![Logo der Chaoswelle](/img/chaoswelle.png "Logo der Chaoswelle")
Im Moment finden keine Amateurfunktreffen mehr im CCCB statt
Früher trafen sich Funkamateure oder Interessierte
rund um drahtlose Kommunikation im Chaos Computer Club Berlin im Rahmen des
[Club Discordia]({{< ref "clubdiscordia.md" >}}). Manchmal gibt es Vorträge
oder Workshops, die dann im Kalender separat angezeigt werden. Gelegentlich
halten wir Amateurfunkkurse ab, um für die Prüfung zum Funkamateur vorzubereiten.
Das Treffen ist Nahe zur [Interessensgemeinschaft
Vor einiger Zeit fanden gelegentlich Amateurfunkkurse im CCCB statt. Im Zusammenhang damit trafen sich Funkamateure und Interessierte rund um drahtlose Kommunikation auch an den offenen Abenden. Das Treffen war Nahe zur [Interessensgemeinschaft
Chaoswelle](http://chaoswelle.de), die sich im DARC e.V. Ortsverband D23
organisiert. Funkamateure oder Interessierte rund um die Funktechnik sind dazu
Willkommen! Ankündigungen und Diskussionen finden auf einer [offenen
organisiert. Ankündigungen und Diskussionen zu diesen Themen finden auf einer [offenen
Mailingliste](http://lists.chaoswelle.de/listinfo/berlin) statt.
Für Fragen kannst Du Dich an Lars (Rufzeichen DC4LW) unter <dc4lw@darc.de>
wenden.
## Kurse
In 14 Unterrichtseinheiten ab Mitte September 2018 bis zum Jahresende werden
die nötigen [Inhalte für die Klasse E]({{< ref "afu-kurs-e.md" >}})
vermittelt, das ist der erster Teil des Lehrgangs. In vierzehn weiteren
Einheiten des zweiten Teils kommen im Winter 2019 die zusätzlichen [Inhalte für
die Klasse A]({{< ref "afu-kurs-e.md" >}}) an die Reihe. Wir treffen uns
wöchentlich am Montagabend im Zeitraum von 18:00 Uhr bis 20:30 Uhr (mit kurzen
Pausen zwischendurch).
Details gibt es auf der Seite der [Chaoswelle](https://www.chaoswelle.de/Lehrgang_Berlin_2018). -->
Für Fragen kannst Du Dich auch an Lars (Rufzeichen DC4LW) unter <dc4lw@darc.de>
wenden.

Some files were not shown because too many files have changed in this diff Show more