Skip to content

Commit 3761c0f

Browse files
Grzegorz Kocjanclaude
andcommitted
merge: system promocji social media gk-sm + kampania #65
Silnik publikacji (pyldz social), skille gk-sm-1..4 + retro, renderer grafik HTML->puppeteer->PNG, cron 9:00/17:00 Europe/Warsaw, YouTube live. Kampania #65 jest odnotowana w status.json jako opublikowana ręcznie, więc pierwszy run crona po tym mergu nie wypchnie jej ponownie. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2 parents 70ba11f + 390842b commit 3761c0f

77 files changed

Lines changed: 4222 additions & 612 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
name: gk-sm-1-brief
3+
description: >
4+
Faza 1 promocji meetupu Python Łódź w social media — brief: preset, zakres,
5+
kanały, decyzje. Użyj gdy startujemy promocję spotkania: "promocja meetupu",
6+
"wystartujmy social media do #NN", "zaplanuj posty do spotkania #NN",
7+
"brief promocji", "kampania meetupu". Czyta page/content/spotkania/<nr>/index.md
8+
+ dane prelegentów, pisze social/brief.md. Pierwszy skill sekwencji gk-sm-*.
9+
---
10+
11+
# gk-sm-1-brief — brief promocji (faza 1)
12+
13+
Ustala CO promujemy, JAKIM presetem i na JAKICH kanałach — zanim powstanie
14+
jakikolwiek tekst. Wyjście to krótki dokument decyzji, nie treści.
15+
16+
**Kontrakt z procesem:** faza 1. Wejście: `page/content/spotkania/<nr>/index.md`
17+
(+ `page/data/speakers/*.yaml`, dane sponsora). Wyjście:
18+
`page/content/spotkania/<nr>/social/brief.md`. Następny: **gk-sm-2-seria**.
19+
20+
## Presety
21+
22+
- **P1 — klasyczny meetup** (prelekcje z prelegentami):
23+
ogłoszenie → post per prelekcja (z oznaczeniem prelegenta) → reminder →
24+
last call → dzień spotkania.
25+
- **P2 — Lightning Talks + Open Spaces** (edycje letnie; wzorzec: ręczna seria
26+
#65 `page/content/spotkania/65/descriptions/social-series.md`):
27+
ogłoszenie → posty edukacyjne „czym jest LT/OS" → call for speakers →
28+
reminder → last call → dzień spotkania.
29+
- **P3 — pojedynczy post** (ad-hoc: ankieta, nagranie, ogłoszenie).
30+
31+
## Proces
32+
33+
1. Przeczytaj `index.md` spotkania: format, data, godzina, miejsce,
34+
prelekcje/LT, sponsor. Edycja letnia ⇒ P2 (patrz `tasks/lessons.md`).
35+
2. Zbierz prelegentów: `page/data/speakers/<id>.yaml` — w tym pole
36+
`instagram:` (handle bez @) do oznaczeń na IG oraz profil LinkedIn z sekcji
37+
`social:`. Braki wypisz w briefie jako „do uzupełnienia / pominięcia".
38+
3. Kanały standardowe: FB + IG + Discord (automat, cron 9:00/17:00 PL)
39+
oraz LinkedIn (pakiet wklejki z gk-sm-4). YT live zakłada gk-sm-4.
40+
Odchyłki zapisz jawnie w sekcji Decyzje.
41+
4. Ustal etapy (liczba i cele postów) oraz okno czasowe: od dziś do dnia
42+
spotkania, sloty tylko 9:00 lub 17:00.
43+
5. Zbierz linki: strona spotkania, zapisy (meetup.com), formularz LT (dla P2),
44+
Discord. Brak linku = placeholder `[LINK]` + pozycja na liście braków.
45+
6. Pokaż brief userowi, zbierz uwagi, popraw. **Jawna akceptacja** kończy fazę.
46+
47+
## Format social/brief.md
48+
49+
```markdown
50+
# Brief promocji — Python Łódź #<nr> (<data> · <miejsce>)
51+
52+
Preset: P1|P2|P3 · Kanały: FB, IG, Discord (automat) + LinkedIn (wklejka) · YT live: tak/nie
53+
54+
## Etapy (robocze)
55+
| # | ~data | slot | cel |
56+
|---|-------|------|-----|
57+
58+
## Prelegenci i oznaczenia
59+
| kto | IG handle | LinkedIn |
60+
|-----|-----------|----------|
61+
62+
## Linki
63+
- strona: … · zapisy: … · formularz LT: … · Discord: …
64+
65+
## Braki / do uzupełnienia
66+
## Decyzje i odchyłki
67+
```
68+
69+
## Feedback loop (obowiązuje)
70+
71+
- **Na starcie fazy**: przeczytaj `tasks/feedback.md` i zastosuj wpisy ze statusem
72+
`nowy` dotyczące tej fazy, zanim cokolwiek wyprodukujesz.
73+
- **Po każdej korekcie usera** (zrobiłeś coś nie tak, jak chciał): dopisz wpis
74+
`[data] | gk-sm-1-brief | co poszło nie tak | jak ma być | nowy`.
75+
- Wpisy do skilli promuje wyłącznie gk-sm-retro — nie edytuj SKILL.md w trakcie fazy.
76+
77+
## Definition of Done
78+
79+
- `social/brief.md` istnieje: preset, etapy z celami, kanały, linki.
80+
- Braki danych jawnie wylistowane.
81+
- User zaakceptował brief.
82+
- → Następny skill: **gk-sm-2-seria**.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
name: gk-sm-2-seria
3+
description: >
4+
Faza 2 promocji meetupu Python Łódź — seria postów: jeden kanoniczny tekst
5+
per post, iteracyjnie z userem. Użyj po zaakceptowanym briefie lub gdy
6+
trzeba poprawić teksty: "napisz posty", "seria postów", "teksty do promocji",
7+
"popraw posty do #NN". Czyta social/brief.md, pisze social/posts.md
8+
w formacie parsowalnym przez publisher. Drugi skill sekwencji gk-sm-*.
9+
---
10+
11+
# gk-sm-2-seria — kanoniczne teksty postów (faza 2)
12+
13+
Zamienia brief w gotowe teksty. **Jeden kanoniczny tekst per post** — NIE
14+
warianty per platforma. Różnice platformowe są mechaniczne i stosuje je
15+
publisher (`src/pyldz/social/transforms.py`): na IG linki zamieniają się w
16+
„🔗 Link w bio → pythonlodz.org" + stałe hashtagi; FB/Discord/LinkedIn dostają
17+
tekst bez zmian. Wyjątek: rzadki `override` per platforma (np. `@everyone`
18+
dla Discorda).
19+
20+
**Kontrakt z procesem:** faza 2. Wejście: `social/brief.md`. Wyjście:
21+
`social/posts.md`. Następny: **gk-sm-3-grafiki**.
22+
23+
## Format social/posts.md (kontrakt z publisherem — nie zmieniaj!)
24+
25+
```markdown
26+
# Posty — Python Łódź #<nr>
27+
28+
## post: <id-kebab-case>
29+
30+
<pełny kanoniczny tekst — linki pełnymi URL-ami, @handle prelegentów IG w treści>
31+
32+
### override: discord
33+
34+
<opcjonalny pełny tekst zastępczy, np. z @everyone>
35+
```
36+
37+
Id posta: `[a-z0-9][a-z0-9-]*` (np. `save-the-date`, `lightning-talk`,
38+
`last-call`). Override tylko gdy transformacja mechaniczna nie wystarcza.
39+
40+
## Zasady tekstów
41+
42+
- Ton Python Łódź: przyjazny, luźny, otwarty, „zero spiny". Emoji z umiarem.
43+
Myślnik: „-". Wzorzec jakości: `page/content/spotkania/65/descriptions/social-series.md`.
44+
- Każdy post ma jeden cel (z etapów briefu) i jedno CTA.
45+
- Linki pełnymi URL-ami w treści (IG-transform zajmie się resztą).
46+
- Prelegenci: w treści `@handle` (IG) — publisher zostawia; na FB to plain text
47+
(zgodnie ze specem, ograniczenie Mety); LinkedIn dostanie instrukcję tagów
48+
w gk-sm-4.
49+
- Placeholder na link do YT live: wpisz `[LINK DO LIVE]` w postach dnia
50+
spotkania — gk-sm-4 podmieni po założeniu transmisji.
51+
52+
## Model współpracy (obowiązuje)
53+
54+
- **Nigdy jednostrzałowo.** Dla kluczowych postów pokaż 3–4 kontrastowe
55+
warianty → zbierz reakcję per wariant → syntezuj.
56+
- Pokazuj pełne brzmienie (nie skróty) — to dokładny tekst, który pójdzie
57+
w świat. **Jawna akceptacja pełnego brzmienia każdego posta.**
58+
- Po akceptacji sprawdź parsowalność:
59+
`uv run python -c "from pathlib import Path; from pyldz.social.posts_md import parse_posts_md; print(list(parse_posts_md(Path('page/content/spotkania/<nr>/social/posts.md').read_text())))"`
60+
61+
## Feedback loop (obowiązuje)
62+
63+
- **Na starcie fazy**: przeczytaj `tasks/feedback.md` i zastosuj wpisy ze statusem
64+
`nowy` dotyczące tej fazy, zanim cokolwiek wyprodukujesz.
65+
- **Po każdej korekcie usera** (zrobiłeś coś nie tak, jak chciał): dopisz wpis
66+
`[data] | gk-sm-2-seria | co poszło nie tak | jak ma być | nowy`.
67+
- Wpisy do skilli promuje wyłącznie gk-sm-retro — nie edytuj SKILL.md w trakcie fazy.
68+
69+
## Definition of Done
70+
71+
- `social/posts.md` w poprawnym formacie (parser zwraca wszystkie posty).
72+
- Każdy etap briefu ma post; każdy post zaakceptowany w pełnym brzmieniu.
73+
- → Następny skill: **gk-sm-3-grafiki**.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
name: gk-sm-3-grafiki
3+
description: >
4+
Faza 3 promocji meetupu Python Łódź — grafiki do postów przez
5+
HTML+CSS → puppeteer → PNG. Użyj po zaakceptowanych tekstach lub do poprawy
6+
grafik: "grafiki do postów", "zrób grafiki", "popraw grafikę do #NN",
7+
"kreacje social media". Czyta social/posts.md, pisze social/images/final/.
8+
Trzeci skill sekwencji gk-sm-*.
9+
---
10+
11+
# gk-sm-3-grafiki — grafiki postów (faza 3)
12+
13+
Produkuje grafiki brandowe przez `tools/social/render.mjs` (HTML+CSS →
14+
puppeteer → PNG). **Tekst zawsze warstwą HTML** (nigdy wypalony w tle) —
15+
łatwa iteracja i pełna kontrola typografii.
16+
17+
**Kontrakt z procesem:** faza 3. Wejście: `social/posts.md` (+ brief).
18+
Wyjście: `social/images/final/*.png`. Następny: **gk-sm-4-harmonogram**.
19+
20+
## Produkcja
21+
22+
1. Szablony: `tools/social/templates/*.html` (start: `announcement.html`).
23+
Nowy typ posta ⇒ nowy szablon w tym katalogu (commitowany — rośnie biblioteka).
24+
2. Job JSON + render:
25+
```bash
26+
node tools/social/render.mjs job.json
27+
# job: template, name, outDir, formats ["4x5","1x1","16x9"], fields, background?
28+
```
29+
Formaty z jednego szablonu; podstawowy format postów to **4:5**.
30+
(Pierwsze użycie na maszynie: `npm install --prefix tools/social`.)
31+
3. Tła: stock (Pexels/Unsplash) → zapisz źródłowy plik w `social/images/stock/`
32+
z notką pochodzenia (`social/images/stock/README.md`: plik → URL źródła,
33+
licencja) — albo własne zdjęcia/assety z repo.
34+
4. Brand (wymusza szablon): granat `#001F3F`, żółty `#FFD700`,
35+
logo `page/assets/images/logo.png`, fonty OpenSans z `page/assets/fonts/`.
36+
37+
## Reguły czytelności (z dumtek — odrzucaj, co ich nie spełnia)
38+
39+
- **Data i miejsce NA grafice** — nie licz, że ktoś doczyta w tekście.
40+
- Wysoki kontrast napis/tło; czcionka czytelna na telefonie (podgląd w 25%).
41+
- Mało tekstu: kicker + hasło + data/miejsce. Ściana tekstu = antywzorzec.
42+
- Zbyt „ładne"/artystyczne kosztem czytelności = antywzorzec.
43+
44+
## Model współpracy (obowiązuje)
45+
46+
- Pokazuj obrazy, nie opisy hexów. Do akceptacji renderuj **mockup w feedzie**:
47+
```bash
48+
node tools/social/mockup.mjs <grafika.png> <plik-z-tekstem-posta> <mockup.png>
49+
```
50+
- 2–3 kontrastowe warianty dla grafik kluczowych → reakcja per wariant →
51+
synteza → **jawna akceptacja zestawu**.
52+
- Zaakceptowane → `social/images/final/<post-id>-<format>.png` (nazwa pliku
53+
= id posta z posts.md + format). Odrzucone + źródłowe job JSON →
54+
`social/images/archive/`.
55+
56+
## Feedback loop (obowiązuje)
57+
58+
- **Na starcie fazy**: przeczytaj `tasks/feedback.md` i zastosuj wpisy ze statusem
59+
`nowy` dotyczące tej fazy, zanim cokolwiek wyprodukujesz.
60+
- **Po każdej korekcie usera** (zrobiłeś coś nie tak, jak chciał): dopisz wpis
61+
`[data] | gk-sm-3-grafiki | co poszło nie tak | jak ma być | nowy`.
62+
- Wpisy do skilli promuje wyłącznie gk-sm-retro — nie edytuj SKILL.md w trakcie fazy.
63+
64+
## Definition of Done
65+
66+
- Każdy post z serii ma grafikę w `social/images/final/` (min. 4:5),
67+
nazwaną `<post-id>-4x5.png`.
68+
- Data i miejsce na grafikach eventowych; mockupy pokazane; zestaw
69+
zaakceptowany przez usera.
70+
- → Następny skill: **gk-sm-4-harmonogram**.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
---
2+
name: gk-sm-4-harmonogram
3+
description: >
4+
Faza 4 promocji meetupu Python Łódź — harmonogram publikacji, YT live,
5+
pakiet LinkedIn, dry-run i uzbrojenie crona. Użyj po zaakceptowanych
6+
grafikach: "harmonogram postów", "zaplanuj publikacje", "odpal promocję",
7+
"załóż live na YouTube", "pakiet LinkedIn". Pisze social/schedule.yaml
8+
+ social/linkedin-paste.md, zakłada YT live, robi dry-run, commituje do main.
9+
Czwarty skill sekwencji gk-sm-*.
10+
---
11+
12+
# gk-sm-4-harmonogram — kalendarz, YT live, wklejka, uzbrojenie (faza 4)
13+
14+
Ostatnia faza przed automatem: układa kalendarz, zakłada transmisję,
15+
generuje pakiet ręcznej wklejki i uzbraja cron przez commit do `main`.
16+
17+
**Kontrakt z procesem:** faza 4. Wejście: `social/posts.md` +
18+
`social/images/final/`. Wyjście: `social/schedule.yaml` +
19+
`social/linkedin-paste.md` (+ link YT w postach). Następny: gk-sm-retro
20+
(po meetupie).
21+
22+
## Proces
23+
24+
1. **Kalendarz**: przypisz każdemu postowi datę + slot (tylko **9:00** lub
25+
**17:00** Europe/Warsaw), kanały, grafikę i tagi IG. Format
26+
`schedule.yaml` (kontrakt z publisherem — patrz niżej).
27+
2. **YT live** (jeśli brief mówi „tak"):
28+
```bash
29+
uv run pyldz social yt-create-live --title "Python Łódź #<nr> — <tytuł>" \
30+
--start "<YYYY-MM-DD HH:MM>" --description-file page/content/spotkania/<nr>/descriptions/youtube-live.md
31+
```
32+
Zwrócony link wstaw w `posts.md` w miejsce `[LINK DO LIVE]`.
33+
(Pierwsze użycie: otworzy się OAuth w przeglądarce; token → `.yt_token.json`.)
34+
3. **Pakiet LinkedIn**: `social/linkedin-paste.md` — dla każdego posta
35+
z kanałem `linkedin`: data+slot, pełny tekst (kanoniczny lub override),
36+
którą grafikę załączyć, kogo oznaczyć (profile LinkedIn prelegentów
37+
z briefu — tagowanie ręcznie w UI natywnego schedulera, do 3 mies. w przód).
38+
Opcjonalnie sekcja YT Community (brak API — też wklejka).
39+
4. **Dry-run** — pokaż userowi DOKŁADNE payloady:
40+
```bash
41+
uv run pyldz social dry-run --meetup <nr>
42+
```
43+
Uwaga: dry-run pokazuje tylko posty due „teraz"; harmonogram przyszły
44+
zweryfikuj czytając schedule.yaml na głos (post × kanał × slot × grafika).
45+
5. **Akceptacja → uzbrojenie**: po jawnej akceptacji całości commit + push
46+
do `main` (posts.md, schedule.yaml, images/final/, linkedin-paste.md).
47+
Publikacja = merge do main; cron (`.github/workflows/social-publish.yaml`,
48+
sloty 9:00/17:00 PL) przejmuje resztę i nadrabia zaległe sloty.
49+
Deploy strony (GitHub Pages) musi zajść przed pierwszym slotem —
50+
grafiki muszą być publicznie dostępne pod
51+
`https://pythonlodz.org/spotkania/<nr>/social/…` (FB/IG ciągną URL).
52+
53+
## Format social/schedule.yaml (kontrakt z publisherem — nie zmieniaj!)
54+
55+
```yaml
56+
meetup: "<nr>"
57+
timezone: Europe/Warsaw
58+
posts:
59+
- post: <id z posts.md>
60+
channels: [facebook, instagram, discord, linkedin]
61+
scheduled: 2026-07-08 09:00:00 # czas lokalny Europe/Warsaw
62+
image: images/final/<post-id>-4x5.png # względem social/
63+
ig_tagged: [<ig-handle-bez-@>] # opcjonalne
64+
```
65+
66+
Zasady: IG wymaga `image`; `linkedin` w `channels` = tylko do pakietu wklejki
67+
(publisher pomija); posty przeszłe bez wpisu w `status.json` publikują się
68+
w najbliższym runie (świadomie — tak działa nadrabianie).
69+
70+
## Feedback loop (obowiązuje)
71+
72+
- **Na starcie fazy**: przeczytaj `tasks/feedback.md` i zastosuj wpisy ze statusem
73+
`nowy` dotyczące tej fazy, zanim cokolwiek wyprodukujesz.
74+
- **Po każdej korekcie usera** (zrobiłeś coś nie tak, jak chciał): dopisz wpis
75+
`[data] | gk-sm-4-harmonogram | co poszło nie tak | jak ma być | nowy`.
76+
- Wpisy do skilli promuje wyłącznie gk-sm-retro — nie edytuj SKILL.md w trakcie fazy.
77+
78+
## Definition of Done
79+
80+
- `schedule.yaml` waliduje się (`uv run pyldz social dry-run --meetup <nr>`
81+
działa bez błędu), każdy post ma slot 9:00/17:00 i grafikę tam, gdzie trzeba.
82+
- YT live założony, link wstawiony w posty (jeśli dotyczy).
83+
- `linkedin-paste.md` kompletny (teksty + daty + grafiki + kogo oznaczyć).
84+
- User zaakceptował harmonogram; całość scommitowana i wypchnięta na `main`.
85+
- Po meetupie: **gk-sm-retro**.

‎.claude/skills/gk-sm-manifest.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# gk-sm — manifest wersji
2+
3+
System promocji meetupów w social media. Spec:
4+
`docs/superpowers/specs/2026-07-10-social-media-system-design.md`.
5+
Sekwencja: gk-sm-1-brief → gk-sm-2-seria → gk-sm-3-grafiki →
6+
gk-sm-4-harmonogram → (po meetupie) gk-sm-retro.
7+
8+
| Skill | Wersja |
9+
|---|---|
10+
| gk-sm-1-brief | 1.1.0 |
11+
| gk-sm-2-seria | 1.1.0 |
12+
| gk-sm-3-grafiki | 1.1.0 |
13+
| gk-sm-4-harmonogram | 1.1.0 |
14+
| gk-sm-retro | 1.1.0 |
15+
16+
## CHANGELOG
17+
18+
### 1.1.0 — 2026-07-10
19+
- Feedback loop: każda faza czyta `tasks/feedback.md` na starcie i dopisuje wpis
20+
po każdej korekcie usera; gk-sm-retro promuje sprawdzone wpisy do SKILL.md.
21+
22+
### 1.0.0 — 2026-07-10
23+
- Pierwsze wydanie sekwencji gk-sm-* (wzorzec: dumtek/fb-ads-system gk-fb-*).
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
name: gk-sm-retro
3+
description: >
4+
Retro promocji meetupu Python Łódź po spotkaniu — co zadziałało, ekstrakcja
5+
klocków wielokrotnego użytku, lekcje. Użyj po meetupie: "retro promocji",
6+
"podsumuj promocję #NN", "co zadziałało w postach". Czyta social/ meetupu,
7+
pisze blocks/social/ + tasks/lessons.md. Zamyka sekwencję gk-sm-*.
8+
---
9+
10+
# gk-sm-retro — retro promocji (po meetupie)
11+
12+
Zamyka cykl: wyciąga z kampanii to, co warto zużyć ponownie, i lekcje na
13+
kolejne edycje. Bez analityki zasięgów (poza zakresem systemu) — retro
14+
opiera się na obserwacjach usera i przebiegu procesu.
15+
16+
**Kontrakt z procesem:** wejście: `page/content/spotkania/<nr>/social/`
17+
(+ `status.json` — co i kiedy faktycznie poszło). Wyjście: `blocks/social/`
18+
+ wpisy w `tasks/lessons.md` (+ ew. poprawki skilli gk-sm-*).
19+
20+
## Proces
21+
22+
1. Przejrzyj `status.json`: czy wszystkie posty poszły? Które sloty padły /
23+
były nadrabiane? Błędy z runów crona (GitHub Actions → „Social publish").
24+
2. Zapytaj usera: które posty/grafiki zadziałały (komentarze, zapisy,
25+
zgłoszenia LT), co było za dużo/za mało, co ręczne bolało.
26+
3. **Ekstrakcja klocków** → `blocks/social/<nazwa>.md`: sprawdzone fragmenty
27+
tekstów (call-to-action, explainery LT/OS, struktury postów), szablony
28+
grafik warte powtórzenia (wskaż plik w `tools/social/templates/`),
29+
działające sekwencje etapów. Klocek = plik z treścią + notka kiedy używać.
30+
4. **Przegląd feedbacku** → `tasks/feedback.md`: przejdź wszystkie wpisy `nowy`.
31+
Powtarzające się lub potwierdzone przez usera → wpisz na stałe do odpowiedniego
32+
`gk-sm-*/SKILL.md`, podbij wersję w `.claude/skills/gk-sm-manifest.md`
33+
(semver + wpis w CHANGELOG) i zmień status wpisu na `wdrożone`.
34+
Jednorazowe/nieaktualne → status `odrzucone`. Każdą promocję pokaż userowi
35+
do akceptacji przed edycją skilla.
36+
5. **Lekcje** → `tasks/lessons.md` w formacie repo:
37+
`[data] | co poszło nie tak | reguła na przyszłość` (rzeczy spoza procesu gk-sm).
38+
39+
## Definition of Done
40+
41+
- Klocki wielokrotnego użytku w `blocks/social/` (min. te wskazane przez usera).
42+
- `tasks/feedback.md` przejrzany: zero wpisów `nowy` (wszystkie `wdrożone` albo
43+
`odrzucone`); wdrożone mają odzwierciedlenie w SKILL.md + manifeście.
44+
- Lekcje dopisane do `tasks/lessons.md`.

‎.env.example‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,10 @@ GOOGLE_SHEETS__TOKEN_CACHE_PATH=.client_secret.token.json
66
# Application Configuration
77
DEBUG=false
88
DRY_RUN=false
9+
10+
# Social publisher (gk-sm) — sekrety produkcyjne żyją w GitHub Secrets
11+
META_PAGE_ID=
12+
META_ACCESS_TOKEN=
13+
IG_USER_ID=
14+
DISCORD_WEBHOOK_URL=
15+
SITE_BASE_URL=https://pythonlodz.org

0 commit comments

Comments
 (0)