Balkan RP — sajt za FiveM zajednicu vođen jednim videom
Sajt za roleplay zajednicu ne prodaje uslugu nego atmosferu: ko ga otvori, mora da oseti grad pre nego što pročita ijedno pravilo. Ovo je naš poddomen i naš projekat, bez naručioca — cela strana je jedan šesnaestosekundni let kroz grad, a sedam poglavlja se smenjuje preko njega dok se skroluje. Bez okvira i bez ijedne JavaScript biblioteke.
- Klijent
- Nema — sopstveni demo, bez naručioca
- Delatnost
- FiveM roleplay zajednica (server izmišljen za prikaz)
- Područje
- Balkan, online
- Tip
- Sajt vođen scroll-videom, sedam poglavlja
- Tehnologije
- Vanilla JS · CSS · AI video · ffmpeg · nginx
- Sajt
- rp.svilenkovic.rs
- Status
- Živ od jula 2026, namerno van indeksa
U ovom tekstu
Šta je Balkan RP i čiji je ovaj sajt
Balkan RP nije klijentski posao. To je naš poddomen i naš projekat, izrađen bez naručioca, i tako piše i na samom sajtu: u uglu ekrana stoji pločica sa natpisom DEMO, a uslovi korišćenja u prvoj rečenici kažu da RP server pod tim imenom ne postoji i da su sve prikazane brojke, pravila i organizacije izmišljene za prikaz.
Ono što jeste stvarno je publika. FiveM je modifikacija za GTA V koja dozvoljava privatne servere, a roleplay zajednice sa Balkana su među većim korisnicima. Takav server ima svoj Discord, svoja pravila, svoje frakcije i svoje donacije — i skoro uvek ima sajt koji je ili šablon sa foruma ili jedna slika iz igre sa dugmetom ka Discord-u.
Sadržaj koji sajt prikazuje je zato pisan kao da je pravi: whitelist prijem, ekonomija unutar igre, poslovi, frakcije sa hijerarhijom, heists, custom mape i donacije koje ne kvare balans. Poglavlja se zovu Početak, O serveru, Karakter, Frakcije, Heists, Donacije i Pridruži se — tačno onim redom kojim potencijalni igrač postavlja pitanja: gde sam, ko sam, sa kim sam, šta se radi, koliko košta, kako ulazim.
Zašto uopšte praviti demo za posao koji niko nije naručio: zato što je bio poligon za tehniku koja se posle koristi na pravim sajtovima — ceo sajt vođen jednim videom, umesto 3D scene u pregledaču.
Šta je trebalo rešiti
Publika ovakvog sajta je najzahtevnija koju sajt može da dobije: igrači koji svaki dan gledaju grafiku iz igre. Strana sa stok fotografijom i tri kartice njima ne znači ništa. Prvi utisak mora da bude sam grad.
- Atmosfera pre teksta — posetilac mora da vidi kretanje kroz grad pre nego što pročita ijedno pravilo.
- Da radi na slabom uređaju — deo publike su telefoni i računari koji jedva vuku samu igru. Sajt ne sme da bude teži od igre.
- Bez teškog 3D-a — prva verzija ovog sajta bila je Three.js scena čiji je samo jedan modul nosio 934 KB. Za jednu naslovnu stranu to je previše, a i izgledala je kao 3D scena, ne kao grad.
- Jedan sadržaj, više režima — ista strana mora da ima smisla i kada posetilac traži manje pokreta, štedi podatke ili mu skript uopšte ne radi.
Odluka je bila da se 3D izbaci i zameni filmom: jednim neprekidnim letom kroz grad, snimljenim tako da može da se vodi skrolom. Kamera ide napred bez ijednog reza — od obale i mola, kroz zlatni sat nad centrom, pored tornjeva i preko trga sa fontanom, do neonskog bulevara u sumrak. Poglavlja se smenjuju preko toga, a boja teksta prati doba dana u kadru.
Tehnički, to je zamena jednog problema drugim, ali povoljna. Trodimenzionalna scena troši procesor svake sekunde dok se strana gleda; video se preuzme jednom pa se posle samo dekoduje, a dekodiranje je posao za koji uređaj ima namensko kolo. Za sadržaj koji je ionako unapred određena putanja kamere, film je jeftiniji na svakom uređaju i uverljiviji na oku.
Film se pravi u segmentima, ne odjednom
Šesnaest sekundi neprekidnog leta ne dobija se u jednom potezu. Generatori videa iz slike daju segmente od nekoliko sekundi, pa se film sklapa ulančavanjem.
Postupak je bio isti za svaki segment: prvo se generiše jedan statičan kadar u punom formatu, iz njega se pravi pokret, pa se iz poslednjeg kadra tog segmenta izvuče slika (ffmpeg -sseof) koja postaje početni kadar sledećeg. Šavovi se ne vide zato što kamera na kraju svakog segmenta uđe u nešto — u staklo tornja, u senku nadvožnjaka — pa se spoj desi u trenutku kada je kadar ionako zatamnjen. To nije trik nad materijalom nego uslov koji se piše u zahtev za generisanje.
Dva detalja iz enkodiranja vredi zapisati. Prvi: pre finalnog prolaza materijal ide kroz blago uklanjanje šuma (hqdn3d), što fajl olakša za oko petinu — a teksturu koja se tako izgubi vraća CSS sloj sa zrnom preko videa, koji ne košta ništa merljivo. Drugi: film je enkodiran tako da je svaki kadar samostalan (-g 1), jer se u ovom režimu ne pušta nego premotava, a premotavanje na kadar koji nije ključni znači dekodiranje unazad do najbližeg ključnog.
Neprijatno iznenađenje došlo je sa strane naplate generatora. Provera cene pre generisanja prijavila je jedan iznos kredita, a stvarno je po segmentu skinuto više nego dvostruko. Pravilo koje se od tada drži: posle prve generacije proveri stanje na nalogu, pa tek onda pusti seriju. Preflight nije obećanje.
Sedam poglavlja preko jednog filma
Strana nema sekcije koje se ređaju jedna ispod druge. Ima jednu scenu koja stoji zalepljena na vrhu ekrana i traku visine 1050vh na širokom ekranu (800vh na telefonu) kroz koju se skroluje. Odnos je namerno takav da jedna sekunda filma odgovara otprilike dvema trećinama ekrana skrola — dovoljno sporo da se kadar vidi, dovoljno brzo da se ne dosadi.
Poglavlja su apsolutno pozicionirana po traci, na nuli, pa na 14, 28, 42, 57 i 71 procenat. Poslednje, ono sa uputstvom za pridruživanje, nije na procentu nego je zakačeno za dno trake. To nije stilska odluka nego popravka: dok je i ono bilo na procentu, na nižim ekranima je isklizavalo ispod kraja filma, pa bi posetilac izašao iz scene pre nego što uopšte vidi poziv. Poslednje poglavlje se hvata za dno, ne za procenat — sitnica koja se ne vidi dok ne pukne.
Svako poglavlje nosi svoje raspoloženje — zlatno, sumrak, neon, noć — i naglasna boja nadnaslova, chipova i brojeva prati luk samog filma od dana ka noći. Kada tekst stoji preko videa, jedina stvar koja ga drži čitljivim jeste to što se boja menja zajedno sa kadrom ispod njega; fiksna paleta bi na pola filma nestala u pozadini.
Sa strane stoji navigacija od sedam tačaka koja pokazuje gde se u priči nalaziš, na vrhu tanka traka napretka. Obe se izvode iz istog broja — trenutne pozicije u filmu — pa ne mogu da se raziđu, što je najčešći kvar kod strana koje progres i navigaciju računaju odvojeno.
Tri režima, jedan isti sadržaj
Isti sajt se ponaša na tri načina, a koji će važiti odlučuje se pri učitavanju.
- Scrub — na uređaju sa mišem učitava se sam video i njegovo vreme prati poziciju skrola, uz blago izglađivanje da pokret ne bude nervozan i uz prag ispod koga se ne dira, da se ne troši na kretanje manje od jednog kadra.
- Sekvenca kadrova — na dodirnim uređajima umesto videa crta se na platnu: 161 slika u WebP formatu, ukupno oko 5 MB, koje se učitavaju postepeno.
- Poster — ako je uključena ušteda podataka ili posetilac traži manje pokreta, film se ne učitava uopšte. Strana se pretvara u običnu, prokrolovanu stranu sa posterom na vrhu i poglavljima ispod.
Treći režim nije alibi nego provera zdravlja cele ideje. Tekst poglavlja je pravi tekst u dokumentu, poglavlja su prave sekcije sa svojim naslovima i identifikatorima, a jedini deo koji zavisi od skripta jeste pojavljivanje kartica pri skrolu — i to tako da se bez skripta kartice vide odmah, a ne da ostanu nevidljive. Sajt bez JavaScript-a gubi film, ne sadržaj.
Učitavanje sekvence je podeljeno: prvih dvanaest kadrova odmah, ostatak po osam u trenucima kada pregledač ionako nema pametnija posla. Tu je nastao i najskuplji bag ovog sajta. Poziv kojim se posao zakazuje za besposleno vreme prima drugi argument kao objekat sa rokom, a ne kao broj — a napisan je bio broj. Rezultat je greška odmah pri učitavanju, koja obori ceo skript, i to samo na telefonima, jer se ta grana koda na širokom ekranu nikada ne izvršava. Sajt je na računaru izgledao potpuno ispravno dok je na telefonu bio mrtav. Otud navika da se svaka grana koja postoji samo za jedan tip uređaja otvori i na tom uređaju, a ne u simulaciji.
Tehnička izvedba
Ceo sajt su tri fajla koja se održavaju: jedan HTML, jedan CSS od desetak kilobajta i jedan JavaScript od pet. Nema okvira, nema paketa, nema koraka za sklapanje. Ono što se otvori u editoru je tačno ono što se servira, pa izmena ne zavisi od toga da li se alat kojim je sajt sklopljen još održava.
Fajlovi filma nose verziju u imenu (hero-scrub-a1.mp4, frames-a1/, poster-a1.jpg), a server ih drži u kešu godinu dana kao nepromenljive. To je jedini način da dug keš i buduće izmene mogu da postoje zajedno: kada se film zameni, menja se ime, a ne sadržaj na istoj adresi. Prepisivanje videa u mestu je nevidljivo — ni autor ni posetilac ne vide novi enkod, pa se zaključi da popravka ne radi, iako radi.
Film se isporučuje u dve veličine: puna za široke ekrane, oko 20 MB, i uža za male, oko 9,5 MB. Server odgovara i na delimične zahteve, pa premotavanje ne čeka ceo fajl. HTML se namerno ne kešira, jer je jedini fajl koji sme da se promeni na istoj adresi.
Ispred svega stoji nginx sa punim setom zaglavlja bezbednosti i politikom sadržaja, sa odbijanjem pristupa skrivenim fajlovima i rezervnim kopijama, i sa trajnim preusmerenjem sa HTTP-a na HTTPS. Sertifikat izdaje Let’s Encrypt, kao i za ostatak servera.
Jedan lokalni detalj koji se pamti tek kad zaboli: naslovna strana ovog sajta stoji zaključana na nivou fajl sistema. Dok se ne otključa, ne može da se prepiše — ni raspakivanjem arhive, ni običnim kopiranjem — a poruka o grešci pri tome ne kaže zašto. Konvencija je korisna dok se ne zaboravi, pa je zapisana uz sam projekat.
Brzina i šta film stvarno košta
Prvo što se vidi nije video nego poster — jedan kadar od oko 150 KB, koji se učitava sa najvišim prioritetom i prekriva ceo ekran. Video stoji iznad njega i pojavljuje se tek kada ima dovoljno podataka da se prikaže, uz kratko pretapanje. Posetilac zato ni u jednom trenutku ne gleda crn ekran, a element koji čini prvi prikaz strane je slika, ne film.
Sam video se ne dodiruje dok se ne odluči koji režim važi. U dokumentu stoji bez izvora i sa uputstvom da se ništa ne preuzima unapred; izvor mu dodeljuje skript, i to samo onaj koji je izabrao scrub. Na telefonu se puna verzija nikada ni ne zatraži, a u poster režimu se ne zatraži nijedna.
Sloj zrna i vinjeta preko filma su jedan SVG šum i jedan gradijent — oba bez ijednog piksela sa mreže i oba se preslikaju jednom, a ne po kadru. To je ono što daje utisak filma umesto utiska snimka iz igre, a ne košta ništa merljivo. Naslov na prvom ekranu je običan tekst sa prelivom, ne slika, pa ostaje oštar na svakoj rezoluciji i može da se pročita naglas.
Fontovi se učitavaju sa Google servisa i to je jedina stvar na strani koja dolazi spolja. Za pravi klijentski sajt bili bi lokalni; ovde su ostali kako jesu, a to je i zapisano u politici privatnosti umesto da se prećuti.
Šta je ostalo otvoreno
Motor koji vozi ovaj film premotava video — upisuje mu novo vreme na svaki kadar skrola. To je uobičajen recept i ovde radi, ali se kasnije, na drugom sajtu iz iste porodice, izmerilo da nije najbolji. Svaki upis u vreme videa je zaseban skok: pregledač isprazni cev za dekodiranje, ode na traženi kadar i prikaže ga, a upisi koji stignu dok skok traje bivaju progutani. Kroz brz prelaz se umesto svih kadrova prikaže tek deo njih, i oko to čita kao slajdšou, ne kao film.
Bolje rešenje je da se video kroz prelaz pušta, a da mu se brzina reprodukcije vodi prema tome koliko je skrol odmakao i koliko još ima do cilja. Premotavanje ostaje samo za skok unazad i za sletanje na kraj. Uz to ide i novo enkodiranje, jer recept „svaki kadar je ključni" gura zapis u format koji nijedna grafička kartica ne dekoduje hardverski — pa sve pada na procesor, baš tamo gde se najviše štedelo.
Isto važi i za izbor režima. Ovde se telefon prepoznaje po tome što se dodiruje, pa dobija sekvencu slika. Ispravnije je pitati uređaj šta ume da odsvira, a ne kako se dodiruje: današnji telefon lepo nosi pravi video, a sekvenca slika mu daje manje kadrova nego što bi imao sa filmom. Sekvenca ostaje smislena kao rezerva kada video padne, ne kao glavna ruta.
Oboje je poznato, mereno i zapisano, i oboje traži novo enkodiranje filma i novu oznaku verzije u imenima fajlova. Za sajt koji nije klijentski i koji nije u indeksu, to je stavka koja čeka red — ali stoji ovde napisana, jer nalaz koji se prećuti nije nalaz.
Planirana je i dogradnja samog filma: treći segment, noćni finale sa neonskim bulevarom i usponom ka silueti grada. Izvorni materijal i skripta za enkodiranje stoje spremni na serveru, čeka se samo generisanje i produžavanje trake da bi novi metar filma imao kroz šta da se odvrti.
Poštena oznaka, pravni tekstovi i indeks
Demo koji izgleda kao pravi sajt lako postane laž. Zato je oznaka vidljiva na svakoj strani, a ne sakrivena u podnožju: mala pločica sa natpisom DEMO stoji fiksirana u uglu ekrana, i na naslovnoj i na pravnim stranama, i ne pomera se pri skrolu.
Sajt je namerno van pretrage. U dokumentu stoji zabrana indeksiranja, a robots.txt zabranjuje obilazak celog sajta. Posledica je i to da na njemu nema strukturiranih podataka: schema koja izmišljenu organizaciju predstavlja kao stvarnu je tačno ono što ne treba raditi, pa je nema nijedne. Kod pravog klijenta bi to bio prvi sloj koji se dodaje, ovde je prvi koji se izostavlja.
Politika privatnosti i uslovi nisu prekopirani ni od koga. Pišu šta se stvarno dešava: da nema formi, da se ne prikupljaju lični podaci, da server vodi standardne zapise pristupa i koliko dugo ih drži, i da se fontovi povlače sa tuđeg servisa. Uslovi u prvoj rečenici kažu da server ne postoji i da dugmad za pridruživanje, prijavu i donacije ne pokreću nikakav proces.
Od sitnica koje se retko rade: na vrhu strane stoji preskočni link koji vodi pravo na poglavlje sa pridruživanjem, poglavlja su poređana u ispravnu hijerarhiju naslova, a video je izvučen iz reda za tastaturu i označen kao ukras, jer nema šta da se sa njim uradi tasterima. Adresa za povezivanje na server kopira se jednim klikom, sa kratkom potvrdom umesto tihe radnje. U podnožju stoji godina i autor, bez ijednog traga alata kojim je sajt pravljen.
Šta ovaj rad pokazuje
Za nekoga ko vodi roleplay zajednicu, poenta se najkraće kaže ovako: sajt koji izgleda kao trejler za server ne traži da posetilac ima jaku mašinu, a sadržaj u njemu je običan tekst koji se menja u jednom fajlu. Ime servera, broj slotova, pravila i koraci za prijavu su rečenice, ne slike — pa se menjaju za minut i ne moraju ponovo da se crtaju kad se nešto na serveru promeni.
Za bilo koga drugog, ovo je pokazna vežba za tehniku koja sa gejmingom nema nikakve veze. Isti motor može da vozi prezentaciju kuće, mobilnog bara ili proizvoda — svuda gde postoji jedan neprekidan pokret koji sam po sebi priča priču, film je jeftiniji i uverljiviji od 3D scene u pregledaču, a merljivo lakši za slabiji uređaj.
Ono što se sa ovog projekta prenelo dalje je metod, ne kod: film se pravi u segmentima i ulančava kroz poslednji kadar; režim se bira po sposobnosti uređaja, a ne po njegovoj vrsti; imena fajlova nose verziju, jer je dug keš inače zamka za onoga ko izmenu radi; poslednje poglavlje se hvata za dno trake; i strana mora da ostane čitljiva i kada se film uopšte ne prikaže.
Sajt je živ od jula 2026. na rp.svilenkovic.rs i stoji tamo kao demo — bez naručioca i bez servera iza sebe. Ako ga jednog dana dobije, sadržaj je već napisan, a strana ga čeka.
Sajt u slikama
Balkan RP
Sedam poglavlja preko jednog neprekidnog leta kroz grad — cela strana je film.
rp.svilenkovic.rsČesto postavljana pitanja
Da li Balkan RP stvarno postoji kao server?
Da li se ovakav sajt otvara na slabom telefonu?
Šta se vidi ako posetilac ima isključen JavaScript?
Može li se film kasnije zameniti bez prepravke sajta?
Zašto video, a ne 3D scena u pregledaču?
Da li ovakav sajt može da se nađe na pretrazi?
Treba vam ovakav sajt?
Recite mi čime se bavite i šta sajt treba da uradi za vas — dobijate fiksnu ponudu i rok, u pisanoj formi.