Nakon nekoliko dugih godina korištenja WordPressa zajedno s Elementorom (Pro) kao glavnim alatom za dizajn, odlučio sam da je konačno vrijeme da vidim šta AI i vibe coding zapravo mogu učiniti za mene. Poznati stek mi je dobro služio za ličnu stranicu, ali radoznalost je prevladala i želio sam saznati može li moderan radni proces potpomognut AI-jem zamijeniti CMS na koji sam se već navikao.
Da budemo jasni, ovo nije bio moj prvi susret s vibe codingom. Prije nekog vremena već sam ga koristio za pomoć pri kreiranju osnove za jedan od svojih projekata, jednostavnu 301 redirect landing stranicu pod nazivom Buymeachinesetakeaweay, o kojoj možete pročitati ovdje: https://idzan.hr/project/buymeachinesetakeaweay-com-fan-redirect-support-page/. Taj projekt me naučio kako prilagoditi AI izlaz tako da mogu naknadno ručno uređivati HTML i sam nastaviti dodavati nove komentare i zanimljive citate autora. Bila je to mala stvar, ali mi je dala samouzdanje da razvoj potpomognut AI-jem može funkcionirati za mene u većem obimu.
Priprema za skok
Svaka ozbiljna migracija počinje sigurnosnom kopijom, a moja nije bila izuzetak. Prije bilo čega drugog napravio sam backup originalne baze podataka i svih medijskih datoteka te izvezao sav sadržaj iz WordPressa u njegovom izvornom XML formatu. Taj izvoz se kasnije pokazao kao zlato vrijedan, jer je dao AI-ju strukturirani izvor istine za sav sadržaj koji se godinama skupljao na stranici.
Plan za novi dizajn bio je prilično jednostavan. Želio sam zadržati isti ili barem vrlo sličan izgled i osjećaj kao na originalnoj stranici, koju namjerno nisam gasio tokom tranzicije. Na taj način Claude je mogao vidjeti stranicu uživo i koristiti njen postojeći sadržaj kao referencu za skice, a kad god su mu bili potrebni podaci iz prve baze podataka, mogao sam ih jednostavno povući iz originalnog sadržaja.
Izbor osnove
Za samu CMS osnovu odabrao sam provjerenu i pouzdanu kombinaciju PHP-a i MySQL-a. U to vrijeme to se činilo kao dosadan, pouzdan izbor, iako se kasnije pokazalo da ima više grešaka nego što je ik ko očekivao kada su objavljene dvije velike ranjivosti daljinskog izvršavanja koda, CVE-2026-109618 i CVE-2026-109619. Srećom, moje dugogodišnje iskustvo administratora sistema i self-hostera na VPS-u se isplatilo. Onog dana kada je zakrpa stigla, nisam zakrpao PHP samo za svoju stranicu, već za svaku stranicu hostovanu na tom VPS-u. Kratka zahvalnost ovdje ide za Hetzner i Leaseweb što su tako brzo u svoje keš memorije ubacili zakrpljene verzije PHP-a za moju distribuciju po izboru, što je cijelu operaciju učinilo mnogo bezbolnijom nego što je mogla biti.
Sama izrada
Proces vibe codinga i dotjerivanja trajao je ukupno nekoliko dana. Prvi dan je potrošen na dizajn i osnove sigurnosti, zajedno s konfiguracijom čišćenja CDN-a preko mog DNS provajdera, pa još jedna zahvalnost ide za Bunny.net što je to učinio bezbolnim.
Zatim je došla jedna od zanimljivijih funkcija, višefazno AI prevođenje podržano umjetnom inteligencijom koje koristi više modela. Trenutna postavka uključuje Google Gemini (gemini-3.5-flash-lite), OpenAI ChatGPT (gpt-6-luna), Anthropic Claude i Google Translate sa API-jem ako zatreba. Posjedovanje nekoliko dostupnih modela znači da nisam vezan za jednog provajdera i mogu upoređivati kvalitet prevoda između njih.
Stranica trenutno podržava hrvatski (/hr/), bosanski (/bs/), srpski (/sr/) i slovenački (/sl/), pri čemu svaka dobija svoju kopiju prevedenog sadržaja. Engleski ostaje original na korijenskoj putanji i služi kao zadani za sve što još uvijek nije prevedeno. Pored trenutnog .hr domena, aktivni su i domeni specifični za države .ba, .si i .rs, zajedno s prethodno korištenim .eu i .com.hr, te .name TLD-om, a svi oni vrše 301 preusmjeravanje na glavni .hr domen bez obzira na sve. Tako da ako neko podijeli objavu sa slug-om kao što je /ba/post-name, ona ide kroz .hr/ba/ i završava na originalnom slug-u u njegovom bosanskom prijevodu. A ako neko dođe na stranicu i ne razumije engleski, bez brige, AI prijevod je tu da pomogne preko birača jezika.
Sam taj birač jezika napravljen je sa SVG ikonicama zastava iz mog sopstvenog seta ikona, kojima se upravlja kroz administrativni panel, a svaka je propraćena svojim ISO 639 kodom jezika, kako je navedeno na Wikipediji na https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes. Zanimljivo je da se samo hrvatski kod zapravo poklapa s njegovim državnim TLD-om, pri čemu hr označava oboje. Ostali se razlikuju: bosanski je označen sa BS dok mu je državni domen .ba, srpski je SR naspram .rs, a slovenački je SL naspram .si. Engleski je označen sa EN, nema sopstveni državni domen i na stranici se prikazuje kao en-US.
Otprilike u to vrijeme administrativni panel je također dobio prijeko potrebnu pažnju. Bio je postao pomalo neuredan, pa sam ga očistio i organizovao s odgovarajućim podmenijima tako da se postavke ponovo mogu zapravo pronaći.
}Kasnije sam implementirao funkciju koja enormno pomaže u pogledu brzine i kompatibilnosti. Sve slike sada dobijaju WebP i AVIF kopije za brže učitavanje, uz originalni JPG ili PNG kao rezervnu opciju za starije pretraživače. Ikone su očišćeni SVG fajl formati ubačeni direktno na stranicu i nikada nisu objavljeni kao preuzimive datoteke, tako da se moji plaćeni SVG setovi ikona ne mogu tek tako preuzeti.
Puštanje u rad obavljeno je u duhu „live implementacije uz brzi povratak na staru i stabilnu verziju ako nešto krene po zlu“. I iskreno, zamalo je propalo nekoliko puta zbog pogrešno podešenih VHOST, NGINX i Varnish Cache konfiguracija, da i ne spominjemo Google PageSpeed modul. Moram biti pošten i priznati da su ti propusti bili moje greške, a ne AI-jeve.
Mali detalji koji su važni
Kada je jezgro počelo raditi, dodao sam završne detalje. Stranica sada ima robots.txt sa listom dozvola za dobre AI web pretraživače (crawlere), automatski ažuriran sitemap.xml sa punom višestrukom jezičkom podrškom, plus llms.txt za AI asistente i podršku za IndexNow. Sve stranice se poslužuju kao čist statički HTML sa strukturiranim podacima u JSON-LD formatu, tako da AI agenti mogu lako čitati i pregledati stranicu. Dobri botovi su dobrodošli; oni koji ignorišu robots.txt blokirani su na CDN-u putem edge pravila, uz još jedno hvala za Bunny.net, te direktno u vhost konfiguraciji.
Što se tiče sigurnosti, adminska ploča je zaista skrivena. Ne nalazi se na klasičnoj /admin putanji ili bilo kojoj drugoj putanji poznatoj po privlačenju napada grubom silom (brute-force). Umjesto toga, nalazi se iza zaista jedinstvenog sluga koji niko neće pogoditi.
Dokumentacija i open-sourcing
Pošto vjerujem da je projekat dobar onoliko koliko mu je dobra dokumentacija, zatražio sam i README i vodič za podešavanje. Oboje su objavljeni u GitHub repozitorijumu na https://github.com/idzanhr/idzan_custom_cms_refresh. Vodič objašnjava projekat i vodi kroz njegovo podešavanje bez ikakvog mog stvarnog sadržaja. Sve što je lično moje, poput detalja konfiguracije ili mojih vlastitih kodova, ostaje van javnog repozitorija i zamijenjeno je generičkim ekvivalentima koji i dalje omogućavaju svakome da sam ažurira CMS.
Završne misli
Sa ovom postavljenom osnovom, također sam ponovo bazirao i izgradio svoju Music Works stranicu na music.idzan.hr koristeći isti CMS na istoj osnovi i platformi. Tom projektu je trebalo nešto manje vremena da se završi pošto se radi o jednoj poddomeni koja jednostavno lista moje radove, a zamijenila je staru početnu stranicu koja je imala neki O meni sadržaj, premještajući ga na zasebnu stranicu. Za kontakte, ona i dalje vodi do moje druge stranice Social Media na socials.idzan.hr, koju sam također kreirao unutar vibe coding pristupa ali koristeći samo statičnu stranicu, budući da te podatke ne treba često mijenjati niti dodavati i trebaju ostati u istom obliku. Ta stranica je jednostavna, čista, minimalistička i brza, ostvarujući rezultat 100/100 na Google Lighthouse testovima bez nepotrebnog viška koda.
Gledajući unazad, napuštanje WordPress-a i Elementora nakon svih ovih godina djelovalo je rizično, ali kombinacija pažljive pripreme, čvrstih rezervnih kopija (backupova) i razvoja uz pomoć vještačke inteligencije pokazala je da je prilagođeni CMS napravljen na ovaj način apsolutno održiv. Stranica je brža, čistija, lakša za razumijevanje, i ja kontrolišem svaku njenu liniju. I ako se bilo šta ikada pokvari, i dalje imam taj WordPress izvoz sigurno sačuvan na polici.
Ipak, ovo nije objavu rata WordPress-u. Za sve buduće projekte kojima je potrebna komplikovanija stranica ili web shop, i dalje ću rado posegnuti za radnom i stabilnom WordPress instalacijom sa dodacima poput WooCommerce-a, uz prilagođeni kod tamo gdje je potreban. A neke stranice, zbog svog dizajna i složenosti, nikada neće biti pretvorene u AI vibe-coded projekte, i to je svjesna odluka donesena imajući u vidu njihove zahtjeve.
Pored ovog projekta, moj lični GitHub također sadrži još dva vibe-coded projekta bazirana na PHP-u i MySQL-u, napravljena za internu upotrebu zajedno sa nekoliko kolega sa posla. Oni upravljaju prednjim dijelom (front-endom) dok je pozadina (back-end) u potpunosti moja, a možete ih pregledati na https://github.com/idzanhr?tab=repositories.
Jedna posljednja napomena u interesu transparentnosti: ovaj tekst je generisan i lektorisan uz pomoć modela Proton Lumo 2.0 Max, baziranog na mom originalnom sadržaju i bilješkama.
