PageSourceSearch

https://kabinata.com/

html kabinata.com collected 2026-10-02 06:59:07 UTC 46,116 bytes, 361 lines download raw bytes

1<!doctype html>
2<!-- lang="bg-BG" (not bare "bg") so Google's "International targeting"
3     report and Bing's geo-IP logic both recognize the locale as Bulgaria-
4     Bulgarian specifically. LanguageProvider overrides this at runtime
5     when the visitor switches lang. -->
6<html lang="bg-BG">
7  <head>
8    <meta charset="UTF-8" />
9    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
10
11    <!-- Personal voucher link (…/vaucheri?utm_…#ref=TOKEN, spec of 2026-09-29) —
12         MUST run first. The token is in the fragment, so it never reaches a
13         server, a log or a Referer; it is read here, before any tag or the app,
14         and the fragment is removed at once (the utm_* stay: they name the
15         channel, not the person). GA4, Meta and the Employment Agency never see
16         it. It stays in this page's memory only (no cookie, no storage) for one
17         thing: telling track-voucher-click that the apply button was pressed.
18         Also kept in memory only: where the visit came from (utm_* of the
19         landing address, the referring host) — an inquiry sent in the same
20         visit carries it as its source. -->
21    
21<script>
22      (function () {
23        try {
24          var u = new URL(location.href), q = u.searchParams, landing = { path: u.pathname };
25          ["utm_source", "utm_medium", "utm_campaign"].forEach(function (n) { var v = q.get(n); if (v) landing[n] = v.slice(0, 100); });
26          try { var r = document.referrer && new URL(document.referrer); if (r && r.host !== location.host) landing.referrer_host = r.host; } catch (e) {}
27          window.__kabLanding = landing;
28          var m = /^#ref=([^&]*)/.exec(u.hash), clean = false;
29          if (m) { if (/^[A-Za-z0-9_-]{43}$/.test(m[1])) window.__kabVoucherToken = m[1]; clean = true; }
30          if (q.has("k")) { q.delete("k"); clean = true; } // the first scheme's query token — never kept
31          if (clean) history.replaceState(history.state, "", u.pathname + (q.toString() ? "?" + q.toString() : ""));
32        } catch (e) {}
33      })();
34    </script>
34
35
36    <!-- Google Consent Mode v2 — MUST run before the GTM snippet below.
37         Defaults are all DENIED; the CookieConsent banner (src/lib/consent.ts
38         writeConsent) pushes gtag('consent','update', ...) the moment the
39         visitor decides, and again on every later change/withdrawal:
40           analytics accepted  -> analytics_storage: granted
41           marketing accepted  -> ad_storage + ad_user_data + ad_personalization: granted
42         For returning visitors the stored decision is replayed here, before
43         GTM boots, so tags see the correct state from the first event. -->
44    
44<script>
45      window.dataLayer = window.dataLayer || [];
46      function gtag(){dataLayer.push(arguments);}
47      gtag('consent', 'default', {
48        analytics_storage: 'denied',
49        ad_storage: 'denied',
50        ad_user_data: 'denied',
51        ad_personalization: 'denied'
52      });
53      try {
54        var c = JSON.parse(localStorage.getItem('kabinata-consent-v1') || 'null');
55        if (c && c.decidedAt) {
56          gtag('consent', 'update', {
57            analytics_storage: c.analytics === true ? 'granted' : 'denied',
58            ad_storage: c.marketing === true ? 'granted' : 'denied',
59            ad_user_data: c.marketing === true ? 'granted' : 'denied',
60            ad_personalization: c.marketing === true ? 'granted' : 'denied'
61          });
62        }
63      } catch (e) {}
64    </script>
64
65    <!-- Google Tag Manager — GTM-KSD3NZC5. Loads on every visit, on every
66         page, with no consent gate — but DEFERRED to first user interaction
67         (or a 3.5s timeout, whichever comes first). Lighthouse mobile
68         2026-08-04 measured gtm.js at 1,949ms of main-thread time, single
69         biggest TBT/LCP offender; deferring it moves that work after first
70         paint. Events fired before GTM boots are NOT lost — dataLayer is a
71         plain array (created by the Consent Mode block above) and GTM
72         replays it on load. What each tag may do is governed by Consent
73         Mode + the tag configuration the owner manages in the GTM UI
74         (Pixel/Clarity/GA4 live THERE now — never add them back here). -->
75    
75<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
76    new Date().getTime(),event:'gtm.js'});
77    var loaded=false;function loadGtm(){if(loaded)return;loaded=true;
78    var f=d.getElementsByTagName(s)[0],j=d.createElement(s),
79    dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
80    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
81    evs.forEach(function(e){w.removeEventListener(e,loadGtm,opts)});}
82    var evs=['pointerdown','keydown','touchstart','scroll'],
83    opts={once:true,passive:true,capture:true};
84    evs.forEach(function(e){w.addEventListener(e,loadGtm,opts)});
85    setTimeout(loadGtm,3500);
86    })(window,document,'script','dataLayer','GTM-KSD3NZC5');</script>
86
87    <!-- End Google Tag Manager -->
88
89    <!-- COUPLING: this title + the meta/og/twitter descriptions below are
90         exact sub_filter anchor strings in deploy/nginx-kabinata-com.conf.
91         If you edit them here, update the sub_filter patterns in the same
92         commit or fallback pages lose their per-route meta rewriting. -->
93    <title>Кабината | Kabinata.com — езикови курсове от 2005 г.</title>
94    <meta name="description" content="Онлайн езикови курсове по английски, немски, френски, испански и италиански. Реални учители и AI разговорен партньор 24/7. Ваучери от Агенция по заетостта." />
95    <meta name="author" content="Kabinata" />
96
97    <!-- PWA: installable web app (no service worker / no offline) -->
98    <link rel="manifest" href="/manifest.webmanifest" />
99    <meta name="theme-color" content="#d4a017" />
100    <!-- Favicon set — Kabinata bird mark centered on amber-gradient rounded
101         square. Multi-resolution .ico covers legacy browsers (16/32/48); the
102         individual PNGs power high-DPR Chrome, Android home-screen + iOS
103         add-to-home (apple-touch-icon below). -->
104    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
105    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
106    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
107    <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
108    <link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png" />
109
110    <!-- iOS Add to Home Screen support -->
111    <link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png" />
112    <meta name="apple-mobile-web-app-capable" content="yes" />
113    <meta name="apple-mobile-web-app-status-bar-style" content="default" />
114    <meta name="apple-mobile-web-app-title" content="Kabinata.com" />
115    <meta name="mobile-web-app-capable" content="yes" />
116
117    <!-- Self-hosted Inter + Manrope fonts — eliminates 750ms render-blocking
118         Google Fonts CSS round-trip and 50-100ms TLS handshake to gstatic.com.
119         All 13 woff2 files (latin + latin-ext + cyrillic + cyrillic-ext +
120         greek + vietnamese subsets) total ~320KB but each is unicode-range
121         scoped so browsers only fetch what they need (~30-40KB typical).
122         font-display: swap preserved in fonts.css. Cached 1 year via
123         /assets/* nginx rules (CF cache HIT on repeat visits). -->
124    <link rel="preload" as="font" type="font/woff2"
125      href="/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2" crossorigin />
126    <!-- Also preloaded (2026-09-29): the Cyrillic Inter (Bulgarian body text)
127         and both Manrope subsets the headings use („Кабината | Kabinata.com“
128         mixes Cyrillic and Latin). Once route-seo.mjs left the first load, the
129         app painted before Manrope arrived and the headings jumped when it did
130         (Lighthouse mobile CLS 0.02 → 0.25 on the homepage). -->
131    <link rel="preload" as="font" type="font/woff2"
132      href="/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2" crossorigin />
133    <link rel="preload" as="font" type="font/woff2"
134      href="/fonts/xn7gYHE41ni1AdIRggOxSuXd.woff2" crossorigin />
135    <link rel="preload" as="font" type="font/woff2"
136      href="/fonts/xn7gYHE41ni1AdIRggexSg.woff2" crossorigin />
137    <style>@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1D
137BF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Inter';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Inter';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Inter';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
137unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Inter';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Manrope';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Manrope';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Manrope';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Manrope';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Manrope';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Manrope';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Manrope';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Manrope';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Manrope';font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}</style>
138
139    <!-- Preconnect to Supabase + CF — Vite-bundled chunks fetch from
140         jqsvsxtorstrwwlrwpfj.supabase.co for teachers/courses_meta/blog/etc.
141         Cuts ~80ms off initial DB calls on cold visits. Must match
142         VITE_SUPABASE_URL in .env (otherwise preconnect to wrong host
143         wastes the TLS handshake). Project consolidated 2026-05-24 —
144         see data/lesson-backups/jqsvs-lessons-pre-migrate-*.json for
145         the pre-migration baseline. -->
146    <link rel="preconnect" href="https://jqsvsxtorstrwwlrwpfj.supabase.co" />
147    <!-- Preconnect to Google Tag Manager CDN — gtm.js loads unconditionally
148         from the <head> snippet above. (facebook.net / clarity.ms preconnects
149         removed with their inline snippets — those platforms now load via GTM
150         only if the owner configures them there.) -->
151    <link rel="preconnect" href="https://www.googletagmanager.com" />
152
153    <!-- LCP hero image preload — uses imagesrcset/imagesizes so the browser
154         picks the appropriate responsive variant (~30KB WebP/AVIF on mobile
155         vs 540KB original PNG). PNG remains as ultimate fallback in
156         <picture>. media-gated to >=768px: on mobile both homepage
157         illustrations are display:none (owner decision 2026-08-04 — text
158         becomes the LCP), so phones must not spend bandwidth on them. -->
159    <link
160      rel="preload"
161      as="image"
162      media="(min-width: 768px)"
163      href="/hero-headset-480w.webp"
164      imagesrcset="/hero-headset-320w.webp 320w, /hero-headset-480w.webp 480w, /hero-headset-720w.webp 720w, /hero-headset-960w.webp 960w"
165      imagesizes="(min-width: 1024px) 360px, 320px"
166      fetchpriority="high"
167    />
168
169    <!-- VouchersStrip illustration — desktop-only (same owner decision).
170         The strip renders client-side only (lang gate), so without a preload
171         the image is discovered post-hydration (~600ms+ later). AVIF-only +
172         type: non-AVIF browsers skip the preload entirely and fall back to
173         the <picture> webp sources at render time. -->
174    <link
175      rel="preload"
176      as="image"
177      type="image/avif"
178      media="(min-width: 768px)"
179      href="/hero-voucher-480w.avif"
180      imagesrcset="/hero-voucher-320w.avif 320w, /hero-voucher-480w.avif 480w, /hero-voucher-720w.avif 720w, /hero-voucher-960w.avif 960w"
181      imagesizes="(min-width: 1024px) 300px, 280px"
182      fetchpriority="high"
183    />
184
185    <!-- Canonical — nginx sub_filter rewrites this on every response to
186         match the requested path (so each page has a unique canonical
187         + og:url + twitter:url even for non-JS scrapers). See
188         deploy/nginx-kabinata-com.conf. -->
189    <link rel="canonical" href="https://kabinata.com/" />
190
191    <!-- Crawler hints -->
192    <!-- Robots directives: index+follow always, allow large image previews
193         in SERP, allow unlimited snippet length (matches competitive-set
194         parity), allow long video preview (helps when blog posts embed
195         YouTube). -->
196    <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
197    <meta name="googlebot" content="index, follow" />
198    <meta name="referrer" content="strict-origin-when-cross-origin" />
199
200    <!-- Open Graph (Facebook, LinkedIn, Slack, Discord, etc.) -->
201    <meta property="og:title" content="Кабината | Kabinata.com — езикови курсове от 2005 г." />
202    <meta property="og:description" content="Онлайн езикови курсове по английски, немски, френски, испански и италиански. Реални учители и AI разговорен партньор 24/7. Ваучери от Агенция по заетостта." />
203    <meta property="og:type" content="website" />
204    <meta property="og:url" content="https://kabinata.com/" />
205    <meta property="og:site_name" content="Кабината | Kabinata.com — езикови курсове" />
206    <meta property="og:locale" content="bg_BG" />
207    <meta property="og:image" content="https://kabinata.com/og/home-v4.jpg" />
208    <meta property="og:image:type" content="image/jpeg" />
209    <meta property="og:image:secure_url" content="https://kabinata.com/og/home-v4.jpg" />
210    <meta property="og:image:width" content="1200" />
211    <meta property="og:image:height" content="630" />
212    <meta property="og:image:alt" content="Кабината — онлайн езикови курсове с преподавател и AI практика" />
213
214    <!-- Twitter / X cards -->
215    <meta name="twitter:card" content="summary_large_image" />
216    <meta name="twitter:title" content="Кабината | Kabinata.com — езикови курсове от 2005 г." />
217    <meta name="twitter:description" content="Онлайн езикови курсове по английски, немски, френски, испански и италиански. Реални учители и AI разговорен партньор 24/7. Ваучери от Агенция по заетостта." />
218    <meta name="twitter:image" content="https://kabinata.com/og/home-v4.jpg" />
219    <meta name="twitter:url" content="https://kabinata.com/" />
220
221    <!-- Schema.org Organization (basic — full version injected via JSON-LD in app) -->
222    <meta itemprop="name" content="Кабината" />
223    <meta itemprop="description" content="Онлайн езикови курсове с преподавател и AI практика." />
224
225    <!-- Facebook page link (helps FB associate shared content with this page) -->
226    <meta property="article:publisher" content="https://www.facebook.com/kabinataonlinecourse/" />
227    <meta property="og:see_also" content="https://www.facebook.com/kabinataonlinecourse/" />
228    <!-- FB Page ID — lets the Kabinata FB page collect insights for shares
229         of this URL. ID from facebook.com/58553094413 -->
230    <meta property="fb:pages" content="58553094413" />
231    <!-- FB App ID — registered at developers.facebook.com/apps as
232         "Kabinata Website". Clears the FB Sharing Debugger warning and
233         enables Insights API for shares of this domain. -->
234    <meta property="fb:app_id" content="2917889525067624" />
235
236    <!-- Google Search Console verification.
237         To set up: search.google.com/search-console → Add property →
238         Domain (kabinata.com) → Pick HTML meta tag → copy the content
239         value here. Or use the DNS TXT record method (preferred for
240         domain-wide ownership, also covers all subdomains).
241         When set, GSC will auto-detect the sitemap below. -->
242    <!-- <meta name="google-site-verification" content="REPLACE_WITH_GSC_TOKEN" /> -->
243
244    <!-- Facebook Domain Verification — pairs kabinata.com with Pixel
245         498294877011545 ("act_38184417_pixel") so event matching quality
246         is high + Aggregated Event Measurement is active. Token issued
247         via business.facebook.com → Owned Domains → kabinata.com. -->
248    <meta name="facebook-domain-verification" content="ogccbt4szibbmdm013jviqb7tgr8ba" />
249
250    <!-- Meta Pixel + Microsoft Clarity used to be inlined here. Removed
251         2026-07-27 on the owner's instruction: ALL analytics/ad platforms are
252         now added and managed exclusively through Google Tag Manager
253         (GTM-KSD3NZC5, loaded above), so a direct snippet here would fire
254         them twice. Do not re-add tracking scripts to this file. -->
255    
255<script type="module" crossorigin src="/assets/index-oZfH1_pg.js"></script>
255
256    <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-QTnfLwEv.js">
257    <link rel="modulepreload" crossorigin href="/assets/icons-vendor-CDHov_v3.js">
258    <link rel="modulepreload" crossorigin href="/assets/react-vendor-HM2djXMt.js">
259    <link rel="modulepreload" crossorigin href="/assets/query-vendor-DH0XvFSR.js">
260    <link rel="modulepreload" crossorigin href="/assets/toast-vendor-DO-reOIq.js">
261    <link rel="modulepreload" crossorigin href="/assets/dist-e9o-suPD.js">
262    <link rel="modulepreload" crossorigin href="/assets/utils-D5d6Eg6K.js">
263    <link rel="modulepreload" crossorigin href="/assets/utils-DtRepgRX.js">
264    <link rel="modulepreload" crossorigin href="/assets/button-KArHeGLr.js">
265    <link rel="modulepreload" crossorigin href="/assets/dist-Y3F3P-Jw.js">
266    <link rel="modulepreload" crossorigin href="/assets/route-seo-core-0ijAF5V1.js">
267    <link rel="modulepreload" crossorigin href="/assets/text-vendor-Cj2bU70H.js">
268    <style>:root{--background:0 0% 100%;--foreground:222 25% 14%;--primary:40 82% 58%;--primary-foreground:222 40% 10%;--border:215 20% 90%;--radius:1rem}
269*,::before,::after{box-sizing:border-box;border:0 solid hsl(var(--border))}
270html{line-height:1.5;-webkit-text-size-adjust:100%;scroll-behavior:smooth}
271body{margin:0;background:hsl(var(--background));color:hsl(var(--foreground));font-family:'Inter',system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased}
272h1,h2,h3,h4,h5,h6{font-family:'Manrope','Inter',system-ui,sans-serif;font-weight:700;letter-spacing:-.02em;margin:0}
273img,svg,video,canvas{display:block;max-width:100%;height:auto}
274#root{min-height:100vh}
275[data-prerender],[data-prerender] *{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Arial,sans-serif}
276[data-prerender] h2{font-size:1.5rem;line-height:1.3;font-weight:700;margin:2rem 0 .75rem}
277[data-prerender] h3{font-size:1.2rem;line-height:1.35;font-weight:700;margin:1.5rem 0 .5rem}
278[data-prerender] p{margin:0 0 1rem}
279[data-prerender] ul,[data-prerender] ol{margin:0 0 1rem;padding-left:1.5rem}
280[data-prerender] ul{list-style:disc}
281[data-prerender] ol{list-style:decimal}
282[data-prerender] li{margin:.25rem 0}
283[data-prerender] a{color:#b45309;text-decoration:underline}</style><link rel="preload" href="/assets/index-DQAzFidp.css" as="style" crossorigin><link rel="stylesheet" crossorigin href="/assets/index-DQAzFidp.css" media="print" onload="this.media='all';this.onload=null"><noscript><link rel="stylesheet" crossorigin href="/assets/index-DQAzFidp.css"></noscript>
284      <!-- KABINATA_PRERENDER_BEGIN -->
285    <link rel="alternate" hreflang="bg" href="https://kabinata.com/" />
286    <link rel="alternate" hreflang="en" href="https://kabinata.com/en" />
287    <link rel="alternate" hreflang="de" href="https://kabinata.com/de" />
288    <link rel="alternate" hreflang="es" href="https://kabinata.com/es" />
289    <link rel="alternate" hreflang="x-default" href="https://kabinata.com/" />
290    
290<script type="application/ld+json" id="jsonld-prerender-0">{"@context":"https://schema.org","@type":["EducationalOrganization","LocalBusiness"],"@id":"https://kabinata.com#org","name":"Кабината","legalName":"Кабината БГ ООД","alternateName":["Кабината | Kabinata.com — езикови курсове","Kabinata","Kabinata.com","Kabinata Online Courses","Кабината Онлайн Курсове"],"url":"https://kabinata.com","logo":{"@type":"ImageObject","@id":"https://kabinata.com#logo","url":"https://kabinata.com/kabinata-logo.png","caption":"Кабината"},"image":"https://kabinata.com/og-image.png","foundingDate":"2005","description":"Кабината е онлайн езиков център с над 20 години опит — езикови курсове по английски, немски, френски, испански и италиански. Реални учители, групови и индивидуални уроци, AI разговорен партньор 24/7.","email":"[email protected]","telephone":"+359 878 755 009","address":{"@type":"PostalAddress","streetAddress":"ул. Минзухар 14","addressLocality":"Лозенец","addressRegion":"София","postalCode":"1421","addressCountry":"BG"},"sameAs":["https://www.facebook.com/kabinataonlinecourse/","https://www.youtube.com/@KabinataBG","https://kabinata.ai/","https://www.jobs.bg/company/kabinatabg","https://www.google.com/maps?cid=12401171983978362857"],"areaServed":[{"@type":"Country","name":"Bulgaria"},{"@type":"Continent","name":"Europe"},{"@type":"Place","name":"Worldwide (online)"}]}</script>
290
291    
291<script type="application/ld+json" id="jsonld-prerender-1">{"@context":"https://schema.org","@type":"WebSite","@id":"https://kabinata.com#website","name":"Кабината | Kabinata.com — езикови курсове","alternateName":["Кабината","Kabinata","Kabinata.com"],"url":"https://kabinata.com","publisher":{"@type":"EducationalOrganization","@id":"https://kabinata.com#org"},"inLanguage":"bg","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://kabinata.com/blog?q={search_term_string}"},"query-input":"required name=search_term_string"}}</script>
291
292    
292<script type="application/ld+json" id="jsonld-prerender-2">{"@context":"https://schema.org","@type":"WebPage","@id":"https://kabinata.com/#webpage","url":"https://kabinata.com/","name":"Кабината | Kabinata.com — езикови курсове от 2005 г.","description":"Онлайн езикови курсове по английски, немски, френски, испански и италиански. Реални учители и AI разговорен партньор 24/7. Ваучери от Агенция по заетостта.","isPartOf":{"@type":"WebSite","@id":"https://kabinata.com#website"},"about":{"@type":"EducationalOrganization","@id":"https://kabinata.com#org"},"primaryImageOfPage":"https://kabinata.com/og/home-v4.jpg","inLanguage":"bg-BG","speakable":{"@type":"SpeakableSpecification","cssSelector":["h1","h2","p"]}}</script>
292
293    
293<script type="application/ld+json" id="jsonld-prerender-3">{"@context":"https://schema.org","@type":"BreadcrumbList","@id":"https://kabinata.com/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Начало","item":"https://kabinata.com"}]}</script>
293
294    <!-- KABINATA_PRERENDER_END -->
295  </head>
296
297  <body>
298    <!-- Google Tag Manager (noscript) — non-JS fallback for GTM-KSD3NZC5.
299         Renders only when JavaScript is disabled, which is rare; included
300         for completeness per Google's official install snippet. -->
vendor: 79 bytes, lines 300-302
300
301    <noscript>
302      <iframe src="https://www.googletagmanager.com/ns.html?id=
302GTM-KSD3NZC5
vendor: 106 bytes, lines 302-305
302"
303              height="0" width="0" style="display:none;visibility:hidden"></iframe>
304    </noscript>
305    
305<!-- End Google Tag Manager (noscript) -->
306
307    <div id="root"><div data-prerender="true" style="font-family:system-ui,-apple-system,'Segoe UI',Roboto,Arial,sans-serif;color:#1a2238;background:linear-gradient(180deg,#fef3c7 0%,#fffbeb 100%);padding:5rem 1.5rem 4rem;text-align:center;min-height:60vh"><a href="/" aria-label="Кабината — начало" style="display:inline-block;margin:0 auto 2rem"><img src="/kabinata-logo.png" alt="Кабината" width="170" height="44" style="height:44px;width:auto;display:block;margin:0 auto" /></a><h1 style="font-size:clamp(2rem,6vw,3rem);font-weight:800;letter-spacing:-0.025em;line-height:1.15;margin:0 auto 1.25rem;max-width:48rem">Кабината | Kabinata.com — езикови курсове</h1><p style="color:#4a5675;font-size:clamp(1rem,3vw,1.25rem);line-height:1.55;margin:0 auto;max-width:42rem">Онлайн езикови курсове по английски, немски, френски, испански и италиански. Реални учители и AI разговорен партньор 24/7. Ваучери от Агенция по заетостта.</p><div style="max-width:46rem;margin:2.5rem auto 0;text-align:left;color:#1a2238;font-size:1.05rem;line-height:1.65"><p>Езикови курсове от 2005 г. Онлайн обучение по английски, немски, френски и испански с преподавател на живо. Разгледай курсовете или изпрати запитване за обучение с ваучер.</p><p><a href="/vaucheri">Курсове с ваучер</a> · <a href="/courses">Разгледай курсовете</a></p><p><strong>„КАБИНАТА БГ“ ООД · ЕИК 200590600</strong><br>Телефон: <a href="tel:+359878755009">0878 755 009</a></p><p>Обучението с ваучер е за одобрени кандидати по условията на съответната програма на Агенцията по заетостта. <a href="/contact?tema=vaucher">Запитване за курс с ваучер</a></p><h2>Езиков център с над 20 години опит, сега изцяло онлайн</h2>
308<p>Кабината е онлайн езиков център, основан през 2005 година. За тези над 20 години през курсовете ни са минали над 70 000 курсисти. Центърът е регистриран доставчик на обучение към Агенция по заетостта.</p>
309<p>
309Онлайн форматът промени мястото, но не и същността на добрия езиков курс: редовни уроци с жив преподавател, ясна програма по нива и достатъчно време всеки да проговори. Разликата е, че вече не пътувате до зала в точно определен час — учите онлайн, а ако пропуснете урок, гледате записа му, когато ви е удобно.</p>
310
311<h2>Пет езика и нива по европейската езикова рамка</h2>
312<p>Преподаваме пет езика — английски, немски, френски, испански и италиански. Нивата следват Общата европейска езикова рамка: A1, A2, B1, B2 и C1. Всяко ниво е отделен курс със своя програма, така че по всяко време знаете къде се намирате и какво следва. Не се налага да гадаете дали „сте някъде към средата“.</p>
313<ul>
314<li><a href="/courses/english">курс по английски език онлайн</a> — живи уроци с преподавател, ниво по ниво</li>
315<li><a href="/courses/german">онлайн курс по немски език</a> — за работа, следване или преместване в немскоговоряща страна</li>
316<li><a href="/courses/spanish">курс по испански език за начинаещи и Ð
316½Ð°Ð¿Ñ€ÐµÐ´Ð½Ð°Ð»Ð¸</a> — групови уроци с жив преподавател</li>
317<li><a href="/courses/french">онлайн курс по френски език</a> — от основите нагоре, стъпка по стъпка</li>
318<li><a href="/courses/italian">курс по италиански език онлайн</a> — за пътувания, работа и удоволствие от езика</li>
319</ul>
320<p>Ако не сте сигурни откъде да започнете, направете <a href="/quiz">безплатния тест за ниво</a>. Отнема няколко минути и показва от кое ниво има смисъл да тръгнете — вместо да повтаряте неща, които вече знаете, или да влезете в група, в която ще ви е трудно.</p>
321
322<h2>Жив урок с учител плюс практика между уроците</h2>
323<p>Груповите уроци се провеждат на живо с реален преподавател — със задаване на въпроси, поправки в момента и разговор с останалите курсисти. Всеки урок се записва, така че материалът остава при вас: можете да се върнете към обяснението на дадено граматично правило или да наваксате, ако този ден просто не сте могли да присъствате.</p>
324<p>Проблемът на повечето курсове обаче не е в самия урок, а в дните между уроците, когато езикът стои неизползван. Затова в платформата има и AI разговорен партньор — „Кабинкова“. С нея говорите и пишете на езика, който учите, по всяко време на денонощието, без притеснение, че ще сгрешите пред някого.</p>
325<ul>
326<li>Живи групови уроци по програмата за съответното ниво</li>
327<li>Запис на всеки урок, достъпен и след това</li>
328<li>Разговор с „Кабинкова“ 24/7 — с глас или на чат, на изучавания език</li>
329<li>Частни уроци, когато искате вниманието на преподавателя изцяло за вас</li>
330</ul>
331
332<h2>Преподаватели с хиляди оценки</h2>
333<p>Зад курсовете стоят 29 преподаватели. Коце преподава английски със средна оценка 4.94 от 8749 оценки и 4409 проведени урока. Снежана (немски) е с 4.96 от 5514 оценки, Цвети (английски) — с 4.92 от 3610, Теменужка (френски) — с 4.96 от 1765, Албена (испански) — с 4.99 от 1141, а Diana Lofreda (италиански) — с 4.98 от 285 оценки.</p>
334<p>Това е и причината груповите уроци да работят: човекът отсреща е учител с опит, който вижда кога се губите и се връща една стъпка назад.</p>
335
336<h2>Обучение с ваучер от Агенция по заетостта</h2>
337<p>За много хора най-достъпният вход към езика е държавното финансиране. Кабината е регистриран доставчик на обучение с ваучери и провежда пълни курсове по тази програма. Условието е да сте заето лице.</p>
338<ul>
339<li>До 460 € държавно финансирано обучение</li>
340<li>300 учебни часа — три нива по 100 часа</li>
341<li>Сертификат за всяко завършено ниво</li>
342<li>Обучението се провежда онлайн, както и останалите ни курсове</li>
343</ul>
344<p>Ако сте заето лице, вижте условията за <a href="/vaucheri">езиков курс с ваучер от Агенция по заетостта</a> и проверете дали отговаряте на изискванията, преди да плащате каквото и да било.</p>
345
346<h2>Цени, които се събират в месечния бюджет</h2>
347<p>Абонаментът е месечен. Един курс, тоест едно ниво по избран език, струва 10 € на месец. Ако искате целия език — всички нива — цената е 25 € на месец. Достъп до всичките пет езика е 49 € на месец, а по-дългите периоди са с отстъпка.</p>
348<ul>
349<li>Един курс (едно ниво): 10 € на месец</li>
350<li>Цял език (всички нива): 25 € на месец</li>
351<li>Всички пет езика: 49 € на месец</li>
352<li>Частен урок: 15 €, а пакет от 10 частни урока — 127,50 €</li>
353</ul>
354<p>Първите 6 месеца са безплатни и няма автоматично подновяване — решението дали да продължите остава ваше. Пълните <a href="/pricing">цени на онлайн курсовете</a>, включително отстъпките за по-дълъг период, може да видите по всяко време.
354</p>
355
356<h2>За кого е и как се започва</h2>
357<p>Онлайн езиковите курсове са подходящи за хора, чието време не е тяхно: работещи с фиксирано работно време, родители на малки деца, студенти между лекции и изпити, българи в чужбина. Записът на всеки урок и разговорната практика по всяко време правят обучението възможно и когато седмицата не е минала по план.</p>
358<p>Започването отнема няколко стъпки: направете теста за ниво, изберете езика си, влезте в първия жив урок и продължете с практика между уроците. След над 20 години и над 70 000 курсисти сме сигурни в едно — най-важната крачка е първата, а тя при нас е безплатна.</p><nav data-prerender-nav="true" style="margin-top:2.5rem;font-size:0.95rem;line-height:1.7"><p><a href="/courses">Езикови курсове</a> · <a href="/teachers">Учители</a> · <a href="/pricing">Цени</a> · <a href="/blog">Блог</a> · <a href="/practice">AI разговорна практика</a> · <a href="/vaucheri">Ваучери от Агенция по заетостта</a> · <a href="/chastni-uroci">Частни уроци</a>
358 · <a href="/sertifikati">Сертификати</a> · <a href="/za-nas">За нас</a> · <a href="/contact">Контакти</a></p><p><a href="/grafik">График на уроците на живо</a> · <a href="/practice/topics">Говорни теми по език и ниво</a> · <a href="/reviews">Мнения</a> · <a href="/platforma-kabinata">Платформата Кабината</a> · <a href="/stani-uchitel">Преподавай в Кабината</a> · <a href="/partners">Партньорска програма</a> · <a href="/terms">Общи условия</a> · <a href="/privacy">Поверителност</a></p><p><strong>Последни статии:</strong></p><ul><li><a href="/blog/en-relationships">Английски за Б1: Говорим за приятелство и връзки</a></li><li><a href="/blog/fr-lecture">Четенето на френски: как да говорим за книги на B1 ниво</a></li><li><a href="/blog/de-beruhmte-menschen">Berühmte Menschen: говорим за известни личности на немски</a></li><li><a href="/blog/en-stress-management">Стрес и доброволчество: английски за ниво B2</a></li></ul><p style="margin-top:1rem"><strong>„КАБИНАТА БГ“ ООД · ЕИК 200590600</strong> · Kabinata.com — езикови курсове от 2005 г.</p><p>Тел. <a href="tel:+359878755009">+359 878 755 009</a> · <!--email_off--><a href="mailto:[email protected]">[email protected]</a><!--/email_off--> · ул. „Минзухар“ 14, ж.к. Лозенец, 1421 София</p><p style="margin-top:1rem;color:#4a5675">Kabinata: <a href="https://kabinata.ai/" rel="noopener">kabinata.ai</a> · <a href="https://old.kabinata.com/" rel="noopener">old.kabinata.com</a> · <a href="https://staro.kabinata.com/" rel="noopener">staro.kabinata.com</a></p></nav><p data-prerender-langs="true" style="margin-top:1rem;font-size:0.95rem">На други езици: <a href="/en" hreflang="en" lang="en">English</a> · <a href="/de" hreflang="de" lang="de">Deutsch</a> · <a href="/es" hreflang="es" lang="es">Español</a></p></div></div></div>
359  
359<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"a5eb669c7db74afd84b6e38618aec2d7","r":1,"spa":2}' crossorigin="anonymous"></script>
359
360</body>
361</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.