Přejít k obsahu
acb.cz — audit a návrh přestavby

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ě.

3,8Celkem z 10
7Zralost platformy
3Tato konkrétní instalace
4,1%bajtů HTML je obsah
8,5%stylopisu se používá

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.

01

Č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 dnesheritageateliernocturnekinetic
Podíl obsahu v HTML4,1 %24,4 %20,7 %22,0 %19,2 %
Průměrná velikost stránky155 KB24 KB26 KB23 KB31 KB
Odeslané CSS763 KB61 KB69 KB66 KB74 KB
Odeslaný JavaScript585 KB6 KB9 KB10 KB8 KB
Požadavků na úvodní stránce~6017132030
Stránek s <main>28 %100 %100 %100 %100 %
Stránek s odkazem pro přeskočení obsahu0 %100 %100 %100 %100 %
Obrázků s width a height22 %100 %100 %100 %100 %
Obrázků bez přístupného názvu1 3800000
Stránek s přeskočenou úrovní nadpisu31 %0000
Vodorovné přetečení, 390–14400000

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.

02

Na čem web běží

Určeno z balíků, hlaviček a značkování
FrameworkRuby on Rails, serverem vykreslované ERB
x-runtime, x-request-id, session cookie Rails
PlatformaAuctify / Auctea — víceklientský dražební engine
auctea_application-themed-as-acb.css
CMSFolio
window.Folio, jmenný prostor tříd f-
Dodavatelsinfin.digital
poznámka v patičce, organizace sinfin na GitHubu
AssetySprockets, jeden CSS 763 KB a jeden JS 585 KB, bez dělení
NavigaceTurbolinks 5 — v roce 2021 nahrazené Turbem
ChováníStimulus, 99 registrovaných controllerů, 43 se používá veřejně
Realtimemessage_bus, HTTP long-poll
0 zmínek o WebSocket v 585 KB
UI knihovnyBootstrap 5.3.1, jQuery, Popper, PhotoSwipe, Dropzone, Tempus Dominus
PřihlašováníDevise + OmniAuth (Google, Apple, X), Cloudflare Turnstile
EdgeCloudflare pouze před HTML
MédiaVeřejný S3 bucket auctea, eu-central-1, bez CDN
MarketingGTM, 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.

03

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é.

Současná architektura, jak byla naměřena. Přepínač pohledů je uvnitř diagramu. Otevřít ve velkém ↗
04

Kde to bolí

Výkon — platí se za značkování, ne za obsah

24,6 : 1Poměr značkování k textu na 513 stránkách. 81,5 MB HTML nese 3,3 MB čitelného textu — obsah tvoří 4,1 % bajtů. Nejhorší stránka katalogu má poměr 54 : 1.
91,5 %Stylopisu o velikosti 763 KB se nikdy nepoužije. Na webu je 8 225 tříd; kdekoli na něm se objeví 698. Odesílá se 1 888 utility tříd Bootstrapu, používá se 21 z nich, a stojí 71 KB.
10 815Obrázků bez width a height — 77,8 % všech obrázků, a každý z nich posune rozvržení. Rozměry má jen 22,2 %.
0Deskriptorů w a atributů sizes. Každý srcset řeší jen hustotu pixelů, takže telefon se šířkou 360 px stahuje obrázek pro desktop.
0Direktiv preconnect na server S3, ze kterého jde všech zhruba 50 obrázků na stránce. První obrázek tak platí celé DNS a TLS navázání až po zpracování HTML.
58 355Atributů data-controller na webu, tedy 114 na stránku, k tomu 35 530 vložených SVG a 37 771 atributů style přímo v elementech.

Přístupnost — 3 / 10

0Odkazů pro přeskočení obsahu. Každý návštěvník projde tabulátorem sedmipoložkové menu, jeho podmenu, vyhledávací formulář a panel nastavení, než se dostane k obsahu.
0Oblastí aria-live — na webu, jehož hlavní funkcí je cena, která se mění v reálném čase. Nevidomý dražitel se nikdy nedozví, že byl přeplacen.
28 %Stránek má orientační bod <main>. Na úvodní stránce chybí <h1> úplně; její osnova začíná na h4. Na 31 % stránek je přeskočena úroveň nadpisu.
3,26 : 1Kontrast značkové zlaté #B18839 na bílé. WCAG AA požaduje pro text 4,5 : 1. Používá se jako text i jako bílý text na zlatém tlačítku. Přístupná varianta #8F6B24 v sadě tokenů existuje a nepoužívá se.
8,6 %Z 653 rámců iframe má atribut title. 642 prvků s role="dialog" nemá aria-modal ani přístupný název.

Vyhledávače — 3 / 10

0Bloků JSON-LD na 513 stránkách. Aukční dům se 72 578 záznamy o dílech nepublikuje žádná strukturovaná data typu Product, Offer, Event ani VisualArtwork.
152 702Obsahově chudých adres katalogu — 99,6 % sitemapy. Zdvojené v češtině i angličtině, se shodou 99,98 % slugů, bez popisu, bez strukturovaných dat a bez dosažených cen, protože ty jsou až po registraci. Přitom jsou jediným důvodem, proč katalog existuje.
0Značek meta robots, přestože robots.txt v komentáři tvrdí, že se indexace katalogu řídí právě jimi. Napsaná politika není zavedená.
58 %Stránek nemá meta popis, včetně 85 z 86 stránek katalogu. 192 stránek sdílí zdvojený titulek; 16 stránek aukcí má titulek úplně stejný.
22 %Stránek má hreflang a x-default se nepoužívá vůbec. Dvanáct anglických stránek je prázdná skořápka — anglický archiv výstav má 23 znaků, anglický rozcestník blogu nemá žádný, a přitom sitemapa uvádí 143 anglických adres blogu.

Bezpečnost a soukromí — 4 / 10

Chybí CSPA nejde doplnit levně: 6 418 vložených bloků <script> a 37 771 vložených stylů znamená, že jakákoli politika by potřebovala unsafe-inline a nic by nepřinesla. Skutečné CSP vyžaduje přestavbu šablon.
Chybí HSTSNa webu, který drží registrace dražitelů s osobními údaji. Chybí také Permissions-Policy, COOP a CORP.
5 × bez SRIBootstrap, js-cookie, cleave.js, intl-tel-input a html5sortable se tahají z cdnjs za běhu, bez otisku Subresource Integrity a bez CSP, které by je omezilo. Bootstrap se navíc načítá v neminifikované verzi.
Veřejný bucketKaždá fotografie díla jde nepodepsaná z s3.eu-central-1.amazonaws.com/auctea/, po cestě, která prozrazuje čas nahrání na sekundu. Celou obrazovou knihovnu lze stáhnout a vykrádat odkazem na náklady klienta.
SprávněPříznaky cookie (secure; HttpOnly; SameSite=Lax, 12 h), CSRF Rails v každém formuláři a opravdu dobře udělaný Consent Mode v2 se všemi šesti signály ve výchozím stavu zamítnutými a s Meta Pixelem drženým neaktivním až do souhlasu. Je to nejsilnější část webu.

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.

Stáří použitého přístupu
Používá seNahrazeno
Turbolinks 5Turbo, 2021
Jeden balík Sprocketsimportmap / jsbundling, Rails 7, 2021
jQueryzůstalo jen jako adaptér pro message_bus
message_bus long-pollWebSocket
role="document" v dialozíchvzor z doby před rokem 2016
ruční přepínač tmavého režimuprefers-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.

05

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.

3,8Vážený průměr
7 / 10Auctify jako platforma
3 / 10Instalace acb.cz

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.

06

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.

Sazby českých agentur této třídy — odhad podle zveřejněných ceníků
RolenízkástřednívysokáKč / MD
Senior Rails vývojář1 4002 0002 80016 000
Frontend vývojář1 2001 8002 50014 400
UX/UI designér1 2001 7002 40013 600
Projektový manažer1 1001 6002 20012 800
Analytik1 2001 7002 40013 600
Smíšená sazba použitá dále1 800 Kč/h14 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.

Hosting pro tuto zátěž, měsíčně — odhad
VariantaKč / měsíc
Český VPS, bez správy
třída Vedos / Váš-Hosting / Forpsi
7 500–12 000
Hetzner Cloud7 500–9 500
DigitalOcean10 000–14 000
AWS eu-central-116 000–24 000
Přefakturováno agenturou15 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.

Paušál za údržbu — odhad
Úroveňh / měsícKč / měsíc
Nízká — záplaty, monitoring, reaktivně6–812 000–16 000
Standard — navíc drobné změny, čtvrtletní upgrady12–1622 000–30 000
Vysoká — navíc SLA pro živé aukce, proaktivní práce20–3036 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.

Požadavky na změnu — odhad při 1 800 Kč/h
Prácehodin
Nová obsahová stránka ze stávajících bloků2–63 600–11 000
Nová stránka s vlastním rozvržením8–2014 000–36 000
Nový filtr v katalogu10–3018 000–54 000
Redesign jedné šablony20–5036 000–90 000
Nový jazyk60–150108 000–270 000
Napojení na externí službu30–10054 000–180 000
Nový typ aukce nebo změna pravidel dražby40–12072 000–216 000
Zveřejněný ceník Auctea — auctea.com, přepočteno kurzem 25 Kč/€
TarifKč / měsícRozsah
Startupod 1 475web s CMS, objednávky, fakturace
Growthod 8 125+ modul nabídky děl, prioritní podpora
Enterpriseod 16 250+ BankID, smlouvy, analytika
Customna 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é.

Celkové roční náklady vlastníka — odhad, platforma už postavená
Položkanízkopravděpodobněvysoko
Licence platformy96 000300 000600 000
Hosting, přefakturovaný120 000240 000420 000
Paušál za údržbu144 000300 000660 000
Požadavky na změnu100 000350 000900 000
Cloudflare, monitoring, pošta, SMS15 00040 00090 000
Ročně, Kč475 0001 230 0002 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ě.

07

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.

Rozsah A — web a katalog, bez dražebního enginu
Balík práceMD
Analýza, informační architektura, obsahový model8115 000
Drátěné modely, vizuální design, responzivita a tmavý režim22317 000
Jádro CMS — stránky, bloky, média, role25360 000
Datový model katalogu a import 76 000 záznamů15216 000
Vyhledávání a fasety v rozsahu 76 tisíc položek12173 000
Obrazová linka — příjem, varianty, CDN10144 000
Frontend všech šablon28403 000
Blog, statické stránky, formuláře, měření8115 000
Dvojjazyčnost cs + en8115 000
SEO, sitemapy, výkon7101 000
Testování, infrastruktura, předání15216 000
Vedení projektu19274 000
Celkem1772 549 000

Rozpětí 2,0 až 3,3 milionu Kč.

Rozsah B — celá platforma, sálové i časované aukce, platby, administrace
Balík práceMD
Všechno z rozsahu A1772 549 000
Registrace dražitelů, ověření totožnosti, schvalování20288 000
Časované aukce — limitní příhozy, kroky, prodloužený konec30432 000
Konzole pro sálovou aukci a rozhraní operátora28403 000
Realtime přenos, pořadí příhozů, zátěžové testy22317 000
Živé vysílání10144 000
Příjem děl, smlouvy, elektronický podpis25360 000
Platby, fakturace, vypořádání, DPH, autorské poplatky30432 000
Administrace a reporting25360 000
Archiv cen s analytikou12173 000
Bezpečnostní revize, zátěž, zkouška aukčního večera15216 000
Analýza a vedení navíc kvůli dražební doméně26374 000
Celkem4206 048 000

Rozpětí 5,0 až 8,5 milionu Kč při smíšené sazbě 14 400 Kč za člověkoden.

08

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.

Navržený stack
WebAstro 5 na Cloudflare Workers — předrenderované, ostrůvky jen tam, kde návštěvník něco dělá
APIHono, TypeScript, na Workers
DraženíJeden Durable Object na aukci — jednovláknový, takže pořadí plyne z konstrukce
DatabázePostgreSQL — katalog a append-only log událostí příhozů
VyhledáváníTypesense — fasety, tolerance překlepů, skládání české diakritiky
MédiaR2 pro originály, Cloudflare Images pro varianty, podepsané URL pro nezveřejněné položky
CMSPayload 3, ukládá do téže databáze PostgreSQL
FrontyCloudflare Queues — varianty, pošta, faktury
PlatbyStripe a česká platební brána; bankovní převod párovaný přes variabilní symbol
Navržená architektura. Čtyři pohledy: veřejná stránka, živé dražení, vyhledávání, média. Otevřít ve velkém ↗

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ě.

Příhoz v posledních vteřinách — odeslání, seřazení, reakce limitu, prodloužený konec. Otevřít ve velkém ↗
Život položky — doménový model, který musí každá přestavba zvládnout. Otevřít ve velkém ↗

Co to přinese proti dnešku

OblastDnesCíl
Podíl obsahu v HTML4,1 %nad 25 %
Odeslané a využité CSS763 KB / 8,5 %pod 60 KB / nad 80 %
Cena zobrazení stránkypokaždé vykreslení na originuodpověď z edge, databáze se nedotkne
Přenos příhozůHTTP long-poll, minimum 100 msWebSocket, pořadí dané konstrukcí
Strukturovaná data0Organization, Event, Product, VisualArtwork, Breadcrumb
Katalog v indexu152 702 obsahově chudých adres, ceny skrytékurátorované stránky autorů a děl s viditelnými cenami
Přístupnostbez odkazu na obsah, bez h1, bez živých oblastíWCAG 2.2 AA, dražení oznamované odečítačem
CSPnelze zavést bez přepsání šablonna bázi nonce, žádný vložený skript
09

Metoda

  1. 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é.
  2. Určení stacku z balíků, otisků v názvech souborů, HTTP hlaviček a značkování — ne z tvrzení dodavatele.
  3. 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.
  4. 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.
  5. Návrh cílové architektury podle domény, pak nakreslení a ověření diagramů.
  6. Č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ů.