Changelog

Historie úprav webu (kromě přidávání nových článků).

Changelog

Tento soubor sleduje změny webu Vibecoding. Zapisujeme sem všechny úpravy kromě přidávání nových článků.

[2.11.0] — 2026-05-13

Přidáno

  • Lístek zdarma z administrace — v /admin/akce/[id] tab Objednávky nové tlačítko „+ Lístek zdarma" otvírá modal pro manuální vystavení free registrace (speaker, partner, VIP, host). Backend POST /api/admin/create-free-ticket zakládá registraci s payment_status='manual', verified=1, payment_amount=0, promo_code='ADMIN_FREE' (pro reporting) a interní poznámkou. Email pozve příjemce na /moje-misto?token=..., kde si vybere sedadlo a zároveň upraví veřejnou jmenovku (display_name / URL / emoji — už existující SeatSelector). Volitelné: osobní zpráva v markdownu, BCC admina, override kapacity. Žádná faktura, žádný promo blok.
  • Markdown export výsledků dotazníku/admin/vysledky-dotazniku má nové tlačítko „Stáhnout (Markdown)". Generuje na klientovi z už načtených dat: souhrn (response rate, počty), tabulky pro rating a single-choice otázky, blockquote pro textové odpovědi po respondentech, sekce s uloženou LLM analýzou. Název souboru dotaznik_<akce>_<dotaznik>_<termin>.md.

Dokumentace

  • docs/free-ticket-admin.md — popis flow, UI, endpointu, obsahu emailu, auditu (promo_code='ADMIN_FREE').

[2.10.0] — 2026-05-07

Přidáno

  • Zoom integrace pro online workshopy (ADR-005) — kompletní automatizace lifecyklu online akce. Server-to-Server OAuth pod patrick.zandl@marigold.cz, app „Vibecoding events" v Zoom Marketplace.
    • PR1 Foundation — admin tlačítka „Vytvořit/Smazat Zoom meeting" v /admin/akce/[id], sloupce zoom_meeting_id, zoom_start_url, zoom_passcode, zoom_start_at_utc, zoom_end_at_utc, zoom_host_email, zoom_created_at na event_dates. UTC instanty z Zoom API response (žádný hardcoded TZ offset).
    • PR2 User flow — auto-registrace zaplacených účastníků jako Zoom registrants po každé úspěšné platbě (FIO admin, FIO self-service, manuální confirm, Stripe webhook, FIO cron). Separátní join_tokenregistration.id chrání před iterací ID. Proxy /akce/join/[token] validuje cancel/payment/zoom-status, časové okno (-30 min až +24 h od konce). 4 email cesty přepnuty na proxy URL (potvrzovací po platbě, preview, 10-min reminder, 7d/1d reminder). Cancel flow ruší registranta v Zoomu. Retry cron (5 min) pro pending/failed registrace, max 5 pokusů. Backfill button pro hromadnou registraci už zaplacených.
    • PR3 Attendance — webhook /api/webhook/zoom s CRC challenge + HMAC-SHA256 signature verify (5 min replay window, timing-safe). Branch handlery pro meeting.participant_joined/left/endedINSERT OR IGNORE do zoom_attendance_logs (idempotency proti Zoom retry). Finalize cron (každé 2 h) doplňuje data z report API a počítá attended_seconds / meeting_seconds → status attended (≥70 %), partial (≥20 %), no_show. Double URL-encode meeting UUID když začíná / nebo obsahuje // (Zoom API quirk). Admin „Účast" tab s live counterem, anomáliemi (účastníci bez registrace → Telegram alert), finalizovanou tabulkou a CSV exportem.
  • Branded error tracking pro Zoom — všechny Zoom endpointy (admin create/delete/backfill/attendance, webhook, retry+finalize cron, proxy) napojené na BetterStack přes initErrorTracking + captureException. Nový helper captureMessage(sentry, msg, { level, extra }) v src/lib/error-tracking.ts pro warningy/info eventy (signature failures, neznámé meetings, unmatched participants).
  • Admin akce — survey results card na detailu termínu po odeslání dotazníku.
  • PassKit ticket POC — proof-of-concept Apple Wallet pasy pro účastníky, zatím odložené (viz commit historie).
  • Admin dashboard v3 — 2-řádkový layout termínů s countdownem, inline email status ikonkami, readiness checklistem, last-activity sloupcem; šedě odlišené proběhlé termíny ≤30 dní, skryté archivované karty.

Migrace

  • db/migration-079-zoom-foundation.sql — 7 sloupců na event_dates pro Zoom meeting state + UNIQUE index.
  • db/migration-080-zoom-registrants.sql — 7 sloupců na registrations (zoom_registrant_id, zoom_personal_url, join_token, zoom_registration_status, attempts, last_attempt_at, error) + 2 indexy.
  • db/migration-081-zoom-attendance.sql — tabulka zoom_attendance_logs s UNIQUE dedup indexem; attended, attendance_seconds, attendance_status na registrations; attendance_finalized_at na event_dates.

Operační

  • Cloudflare secrets: ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET, ZOOM_WEBHOOK_SECRET (volitelně ZOOM_ALT_HOSTS).
  • Cron-job.org úlohy: zoom-registration-retry (každých 5 min), zoom-attendance-finalize (každé 2 h).
  • Zoom Marketplace webhook subscription „Vibecoding Workshopy" aktivní s eventy meeting.participant_joined/left/ended.

Dokumentace

  • docs/decisions/005-zoom-integration.md (ADR), docs/zoom-integration.md (kompletní popis PR1–PR3 + plán PR4 recording), aktualizovaný docs/error-tracking.md o Zoom routes a captureMessage helper.

[2.9.0] — 2026-05-05

Přidáno

  • Nový flow upomínek platby — dvě upomínky (D+3, D+6 osoba / D+7, D+13 firma) + auto-storno (D+7 / D+14). Counter-based logika (payment_reminder_count, separátní timestampy), společné šablony v lib/payment-emails.ts. Manuální endpoint /api/admin/send-payment-reminder přepsán na sdílené šablony, podporuje force override.
  • Event-proximity timing — cron porovnává standardní timeline od objednávky s blízkostí akce; všechny upomínky musí padnout před akcí (E−4, E−2, storno E−1). Použije se ten z obou, který spadne dřív (logické OR).
  • Post-event auto-storno — pending registrace u akcí, jejichž termín už proběhl, jsou cronem stornovány automaticky (řeší dříve „zaseknuté" objednávky).
  • Auto-restore na pozdní platbu — když FIO matching najde platbu pro auto-stornovanou registraci, registraci obnoví (cancelled_at = NULL), pošle email „Platba přijata — registrace obnovena" a pokračuje standardním paid-flow (Fakturoid faktura, wallet pass).
  • Stripe upgrade z bank-transfer na card — na platební stránce /akce/platba?token=... se u objednávek ≥ 500 Kč zobrazuje tlačítko „Zaplatit kartou" (vyžaduje STRIPE_ENABLED). Endpoint /api/stripe/create-checkout nově přijímá upgradeToCard: true a sám přepne payment_method z transfer na card.
  • Korporátní note v upomínkách — text „Máte ve firmě delší schvalovací proces? Odepište prosím na tento email…" v každé upomínce.
  • Logování upomínek do email_log — typy payment_reminder_1, payment_reminder_2, payment_cancellation, payment_restore. Cron + manuální endpoint loguje vše.
  • Dokumentace docs/payment-reminder-flow.md s kompletním popisem flow, timeline, šablon a edge cases.

Opraveno

  • Cron filtr přes events.date — cron send-reminders ignoroval pending registrace, jejichž akce měla hlavní datum v minulosti, ale event_dates variantu v budoucnu. Filtr přepsán na COALESCE(event_dates.date, events.date).
  • send-payment-reminder endpoint per-registrace — UI v /admin/objednavky volalo s registrationId, endpoint vyžadoval eventId a vracel chybu. Endpoint nyní podporuje oba módy.
  • Tlačítko „Náhled emailu" v /admin/vysledky-dotazniku — popup blocker rušil okno otevřené po await. Otevírá se nyní synchronně s placeholderem, HTML se dopisuje po fetchi.
  • Odesílatel dotazníkových emailů — sjednoceno na Patrick Zandl <patrick@vibecoding.cz> + explicitní Reply-To.

Migrace

  • db/migration-078-payment-reminder-tracking.sql — nové sloupce payment_reminder_count, payment_reminder_1_sent_at, payment_reminder_2_sent_at + backfill ze starého payment_reminder_sent_at. Legacy alias zachován.

[2.8.0] — 2026-05-05

Přidáno

  • Microsoft Clarity analytics — integrace @microsoft/clarity npm balíčku s custom tagy (typ stránky, kategorie článku) a sledováním scroll events. Project ID nastaveno přes env, načítá se jen v produkci.
  • X (Twitter) conversion tracking — pixel pro sledování konverzí z X kampaní přidán do Base.astro.
  • Dotazník pro Claude Code Workshop — seed script scripts/seed-claude-code-workshop-survey.mjs pro 13-otázkový feedback survey (idempotentní, sdílený napříč termíny workshopu). Default BASE_URL cílí na produkci https://www.vibecoding.cz. Nasazená šablona bbe30b30-63f8-4728-b806-04c66e03bcea u akce evt_1773221277734_o0o9wc2rm.
  • Email template pro účastníky workshopu — detailní instrukce „co si přinést" s prerekvizitami (Claude Code instalace, Git, projekt).
  • Dokumentacedocs/claude-code-workshop-survey.md (popis dotazníku, identifikátory, vzorový úvodní text emailu) a gotcha v docs/gotchas.md o nutnosti www. BASE_URL pro admin scripty proti produkci.

Vylepšeno

  • TOC u krátkých článků — Table of Contents se skrývá u článků pod 600 slov, kde je rušivý a navigačně zbytečný.

[2.7.3] — 2026-04-18

Vylepšeno

  • SEO: interní prolinkování — 180+ interních odkazů přidáno do 40 článků pro klíčová slova cursor, replit, lovable a gpt-5. Titulky 69 článků zkráceny pod 60 znaků (včetně suffixu | Vibecoding.cz). Meta descriptions doplněny nebo zkráceny na 130–155 znaků u 76 článků.
  • SEO: schema.org opravy — VideoObject na /videa/ doplněn o embedUrl, contentUrl a správný formát interactionType. Z CollectionPage na /zpravicky/tyden/* odstraněno nevalidní pole numberOfItems.
  • SEO: sitemap — přidány chybějící stránky /workshopy/ a /obchodni-podminky/.
  • SEO: orphan pages/ostatni/ přidáno do navigace článků, interní linky akcí opraveny na trailing slash.
  • SEO: výkon — CDN cache 30 min přidána na /zpravicky/[company] (TTFB bylo 6 s). N+1 query v detailu akce nahrazena jedním batch dotazem.
  • IndexNow — klíč 5e156b89529f427ba90a433a4b812428 nastaven, 34 URL odesláno na api.indexnow.org.

Opraveno

  • Broken 3XX redirect linky — opraven odkaz na Convex v codex-09.md a odkaz na Droid v claude-code-na-webu.md.
  • Alt texty — 9 obrázků bez alt textu ve 4 článcích doplněno o popisné texty.

[2.7.2] — 2026-04-18

Opraveno

  • 21 broken links v LLM stránkách — odkazy v popisech modelů typu [text](/openai/o3-mini) ukazovaly na neexistující URL (správný formát je /llm/openai-o3-mini/). Opraveno ve 16 souborech v src/content/llm/. Kde cílový model nemá content soubor, link byl odstraněn a ponechán jen text.

[2.7.1] — 2026-04-17

Přidáno

  • Stripe platby kartou v live módu — nasazen live webhook endpoint, secrets (STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_ENABLED) v Cloudflare Pages. Kartová platba dostupná vedle bankovního převodu pro akce od 500 Kč.

Opraveno

  • Editace programu termínu v adminu — pole program_variable u variant termínů (event_dates) nebylo dostupné v editačním formuláři v /admin/akce/[id]. Přidána textarea "Program termínu (markdown)" do modalu "Upravit termín". API endpoint pole již podporoval, chybělo jen UI.
  • Test order s kartou — objednávky přes testovací email patrick@zandl.cz s platbou kartou se nyní účtují 20 Kč místo 1 Kč (Stripe CZK minimum je 15 Kč). Bankovní převod zůstává na 1 Kč.

[2.7.0] — 2026-04-16

Přidáno

  • Admin dashboard akcí — kompletní přepis přehledu akcí (/admin/akce/). Produktové karty seskupené per akce s termíny uvnitř místo plochého seznamu. Tříměsíční finanční přehled (zaplaceno / čeká na platbu) nahoře. Alert panel pro přeprodané termíny a staré nezaplacené objednávky. Kapacitní bary rozlišují zaplacené (zelená) a čekající na platbu (žlutá). Waitlist počty per termín.
  • Monthly revenue API — nový dotaz v /api/admin/get-data agregující příjmy per měsíc podle data konání akce.

Opraveno

  • Rozcestník akcí s budoucími termíny — stránka /akce/[slug]/ se zobrazovala jako „proběhlá akce" i když existovaly budoucí termíny v event_dates. Nyní se isPastEvent počítá z termínů, ne jen z hlavního data eventu.

[2.6.0] — 2026-04-06

Přidáno

  • llms.txt a llms-full.txt — soubory pro AI discovery (LLM crawlery). Kurátorský přehled webu s klíčovými články a rozšířená verze se všemi sekcemi.
  • robots.txt rozšíření — explicitní povolení AI crawlerů (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, ChatGPT-User, Claude-Web).
  • TechArticle schema — upgrade Article → TechArticle v JSON-LD pro články, přidáno inLanguage a publisher.url.
  • EducationEvent JSON-LD na stránce /workshopy/ — structured data pro workshop Claude Code pro vývojáře (cena, kapacita, délka, teaches).
  • Service JSON-LD na stránce /workshopy/ — structured data pro firemní workshop.
  • FAQPage JSON-LD na stránce /workshopy/ — 5 nejčastějších otázek (pro koho, cena, co se naučím, firemní varianta, notebook).
  • VideoObject JSON-LD na stránce /videa/ — ItemList s VideoObject pro každé video (název, popis, zhlédnutí, datum).
  • Event ItemList JSON-LD na přehledu /akce/ — structured data pro nadcházející akce.
  • RSS feed pro akce — nový endpoint /akce-feed.xml s posledními 30 akcemi.
  • RSS autodiscovery — oba RSS feedy (články + akce) v <head> každé stránky.

Vylepšeno

  • Meta descriptions — informačně hustší popisy na homepage, /vibecoding/, /akce/, /workshopy/, /videa/, /changelog/, /podpora/.

[2.5.0] — 2026-04-02

Přidáno

  • Výběr místa jako samostatný krok — seat picker odstraněn z objednávkového formuláře. Nová mezikroková stránka /akce/vybrat-misto s celostránkovou mapou míst, step indikátorem (1. Objednávka → 2. Výběr místa → 3. Platba) a auto-předvýběrem nejlepšího volného místa.
  • 30minutová rezervace místa (seat hold) — nový endpoint /api/seats/hold s TTL 30 minut. Místo je držené po dobu platby; po expiraci se automaticky uvolní. Seat availability filtruje expirované holds.
  • DB migrace 057expires_at sloupec v event_seat_bookings pro dočasné rezervace.
  • Upozornění na expiraci místa — pokud uživatel zaplatí po expiraci jeho seat holdu, v potvrzovacím emailu je upozorněn a vyzván k novému výběru místa.
  • Wallet pass (Passcreator) integrace — tlačítko "Přidat do Apple/Google Wallet" na stránkách /moje-misto a /akce/platba.
  • Admin: odeslání vstupenky — nový endpoint /api/admin/send-wallet-pass + tlačítko "Poslat/Přeposlat vstupenku" v detailu registrace. Zobrazení wallet pass odkazu v admin detailu.
  • Admin: wallet_pass_id/url v get-data query pro zobrazení stavu vstupenky.

Opraveno

  • Dark mode kontrast — opravena nečitelnost "Téma týdne" (featured card), LLM ticker chipů a "Obsah článku" (TOC) v tmavém režimu.

[2.4.0] — 2026-04-02

Přidáno

  • Modul Reklamy (/admin/reklamy/) — přehled všech reklamních kampaní s KPI kartami (aktivní kampaně, celkový denní budget, utraceno 7d, konverze), filtrování podle statusu a platformy, progress bary budget vs. utraceno, toggle pause/resume, smazání propojení.
  • One-click Google Ads Search kampaně — tlačítko "Spustit Google Ads" na detailu akce i v /admin/reklamy/ pro příručku. Vytvoří budget + kampaň (Target Spend bidding) + ad group + RSA reklamu + klíčová slova v jednom batch mutate volání (Google Ads API v20).
  • LLM generování klíčových slov a RSA textů — endpoint suggest-ad-keywords (OpenRouter / Gemini 2.0 Flash) navrhne 10–15 klíčových slov a 10 titulků + 4 popisy přímo z metadat akce nebo příručky.
  • RSA editor s počítadly znaků — titulky (max 30 znaků) a popisy (max 90 znaků) jsou editovatelné s barevným varováním při překročení limitu.
  • Auto-pause při dosažení end_date — cron sync-ad-metrics nově pauzuje kampaně s end_date ≤ dnes (status → ended).
  • Podpora kampaní bez akce — Google Ads kampaně pro /prirucka (lead magnet) jsou plně podporovány; LEFT JOIN v list query zajistí jejich zobrazení.
  • Nové sloupce v ad_campaigns: end_date, max_cpc, rsa_headlines, rsa_descriptions. Nová tabulka ad_keywords pro Google Ads klíčová slova.

[2.3.0] — 2026-04-02

Přidáno

  • Seat selection — výběr míst k sezení — kompletní systém pro akce s mapou míst. Tabulky seat_maps, event_seat_bookings, sloupce seat_token a seat_reserved_rows v registrations/events. Mapa kina Dlabačov (13 řad, 357 míst).
  • /moje-misto — self-service stránka pro výběr a změnu místa (token auth). Redesign: 2-sloupcový layout (mapa + sticky info panel), malé sedačky 14×14 px bez čísel, centrované řady, všechny řady viditelné bez scrollování. Info panel zobrazuje název akce, datum, místo a zvolené sedadlo; tlačítko Potvrdit na první obrazovce.
  • Retroaktivní email kampaň — admin "Rozeslat výběr míst" → hromadný email zaregistrovaným bez místa.
  • Per-event rezervace řad — admin může označit libovolné řady jako vyhrazené (uloženo jako JSON v events.seat_reserved_rows).
  • Vizuální mapa obsazenosti v adminu na detailu akce, banner obsazenosti na veřejné stránce akce (zelená <70 %, žlutá ≥70 %).
  • Podpora více vstupenek na jeden emailrequest-link odesílá jeden email s N odkazy.
  • Responzivní seat picker při mobilním zobrazení /moje-misto (info panel nad mapou).

Opraveno

  • 500 na /api/seats/request-link — dotaz na neexistující sloupce first_name/last_name; opraveno na contact_name.
  • Seat picker se nezobrazoval při registraci — chyběly props hasSeatMap a seatEventId v WorkshopOrderForm.
  • Místo se neuvolnilo při zrušení registrace — přidán DELETE FROM event_seat_bookings do obou cancel endpointů.
  • 500 při uložení místaselect.ts dotazoval r.cancelled místo r.cancelled_at.
  • Rezervované řady nebyly vidět na /moje-mistomoje-misto.astro nenačítalo seat_reserved_rows z events.

[2.3.1] — 2026-04-02

Přidáno

  • Potvrzovací email po výběru místa — po rezervaci přijde email s tabulkou: název akce, datum, místo konání, přidělené sedadlo + odkaz pro změnu.
  • Veřejný profil na mapě — při výběru místa lze volitelně vyplnit jméno/přezdívku a URL webu. Na veřejné mapě po najetí myší se zobrazí jméno; při vyplněné URL je sedadlo kliknutelný odkaz.
  • Kapacitní součet v admin UI — sekce rezervace řad nově zobrazuje "Celkem: X — veřejně: Y" s červeným varováním při překročení kapacity.
  • Email výběru místa přepracován — odesílatel Patrick Zandl <patrick@vibecoding.cz>, formální text, deadline info, podpis.
  • Migrace 055display_name, display_url do event_seat_bookings.

Opraveno

  • Kontrast rezervovaných řad — z neviditelné #f5f5f5 na výraznou #d1d5db (SeatPicker.css + SeatSelector.tsx).

[2.2.0] — 2026-03-27

Přidáno

  • Redesign /admin/akce/ — kompletní přepracování správy akcí do AdminLayout se sidebarem, 3-měsíční přehled akcí (aktuální + 2 měsíce dopředu), KPI stat karty, tabulka s filtry a context menu.
  • Detail akce (/admin/akce/[id]) — nová stránka s breadcrumb navigací, info kartou, tabulkou registrací s vyhledáváním a 6 status filtry, detail modálem s Fakturoid exportem a správou plateb.

[2.1.0] — 2026-03-27

Přidáno

  • PDF Lead Magnet — kompletní systém pro stahování příručky "AI ve firmách 2026" výměnou za email. Double opt-in, PDF delivery z R2, 4týdenní nurturing sekvence s automatickým odesíláním.
  • Admin dashboard příručky (/admin/prirucka/) — KPI karty (registrace, konverze, churn), nurturing funnel, UTM zdroje, denní registrace graf, tabulka leadů.
  • Editor nurturing emailů — markdown editor s náhledem pro úpravu 4 nurturing emailů z admin UI. Šablony v DB s fallbackem na hardcoded verze.
  • Training dashboard timeline — přehled akcí nyní zobrazuje celé 3 měsíce od začátku aktuálního měsíce (ne jen od dneška).

Změněno

  • Redesign /prirucka landing page — full-width nadpis, větší obálka knihy (reálný obrázek místo CSS mockup), CTA tlačítko v hero sekci, zkrácený obsah příručky (kompaktní číslovaný seznam místo 8 karet), social proof přesunutý do hero.
  • Email deliverability — vylepšení doručitelnosti verifikačních a nurturing emailů.

Opraveno

  • Resend topic ID fallback — robustnější handling chybějící env proměnné pro ai-pro-firmy topic.

[2.0.1] — 2026-03-25

Opraveno

  • Videa se neaktualizovala — stránka /videa byla staticky prerenderovaná při buildu, kdy YouTube API klíč není dostupný. Přepnuto na SSR s CDN cache (1 h) — videa jsou vždy aktuální, API se volá max 1× za hodinu.

[2.0.0] — 2026-03-21

Přidáno

  • Admin objednávek (/admin/objednavky/) — kompletní modul pro správu objednávek placených workshopů. KPI karty (celkem, čekající, zaplacené, zrušené, příjem), tabulka se zebra stripingem, vyhledávání podle jména/emailu/VS/firmy, filtry podle stavu a akce. Detail objednávky s informacemi o zákazníkovi, platbě, workshopu a časovou osou.
  • FIO synchronizace z admin UI — tlačítko „Sync FIO" v objednávkách volá /api/admin/sync-payments (chráněno Cloudflare Access místo CRON_SECRET). Zobrazí panel nespárovaných transakcí.
  • FIO reconciliace (/api/admin/fio-reconcile) — diagnostický endpoint porovnávající všechny FIO transakce se všemi registracemi. Kategorizuje: already_matched, unmatched, cancelled_match, pending_match.
  • Email notifikace o nespárovaných platbách — cron check-payments po každém běhu zkontroluje nespárované příchozí platby a pošle admin email s tabulkou k manuálnímu řešení.
  • Akce v detailu objednávky — ruční potvrzení platby, kontrola FIO podle VS, odeslání upomínky, zrušení/obnovení registrace, změna termínu (date variant).

Změněno

  • Platební lhůty — prodlouženy z 1/2 dny na rozlišení osobní/firemní: osobní registrace (bez IČO) — upomínka po 3 dnech, zrušení po 7 dnech; firemní registrace (s IČO) — upomínka po 7 dnech, zrušení po 14 dnech.
  • Newsletter odesílatel — přepnuto na Patrick Zandl <patrick@vibecoding.cz> přes env proměnnou RESEND_NEWSLETTER_FROM.

Opraveno

  • 10 chybně zrušených registrací — starý systém (1 den upomínka, 2 dny zrušení) automaticky zrušil registrace dříve, než platby dorazily. Všech 10 + 1 (DEVELMAGIC s VS ve zprávě místo v poli VS) obnoveno, zaplaceno, faktury vystaveny.
  • Admin témata — parsování obsahu témat z Telegram bota (extrakce titulku z „Titulek:" řádku, čistý excerpt bez GitHub navigace, lehký markdown renderer pro rozbalený obsah, oprava slepení data).

[1.9.0] — 2026-03-17

Přidáno

  • Čekací listina na workshopy — když jsou všechny termíny vyprodané, formulář se změní na waitlist signup (jméno + email). Když jsou volné termíny, přibyla volba „Žádný termín mi nevyhovuje" která skryje cenu a fakturaci a umožní registraci k odběru avíz.
  • Notifikace čekajících — admin endpoint pro hromadné odeslání emailu „Nový termín" všem na čekací listině s CTA na registraci.
  • Témata z Telegram bota — nové tlačítko 📌 Téma v botu uloží raw obsah URL pro pozdější zpracování do článku. Admin stránka /admin/temata/ se vyhledáváním, rozbalitelným textem a kopírováním do schránky.
  • Partnerské kódy (přejmenováno ze „Slevové/Promo kódy") — editační modal, strukturované karty s metrikami a progress barem.
  • Redesign admin dashboardu — business-first layout s KPI kartami (revenue, pipeline, workshop, poptávky), spojeným kalendářem z obou DB, akčním panelem (poptávky, čekající platby, partnerské kódy) a collapsed zprávičkami.
  • FIO kontrola z dashboardu — tlačítko „Spustit kontrolu FIO" volá server-side proxy bez expozice CRON_SECRET na frontend.

Opraveno

  • Digest filtrování článků — články publikované na hraničním dni (now - N dní) se nezobrazovaly kvůli porovnání s časovou složkou. Opraveno oříznutím na začátek dne.
  • Oddělení featured a regular článků v digestu — nadpis „Další články" mezi sekcemi, regular články se vizuálně neztrácí pod featured kartami.

Změněno

  • Cron jobs — přesun na cron-job.org (check-payments každých 30 min, send-reminders denně, weekly-digest úterý, promo-summary denně).
  • Navigace — Zprávičky přidány do hlavního menu, „Firemní AI vývoj" nahrazeno interním „Workshopy".

[1.8.0] — 2026-03-16

Přidáno

  • Slevové promo kódy — systém slevových kupónů pro workshopy. Kód nastaví novou cenu, lze omezit na konkrétní akci, počet použití a platnost. Podpora provizí pro partnery.
  • Promo kód v objednávkovém formuláři — pole „Slevový kód" s živou validací. Po ověření se zobrazí nová cena a přeškrtne původní.
  • Admin promo kódů (/admin/promo-kody/) — vytváření, přehled, aktivace/deaktivace, mazání. Zobrazuje statistiky využití a provizí.
  • Automatické shrnutí promo kódů — cron endpoint /api/cron/promo-summary po vypršení kódu nebo den po workshopu pošle kontaktní osobě email se shrnutím využití a výpočtem provize.

[1.7.0] — 2026-03-16

Přidáno

  • Sekce Workshopy (/workshopy/) — nová landing page s nabídkou workshopů pro vývojáře (Claude Code) a firemních workshopů (Startup/Firma/Enterprise). Dynamické termíny z DB, social proof strip, profil lektora, FAQ accordion a poptávkový formulář.
  • Poptávkový formulář firemních workshopů — formulář na /workshopy/#poptavka odesílá notifikační email a ukládá poptávku do DB (workshop_inquiries).
  • Admin poptávek (/admin/poptavky/) — přehled poptávek s barevným rozlišením statusů (nová/kontaktováno/vyhrána/ztracená), inline změna stavu a poznámky.
  • Zprávičky v hlavní navigaci — přidán odkaz na /zpravicky/ do desktop i mobile menu.

Změněno

  • Navigace — položka „Firemní AI vývoj" (externí link na aivefirmach.cz) nahrazena interním tlačítkem „Workshopy" (/workshopy/). Barva highlight tlačítka změněna z oranžové na zelenou.
  • Footer — odkaz na aivefirmach.cz nahrazen interním odkazem na /workshopy/.
  • Cron jobs — přesun z wrangler.toml cron triggers (nefunkční bez scheduled handleru) na externí cron-job.org. Tři joby: check-payments (30 min), send-reminders (denně), weekly-digest (úterý).

[1.6.0] — 2026-03-14

Přidáno

  • Automatické párování plateb — cron endpoint /api/cron/check-payments každou hodinu kontroluje FIO API a páruje příchozí platby s objednávkami workshopů podle variabilního symbolu. Po spárování se automaticky vytvoří zaplacená faktura ve Fakturoidu a odešle zákazníkovi emailem.
  • Fakturoid export při ověření platbyverify-payment.ts nyní při úspěšném ověření platby automaticky exportuje fakturu do Fakturoidu (dříve jen při manuálním potvrzení adminem).
  • Per-token FIO rate limiting — workshop (FIO_WORKSHOP_TOKEN) a donation (FIO_API_TOKEN) tokeny mají nezávislé rate limity, neblokují se navzájem.

Změněno

  • Platební účet workshopů — přesun z Air Bank (1925326058/3030, bez API) na FIO podnikatelský účet (2403461724/2010, s API). Aktualizovány QR kódy, platební stránka, reminder emaily a registrační emaily.
  • Generování variabilních symbolůcrypto.getRandomValues() místo Date.now() % 1000 + Math.random(). Workshop VS ověřuje uniqueness v DB s retry mechanismem (až 5 pokusů).
  • Cron schedule — přidán hodinový trigger 11 * * * * pro kontrolu plateb.

[1.5.0] — 2026-03-12

Přidáno

  • Newsletter s Resend Topics — dvě odběrové skupiny (Vibecoding Akce + Vibecoding Články) v jedné audience. Odhlášení přes brandovanou Resend preferences stránku.
  • Formuláře pro odběr newsletteru — v patičce článků (source: clanky) a na homepage (source: both). Double opt-in s topic přiřazením podle zdroje.
  • Týdenní přehled článků (weekly digest) — automatický broadcast nových článků každé úterý 8:00 UTC. Formát: logo + „Vibecoding.cz weekly" hlavička, featured články jako „Téma týdne", vlastní akce nahoře, externí akce dole pod „Kde mě potkáte".
  • Úvodník v digestu — markdown textarea v admin UI pro osobní komentář. Uloží se do DB, pošle se jednou a automaticky se označí jako odeslaný.
  • Admin UI pro digest — náhled, ruční odeslání, nastavení období/předmětu/úvodního textu v /admin/newsletter.
  • Cron weekly-digest — endpoint /api/cron/weekly-digest s autentizací přes CRON_SECRET.
  • Parallel.ai Extract API — integrace pro extrakci obsahu z URL v Telegram botu. Parallel jako primární zdroj (3–6x více obsahu než Cheerio), Cheerio jako fallback. X/Twitter extrakce nezměněna.
  • Promo banner workshopů v článcích — dynamický banner pro placené workshopy v každém článku, kompaktní promo pro ostatní akce.

Změněno

  • Předmět digestu — „Vibecoding.cz weekly: [název prvního featured/prvního článku]" místo generického.
  • Sync kontaktů — sjednocení registrací a newsletter subscribers přes SQL UNION ALL, oba Resend Topics se nastaví na opt_in.
  • Broadcast name limit — oříznutí na 70 znaků (Resend limit).

[1.4.0] — 2026-03-12

Přidáno

  • Prémiový workshop landing page — placené workshopy mají nový design: hero sekce s fotkou lektora a tmavým gradientem, detail strip (datum, čas, místo, kapacita), blokové formátování programu (h2/h3 jako karty), instructor karta a sticky objednávkový formulář.
  • SEO optimalizace hub stránek — optimalizované title a meta description pro všechny nástroje (Claude Code, Cursor, Windsurf, Lovable.dev, Replit, Gemini CLI, Databutton, Tempo Labs). Úvodní texty 150–200 slov s interním prolinkováním. FAQ sekce s FAQPage JSON-LD schema pro Google featured snippety.
  • Navigace AI nástrojů na /vibecoding/ — chip/pill odkazy na všechny sekce AI nástrojů nad seznamem článků.
  • Security hardening — centrální CF Access JWT verifikace v middleware pro /api/admin/*, CSRF origin validace na registraci a dotazníky, internal secret pro server-to-server volání, cron secret autentizace, rate limiting na proformu.
  • Obchodní podmínky — stránka /obchodni-podminky/ se storno podmínkami, odkazy z objednávky, platební stránky a proformy.
  • BCC objednávek — email s platebními údaji se posílá v BCC na patrick@zandl.cz.

Změněno

  • Platební účet — workshopy přesunuty na Air Bank (1925326058/3030), FIO zůstává jen pro dary.
  • Volitelné firemní údaje — objednávku workshopu lze učinit i bez IČO a názvu firmy.
  • Dodavatel na proformě — aktualizovány údaje (IČO 43943420, email patrick@zandl.cz), přidán QR kód pro platbu.

[1.3.1] — 2026-03-10

Přidáno

  • Tlačítko pro kopírování code bloků — malá ikonka clipboardu v pravém horním rohu každého <pre> bloku v článcích. Po kliknutí se obsah zkopíruje do schránky a ikonka se na 1,5 s změní na fajfku.
  • Responzivní hamburger menu — na mobilech (pod 760px) se navigace schovává do hamburger menu s animovanou ikonkou. „Firemní AI vývoj" zůstává viditelný na tabletech, na malých telefonech (pod 640px) se přesune také do menu. Desktop zůstává beze změn.

[1.3.0] — 2026-02-26

Přidáno

  • Strukturovaný logovací systém — nový src/lib/logger.ts s korelačními ID, hierarchickými kroky a měřením doby trvání. Všechny klíčové funkce v telegram-bot.ts a webhook.ts instrumentovány pro diagnostiku zpracování URL přes wrangler tail.
  • SPA detekce — rozpoznání Lark Suite, Notion, Confluence a Google Docs s varováním o JS-renderovaném obsahu.
  • Healthcheck panel v admin/zpravicky — nový endpoint /api/admin/bot-health a přehledový panel s konfigurací, statistikami zpráv, digestu a poslední aktivitou.
  • Dynamický event banner v článcích — banner se náhodně střídá mezi vlastními a externími akcemi. Cachovaný API endpoint /api/upcoming-events (1h na edge) minimalizuje zátěž D1/Workers. Bez nadcházejících akcí se banner skryje.
  • Pole is_own_event v admin formuláři — checkbox "Vlastní akce" s poli pro název přednášky a URL externí akce.

Změněno

  • Redesign admin/zpravicky — nová tabulka s barevnými type badges, entity tagy, relativními daty a indikátorem odeslání do Telegramu.
  • Admin/akce filtr — zobrazuje jen vlastní akce (is_own_event = 1), externí akce skryty.
  • Odstraněna sekce admin/digest z navigace (digest mód zrušen upstream).
  • Karta akce na /akce/ — odstraněno zobrazení URL externí akce v rámečku.

[1.2.0] — 2026-02-23

Přidáno

  • X API v2 pro news mode — tweety se nyní zpracovávají výhradně přes X API v2 (fetchTweetViaApi), včetně plného textu Twitter Articles (note_tweet, article.plain_text). Externí články odkazované z tweetů se automaticky stahují. Bez fallbacku na fxtwitter.
  • Gemini pro YouTube — YouTube videa se zpracovávají modelem google/gemini-2.5-flash (konfigurovatelné přes llm_model_youtube), který umí nativně analyzovat obsah videa.
  • Automatické JSON instrukceNEWS_JSON_FORMAT blok se vždy přidá ke každému promptu (i ke custom promptům z DB), takže LLM vždy vrátí validní JSON.

Opraveno

  • Prázdné zprávičky — příčina: model google/gemini-3.1-pro-preview nerespektoval response_format: json_object a custom prompty v DB neměly JSON instrukce. Změněn výchozí model na google/gemini-2.5-pro.
  • OpenRouter + Claude response_format nekompatibilita — Anthropic Claude přes OpenRouter nepodporuje response_format: json_object (konvertuje na tool_use). Parametr se nyní přeskočí pro anthropic/ modely; spolehlivé JSON instrukce v promptu stačí.
  • Markdown místo HTML v zprávičkách — 64 % článků mělo **tučné** místo <b>tučné</b>. Opraveno robustnějším parsingem s text fallbackem.

[1.1.0] — 2026-02-21

Přidáno

  • Training Management System — Frontend SPA — responzivní React SPA na /training/ pro správu zákazníků, zakázek, typů akcí, kalendáře a uživatelů. Hash router, JWT auth, SCSS modules s light/dark mode, cs/en lokalizace. Role-based navigace (admin/editor/external). Desktop sidebar, tablet collapsed, mobile bottom tab bar. CRUD na všech entitách, pipeline dashboard, měsíční kalendář s barevnými bloky dle statusu.

[1.0.0] — 2026-02-21

Přidáno

  • Evidenční a objednávkový systém (Training API) — kompletní backend REST API /api/v1/* pro evidenci zákazníků, zakázek, typů akcí, kalendář obsazenosti a dashboard. RBAC s rolemi admin/editor/external. Separátní D1 databáze training-db.
  • D1-based rate limiting — persistentní rate limiting login pokusů v D1 databázi místo in-memory Map, funkční napříč Cloudflare Workers instancemi.
  • Bookmark Digest — osobní analytický digest z odkazů přes Telegram bota s LLM zpracováním a streaming voláním.

Změněno

  • Streaming LLM volání pro digest — prevence Cloudflare Worker timeoutu.
  • Redesign digest emailu — lepší UX, formátování odstavců a podnadpisů.

Opraveno

  • HTML sanitizace v Telegram zprávách — konverze <br> na newlines, korektní odstranění nepodporovaných tagů.
  • Tiché selhání Telegram API — přidáno logování chyb a sanitizace HTML.

2026-02-17

  • Hodnocení článků — přidán widget mg-feedback.js z top.marigold.cz do šablony každého článku ([...slug].astro). Widget se zobrazuje pod podpisem autora a umožňuje čtenářům ohodnotit článek (sad/neutral/happy). Hlasy se sbírají centrálně v systému article-engagement-tracker a jsou dostupné v admin dashboardu na top.marigold.cz. Slug článku odpovídá poslednímu segmentu Astro slug (bez data prefixu).

2026-02-16

  • Newsletter subscription s double opt-in — formulář na /akce/ pro přihlášení k odběru upozornění na nové akce s potvrzením emailem (GDPR compliant).
  • Nová databázová tabulka newsletter_subscribers s verification tokens a cancellation tokens.
  • Verification flow — uživatel zadá email → obdrží verification email → klikne na odkaz → přidání do Resend segmentu.
  • Nové endpointy: /api/verify-newsletter (potvrzení), /api/cancel-newsletter (odhlášení).
  • Potvrzovací stránky: /akce/newsletter-confirmed, /akce/newsletter-cancelled, /akce/newsletter-error.
  • Oprava dynamického načítání data akce — stránka /akce/registrace-uspesna nyní zobrazuje správné datum a čas akce místo hardcoded 9. února 2026.

2026-02-15

  • Zobrazení náhledového obrázku v článcích — thumbnail z frontmatter (pole thumbnail) se zobrazuje mezi nadpisem a sekcí "Rychlé body". Obrázek je plně responzivní s jemným borderem a border-radius.
  • Vylepšení adminu /akce/ — když je vybraná konkrétní akce z rolety, statistiky (aktivní/čekající/zrušení) se počítají pouze pro vybranou akci. Sloupec "Akce" v tabulce registrací se skryje, aby nebyl redundantní.

2026-02-15

  • Vylepšení typografie článků — výraznější nadpis (2-2.6rem responsive), zprovoznění italiky (em tag) a explicitní zobrazení odrážek u seznamů.
  • Podpis autora na konci každého článku — italika, větší písmo (1.1rem), zarovnání vpravo, oddělený horním okrajem. Pokud autor není uveden, zobrazí se Patrick Zandl.
  • Vkusné odrážky v sekci "Rychlé body" — zelené accent barvy (1.1em), větší spacing, konzistentní s designem webu.
  • Telegram promo box přesunut na konec článků — zobrazuje se za podpisem autora, před patičkou, jako call-to-action po přečtení.

2026-02-13

  • Nová administrace newsletteru na /admin/newsletter/ s markdown editorem, náhledem a rozesláním přes Resend Broadcast.
  • Newsletter flow převeden na nový Resend segments model (segmentId), bez závislosti na audience ID.
  • Přidána synchronizace kontaktů z registrací do Resend segmentu včetně respektování marketing_optout.
  • Doplněn One-Click unsubscribe endpoint (POST /api/unsubscribe) pro List-Unsubscribe-Post.
  • Oprava deploye: doplněny chybějící knihovny src/lib/newsletter.ts a src/lib/newsletter-sync.ts.
  • Vylepšen výstup syncu v adminu: detailnější souhrn výsledků (počty, cílový stav segmentu, doba běhu).
  • Odkaz v hlavní navigaci změněn z "Školení" na "Firemní AI vývoj" s novým URL na firemní workshop Claude Code (https://www.aivefirmach.cz/claude-code-workshop/). Odkaz je vizuálně zvýrazněn oranžovým gradientem pro lepší viditelnost.

2026-02-08

  • Nová stránka /podpora/ — darovací stránka s QR kódem (SPAYD), volitelnou částkou, ověřením platby přes FIO API a seznamem podporovatelů.
  • React komponenta DonationForm s přednastaveními částek (50/100/200/500 Kč), QR kódem generovaným na klientu (qrcode.react) a persistencí VS v localStorage.
  • API endpointy /api/fio/verify-donation (ověření platby podle VS) a /api/fio/donors (seznam aktivních dárců).
  • Odkaz "Podpor provoz" v patičce webu na všech stránkách.

2026-02-05

  • Přechod z Telegram skupiny na kanál @vibecoding_patrick — jednosměrná distribuce zpráviček a článků.
  • Bot automaticky maže servisní zprávy (připojení/odchod členů) ve skupině.
  • Bot ignoruje servisní zprávy a neodpovídá "nemáš oprávnění" novým členům.
  • Aktualizace všech Telegram odkazů na webu (patička, homepage, zprávičky, články).
  • Telegram notifikace pro zprávičky — automatické odesílání nových zpráviček do kanálu při publikaci z admin UI (řízeno nastavením telegram_auto_notify).
  • Nový endpoint /api/telegram/notify-articles pro automatické odesílání nových článků na Telegram kanál.
  • GitHub Actions workflow — denní cron (8:00 UTC) + trigger při push na main pro automatické notifikace článků.
  • Propagace Telegram kanálu na webu — odkaz v patičce (vedle LinkedIn), banner na stránce Zprávičky, sidebar box na homepage, promo karta v článcích.

2026-02-03

  • Nový Split Hero na titulní stránce — téma týdne vlevo, karusel zpráv vpravo s dynamickým seskupováním podle délky textu.
  • Karusel zpráv automaticky zobrazuje více krátkých zpráv nebo méně dlouhých na jedné stránce (limit 350 znaků).
  • Auto-rotace karuselu každých 5.5s, pauza při hoveru, swipe gesta na mobilu, klávesnicová navigace.
  • Nová sekce Zprávičky (/zpravicky) — krátké zprávy ze světa AI generované z odkazů pomocí Telegram bota.
  • Telegram bot @vibecoding_patrick — zpracování odkazů pomocí LLM (OpenRouter), tlačítka pro publikaci/zahození, podpora Twitter/X, článků, GitHub.
  • Nové stylování tabulek v článcích — zaoblené rohy, zelený gradient v hlavičce, zebra striping, hover efekty, zvýrazněný první sloupec pro kategorie.
  • Responzivní tabulky na mobilu — horizontální scroll se sticky prvním sloupcem pro lepší orientaci.

2026-02-02

  • Přidán nový sloupec "Vydáno" v přehledu LLM modelů s možností řazení podle data publikace.
  • Pole release_date využívá created timestamp z OpenRouter API (datum přidání modelu na platformu).
  • Doplněno release_date do všech 125 existujících LLM modelů.
  • Tracker skript automaticky nastavuje release_date pro nové modely.

2026-02-01

  • Přidáno pole program (markdown) do editačního formuláře akcí v administraci — umožňuje editovat detailní program akce přímo z admin panelu.
  • Místo konání akce je nyní prolinkované na URL mapy s ikonkou 📍 — kliknutím se otevře mapa v novém okně.
  • Redesign changelog stránky — vizuální kategorizace změn (✨ nové funkce, 🔧 opravy, 📝 drobnosti), lepší stylování inline kódu s pozadím, karty pro jednotlivé záznamy.

2026-01-30

  • Opraveny Open Graph meta tagy pro články — og:type změněn z website na article, přidány article:published_time a article:author pro lepší náhledy při sdílení na sociálních sítích.

2026-01-28

  • Plně responzivní design pro mobilní telefony — kompaktní hlavička (menší avatar, skrytý subtitle, inline navigace + hledání), přizpůsobení všech typů stránek (homepage, LLM přehled, LLM detail, články, akce), stacked footer, bottom-sheet vyhledávání, edge-to-edge code bloky.
  • Re-analýza 76 LLM modelů s rozšířeným schématem — benchmarky, expert verdikty (killer feature, skryté riziko), celkové skóre a tier hodnocení pro modely od OpenAI, DeepSeek, Google, Anthropic, xAI, Mistral a Z.AI.
  • Redesign LLM detailu — hero sekce s provider badge a skóre, vizuální benchmark progress bary, insight karty (killer feature / skryté riziko), porovnávací tabulka s konkurencí, rozhodovací pomocník (použij/nepoužívej).
  • Rozšíření LLM analyzátoru o generování nových polí (expert_verdict, benchmark_categories, overall_score) a re-analýzu existujících modelů.
  • Přidáno vyhledávání v hlavičce s našeptávačem a server‑side indexem (články, LLM, akce).
  • Nová stránka /search pro kompletní výsledky vyhledávání.
  • Zkratky pro vyhrazená slova (Codex, Claude Code, Cursor, Lovable, Replit, Gemini, Windsurf, Tempo Labs).
  • Přidán veřejný changelog a odkaz v patičce.
  • Styling pro vyhledávání v hlavičce i na stránce výsledků.
  • Opraven build changelogu (import přes ?raw bez Node fs).
  • Nastaveno passthrough pro Astro image service kvůli Cloudflare adapteru.
  • Přesun Sass @import na @use kvůli deprecacím.
  • Opraven frontmatter u článku o indexování velkých codebase (odstraněn layout: post).
  • Přidán odkaz na LinkedIn do patičky včetně ikonky.
  • Opraveno vyhledávání (API není prerenderované, vrací živé výsledky).
  • Vyhledávání v hlavičce drží jednu řádku s menu; RSS odebráno z hlavičky.
  • U registrace akce přidány informace k emailu pod polem.
  • Přidán dynamický sitemap.xml (články, LLM, nástroje, akce).
  • Přidány 301 přesměrování starých článkových URL bez kategorie/data.
  • Redesign stránky /llm s vyhledáváním jen mezi modely, filtry a porovnáním.