forked from cccb-website-team/www
Merge branch 'staging' into production
This commit is contained in:
commit
a63680661e
36 changed files with 777 additions and 714 deletions
|
|
@ -1 +0,0 @@
|
||||||
* @cccb/web
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
# 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"
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
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 }}
|
|
||||||
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
|
|
@ -1 +0,0 @@
|
||||||
* @cccb/web
|
|
||||||
28
.github/dependabot.yml
vendored
28
.github/dependabot.yml
vendored
|
|
@ -1,28 +0,0 @@
|
||||||
# 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"
|
|
||||||
129
.github/workflows/release.yml
vendored
129
.github/workflows/release.yml
vendored
|
|
@ -1,129 +0,0 @@
|
||||||
name: Release website
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 4 * * *"
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- staging
|
|
||||||
- production
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
pages:
|
|
||||||
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)
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
name: Upload pages
|
|
||||||
with:
|
|
||||||
name: pages
|
|
||||||
path: public
|
|
||||||
|
|
||||||
calendar:
|
|
||||||
needs: [ pages ]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- 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: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
cache: 'pip' # caching pip dependencies
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip setuptools wheel
|
|
||||||
pip install -r requirements.txt
|
|
||||||
- name: Download pages
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pages
|
|
||||||
path: public/
|
|
||||||
- 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
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
name: Upload pages
|
|
||||||
with:
|
|
||||||
name: enhanced_pages
|
|
||||||
path: public
|
|
||||||
|
|
||||||
staging:
|
|
||||||
needs: [ calendar ]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
environment: staging
|
|
||||||
if: (github.ref == 'refs/heads/staging' && github.event_name == 'push') || github.event_name == 'schedule'
|
|
||||||
steps:
|
|
||||||
- name: Download pages
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: enhanced_pages
|
|
||||||
path: public
|
|
||||||
- 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-staging-${{ env.timestamp }}.zip
|
|
||||||
directory: public
|
|
||||||
- name: Create Release
|
|
||||||
uses: ncipollo/release-action@v1.16.0
|
|
||||||
with:
|
|
||||||
tag: staging-${{ env.timestamp }}
|
|
||||||
name: Website staging version ${{ env.timestamp }}
|
|
||||||
body: Website staging version ${{ env.timestamp }}
|
|
||||||
artifacts: release-staging-${{ env.timestamp }}.zip
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
production:
|
|
||||||
needs: [ calendar ]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
environment: production
|
|
||||||
if: (github.ref == 'refs/heads/production' && github.event_name == 'push') || github.event_name == 'schedule'
|
|
||||||
steps:
|
|
||||||
- name: Download pages
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: enhanced_pages
|
|
||||||
path: public
|
|
||||||
- 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-production-${{ env.timestamp }}.zip
|
|
||||||
directory: public
|
|
||||||
- name: Create Release
|
|
||||||
uses: ncipollo/release-action@v1.16.0
|
|
||||||
with:
|
|
||||||
makeLatest: true
|
|
||||||
tag: production-${{ env.timestamp }}
|
|
||||||
name: Website production version ${{ env.timestamp }}
|
|
||||||
body: Website production version ${{ env.timestamp }}
|
|
||||||
artifacts: release-production-${{ env.timestamp }}.zip
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,4 +1,5 @@
|
||||||
static/all.ics
|
static/all.ics
|
||||||
|
.envrc
|
||||||
|
|
||||||
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,hugo
|
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,hugo
|
||||||
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,hugo
|
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,hugo
|
||||||
|
|
@ -100,4 +101,4 @@ shell.nix
|
||||||
.direnv
|
.direnv
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
.venv
|
.venv
|
||||||
|
|
|
||||||
20
README.md
20
README.md
|
|
@ -1,23 +1,19 @@
|
||||||

|
|
||||||
|
|
||||||
# CCCB Website
|
# CCCB Website
|
||||||
|
|
||||||
This is the website of the CCCB.
|
This is the website of the CCCB.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
1. Get Hugo: <https://gohugo.io/getting-started/installing>
|
1. Get Hugo: <https://gohugo.io/getting-started/installing>
|
||||||
2. Clone this repo
|
2. Clone this repo (`--recursive` is needed to check out submodules)
|
||||||
```shell
|
```shell
|
||||||
git clone https://github.com/cccb/www
|
git clone --recursive https://git.berlin.ccc.de/cccb-website-team/www.git cccb-website
|
||||||
```
|
```
|
||||||
3. Switch directory
|
3. Switch directory
|
||||||
```shell
|
```shell
|
||||||
cd www
|
cd cccb-website
|
||||||
```
|
|
||||||
3. Fetch Submodules
|
|
||||||
```shell
|
|
||||||
git submodule update --recursive --remote --init
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Run site locally
|
### Run site locally
|
||||||
|
|
@ -35,13 +31,13 @@ Every change you make on the project will be reflected in your browser as long a
|
||||||
|
|
||||||
## Making a change
|
## Making a change
|
||||||
|
|
||||||
1. Use your local dev setup (see Getting started) or via GitHub editor.
|
1. Use your local dev setup (see Getting started) or via the Forgejo editor.
|
||||||
2. Make your change in `staging` branch.
|
2. Make your change in `staging` branch.
|
||||||
3. Commit (and push) your change.
|
3. Commit (and push) your change.
|
||||||
4. GitHub Actions is running the release workflow.
|
4. ~~GitHub Actions is running the release workflow.~~
|
||||||
- If successful, check [Staging Website](https://staging.berlin.ccc.de/) if change is correct.
|
- If successful, check [Staging Website](https://staging.berlin.ccc.de/) if change is correct.
|
||||||
5. Create merge request to merge changes from `staging` to `production` branch. Ask somebody to check merge request or if small change, merge yourself.
|
5. Create 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.
|
6. ~~GitHub Actions is running the release workflow.~~
|
||||||
- If successfull, check [Website](https://berlin.ccc.de/) if change is correct.
|
- If successfull, check [Website](https://berlin.ccc.de/) if change is correct.
|
||||||
7. Profit!
|
7. Profit!
|
||||||
|
|
||||||
|
|
|
||||||
4
TODO.md
4
TODO.md
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
- DSGVO-compliant Datenschutzerklärung reinbasteln
|
- DSGVO-compliant Datenschutzerklärung reinbasteln
|
||||||
- Entscheiden, welche Seiten sonst noch konvertiert werden sollen und welche in die ewigen Datengründe gehen können
|
- Entscheiden, welche Seiten sonst noch konvertiert werden sollen und welche in die ewigen Datengründe gehen können
|
||||||
- add nix config to repo
|
|
||||||
|
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
|
|
||||||
|
|
@ -17,4 +18,3 @@
|
||||||
- Bestehende Datengarten-Termine konvertieren
|
- Bestehende Datengarten-Termine konvertieren
|
||||||
- ggf. template mit frontmatter
|
- ggf. template mit frontmatter
|
||||||
- Theme forken, alle assets sollten lokal gehosted sein und nicht von irgendwelchen CDNs bezogen werden (HTTP/2 ftw!)
|
- Theme forken, alle assets sollten lokal gehosted sein und nicht von irgendwelchen CDNs bezogen werden (HTTP/2 ftw!)
|
||||||
|
|
||||||
|
|
|
||||||
5
build.sh
5
build.sh
|
|
@ -1,7 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
|
||||||
hugo $(cat .hugo-params)
|
hugo $(cat .hugo-params)
|
||||||
./tools/merge_cals.py
|
./tools/merge_cals.py
|
||||||
upcoming="$(tools/gen_upcoming.py static/all.ics 20 5 | tr '\n' ' ')"
|
upcoming="$(tools/gen_upcoming.py static/all.ics 20 5 | tr '\n' ' ')"
|
||||||
cp static/all.ics public/all.ics
|
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
|
||||||
|
|
|
||||||
|
|
@ -25,53 +25,9 @@ title = "Chaos Computer Club Berlin"
|
||||||
headline = "Willkommen! Wir sind ein Erfa-Kreis des Chaos Computer Club e.V. und die örtliche Niederlassung des CCC in Berlin."
|
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"
|
# bio = "A little bit about you"
|
||||||
links = [
|
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" },
|
{ mastodon = "https://chaos.social/@clubdiscordia" },
|
||||||
# { irc = "https://webirc.hackint.org/#ircs://irc.hackint.org/#cccb" },
|
{ forgejo = "https://git.berlin.ccc.de/explore/repos" },
|
||||||
# { medium = "https://medium.com/username" },
|
{ email = "mailto:mail2025@berlin.ccc.de" },
|
||||||
# { microsoft = "https://www.microsoft.com/" },
|
{ github = "https://github.com/cccb/" },
|
||||||
# { 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"},
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[footer]]
|
[[footer]]
|
||||||
name = "Categories"
|
name = "Kategorien"
|
||||||
pageRef = "categories"
|
pageRef = "categories"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
|
|
@ -56,6 +56,6 @@
|
||||||
weight = 500
|
weight = 500
|
||||||
|
|
||||||
[[footer]]
|
[[footer]]
|
||||||
name = "Privacy"
|
name = "Datenschutz"
|
||||||
pageRef = "datenschutz"
|
pageRef = "datenschutz"
|
||||||
weight = 600
|
weight = 600
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ backgroundImageWidth = 1200
|
||||||
defaultFeaturedImage = "/img/avatar-CCCB-Logo.png" # used as default for featured images in all articles
|
defaultFeaturedImage = "/img/avatar-CCCB-Logo.png" # used as default for featured images in all articles
|
||||||
|
|
||||||
# highlightCurrentMenuArea = true
|
# highlightCurrentMenuArea = true
|
||||||
# smartTOC = true
|
smartTOC = true
|
||||||
# smartTOCHideUnfocusedChildren = true
|
smartTOCHideUnfocusedChildren = true
|
||||||
|
|
||||||
giteaDefaultServer = "https://git.fsfe.org"
|
giteaDefaultServer = "https://git.fsfe.org"
|
||||||
forgejoDefaultServer = "https://v8.next.forgejo.org"
|
forgejoDefaultServer = "https://v8.next.forgejo.org"
|
||||||
|
|
@ -68,7 +68,7 @@ forgejoDefaultServer = "https://v8.next.forgejo.org"
|
||||||
showBreadcrumbs = true
|
showBreadcrumbs = true
|
||||||
showDraftLabel = true
|
showDraftLabel = true
|
||||||
showEdit = true
|
showEdit = true
|
||||||
editURL = "https://github.com/cccb/www/tree/staging/content/"
|
editURL = "https://git.berlin.ccc.de/cccb-website-team/www/src/branch/staging/content/"
|
||||||
editAppendPath = true
|
editAppendPath = true
|
||||||
seriesOpened = false
|
seriesOpened = false
|
||||||
showHeadingAnchors = true
|
showHeadingAnchors = true
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,4 @@ description: "Startseite CCCB mit Kurzkalender"
|
||||||
|
|
||||||
CALENDAR
|
CALENDAR
|
||||||
|
|
||||||
Keinen Termin mehr verpeilen? Einfach den [Veranstaltungskalender abonnieren](all.ics)!
|
Weitere Termine findest du [hier](/verein/calendar/).
|
||||||
|
|
@ -1,370 +0,0 @@
|
||||||
---
|
|
||||||
title: "Kalender"
|
|
||||||
subtitle: "Der Kalender des CCCB"
|
|
||||||
date: 2025-02-26T10:00:00+02:00
|
|
||||||
menu:
|
|
||||||
main:
|
|
||||||
parent: "Verein"
|
|
||||||
---
|
|
||||||

|
|
||||||
|
|
||||||
<!-- Kalender-Widget -->
|
|
||||||
<style>
|
|
||||||
.calendar-container {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
width: 100%;
|
|
||||||
gap: 20px;
|
|
||||||
}
|
|
||||||
#calendar {
|
|
||||||
flex: 1;
|
|
||||||
min-width: 300px;
|
|
||||||
}
|
|
||||||
#event-panel {
|
|
||||||
flex: 1;
|
|
||||||
min-width: 300px;
|
|
||||||
background-color: var(--color-bg-secondary);
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 5px;
|
|
||||||
min-height: 300px;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#calendar-controls {
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
#calendar-controls button {
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
font-size: 2em;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 5px 15px;
|
|
||||||
}
|
|
||||||
#calendar-table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
#calendar-table th, #calendar-table td {
|
|
||||||
border: 1px solid var(--color-border);
|
|
||||||
padding: 5px;
|
|
||||||
text-align: center;
|
|
||||||
vertical-align: top;
|
|
||||||
height: 60px;
|
|
||||||
width: 14.28%;
|
|
||||||
}
|
|
||||||
#calendar-table th {
|
|
||||||
background-color: var(--color-bg-secondary);
|
|
||||||
}
|
|
||||||
#calendar-table td {
|
|
||||||
background-color: var(--color-bg-primary);
|
|
||||||
position: relative;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
#calendar-table td:hover {
|
|
||||||
background-color: var(--color-bg-hover);
|
|
||||||
}
|
|
||||||
.event-dot {
|
|
||||||
height: 8px;
|
|
||||||
width: 8px;
|
|
||||||
background-color: greenyellow;
|
|
||||||
border-radius: 50%;
|
|
||||||
display: block;
|
|
||||||
margin: 5px auto 0;
|
|
||||||
}
|
|
||||||
.has-event {
|
|
||||||
background-color: var(--color-bg-secondary) !important;
|
|
||||||
}
|
|
||||||
.selected-day {
|
|
||||||
background-color: var(--color-bg-hover) !important;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
#event-date {
|
|
||||||
font-size: 1.2em;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
.event-item {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
padding-bottom: 15px;
|
|
||||||
border-bottom: 1px solid var(--color-border);
|
|
||||||
}
|
|
||||||
.event-title {
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.event-time, .event-description {
|
|
||||||
font-size: 0.9em;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.no-events {
|
|
||||||
font-style: italic;
|
|
||||||
color: var(--color-text-secondary);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="calendar-container">
|
|
||||||
<div id="calendar">
|
|
||||||
<div id="calendar-controls">
|
|
||||||
<button id="prev-month">←</button>
|
|
||||||
<span id="current-month"></span>
|
|
||||||
<button id="next-month">→</button>
|
|
||||||
</div>
|
|
||||||
<table id="calendar-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Mo</th>
|
|
||||||
<th>Di</th>
|
|
||||||
<th>Mi</th>
|
|
||||||
<th>Do</th>
|
|
||||||
<th>Fr</th>
|
|
||||||
<th>Sa</th>
|
|
||||||
<th>So</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="calendar-body"></tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div id="event-panel">
|
|
||||||
<div id="event-date"></div>
|
|
||||||
<div id="event-details"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
(function(){
|
|
||||||
let events = [];
|
|
||||||
let eventsByDate = {};
|
|
||||||
|
|
||||||
// Funktion zum Parsen der ICS-Datei
|
|
||||||
function parseICS(icsText) {
|
|
||||||
let events = [];
|
|
||||||
let lines = icsText.split(/\r?\n/);
|
|
||||||
let event = null;
|
|
||||||
lines.forEach(line => {
|
|
||||||
if (line.startsWith("BEGIN:VEVENT")) {
|
|
||||||
event = {};
|
|
||||||
} else if (line.startsWith("END:VEVENT")) {
|
|
||||||
if (event) events.push(event);
|
|
||||||
event = null;
|
|
||||||
} else if (event) {
|
|
||||||
let colonIndex = line.indexOf(":");
|
|
||||||
if (colonIndex > -1) {
|
|
||||||
let key = line.substring(0, colonIndex);
|
|
||||||
let value = line.substring(colonIndex + 1);
|
|
||||||
if (key.startsWith("DTSTART")) {
|
|
||||||
event.start = value;
|
|
||||||
} else if (key.startsWith("DTEND")) {
|
|
||||||
event.end = value;
|
|
||||||
} else if (key.startsWith("SUMMARY")) {
|
|
||||||
event.summary = value;
|
|
||||||
} else if (key.startsWith("DESCRIPTION")) {
|
|
||||||
event.description = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hilfsfunktion: Parst einen ICS-Datum-String ins Format "YYYY-MM-DD"
|
|
||||||
function parseDateString(icsDateStr) {
|
|
||||||
// Erwartet entweder ganztägige Daten (YYYYMMDD) oder Datum+Zeit (YYYYMMDDTHHmmssZ)
|
|
||||||
if (icsDateStr.length === 8) {
|
|
||||||
let year = icsDateStr.substring(0, 4);
|
|
||||||
let month = icsDateStr.substring(4, 6);
|
|
||||||
let day = icsDateStr.substring(6, 8);
|
|
||||||
return `${year}-${month}-${day}`;
|
|
||||||
} else if (icsDateStr.length >= 15) {
|
|
||||||
let year = icsDateStr.substring(0, 4);
|
|
||||||
let month = icsDateStr.substring(4, 6);
|
|
||||||
let day = icsDateStr.substring(6, 8);
|
|
||||||
return `${year}-${month}-${day}`;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kalender initialisieren
|
|
||||||
let currentYear, currentMonth;
|
|
||||||
const currentMonthElem = document.getElementById("current-month");
|
|
||||||
const calendarBody = document.getElementById("calendar-body");
|
|
||||||
const eventPanel = document.getElementById("event-panel");
|
|
||||||
const eventDateElem = document.getElementById("event-date");
|
|
||||||
const eventDetailsElem = document.getElementById("event-details");
|
|
||||||
|
|
||||||
document.getElementById("prev-month").addEventListener("click", function(){
|
|
||||||
currentMonth--;
|
|
||||||
if (currentMonth < 0) {
|
|
||||||
currentMonth = 11;
|
|
||||||
currentYear--;
|
|
||||||
}
|
|
||||||
renderCalendar(currentYear, currentMonth);
|
|
||||||
});
|
|
||||||
document.getElementById("next-month").addEventListener("click", function(){
|
|
||||||
currentMonth++;
|
|
||||||
if (currentMonth > 11) {
|
|
||||||
currentMonth = 0;
|
|
||||||
currentYear++;
|
|
||||||
}
|
|
||||||
renderCalendar(currentYear, currentMonth);
|
|
||||||
});
|
|
||||||
|
|
||||||
function renderCalendar(year, month) {
|
|
||||||
// Setze die Monatsbeschriftung (in Deutsch)
|
|
||||||
const monthNames = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
|
|
||||||
currentMonthElem.textContent = monthNames[month] + " " + year;
|
|
||||||
calendarBody.innerHTML = "";
|
|
||||||
|
|
||||||
let firstDay = new Date(year, month, 1);
|
|
||||||
let firstDayIndex = (firstDay.getDay() + 6) % 7; // Montag = 0, Dienstag = 1, etc.
|
|
||||||
let daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
||||||
|
|
||||||
let row = document.createElement("tr");
|
|
||||||
// Leere Zellen vor dem 1. Tag
|
|
||||||
for (let i = 0; i < firstDayIndex; i++){
|
|
||||||
let cell = document.createElement("td");
|
|
||||||
row.appendChild(cell);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tage hinzufügen
|
|
||||||
for (let day = 1; day <= daysInMonth; day++){
|
|
||||||
if (row.children.length === 7) {
|
|
||||||
calendarBody.appendChild(row);
|
|
||||||
row = document.createElement("tr");
|
|
||||||
}
|
|
||||||
let cell = document.createElement("td");
|
|
||||||
cell.innerHTML = "<strong>" + day + "</strong>";
|
|
||||||
|
|
||||||
let dayStr = day < 10 ? "0" + day : day;
|
|
||||||
let monthStr = (month + 1) < 10 ? "0" + (month + 1) : (month + 1);
|
|
||||||
let dateKey = year + "-" + monthStr + "-" + dayStr;
|
|
||||||
|
|
||||||
if (eventsByDate[dateKey]) {
|
|
||||||
let eventDot = document.createElement("div");
|
|
||||||
eventDot.className = "event-dot";
|
|
||||||
cell.appendChild(document.createElement("br"));
|
|
||||||
cell.appendChild(eventDot);
|
|
||||||
|
|
||||||
cell.dataset.dateKey = dateKey;
|
|
||||||
cell.addEventListener("click", function() {
|
|
||||||
// Clear previous selections
|
|
||||||
document.querySelectorAll('.selected-day').forEach(el => {
|
|
||||||
el.classList.remove('selected-day');
|
|
||||||
});
|
|
||||||
cell.classList.add('selected-day');
|
|
||||||
showEventDetails(dateKey);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
row.appendChild(cell);
|
|
||||||
}
|
|
||||||
// Falls die letzte Zeile nicht komplett ist
|
|
||||||
while (row.children.length < 7) {
|
|
||||||
let cell = document.createElement("td");
|
|
||||||
row.appendChild(cell);
|
|
||||||
}
|
|
||||||
calendarBody.appendChild(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
function createEventLink(eventTitle) {
|
|
||||||
if (eventTitle.startsWith("Datengarten")) {
|
|
||||||
// Extract the number after "Datengarten "
|
|
||||||
const match = eventTitle.match(/Datengarten\s+(\d+)/i);
|
|
||||||
if (match && match[1]) {
|
|
||||||
return `https://berlin.ccc.de/datengarten/${match[1]}/`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For other titles, convert to lowercase and use as path
|
|
||||||
const slug = eventTitle.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '');
|
|
||||||
return `https://berlin.ccc.de/page/${slug}/`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showEventDetails(dateKey) {
|
|
||||||
const events = eventsByDate[dateKey];
|
|
||||||
eventDateElem.textContent = formatDate(dateKey);
|
|
||||||
eventDetailsElem.innerHTML = "";
|
|
||||||
|
|
||||||
if (events && events.length > 0) {
|
|
||||||
events.forEach(ev => {
|
|
||||||
let eventItem = document.createElement("div");
|
|
||||||
eventItem.className = "event-item";
|
|
||||||
|
|
||||||
let eventTitle = document.createElement("div");
|
|
||||||
eventTitle.className = "event-title";
|
|
||||||
|
|
||||||
// Create a link for the event title
|
|
||||||
let titleLink = document.createElement("a");
|
|
||||||
titleLink.textContent = ev.summary;
|
|
||||||
titleLink.href = createEventLink(ev.summary);
|
|
||||||
titleLink.target = "_blank";
|
|
||||||
eventTitle.appendChild(titleLink);
|
|
||||||
|
|
||||||
eventItem.appendChild(eventTitle);
|
|
||||||
|
|
||||||
let eventTime = document.createElement("div");
|
|
||||||
eventTime.className = "event-time";
|
|
||||||
eventTime.textContent = `Start: ${formatTime(ev.start)}, End: ${formatTime(ev.end)}`;
|
|
||||||
eventItem.appendChild(eventTime);
|
|
||||||
|
|
||||||
if (ev.description) {
|
|
||||||
let eventDescription = document.createElement("div");
|
|
||||||
eventDescription.className = "event-description";
|
|
||||||
eventDescription.textContent = ev.description;
|
|
||||||
eventItem.appendChild(eventDescription);
|
|
||||||
}
|
|
||||||
|
|
||||||
eventDetailsElem.appendChild(eventItem);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
let noEvents = document.createElement("div");
|
|
||||||
noEvents.className = "no-events";
|
|
||||||
noEvents.textContent = "Keine Veranstaltungen an diesem Tag.";
|
|
||||||
eventDetailsElem.appendChild(noEvents);
|
|
||||||
}
|
|
||||||
|
|
||||||
eventPanel.style.display = "block";
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatDate(dateStr) {
|
|
||||||
// Convert YYYY-MM-DD to DD.MM.YYYY
|
|
||||||
const parts = dateStr.split("-");
|
|
||||||
return `${parts[2]}.${parts[1]}.${parts[0]}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatTime(icsTimeStr) {
|
|
||||||
// Format time for display
|
|
||||||
if (icsTimeStr.length === 8) {
|
|
||||||
// All-day event
|
|
||||||
return "Ganztägig";
|
|
||||||
} else if (icsTimeStr.length >= 15) {
|
|
||||||
// Time-specific event
|
|
||||||
const hour = icsTimeStr.substring(9, 11);
|
|
||||||
const minute = icsTimeStr.substring(11, 13);
|
|
||||||
return `${hour}:${minute}`;
|
|
||||||
}
|
|
||||||
return icsTimeStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ICS-Datei abrufen und Events verarbeiten
|
|
||||||
fetch('/all.ics')
|
|
||||||
.then(response => response.text())
|
|
||||||
.then(data => {
|
|
||||||
events = parseICS(data);
|
|
||||||
events.forEach(ev => {
|
|
||||||
let dateKey = parseDateString(ev.start);
|
|
||||||
if (dateKey) {
|
|
||||||
if (!eventsByDate[dateKey]) {
|
|
||||||
eventsByDate[dateKey] = [];
|
|
||||||
}
|
|
||||||
eventsByDate[dateKey].push(ev);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let today = new Date();
|
|
||||||
currentYear = today.getFullYear();
|
|
||||||
currentMonth = today.getMonth();
|
|
||||||
renderCalendar(currentYear, currentMonth);
|
|
||||||
})
|
|
||||||
.catch(err => console.error('Fehler beim Laden der ICS-Datei:', err));
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,13 +1,31 @@
|
||||||
---
|
---
|
||||||
title: "Tag Des Offenen Hackerspace"
|
title: "Tag Des Offenen Hackspace"
|
||||||
subtitle: "Der CCCB lädt ein zum kennenlernen und entdecken."
|
subtitle: "Der CCCB lädt ein zum Kennenlernen und Entdecken."
|
||||||
date: 2025-02-10T12:00:00+02:00
|
date: 2025-02-10T12:00:00+02:00
|
||||||
dtstart: 20250329T130000
|
dtstart: 20250329T130000
|
||||||
dtend: 20250329T200000
|
dtend: 20250329T200000
|
||||||
---
|
---
|
||||||
|
|
||||||
Der [Tag des offenen Hackerspace](https://events.ccc.de/2024/02/23/tag-des-offenen-hackspace-einladung/) findet dieses Jahr auch im CCCB statt.
|
{{< figure
|
||||||
Es wird Führungen durch die Räume geben und Möglichkeiten zum kennenlernen und Spaß am Gerät.
|
src="/img/tdoh/20250309_001608.jpg"
|
||||||
|
title="Das Airport Display im CCCB"
|
||||||
|
alt="Das Airport Display im CCCB"
|
||||||
|
caption="Das Airport Display im CCCB"
|
||||||
|
>}}
|
||||||
|
|
||||||
- Programm folgt :-)
|
Der [Tag des offenen Hackspace](https://events.ccc.de/2025/02/28/tag-des-offenen-hackspace-2025/) findet dieses Jahr auch im Chaos Computer Club Berlin statt:
|
||||||
|
|
||||||
|
- Führungen durch die Räume
|
||||||
|
- mit Hack- und Lachgeschichten
|
||||||
|
- Kurzvorträge ab 17 Uhr u.a. zu den Themen:
|
||||||
|
- Der CCCB stellt sich vor!
|
||||||
|
- Freifunk
|
||||||
|
- OpenWrt
|
||||||
|
- Spaß am Gerät mit dem Service-Point
|
||||||
|
- Live-Schaltungen zu anderen Hackspaces
|
||||||
|
- die Community kennenlernen
|
||||||
|
|
||||||
|
Am 29.03.2025 freuen wir uns, Euch von 13 Uhr bis 20 Uhr in unseren Clubräumen begrüßen zu dürfen!
|
||||||
|
Anfahrt: https://berlin.ccc.de/verein/anfahrt/
|
||||||
|
|
||||||
|
All Creatures Welcome!
|
||||||
|
|
|
||||||
20
content/veranstaltungen/amateurfunk.md
Normal file
20
content/veranstaltungen/amateurfunk.md
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: "Amateurfunk"
|
||||||
|
subtitle: "Funken und Löten im CCCB"
|
||||||
|
date: 2018-05-17T22:41:48+02:00
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="/img/chaoswelle.png"
|
||||||
|
title="Logo der Chaoswelle"
|
||||||
|
alt="Logo der Chaoswelle"
|
||||||
|
caption="Logo der Chaoswelle"
|
||||||
|
>}}
|
||||||
|
|
||||||
|
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. 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 auch an Lars (Rufzeichen DC4LW) unter <dc4lw@darc.de>
|
||||||
|
wenden.
|
||||||
30
content/veranstaltungen/bastelabend.md
Normal file
30
content/veranstaltungen/bastelabend.md
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
title: "Bastelabend"
|
||||||
|
subtitle: "Der Bastelabend jeden 1. und 3. Samstag im Monat"
|
||||||
|
date: 2025-01-08T20:00:00+02:00
|
||||||
|
dtstart: 20250118T170000
|
||||||
|
dtend: 20250118T230000
|
||||||
|
rrule: "FREQ=MONTHLY;BYDAY=1SA,3SA;WKST=MO"
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
parent: "Veranstaltungen"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="/img/club/27481933907_f240f4232d.jpg"
|
||||||
|
title="Lötkolben im CCCB"
|
||||||
|
alt="Lötkolben im CCCB"
|
||||||
|
caption="Lötkolben im CCCB"
|
||||||
|
>}}
|
||||||
|
|
||||||
|
|
||||||
|
**Jeden 1. und 3. Samstag im Monat ist ab 17 Uhr Bastelabend im Club.**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{{< alert "circle-info" >}}
|
||||||
|
Wenn ihr neu seid und den CCCB zum ersten Mal besuchen wollt, kommt am besten an einem Donnerstag zum [Club Discordia](/page/clubdiscordia/), da samstags nicht immer genug Leute da sind, um euch zu empfangen.
|
||||||
|
|
||||||
|
Generell sind aber alle, die schonmal im Club waren, herzlich eingeladen, an den Bastelabenden vorbeizukommen.
|
||||||
|
{{< /alert >}}
|
||||||
35
content/veranstaltungen/chaosradio.md
Normal file
35
content/veranstaltungen/chaosradio.md
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
---
|
||||||
|
title: "Chaosradio"
|
||||||
|
subtitle: "Content für den Podcast Client"
|
||||||
|
date: 2020-02-27T01:00:00+02:00
|
||||||
|
#dtstart: 20200227T200000
|
||||||
|
#dtend: 20200227T220000
|
||||||
|
#rrule: "FREQ=MONTHLY;BYSETPOS=-1;BYDAY=TH;INTERVAL=1"
|
||||||
|
#location: "CCCB"
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
parent: "Veranstaltungen"
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="/img/chaosradio.png"
|
||||||
|
title="Chaosradio logo"
|
||||||
|
alt="Chaosradio logo"
|
||||||
|
caption="Chaosradio logo"
|
||||||
|
>}}
|
||||||
|
|
||||||
|
[Chaosradio](https://chaosradio.ccc.de) ist der Podcast des CCCB. Seit 2020 zeichen
|
||||||
|
wir ihn remote auf. Gelegentlich finden Sendungen vor Live-Publikum im Club, auf
|
||||||
|
oder auf CCC-Veranstaltungen statt. Dies kündigen wir im Vorfeld separat an.
|
||||||
|
|
||||||
|
Details zu den Sendungen gibt es auf der [Chaosradio
|
||||||
|
Webseite](https://chaosradio.de).
|
||||||
|
|
||||||
|
Kontaktaufnahme
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Offizieller IRC Chat wird unter [\#chaosradio auf
|
||||||
|
hackint.org](irc://irc.hackint.org/chaosradio)
|
||||||
|
([Web](https://webirc.hackint.org/)) betrieben.
|
||||||
|
|
||||||
|
Allgemeine Anfragen gehen an <chaosradio@ccc.de>.
|
||||||
42
content/veranstaltungen/clubdiscordia.md
Normal file
42
content/veranstaltungen/clubdiscordia.md
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
title: "Club Discordia"
|
||||||
|
subtitle: "Die offenen Abende im CCCB"
|
||||||
|
date: 2018-05-17T22:59:56+02:00
|
||||||
|
dtstart: 20220616T190000
|
||||||
|
dtend: 20220616T230000
|
||||||
|
#rrule_excludes:
|
||||||
|
# - 20190815T190000
|
||||||
|
rrule: "FREQ=WEEKLY;BYDAY=TH;INTERVAL=1"
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
parent: "Veranstaltungen"
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="/img/club/e-lab-kisten.jpg"
|
||||||
|
title="Das E-Lab im CCCB"
|
||||||
|
alt="Das E-Lab im CCCB"
|
||||||
|
caption="Das E-Lab im CCCB"
|
||||||
|
>}}
|
||||||
|
|
||||||
|
|
||||||
|
Der **Club Discordia** ist ein öffentliches Treffen in den Clubräumen des CCC Berlin. Jeder, der Lust hat, ist eingeladen, **Donnerstags so ab ca. 19 Uhr bis 24 Uhr** vorbeizukommen. Wer will, kann seinen Computer mitbringen und sollte das auch tun, sonst ist es langweilig wenn die Nerds erstmal nicht mit einem reden oder wenig los ist.
|
||||||
|
|
||||||
|
In den Clubräumen gibt es performantes Internet mit WLAN und etwas zwischenmenschliche Kommunikation.
|
||||||
|
|
||||||
|
Hin und wieder wurde auch beobachtet, dass im Club gekocht wurde, die notwendige Hardware steht zwar zur Verfügung, aber momentan nur begrenzt, da die Küche gerade umgebaut wird:
|
||||||
|
|
||||||
|
https://chaos.social/@nd/114050233067773396
|
||||||
|
|
||||||
|
Im Rahmen des Club Discordia findet auch gelegentlich unsere öffentliche Vortrags-/Workshopveranstaltung, der [Datengarten](/page/datengarten/) statt.
|
||||||
|
|
||||||
|
Außerdem gibt es im Memberbereich ein E-Lab mit 3D-Drucker, Lötstation und vielen anderen nützlichen Werkzeugen zum Basteln, die ihr mit Erlaubnis auch benutzen dürft.
|
||||||
|
|
||||||
|
Bis zum nächsten Donnerstag. Viel Spaß am Gerät!
|
||||||
|
|
||||||
|
# Hier noch ein paar wichtige Hinweise
|
||||||
|
|
||||||
|
* Ihr seid eingeladen, euch im Club frei zu bewegen. Die **Member-Bereiche** (vor allem das Kellergeschoß) sind davon allerdings ausgenommen. Es werden jedoch Führungen angeboten, bei denen ihr auch einen Blick in die Katakomben werfen könnt.
|
||||||
|
* Wer hofft, im Club **Support** für seine Windows/Linux/Mac-Installation zu suchen, hofft leider vergebens.
|
||||||
|
* **Presse ist - insbesondere ohne vorherige Anmeldung - nicht erwünscht**! Wenn ihr den Club besuchen wollt, schreibt eine Mail an <presse@ccc.de> mit eurem Anliegen.
|
||||||
|
* Und noch ein wichtiger und ernstgemeinter Hinweis: **Verschwörungstheoretiker** sind hier an der falschen Adresse. Wenn ihr euch verfolgt fühlt, Stimmen hört, o.ä. sucht euch bitte **[professionelle Hilfe]( https://www.kvberlin.de/60arztsuche/schnellsuchep.html)**.
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue