Nezávislý technický posudek · září 2026
Solidní dražební
stroj pod selhávajícím
povrchem.
acb.cz běží na Auctify/Auctea, což je skutečná víceklientská dražební platforma od sinfin.digital. Platforma umí dost. Vrstva, kterou 1. Art Consulting ukazuje veřejnosti, je o generaci pozadu — a měřitelně.
Měřeno na lokální kopii živého webu, jeho HTTP odpovědích, sitemapách a obou balících assetů. Kopie má 602 stránek; audit běžel nad 513 stránkami, které v tu chvíli existovaly, tedy nad 81,5 MB značkování. Každé číslo na této stránce bylo spočítáno, ne odhadnuto, pokud u něj není výslovně uvedeno ODHAD.
Čtyři redesigny
Každý z nich staví celý web znovu — všechny stránky, česky i anglicky — jako proklikatelnou statickou ukázku. Všechny čtyři sdílejí stejný obsah, stejný seznam stránek a stejné adresy. Liší se jen design. Dražení, vyhledávání a přihlášení jsou nahrané, ne zapojené: nikam se nic neodesílá.
Změřeno proti živému webu
Každý redesign vykresluje stejných 218 stránek ze stejného obsahového modelu, česky i anglicky. Čísla níže jsou spočítaná nad hotovým výstupem, stejným způsobem, jakým audit počítal živý web.
| acb.cz dnes | heritage | atelier | nocturne | kinetic | |
|---|---|---|---|---|---|
| Podíl obsahu v HTML | 4,1 % | 24,4 % | 20,7 % | 22,0 % | 19,2 % |
| Průměrná velikost stránky | 155 KB | 24 KB | 26 KB | 23 KB | 31 KB |
| Odeslané CSS | 763 KB | 61 KB | 69 KB | 66 KB | 74 KB |
| Odeslaný JavaScript | 585 KB | 6 KB | 9 KB | 10 KB | 8 KB |
| Požadavků na úvodní stránce | ~60 | 17 | 13 | 20 | 30 |
| Stránek s <main> | 28 % | 100 % | 100 % | 100 % | 100 % |
| Stránek s odkazem pro přeskočení obsahu | 0 % | 100 % | 100 % | 100 % | 100 % |
| Obrázků s width a height | 22 % | 100 % | 100 % | 100 % | 100 % |
| Obrázků bez přístupného názvu | 1 380 | 0 | 0 | 0 | 0 |
| Stránek s přeskočenou úrovní nadpisu | 31 % | 0 | 0 | 0 | 0 |
| Vodorovné přetečení, 390–1440 | — | 0 | 0 | 0 | 0 |
Přetečení se kontrolovalo na každé stránce při šířkách 390, 768, 1024 a 1440 — 872 kombinací stránka/šířka na každý redesign, nula chyb. Každý vnitřní odkaz a každý odkaz na obrázek ve všech vygenerovaných stránkách byl ověřen proti souborovému systému; žádný nechybí. Všechny čtyři fungují i s vypnutým JavaScriptem.
Na čem web běží
| Framework | Ruby on Rails, serverem vykreslované ERB x-runtime, x-request-id, session cookie Rails |
|---|---|
| Platforma | Auctify / Auctea — víceklientský dražební engine auctea_application-themed-as-acb.css |
| CMS | Folio window.Folio, jmenný prostor tříd f- |
| Dodavatel | sinfin.digital poznámka v patičce, organizace sinfin na GitHubu |
| Assety | Sprockets, jeden CSS 763 KB a jeden JS 585 KB, bez dělení |
| Navigace | Turbolinks 5 — v roce 2021 nahrazené Turbem |
| Chování | Stimulus, 99 registrovaných controllerů, 43 se používá veřejně |
| Realtime | message_bus, HTTP long-poll 0 zmínek o WebSocket v 585 KB |
| UI knihovny | Bootstrap 5.3.1, jQuery, Popper, PhotoSwipe, Dropzone, Tempus Dominus |
| Přihlašování | Devise + OmniAuth (Google, Apple, X), Cloudflare Turnstile |
| Edge | Cloudflare pouze před HTML |
| Média | Veřejný S3 bucket auctea, eu-central-1, bez CDN |
| Marketing | GTM, Meta Pixel, Seznam Sklik, Consent Mode v2 |
Nejpřekvapivější nález. Stránka deklaruje <meta name="action-cable-url" content="/cable">, ale v JavaScriptovém balíku není jediný výskyt ActionCable, createConsumer ani WebSocket.
Živé dražení nese message_bus, knihovna HTTP long-pollingu z Discourse, s minimálním intervalem 100 ms — jeden otevřený požadavek na každého dražitele a aukci a k tomu dotažení JSON fragmentu při každém příhozu. Funguje to, a je to špatný přenos pro tuhle úlohu.
Co dostane každý anonymní návštěvník
56 z 99 Stimulus controllerů je back office — konzole licitátora, klávesové zkratky a zvuková upozornění operátora, pohled prezentujícího, pokladna, schvalování registrací dražitelů a ověřování uživatelů. Spolu s nimi i window.Auctify.API_URLS, tedy mapa koncových bodů pro operátora, licitátora a prezentujícího. Autorizace se pravděpodobně kontroluje na serveru; útočná plocha back office je ale i tak zveřejněná na každé stránce.
Jak se web dnes doručuje
Každé zobrazení stránky je vykreslení na origin serveru. Cloudflare stojí před HTML a neukládá z něj nic — aplikace posílá cache-control: max-age=0, private, must-revalidate a Cloudflare na každé měřené stránce odpovídá cf-cache-status: DYNAMIC. Čas do prvního bajtu se pohyboval od 0,35 s do 0,81 s. Katalog je 152 702 anonymních adres, pro všechny stejných, které se generují z databáze jedna po druhé.
Kde to bolí
Výkon — platí se za značkování, ne za obsah
Přístupnost — 3 / 10
Vyhledávače — 3 / 10
Bezpečnost a soukromí — 4 / 10
Udržovatelnost — kázeň tam je, hygiena ne
Systém tříd je udělaný dobře: dva striktní jmenné prostory, a- pro Auctify a f- pro Folio, striktní BEM u 1 430 z 1 592 tříd, atomický slovník komponent a JavaScriptové háčky záměrně oddělené od stylovacích. Někdo nad tím přemýšlel.
A pak: 6 503 deklarací !important proti 10 363 pravidlům — 0,63 na pravidlo. Vrstva design tokenů, která existuje a obchází se: značková zlatá je natvrdo zapsaná jako #B18839 na 24 místech, zatímco var(--auctify-brand-200) se nepoužije ani jednou. 28 různých hodnot breakpointů bez jakékoli dohody. A 2 642 bajtů motivu jiného klienta (a-site-theme-sypka-*) uvnitř stylopisu ACB.
| Používá se | Nahrazeno |
|---|---|
| Turbolinks 5 | Turbo, 2021 |
| Jeden balík Sprockets | importmap / jsbundling, Rails 7, 2021 |
| jQuery | zůstalo jen jako adaptér pro message_bus |
| message_bus long-poll | WebSocket |
| role="document" v dialozích | vzor z doby před rokem 2016 |
| ruční přepínač tmavého režimu | prefers-color-scheme, použito 0× |
Nic z toho není rozbité. Všechno je o generaci pozadu — a je to zrovna ta generace, která tyhle věci zlevnila.
Hodnocení
Dvanáct oblastí, každá hodnocená 0–10 proti spočítaným důkazům, pak zvážená. Váhy dávají nejvíc výkonu a vyhledávačům, protože tohle je firma, jejíž katalog je zároveň jejím marketingem.
Na tomhle rozdílu stojí rozpočet. Vyměnit Auctify znamená postavit znovu funkční dražební engine — registrace dražitelů, limitní příhozy, prodloužený konec, konzoli licitátora, vypořádání. Vyměnit prezentační vrstvu opraví většinu toho, co je výše naměřeno.
Jen čtyři nálezy jsou skutečně na úrovni platformy a na úrovni klienta se opravit nedají: poměr značkování 24,6 : 1, stylopis o 763 KB, přenos přes long-polling a chybějící CSP.
Kolik stojí web provozovat
Český trh, rok 2026, všechny částky bez DPH a v korunách. Zveřejněné ceny jsou citované; všechno ostatní je odhad a je tak označené. O skutečné smlouvě ACB není veřejně nic — žádný záznam ve věstníku, žádná faktura, žádná zveřejněná provize.
| Role | nízká | střední | vysoká | Kč / MD |
|---|---|---|---|---|
| Senior Rails vývojář | 1 400 | 2 000 | 2 800 | 16 000 |
| Frontend vývojář | 1 200 | 1 800 | 2 500 | 14 400 |
| UX/UI designér | 1 200 | 1 700 | 2 400 | 13 600 |
| Projektový manažer | 1 100 | 1 600 | 2 200 | 12 800 |
| Analytik | 1 200 | 1 700 | 2 400 | 13 600 |
| Smíšená sazba použitá dále | 1 800 Kč/h | 14 400 | ||
Sazby v korunách za hodinu. Ukotveno v analýze Ministerstva vnitra a EY nad 830 veřejnými ICT zakázkami z druhé poloviny roku 2024, kde medián za člověkoden vychází 10 328 Kč u programátora a 12 696 Kč u architekta. Produktová studia na volném trhu si účtují víc než mediány z veřejných tendrů, proto je sazebník výše nad nimi. Brněnské a pražské agentury zveřejňují 1 500–2 800 Kč/h.
| Varianta | Kč / měsíc |
|---|---|
| Český VPS, bez správy třída Vedos / Váš-Hosting / Forpsi | 7 500–12 000 |
| Hetzner Cloud | 7 500–9 500 |
| DigitalOcean | 10 000–14 000 |
| AWS eu-central-1 | 16 000–24 000 |
| Přefakturováno agenturou | 15 000–35 000 |
České agentury přefakturovávají infrastrukturu zhruba 1,8× až 3× nad holé náklady, protože ta položka pokrývá i monitoring, ověřování záloh, pohotovost a marži. VSHosting má zveřejněný poplatek za správu 2 500 Kč měsíčně za server plus 990 Kč za každou další spravovanou službu, což samo o sobě dělá 6 500–8 500 Kč měsíčně ještě před jakýmkoli hardwarem.
| Úroveň | h / měsíc | Kč / měsíc |
|---|---|---|
| Nízká — záplaty, monitoring, reaktivně | 6–8 | 12 000–16 000 |
| Standard — navíc drobné změny, čtvrtletní upgrady | 12–16 | 22 000–30 000 |
| Vysoká — navíc SLA pro živé aukce, proaktivní práce | 20–30 | 36 000–55 000 |
Běžný český trh „správy webu“ za 1 000–5 000 Kč měsíčně je pro weby třídy WordPress a na Rails monolit s realtime sběrnicí a katalogem o 76 000 záznamech se nevztahuje. Zde je pravděpodobná úroveň Standard.
| Práce | hodin | Kč |
|---|---|---|
| Nová obsahová stránka ze stávajících bloků | 2–6 | 3 600–11 000 |
| Nová stránka s vlastním rozvržením | 8–20 | 14 000–36 000 |
| Nový filtr v katalogu | 10–30 | 18 000–54 000 |
| Redesign jedné šablony | 20–50 | 36 000–90 000 |
| Nový jazyk | 60–150 | 108 000–270 000 |
| Napojení na externí službu | 30–100 | 54 000–180 000 |
| Nový typ aukce nebo změna pravidel dražby | 40–120 | 72 000–216 000 |
| Tarif | Kč / měsíc | Rozsah |
|---|---|---|
| Startup | od 1 475 | web s CMS, objednávky, fakturace |
| Growth | od 8 125 | + modul nabídky děl, prioritní podpora |
| Enterprise | od 16 250 | + BankID, smlouvy, analytika |
| Custom | na vyžádání | + vývoj na míru, plné API |
Odhad. ACB používá smlouvy, živé vysílání, hybridní dražbu v sále i online, archiv cen a vlastní vzhled. To je nad úrovní Enterprise — reálně 25 000 až 50 000 Kč měsíčně. Žádný zřizovací poplatek, poplatek za aukci ani provize nejsou nikde zveřejněné; pokud provize z dosažené ceny existuje, převáží všechny ostatní položky. Tohle je neověřené.
| Položka | nízko | pravděpodobně | vysoko |
|---|---|---|---|
| Licence platformy | 96 000 | 300 000 | 600 000 |
| Hosting, přefakturovaný | 120 000 | 240 000 | 420 000 |
| Paušál za údržbu | 144 000 | 300 000 | 660 000 |
| Požadavky na změnu | 100 000 | 350 000 | 900 000 |
| Cloudflare, monitoring, pošta, SMS | 15 000 | 40 000 | 90 000 |
| Ročně, Kč | 475 000 | 1 230 000 | 2 670 000 |
Pokud jsou licence a hosting sloučené do jednoho paušálu — což je u jednoho dlouhodobého klienta v Česku běžné — pravděpodobná částka vychází kolem 1,0 až 1,3 milionu korun ročně.
Kolik by stála stavba od nuly
Existuje jeden pevný bod. Případová studie samotného sinfin.digital uvádí, že projekt ACB byl dodán v roce 2024, zabral přes 300 člověkodnů a postavili ho tři lidé — jeden backendista, jeden frontendista a jeden UX/UI designér. Stihli to za 300, protože Folio i Auctify už existovaly. Dodavatel na zelené louce bez těchto enginů skončí u horní hranice rozpětí níže.
| Balík práce | MD | Kč |
|---|---|---|
| Analýza, informační architektura, obsahový model | 8 | 115 000 |
| Drátěné modely, vizuální design, responzivita a tmavý režim | 22 | 317 000 |
| Jádro CMS — stránky, bloky, média, role | 25 | 360 000 |
| Datový model katalogu a import 76 000 záznamů | 15 | 216 000 |
| Vyhledávání a fasety v rozsahu 76 tisíc položek | 12 | 173 000 |
| Obrazová linka — příjem, varianty, CDN | 10 | 144 000 |
| Frontend všech šablon | 28 | 403 000 |
| Blog, statické stránky, formuláře, měření | 8 | 115 000 |
| Dvojjazyčnost cs + en | 8 | 115 000 |
| SEO, sitemapy, výkon | 7 | 101 000 |
| Testování, infrastruktura, předání | 15 | 216 000 |
| Vedení projektu | 19 | 274 000 |
| Celkem | 177 | 2 549 000 |
Rozpětí 2,0 až 3,3 milionu Kč.
| Balík práce | MD | Kč |
|---|---|---|
| Všechno z rozsahu A | 177 | 2 549 000 |
| Registrace dražitelů, ověření totožnosti, schvalování | 20 | 288 000 |
| Časované aukce — limitní příhozy, kroky, prodloužený konec | 30 | 432 000 |
| Konzole pro sálovou aukci a rozhraní operátora | 28 | 403 000 |
| Realtime přenos, pořadí příhozů, zátěžové testy | 22 | 317 000 |
| Živé vysílání | 10 | 144 000 |
| Příjem děl, smlouvy, elektronický podpis | 25 | 360 000 |
| Platby, fakturace, vypořádání, DPH, autorské poplatky | 30 | 432 000 |
| Administrace a reporting | 25 | 360 000 |
| Archiv cen s analytikou | 12 | 173 000 |
| Bezpečnostní revize, zátěž, zkouška aukčního večera | 15 | 216 000 |
| Analýza a vedení navíc kvůli dražební doméně | 26 | 374 000 |
| Celkem | 420 | 6 048 000 |
Rozpětí 5,0 až 8,5 milionu Kč při smíšené sazbě 14 400 Kč za člověkoden.
Jaký stack bych postavil místo toho
O téhle architektuře rozhodují tři věci. Veřejný web se čte, neobsluhuje — 99,6 % jeho adres je katalog, který nikdo needituje. Dražební engine se zapisuje, souběžně, lidmi, kteří mají v sázce peníze, a pořadí příhozů musí být prokazatelně správné. A klient je aukční dům, ne softwarová firma, takže provozní plocha musí zůstat malá.
Takže: předrenderovat na edge všechno, co se čte. Každý zápis, na kterém záleží, protáhnout jedním řadicím zapisovatelem. Držet jednu databázi jako zdroj pravdy a se vším ostatním — vyhledávacím indexem, obrazovými variantami — zacházet jako s projekcemi, které lze kdykoli postavit znovu.
| Web | Astro 5 na Cloudflare Workers — předrenderované, ostrůvky jen tam, kde návštěvník něco dělá |
|---|---|
| API | Hono, TypeScript, na Workers |
| Dražení | Jeden Durable Object na aukci — jednovláknový, takže pořadí plyne z konstrukce |
| Databáze | PostgreSQL — katalog a append-only log událostí příhozů |
| Vyhledávání | Typesense — fasety, tolerance překlepů, skládání české diakritiky |
| Média | R2 pro originály, Cloudflare Images pro varianty, podepsané URL pro nezveřejněné položky |
| CMS | Payload 3, ukládá do téže databáze PostgreSQL |
| Fronty | Cloudflare Queues — varianty, pošta, faktury |
| Platby | Stripe a česká platební brána; bankovní převod párovaný přes variabilní symbol |
Proč jeden zapisovatel na aukci
Durable Object zpracovává vždy jen jednu zprávu. Příhozový žebříček se zkontroluje a událost zapíše ve stejném kroku, takže dva příhozy ve stejné milisekundě nemohou vyhrát oba. Žádný advisory zámek, žádná optimistická smyčka, žádná dorovnávací úloha. Časovač prodlužující konec aukce sedí uvnitř téhož objektu jako stav, který prodlužuje, a rozesílání přes WebSocket sedí vedle stavu, který rozesílá.
Proč je log příhozů jen pro přidávání
Každý příhoz je neměnná událost s pořadovým číslem. Aktuální nejvyšší příhoz je projekce, ne uložené pole. Spornou dosaženou cenu lze zrekonstruovat i po měsících a majiteli díla se dá ukázat celý žebříček. Tohle je jediné místo v dražebním systému, kde se event sourcing zaplatí okamžitě.
Co to přinese proti dnešku
| Oblast | Dnes | Cíl |
|---|---|---|
| Podíl obsahu v HTML | 4,1 % | nad 25 % |
| Odeslané a využité CSS | 763 KB / 8,5 % | pod 60 KB / nad 80 % |
| Cena zobrazení stránky | pokaždé vykreslení na originu | odpověď z edge, databáze se nedotkne |
| Přenos příhozů | HTTP long-poll, minimum 100 ms | WebSocket, pořadí dané konstrukcí |
| Strukturovaná data | 0 | Organization, Event, Product, VisualArtwork, Breadcrumb |
| Katalog v indexu | 152 702 obsahově chudých adres, ceny skryté | kurátorované stránky autorů a děl s viditelnými cenami |
| Přístupnost | bez odkazu na obsah, bez h1, bez živých oblastí | WCAG 2.2 AA, dražení oznamované odečítačem |
| CSP | nelze zavést bez přepsání šablon | na bázi nonce, žádný vložený skript |
Metoda
- Stažení živého webu do lokálního stromu — 602 stránek HTML v češtině i angličtině (všechny obsahové stránky, všech 99 aukcí, všech 143 článků a vzorek katalogu), oba balíky assetů, písma, ikonový sprite, čtyři sitemapy a HTTP hlavičky. Celý katalog má 152 702 adres; stahovat ho celý by nebylo užitečné ani slušné.
- Určení stacku z balíků, otisků v názvech souborů, HTTP hlaviček a značkování — ne z tvrzení dodavatele.
- Každé číslo na této stránce bylo spočítáno skripty nad tím stromem. Kontrastní poměry jsou vypočtené z relativní luminance podle WCAG 2.1, ne odhadnuté okem.
- Ocenění českého trhu ze zveřejněných ceníků agentur, zveřejněných tarifů hostingů, ceníku Auctea a z analýzy Ministerstva vnitra nad 830 veřejnými ICT zakázkami. Odhady jsou označené jako odhady.
- Návrh cílové architektury podle domény, pak nakreslení a ověření diagramů.
- Čtyřnásobná přestavba celého webu z jednoho obsahového modelu, aby byly ty čtyři návrhy porovnatelné stránku po stránce.
Úplné pracovní podklady: technický audit a rozbor nákladů na českém trhu, oba včetně zdrojů.