Sari la conținut
megapromoting
Hai să discutăm

Expertise · Websites

This site is our technical spec — including the measurements that don't flatter us.

We build server-rendered sites, with images in AVIF and WebP, security headers verified from outside, a sitemap generated from data, and an acceptance check run after every release. All of it can be inspected on the page you are reading.

Construit dejaNu putem cita un site de client fără acordul lui, dar nu avem nevoie: dovada e chiar pagina asta. Rulează Next.js 16.2.4 cu React 19.1.0, e servită prerandat din cache (`x-nextjs-prerender: 1`, `x-nextjs-cache: HIT`), poartă HSTS cu `preload`, `nosniff`, `SAMEORIGIN`, `Referrer-Policy` și o politică de conținut completă — verificate cu `curl -I` pe 06.09.2026. Harta de site conține 147 de adrese, toate generate din date, nu scrise de mână. A doua implementare, în același depozit: infrastructura formularului — jurnal append-only, sondă publică de sănătate, limitare de rată — și scriptul de acceptare rulat după publicare.

Un site de prezentare are un singur test onest: poți verifica din exterior ce spune firma despre el? De aceea pagina asta nu enumeră tehnologii, ci lucruri pe care le poți controla singur cu o comandă. Site-ul rulează Next.js 16.2.4 și React 19.1.0, iar paginile sunt prerandate la construcție și servite din cache — se vede în antetele răspunsului: `x-nextjs-prerender: 1`, `x-nextjs-cache: HIT`, `s-maxage=31536000`, cu o fereastră de 300 de secunde în care o pagină veche mai poate fi servită în timp ce se reîmprospătează.

Randarea pe server nu e o preferință de arhitect. Un vizitator cu conexiune slabă și un motor de căutare primesc același HTML complet, fără să aștepte JavaScript. Peste asta vine disciplina de resurse: imaginile ies în AVIF și WebP, cu cache de un an; fonturile sunt găzduite de noi, nu cerute de la un serviciu extern; opt biblioteci de interfață au importurile optimizate ca să nu tragă module întregi pentru o singură pictogramă.

Antetele de securitate sunt trimise din două locuri și verificate în răspunsul real, nu doar în configurație: transport securizat impus doi ani cu subdomenii și înscriere în lista de preîncărcare, interzicerea ghicirii tipului de fișier, restricția de încadrare în cadre străine, politica de referință, și o politică de permisiuni care închide camera și lasă microfonul doar pentru propria origine — pentru că demonstrațiile vocale au nevoie de el și, fără această excepție, browserul refuză tăcut.

Ultima parte e cea care ne diferențiază, și e neplăcută: publicăm și ce am măsurat prost la noi. Serverul nu oferă încă Brotli și nici HTTP/2. Catalogul de traduceri se transmite pe fiecare navigare și costă aproximativ 70 KB comprimat de fiecare dată. Un pachet de 443 KB conține patru cataloage de limbă, din care doar unul e rutabil. Fonturile aduc și subsetul chirilic, deși paginile verificate nu conțin niciun caracter chirilic. Cifrele astea sunt măsurate, scrise în depozit și în lista de reparații. Un furnizor care nu are astfel de cifre despre propriul site fie nu a măsurat, fie nu vrea să spună.

A single failed critical finding forces the "non-compliant" verdict and caps the score at 49, whatever the weighted formula would say. The reason is simple: trackers firing before consent, or a reject button that stops nothing, affect every visitor at this moment. An immaculate privacy policy is not allowed to lift the average above that.

The work, piece by piece

Randare pe server, servită din cache

Paginile sunt prerandate la construcție și livrate ca HTML complet, nu construite în browser. În răspunsul real apar `x-nextjs-prerender: 1` și `x-nextjs-cache: HIT`, cu `cache-control: s-maxage=31536000` și o fereastră de 300 de secunde în care versiunea veche mai poate fi servită în timp ce se reîmprospătează. Efectul practic: un vizitator cu conexiune slabă și un crawler primesc același conținut, în aceeași cerere.

Imagini și fonturi cu buget, nu cu noroc

Formatele configurate sunt AVIF și WebP, cu durată minimă de cache de 31.536.000 de secunde — un an — și antet `immutable` pe fișierele statice, imagini și fonturi. Fonturile sunt găzduite de noi la construcție, nu cerute de la un serviciu extern la fiecare vizită, și sunt afișate cu `swap`, ca textul să apară înainte de descărcarea fontului. Există și un script de compresie în lot, cu calitate 80 pentru WebP și 75 pentru AVIF, ca sursa să nu depindă de ce a exportat cineva din editorul grafic.

Antete de securitate trimise din două locuri și verificate în răspuns

Din aplicație: transport securizat impus 63.072.000 de secunde cu subdomenii și înscriere în lista de preîncărcare, `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy: strict-origin-when-cross-origin` și o politică de permisiuni care închide camera, lasă microfonul doar pentru propria origine și dezactivează gruparea pe interese. De la serverul web, separat: o politică de securitate a conținutului completă, cu lista explicită de origini permise. La predare se scrie explicit că sunt două locuri — altfel următorul care schimbă ceva îl caută pe cel greșit.

Harta de site generată din date, nu scrisă de mână

Harta de site se construiește din cinci surse — 13 adrese fixe, articolele, 19 produse, 12 servicii și 100 de combinații serviciu × domeniu — și trece printr-o deduplicare finală. Rezultatul: 147 de adrese, numărate atât în cod cât și în fișierul servit de producție. O pagină nouă intră automat; una ștearsă dispare. Nimeni nu întreține o listă paralelă care se desincronizează în trei săptămâni.

Adresele vechi nu mor: 43 de redirecționări permanente

O curățenie de structură lasă în urmă adrese pe care cineva le are salvate sau le-a publicat. În configurație sunt 43 de redirecționări permanente — 9 ghiduri către blog, 20 de articole orfane, 6 studii de caz remapate și 8 pagini individuale. Există și 11 pagini care redirecționează din interiorul aplicației; sunt corecte funcțional, dar mai scumpe decât o regulă de configurație, și sunt trecute ca atare în lista de reparații.

Formularul e infrastructură, nu decor

Solicitarea se scrie într-un jurnal append-only înainte de a se încerca livrarea, cu a doua linie pentru rezultat; există o sondă publică de sănătate care spune dacă un lead poate ajunge la un om chiar acum; iar cererile către interfețe sunt limitate la 10 pe minut, cu cheia luată din ultimul hop al antetului de adrese redirecționate, nu din primul — primul e trimis de client. Motivele sunt scrise în cod, nu în documentație separată.

Verificare de acceptare după fiecare publicare

Un script deschide fiecare pagină de produs, în grupuri de câte trei, și cade dacă lipsește codul 200, ancora de întrebări, ancora de exemplu sau adresa canonică. Verifică apoi harta de site — să conțină fiecare produs și să nu conțină variante de limbă care nu se pot deschide — și `robots.txt`, să nu blocheze resursele necesare randării. Fiecare verificare corespunde unui lucru care s-a stricat deja o dată.

Adresă canonică rezolvată o dată, pentru tot site-ul

Adresa canonică e declarată relativ, într-un singur loc din aranjamentul de bază, și se rezolvă pentru fiecare rută în parte. Aceeași soluție pentru adresa de partajare socială, care înainte declara pagina de start pe majoritatea paginilor. E o linie de cod care înlocuiește o convenție pe care fiecare pagină nouă ar fi trebuit să și-o amintească singură — și pe care, inevitabil, nu și-o amintește.

Ce nu merge e scris în depozit, lângă cod

Depozitul conține un fișier de defecte cunoscute care explică, de exemplu, de ce variantele de limbă din adresă nu comută limba, de ce soluția evidentă face lucrurile mai rele — la randarea pe server nu există nici stocare locală, nici browser, deci detectorul cade pe engleză și toate paginile ies în engleză — și care sunt cele două soluții reale. Preferăm ca un cumpărător tehnic să găsească limita scrisă de noi, nu descoperită de el.

What it looks like

The path, step by step.

01

Inventarul adreselor și ce se întâmplă cu cele vechi

Prima livrare e lista adreselor existente și decizia pentru fiecare: rămâne, se redirecționează sau dispare. La site-ul acesta au rezultat 43 de redirecționări permanente. E munca pe care o sare toată lumea și care produce, câteva luni mai târziu, pagini de eroare în rezultatele căutării.

02

Structura de conținut și sursele din care se generează

Paginile de produs și de serviciu se construiesc din date, nu din fișiere separate. De aici vin harta de site generată automat, adresele canonice consistente și posibilitatea de a verifica programatic că fiecare pagină are ce trebuie. Livrăm structura de date, nu doar paginile randate din ea.

03

Construcția, cu bugete stabilite înainte de conținut

Stabilim de la început ce format au imaginile, ce se cachează și cât, ce se randează pe server și ce rămâne interactiv în browser. Conținutul se așază apoi în bugetul ăsta. Ordinea inversă produce site-uri care arată bine la lansare și se îngreunează cu fiecare pagină adăugată.

04

Publicarea cu poartă și verificare de acceptare

Publicarea verifică memoria liberă a serverului, rulează auditul de securitate al dependențelor, construiește din curat și confirmă că procesul e pornit înainte să raporteze succes. Imediat după, scriptul de acceptare deschide paginile și verifică ancorele, adresele canonice, harta de site și `robots.txt`. Ambele se predau, nu se păstrează la noi.

05

Predarea, cu lista de lipsuri și de măsurători

Predăm codul, procedura de publicare, procedura de revenire, adresele de sănătate — și lista scrisă a ce nu e acoperit, cu cifre. Pentru site-ul acesta lista include lipsa Brotli și a HTTP/2 pe server, costul catalogului de traduceri pe fiecare navigare și subsetul de fonturi neutilizat. Preferăm ca lista să vină de la noi.

Patru straturi verificabile din exterior1HTML prerandat servit din cache2imagini AVIF/WebP și fonturi găzduite local3antete de securitate din aplicație și din serverul web4harta de site și adresele canonice generate din date
Patru straturi verificabile din exterior

Datele

What we touch, where it lives, and how long it stays

A case

Datele din formularul de contact
Nume, adresă de e-mail, telefon, companie, serviciu ales, mesaj, pagina de proveniență și prefixul de rețea al vizitatorului. Se scriu într-un jurnal pe serverul propriu, cu drepturi `0700` pe director și `0600` pe fișiere, în afara directorului de versiune. Termen: 24 de luni, aplicat de cod la fiecare scriere, nu de un planificator care poate fi uitat.
Adresa IP, tăiată înainte de a fi scrisă
Se păstrează doar prefixul de rețea — `/24` la IPv4, `/48` la IPv6 — și se citește ultimul hop din antet, pentru că primul e trimis de client și nu dovedește nimic. Aceeași funcție e folosită și de limitarea de rată, deci nu există un al doilea loc unde adresa completă să ajungă din greșeală.
Statistici de trafic
Măsurarea trece prin instrumentul de analiză configurat și se activează după consimțământ. Cookie-urile reale au fost verificate empiric pe site-ul live, înainte și după acceptare, iar politica de cookie-uri a fost rescrisă după acea verificare — nu invers. Politica anterioară enumera cookie-uri care nu existau.
Registrul de prelucrări, versionat lângă cod
Fiecare tip de date atins de site are o intrare cu scop, temei, categorii și termen, într-un document ținut în același depozit. Când codul schimbă un termen, documentul se schimbă în același comit. Ce nu e stabilit — de exemplu retenția reală din contul de analiză — e marcat explicit ca element de clarificat, nu declarat ca fapt.
Ce nu iese din server
Jetoanele de notificare, cheile de furnizor și identificatorii de canal. Sonda de sănătate întoarce exclusiv valori logice, tocmai ca să poată fi interogată de un serviciu extern fără să divulge nimic despre configurație.

Our own site, 147 addresses in the sitemap, with the text recently rewritten question by question. Every page returned 200 and looked right. The starting question was not "what else do we add", but "of what is on the page, what reaches a machine".

What auditing your own site shows when you publish all of it

Situația

După o restructurare, site-ul propriu părea în regulă: toate paginile răspundeau 200, tabloul de bord era verde. Ne-am pus întrebarea pe care o punem la clienți: ce spune o măsurătoare făcută din exterior, pe toate adresele deodată, nu pe pagina de start?

Ce am construit

Am parcurs cu cereri directe fiecare adresă cunoscută — 249 de adrese, 23 de coloane per adresă, fără urmărirea redirecționărilor, cu cel mult șase cereri în paralel — și am pus rezultatul într-un fișier tabelar versionat. Peste el am rulat verificări separate: comprimarea reală a HTML-ului, ce se transmite pe fiecare navigare, ce conțin pachetele de JavaScript, ce fonturi se descarcă, ce antete de cache și de transport oferă serverul. Fiecare cifră a fost verificată în răspunsul real, nu dedusă din configurație.

Ce a ieșit

244 de adrese răspund 200 și 5 redirecționează. 131 de pagini nu aveau adresă canonică, iar 219 din 244 declarau pagina de start ca adresă de partajare — ambele reparate acum cu câte o linie în aranjamentul de bază, care se aplică fiecărei rute. Serverul nu oferă Brotli și nici HTTP/2. Catalogul de traduceri, 2.268 de chei, se transmite pe fiecare navigare și costă aproximativ 70 KB comprimat de fiecare dată. Un pachet de 443 KB conține patru cataloage de limbă, din care unul singur e rutabil. Fonturile aduc și subsetul chirilic, deși paginile verificate nu conțin niciun caracter chirilic. Toate cifrele, cu comenzile care le reproduc, sunt scrise în depozit.

Ce nu spune cazul

Sunt măsurători de laborator, făcute din exterior, cu cereri directe. Nu sunt date de teren de la vizitatori reali și nu le prezentăm ca atare: metricile de încărcare percepută nu au putut fi citite în instrumentul folosit și sunt marcate explicit ca nemăsurate. Nu am rulat construcția aplicației în timpul auditului, pentru că mai mulți oameni lucrau pe același checkout.

Întrebări

What people ask us before they call

Cu ce construiți, concret?

Next.js 16.2.4 cu React 19.1.0 și TypeScript, cu Tailwind pentru stiluri și componente de interfață accesibile pe bază de primitive Radix. Paginile sunt prerandate la construcție și servite din cache — se verifică din exterior: antetele răspunsului conțin `x-nextjs-prerender: 1` și `x-nextjs-cache: HIT`. Nu e o listă de tehnologii pe care le-am citit; e stiva pe care rulează pagina pe care o citești acum.

Cum verific singur ce spuneți despre securitate?

Cu o singură comandă: `curl -I https://www.megapromoting.com/servicii`. Vei vedea `strict-transport-security: max-age=63072000; includeSubDomains; preload`, `x-content-type-options: nosniff`, `x-frame-options: SAMEORIGIN`, `referrer-policy: strict-origin-when-cross-origin`, o politică de permisiuni care închide camera și lasă microfonul doar pentru propria origine, plus o politică de securitate a conținutului cu lista explicită de origini. Primele cinci vin din configurația aplicației; ultima e trimisă de serverul web — două locuri diferite, și scriem asta la predare.

De unde știți că nu ați stricat ceva la ultima publicare?

Dintr-un script de acceptare rulat după publicare. Deschide fiecare pagină de produs și cade dacă lipsește codul 200, ancora de întrebări, ancora de exemplu sau adresa canonică; verifică apoi că harta de site conține fiecare produs și nu conține variante de limbă care nu se deschid, și că `robots.txt` nu blochează resursele de randare. Fiecare verificare din listă corespunde unui lucru care s-a stricat deja. Scriptul se predă odată cu proiectul — îl poți rula și tu.

Site-ul vostru e rapid?

Depinde ce măsori, și avem cifre în ambele sensuri. Bune: paginile sunt prerandate și servite din cache, imaginile ies în AVIF și WebP cu cache de un an, fonturile sunt găzduite local. Proaste, măsurate pe propriul site: serverul nu oferă Brotli și nici HTTP/2 — o cerere cu `Accept-Encoding: br` primește răspuns necomprimat; catalogul de traduceri se transmite pe fiecare navigare și costă aproximativ 70 KB comprimat de fiecare dată; un pachet de 443 KB conține patru cataloage de limbă din care doar unul e rutabil. Nu îți dau un scor de laborator; îți dau octeții măsurați și lista de reparații care iese din ei.

Cine întreține harta de site?

Nimeni, și ăsta e răspunsul corect. Se generează din cinci surse de date — adrese fixe, articole, produse, servicii și combinațiile serviciu × domeniu — și trece printr-o deduplicare finală. Ies 147 de adrese, aceeași cifră în cod și în fișierul servit de producție. O pagină nouă intră automat. Ce lipsește azi, ca să fie spus: intrările nu poartă dată de ultimă modificare, iar 93 de adrese care se pot indexa nu sunt încă în hartă. Sunt în lista de reparații, nu ascunse.

Faceți site-uri multilingve?

Aici trebuie să fiu precis, pentru că e limita cea mai clară a acestui site. Comutarea limbii din adresă nu funcționează: configurația fixează româna, deci detectorul nu citește niciodată parametrul. Am scris în depozit de ce soluția evidentă e mai rea — la randarea pe server nu există nici stocare locală, nici browser, deci detectorul cade pe engleză și toate paginile ies în engleză — și care sunt cele două soluții reale: rute pe cale, cu segment de limbă, sau rezolvarea limbii pe server în fiecare pagină. Prima e recomandată. Pentru un proiect nou pornim direct cu rute pe cale; pentru unul existent, e o lucrare, nu o setare.

Ce se întâmplă cu adresele vechi când refaceți un site?

Se inventariază și primesc fiecare o decizie: rămâne, se redirecționează permanent sau dispare. La curățenia acestui site au rezultat 43 de redirecționări în configurație. Mai există 11 pagini care redirecționează din interiorul aplicației — funcționează, dar construiesc pagina înainte de a trimite răspunsul de redirecționare, ceea ce e risipă; sunt în lista de mutat în configurație. Îți spun asta ca să știi ce fel de listă primești la predare.

Cum știu că formularul chiar livrează?

Îl întrebi pe el: `GET /api/health/contact` răspunde 200 dacă un lead poate ajunge la un om acum și 503 dacă nu, verificând separat că jetonul canalului de notificare e valid și că jurnalul de cereri se poate scrie. Răspunsul conține numai valori logice, niciodată jetonul. Există pentru că exact aici s-a rupt lucrul o dată: jetonul revocat, ruta întorcând 500, cereri pierdute fără urmă. Acum solicitarea se scrie în jurnal înainte de a se încerca livrarea.

Ce nu faceți?

Nu promitem poziții în căutare, procente de conversie sau scoruri de performanță pe care nu le-am măsurat pe proiectul tău. Nu livrăm un site fără listă de adrese vechi și fără procedură de revenire. Nu ne asumăm platforme terțe la care nu avem acces. Și nu prezentăm ca gata ceva care are o limită cunoscută — dacă am o limită, o găsești scrisă în depozit înainte să o găsești tu în producție.

Pe ce se sprijină afirmațiile de mai sus (15 surse)
  1. Producția servește pagini prerandate din cache: `x-nextjs-prerender: 1`, `x-nextjs-cache: HIT`, `cache-control: s-maxage=31536000`, `x-nextjs-stale-time: 300`https://www.megapromoting.com/servicii · 2026-09-06
  2. Antete de securitate în răspunsul real: HSTS `max-age=63072000; includeSubDomains; preload`, `nosniff`, `SAMEORIGIN`, `strict-origin-when-cross-origin`, politică de permisiuni cu `microphone=(self)`; plus o politică de securitate a conținutului completă servită de nginx și ABSENTĂ din `next.config.ts`https://www.megapromoting.com/servicii · 2026-09-06

13 dintre ele sunt cod și fișiere din depozitele noastre. Nu le publicăm numele și nici linia: împreună, pe o singură pagină, ar descrie prea exact cum sunt construite sisteme care nu sunt doar ale noastre. Le parcurgem cu tine, în depozit, la cerere — verificarea rămâne posibilă, doar că se face într-o discuție.

What would you want to work better?

Tell us about your process. Together we decide what is worth building, what we can connect, and how we check the result.

Hai să discutăm