{"id":2336,"date":"2026-09-15T17:14:55","date_gmt":"2026-09-15T15:14:55","guid":{"rendered":"https:\/\/jsoncrew.com\/?post_type=case_studies&#038;p=2336"},"modified":"2026-10-09T23:16:49","modified_gmt":"2026-10-09T21:16:49","slug":"jsonmeet-komunikator-self-hosted-z-suflerem-ai","status":"publish","type":"case_studies","link":"https:\/\/jsoncrew.com\/en\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/","title":{"rendered":"JSONMeet. Slack, Meet i TeamSpeak w jednym, na w\u0142asnym serwerze."},"content":{"rendered":"\n<style>\n.jm-cs{--cs-sans:var(--sans,-apple-system,BlinkMacSystemFont,\"Segoe UI\",system-ui,Roboto,sans-serif);--cs-mono:var(--mono,ui-monospace,\"SF Mono\",\"SFMono-Regular\",Menlo,\"Cascadia Mono\",Consolas,monospace);font-family:var(--cs-sans);line-height:1.6;color:#020c08;-webkit-font-smoothing:antialiased}\n.jm-cs h1,.jm-cs h2,.jm-cs h3,.jm-cs h4,.jm-cs p,.jm-cs li,.jm-cs blockquote,.jm-cs figcaption{font-family:var(--cs-sans)}\n.jm-cs code{font-family:var(--cs-mono);font-size:.92em;background:#f0faf5;padding:1px 6px;border-radius:4px}\n.jm-cs *{box-sizing:border-box}\n.jm-cs ul li::before{display:none!important;content:none!important;background:transparent!important}\n.jm-cs ul li{padding-left:0!important;list-style:disc;position:static}\n.jm-cs .jm-tldr ul li,.jm-cs .jm-ba__col ul li,.jm-cs .jm-objections ul li{list-style:none}\n.jm-cs .jm-tldr ul li::before,.jm-cs .jm-ba__col ul li::before{display:inline-block!important;content:'\\2022'!important;color:#016C47;background:none!important;position:static!important;width:auto!important;height:auto!important;margin-right:8px;margin-left:-14px;font-weight:700}\n.jm-cs h2{font-size:28px;line-height:1.2;margin:52px 0 16px;color:#016C47}\n.jm-cs h2:first-child{margin-top:0}\n.jm-cs h3{font-size:21px;line-height:1.3;margin:32px 0 12px;color:#020c08}\n.jm-cs h4{font-size:17px;margin:18px 0 8px;color:#020c08}\n.jm-cs p{margin:0 0 16px}\n.jm-cs strong{color:#020c08}\n.jm-cs a{color:#016C47;text-decoration:underline}\n.jm-cs a:hover{color:#04a86d}\n\n\/* HERO *\/\n.jm-hero{display:grid;grid-template-columns:1fr auto;gap:32px;align-items:center;margin:0 0 32px;padding:36px 40px;background:linear-gradient(135deg,#016C47 0%,#04a86d 100%);color:#fff;border-radius:16px}\n.jm-hero__kicker{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;opacity:.85;margin-bottom:14px;font-family:var(--cs-mono)}\n.jm-hero__h1{font-size:clamp(24px,3vw,36px);line-height:1.15;margin:0 0 24px;color:#fff;font-weight:800}\n.jm-hero__stats{display:flex;gap:28px;flex-wrap:wrap}\n.jm-hero__stat strong{display:block;font-size:34px;font-weight:800;line-height:1;color:#fff;font-family:var(--cs-mono)}\n.jm-hero__stat span{display:block;font-size:13px;opacity:.85;margin-top:5px;line-height:1.3}\n.jm-hero__badge{background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.35);border-radius:12px;padding:22px 26px;text-align:center;white-space:nowrap;flex-shrink:0}\n.jm-hero__badge strong{display:block;font-size:15px;font-weight:800;color:#fff;margin-bottom:6px}\n.jm-hero__badge span{font-size:12px;opacity:.75;display:block}\n.jm-hero__badge .jm-hero__badge-big{font-size:20px;font-weight:800;color:#fff;display:block;margin-top:6px;opacity:1}\n\n\/* TL;DR *\/\n.jm-tldr{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:0 0 40px;padding:22px;background:#f0faf5;border:1px solid #bbf7d0;border-radius:12px}\n.jm-tldr__label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#016C47;margin-bottom:7px;font-family:var(--cs-mono)}\n.jm-tldr__val{font-size:14px;color:#020c08;line-height:1.5}\n.jm-tldr ul{margin:4px 0 0;padding-left:14px}\n.jm-tldr ul li{font-size:13px;margin-bottom:4px;line-height:1.4}\n\n\/* BEFORE\/AFTER *\/\n.jm-ba{display:grid;grid-template-columns:1fr 1fr;gap:0;margin:24px 0 40px;border:1px solid #e5e7eb;border-radius:12px;overflow:hidden}\n.jm-ba__col{padding:24px 28px}\n.jm-ba__col--before{background:#fdf4f4;border-right:1px solid #e5e7eb}\n.jm-ba__col--after{background:#f0faf5}\n.jm-ba__col-label{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:14px;display:block;clear:both;width:100%}\n.jm-ba__col--before .jm-ba__col-label{color:#dc2626}\n.jm-ba__col--after .jm-ba__col-label{color:#016C47}\n.jm-ba__col ul{margin:0;padding-left:14px}\n.jm-ba__col ul li{margin-bottom:10px;font-size:15px;line-height:1.45}\n\n\/* METRYKI *\/\n.jm-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:8px 0 40px}\n.jm-metric{text-align:center;padding:22px 14px;background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px}\n.jm-metric__num{font-size:38px;font-weight:800;color:#016C47;line-height:1;font-family:var(--cs-mono);display:block}\n.jm-metric__unit{font-size:13px;color:#6b7280;margin-top:8px;display:block;line-height:1.45}\n.jm-metric__unit small{font-size:12px;color:#9ca3af}\n\n\/* MODULY *\/\n.jm-modules{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:24px 0 40px}\n.jm-module{padding:22px 24px;border:1px solid #e5e7eb;border-radius:10px;background:#F8F8FF;border-top:3px solid #016C47}\n.jm-module__n{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#016C47;margin-bottom:8px;font-family:var(--cs-mono)}\n.jm-module h4{margin:0 0 9px;font-size:16px;color:#020c08;line-height:1.3}\n.jm-module p{margin:0;font-size:14px;color:#374151;line-height:1.6}\n\n\/* STACK *\/\n.jm-stack{display:grid;grid-template-columns:1fr 1fr;gap:0 32px;margin:8px 0 40px;padding:6px 22px;background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px}\n.jm-stack__row{display:grid;grid-template-columns:120px 1fr;gap:14px;align-items:baseline;padding:11px 0;border-bottom:1px solid #e5e7eb}\n.jm-stack__row:nth-last-child(-n+2){border-bottom:none}\n.jm-stack__k{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#016C47;font-family:var(--cs-mono)}\n.jm-stack__v{font-size:14px;color:#020c08;line-height:1.45}\n\n\/* CYTAT *\/\n.jm-quote{margin:40px 0;padding:32px 36px 32px 48px;background:#020c08;border-radius:14px;position:relative}\n.jm-quote::before{content:'\\201C';position:absolute;top:16px;left:24px;font-size:72px;color:#16C47F;line-height:1;font-family:Georgia,serif;opacity:.5}\n.jm-quote blockquote{margin:0}\n.jm-quote blockquote p{font-size:18px;line-height:1.6;color:#e5e7eb;margin:0 0 16px;font-style:italic}\n.jm-quote blockquote footer{font-size:13px;color:#7fe3ad;font-weight:600;font-style:normal}\n\n\/* TIMELINE *\/\n.jm-timeline{margin:24px 0 40px}\n.jm-tl-item{display:grid;grid-template-columns:88px 1fr;gap:18px;margin-bottom:22px;padding-bottom:22px;border-bottom:1px solid #f0f0f0}\n.jm-tl-item:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}\n.jm-tl-week{font-family:var(--cs-mono);font-size:12px;font-weight:700;color:#016C47;text-align:center;padding:9px 6px;background:#f0faf5;border-radius:8px;height:fit-content;line-height:1.35}\n.jm-tl-body h4{margin:0 0 7px;font-size:16px;color:#020c08}\n.jm-tl-body p{margin:0;font-size:14px;color:#374151;line-height:1.6}\n\n\/* OBIEKCJE *\/\n.jm-objections{margin:24px 0 40px}\n.jm-objection{padding:20px 24px;margin-bottom:12px;border:1px solid #e5e7eb;border-radius:10px;background:#F8F8FF}\n.jm-objection__q{font-size:16px;font-weight:700;color:#020c08;margin:0 0 10px}\n.jm-objection__a{font-size:15px;color:#374151;margin:0;line-height:1.65}\n\n\/* SCREENS *\/\n.jm-screens{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:0 0 40px}\n.jm-screens figure{margin:0;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden;background:#f8fafc}\n.jm-screens img{width:100%;height:auto;display:block}\n.jm-screens figcaption{font-size:13px;color:#6b7280;padding:10px 14px;line-height:1.4}\n.jm-screens--single{grid-template-columns:1fr}\n\n\/* LINKI WEWN *\/\n.jm-related{background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px;padding:24px 28px;margin:40px 0}\n.jm-related h3{margin:0 0 14px;font-size:18px;color:#020c08}\n.jm-related ul{margin:0;padding-left:18px}\n.jm-related ul li{margin-bottom:10px;font-size:15px;line-height:1.45}\n.jm-related ul li::before{display:inline-block!important;content:'\\2192'!important;color:#016C47;background:none!important;position:static!important;width:auto!important;height:auto!important;margin-right:8px;margin-left:-20px;font-weight:700}\n\n\/* CTA *\/\n.jm-cta{margin:40px 0 8px;padding:36px;background:linear-gradient(135deg,#020c08 0%,#0B1620 100%);border-radius:14px;text-align:center}\n.jm-cs .jm-cta h3{color:#fff;font-size:23px;margin:0 0 12px;line-height:1.3}\n.jm-cta p{color:rgba(255,255,255,.7);margin:0 0 24px;font-size:16px;line-height:1.6}\n.jm-cta__btns{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}\n.jm-cta__btn{display:inline-flex;align-items:center;padding:13px 26px;border-radius:8px;font-weight:700;font-size:15px;text-decoration:none;transition:transform .15s,box-shadow .15s;line-height:1}\n.jm-cta__btn:hover{transform:translateY(-1px)}\n.jm-cta__btn--primary{background:#16C47F;color:#020c08}\n.jm-cta__btn--ghost{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.3)}\n\n\/* RESPONSIVE *\/\n@media(max-width:700px){\n  .jm-hero{grid-template-columns:1fr}\n  .jm-hero__badge{display:none}\n  .jm-tldr{grid-template-columns:1fr 1fr}\n  .jm-ba{grid-template-columns:1fr}\n  .jm-ba__col--before{border-right:none;border-bottom:1px solid #e5e7eb}\n  .jm-metrics{grid-template-columns:1fr 1fr}\n  .jm-modules{grid-template-columns:1fr}\n  .jm-screens{grid-template-columns:1fr}\n  .jm-stack{grid-template-columns:1fr}\n  .jm-stack__row:nth-last-child(-n+2){border-bottom:1px solid #e5e7eb}\n  .jm-stack__row:last-child{border-bottom:none}\n  .jm-hero__stats{gap:18px}\n  .jm-hero__stat strong{font-size:26px}\n  .jm-quote{padding:24px 24px 24px 36px}\n  .jm-tl-item{grid-template-columns:70px 1fr}\n}\n\n\/* KALKULATOR \u2014 reuse z JSON Hub calc, prefix per case study *\/\n.jh-calc-wrap{background:#f8fafc;border:1px solid #e5e7eb;border-radius:14px;padding:36px 40px;margin:40px 0}\n.jh-calc-wrap h3{margin:0 0 6px;font-size:23px;color:#020c08}\n.jh-calc-intro{font-size:15px;color:#6b7280;margin:0 0 24px;line-height:1.6}\n.jh-calc-step{margin-bottom:26px}\n.jh-calc-step-label{display:flex;align-items:baseline;gap:10px;margin-bottom:12px}\n.jh-calc-step-num{font-family:var(--cs-mono);font-size:11px;font-weight:700;letter-spacing:.1em;color:#016C47;background:#f0faf5;padding:3px 8px;border-radius:6px}\n.jh-calc-step-label strong{font-size:15px;color:#020c08}\n.jh-calc-step-hint{font-size:13px;color:#6b7280;font-style:normal;margin-left:4px}\n.jh-calc-options-list{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n.jh-calc-option-wrap{position:relative}\n.jh-calc-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border:1px solid #e5e7eb;border-radius:8px;background:#fff;cursor:pointer;transition:border-color .15s,background .15s}\n.jh-calc-option:hover{border-color:#04a86d}\n.jh-calc-option.is-selected{border-color:#016C47;background:#f0faf5}\n.jh-calc-option input[type=checkbox]{margin-top:3px;accent-color:#016C47;flex-shrink:0}\n.jh-calc-option-body{flex:1;min-width:0}\n.jh-calc-option-name{font-size:14px;font-weight:700;color:#020c08;margin-bottom:3px;line-height:1.35}\n.jh-calc-option-desc{font-size:12px;color:#6b7280;line-height:1.45}\n.jh-calc-qty-wrap{display:none;margin-top:10px;padding-top:10px;border-top:1px dashed #e5e7eb;align-items:center;gap:10px}\n.jh-calc-qty-wrap.is-open{display:flex}\n.jh-calc-qty-label-sm{font-size:12px;color:#6b7280}\n.jh-calc-qty-btn{width:26px;height:26px;border:1px solid #e5e7eb;background:#fff;border-radius:5px;font-size:16px;font-weight:700;color:#016C47;cursor:pointer;line-height:1}\n.jh-calc-qty-btn:hover{background:#f0faf5}\n.jh-calc-qty-val{font-size:14px;font-weight:700;color:#020c08;min-width:20px;text-align:center;font-family:var(--cs-mono)}\n.jh-calc-summary{margin-top:24px;padding:22px 26px;background:#fff;border:1px solid #016C47;border-radius:10px}\n.jh-calc-summary-row{display:flex;justify-content:space-between;padding:7px 0;font-size:14px;color:#374151}\n.jh-calc-total-line{display:flex;justify-content:space-between;padding:12px 0 0;margin-top:8px;border-top:1px solid #e5e7eb;font-size:17px;font-weight:800;color:#020c08}\n.jh-calc-cta{width:100%;margin-top:16px;padding:14px 18px;background:#16C47F;color:#020c08;border:none;border-radius:8px;font-size:15px;font-weight:700;cursor:pointer;transition:transform .15s}\n.jh-calc-cta:hover{transform:translateY(-1px)}\n.jh-calc-form-panel{margin-top:22px;padding:22px 26px;background:#fff;border:1px solid #e5e7eb;border-radius:10px}\n.jh-calc-form-badge{display:inline-block;margin-bottom:14px;padding:6px 12px;background:#f0faf5;color:#016C47;font-size:12px;font-weight:700;border-radius:6px;font-family:var(--cs-mono)}\n.jh-calc-form-panel label{display:block;font-size:13px;font-weight:700;color:#020c08;margin:12px 0 5px}\n.jh-calc-form-panel input[type=text],.jh-calc-form-panel input[type=email],.jh-calc-form-panel input[type=tel]{width:100%;padding:10px 12px;border:1px solid #e5e7eb;border-radius:6px;font-size:14px;font-family:inherit}\n.jh-calc-form-panel input:focus{outline:2px solid #04a86d;outline-offset:-1px;border-color:#016C47}\n.jh-calc-field-error{display:block;font-size:12px;color:#dc2626;margin-top:4px;min-height:16px}\n.jh-calc-form-panel label.jh-privacy{display:flex;gap:8px;align-items:flex-start;font-weight:400;font-size:13px;color:#374151;margin-top:16px;cursor:pointer}\n.jh-calc-form-panel label.jh-privacy input{margin-top:3px}\n.jh-calc-form-actions{display:flex;gap:10px;margin-top:18px}\n.jh-calc-back{flex:1;padding:11px 14px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer}\n.jh-calc-submit{flex:2;padding:11px 14px;border:none;background:#016C47;color:#fff;border-radius:8px;font-size:14px;font-weight:700;cursor:pointer}\n.jh-calc-submit:hover{background:#04a86d}\n.jh-calc-success{margin-top:22px;padding:22px 26px;background:#f0faf5;border:1px solid #016C47;border-radius:10px;color:#016C47;font-size:15px;line-height:1.6}\n.jh-calc-success strong{display:block;font-size:17px;margin-bottom:6px}\n\n\/* FAQ <details> *\/\n.jh-faq{margin:24px 0 40px}\n.jh-faq details{border:1px solid #e5e7eb;border-radius:10px;background:#F8F8FF;margin-bottom:12px;padding:0;overflow:hidden}\n.jh-faq details[open]{background:#fff}\n.jh-faq summary{padding:18px 44px 18px 24px;font-size:16px;font-weight:700;color:#020c08;cursor:pointer;list-style:none;position:relative}\n.jh-faq summary::-webkit-details-marker{display:none}\n.jh-faq summary::after{content:'+';position:absolute;right:22px;top:50%;transform:translateY(-50%);font-size:22px;font-weight:400;color:#016C47;line-height:1}\n.jh-faq details[open] summary::after{content:'\u2212'}\n.jh-faq details p{padding:0 24px 20px;margin:0;font-size:15px;color:#374151;line-height:1.65}\n\n@media(max-width:700px){\n  .jh-calc-wrap{padding:24px 20px}\n  .jh-calc-options-list{grid-template-columns:1fr}\n}\n<\/style>\n\n<div class=\"jm-cs\">\n\n<!-- HERO -->\n<div class=\"jm-hero\">\n  <div>\n    <span class=\"jm-hero__kicker\">Case Study \u00b7 Produkt w\u0142asny JSON Crew \u00b7 Self-hosted messenger<\/span>\n    <h1 class=\"jm-hero__h1\">JSONMeet. Slack, Meet i TeamSpeak<br>w jednym, na w\u0142asnym serwerze.<\/h1>\n    <div class=\"jm-hero__stats\">\n      <div class=\"jm-hero__stat\"><strong>4 \u2192 1<\/strong><span>cztery narz\u0119dzia zast\u0105pione jednym<\/span><\/div>\n      <div class=\"jm-hero__stat\"><strong>8 weeks.<\/strong><span>od projektu do produkcji<\/span><\/div>\n      <div class=\"jm-hero__stat\"><strong>4K\/60<\/strong><span>udost\u0119pnianie ekranu<\/span><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"jm-hero__badge\">\n    <strong>JSONMeet<\/strong>\n    <span>Produkt w\u0142asny<\/span>\n    <span class=\"jm-hero__badge-big\">1 serwer<\/span>\n  <\/div>\n<\/div>\n\n<!-- TL;DR -->\n<div class=\"jm-tldr\">\n  <div>\n    <div class=\"jm-tldr__label\">Product<\/div>\n    <div class=\"jm-tldr__val\">JSONMeet: komunikator firmowy z kana\u0142ami g\u0142osowymi, czatem, spotkaniami z klientami i suflerem AI. Zbudowany przez JSON Crew, u\u017cywany codziennie przez zesp\u00f3\u0142 JSON Crew.<\/div>\n  <\/div>\n  <div>\n    <div class=\"jm-tldr__label\">Challenge<\/div>\n    <ul>\n      <li>Zesp\u00f3\u0142 rozbity na 4 narz\u0119dzia: g\u0142os, czat, spotkania, nagrania<\/li>\n      <li>Nagrania rozm\u00f3w sprzeda\u017cowych w cudzej chmurze<\/li>\n      <li>Klient ma wej\u015b\u0107 z linku, bez konta i instalacji<\/li>\n      <li>AI ma pomaga\u0107 w trakcie rozmowy, nie po niej<\/li>\n    <\/ul>\n  <\/div>\n  <div>\n    <div class=\"jm-tldr__label\">Rozwi\u0105zanie<\/div>\n    <ul>\n      <li>Kana\u0142y g\u0142osowe i tekstowe, DM-y, wyszukiwarka<\/li>\n      <li>Spotkania pod linkiem z poczekalni\u0105 i nagrywaniem<\/li>\n      <li>Prezenter HQ bez rekompresji na serwerze<\/li>\n      <li>Sufler AI: transkrypcja na \u017cywo i podpowiedzi<\/li>\n    <\/ul>\n  <\/div>\n  <div>\n    <div class=\"jm-tldr__label\">Result<\/div>\n    <ul>\n      <li>Jeden serwer w Warszawie, ~10 ms pingu z Polski<\/li>\n      <li>Zero abonament\u00f3w per u\u017cytkownik<\/li>\n      <li>Recordings and transcripts u nas, z retencj\u0105<\/li>\n      <li>Aplikacja desktopowa z globalnym push-to-talk<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n\n<h2>Cztery narz\u0119dzia, cztery abonamenty, zero kontroli nad nagraniami.<\/h2>\n\n<p>Nasz zesp\u00f3\u0142 pracuje zdalnie, a rozmowy handlowe traktujemy jak <a href=\"\/2026\/09\/03\/prywatny-llm-w-firmie-on-premise\/\">dane, kt\u00f3rych nie oddajemy w cudze r\u0119ce<\/a>. Przez ca\u0142y dzie\u0144 siedzieli\u015bmy na kanale g\u0142osowym w TeamSpeaku, pisali\u015bmy na Slacku i Discordzie, a spotkania z klientami umawiali\u015bmy w Google Meet. Ka\u017cde narz\u0119dzie robi\u0142o swoj\u0105 cz\u0119\u015b\u0107 dobrze. Problem by\u0142 w sumie.<\/p>\n\n<p>Cztery loginy, cztery zestawy powiadomie\u0144, cztery miejsca, w kt\u00f3rych gin\u0119\u0142y ustalenia. Nagrania rozm\u00f3w sprzeda\u017cowych l\u0105dowa\u0142y w chmurze dostawcy, na jego warunkach i z jego retencj\u0105. Chcieli\u015bmy je transkrybowa\u0107, analizowa\u0107 i uczy\u0107 si\u0119 na nich. Ka\u017cda taka pr\u00f3ba oznacza\u0142a eksport, upload do kolejnego narz\u0119dzia i kolejn\u0105 umow\u0119 powierzenia.<\/p>\n\n<p>Najwi\u0119ksza luka by\u0142a w <a href=\"\/2026\/09\/08\/agent-ai-sprzedaz-b2b-6-zadan-handlowca\/\">samej rozmowie<\/a>. Handlowiec s\u0142yszy obiekcj\u0119 klienta i ma kilka sekund na odpowied\u017a. Ca\u0142a <a href=\"\/2026\/08\/19\/automatyzacja-dzialu-sprzedazy-b2b\/\">wiedza firmy o tej obiekcji<\/a> (co zadzia\u0142a\u0142o, czego unika\u0107, jaki jest kontekst leada z CRM) le\u017cy w dokumentach, do kt\u00f3rych w trakcie rozmowy nikt nie si\u0119ga. AI podsumowuj\u0105ce spotkanie po fakcie nic tu nie zmienia.<\/p>\n\n<p><a href=\"\/2026\/08\/13\/jak-wybrac-wdrozeniowca-ai-branza-prawnicza-kancelaria\/\">Postawili\u015bmy wymagania<\/a>: jedna aplikacja, na naszym serwerze, klient wchodzi z linku bez konta, jako\u015b\u0107 udost\u0119pniania ekranu wystarczaj\u0105ca do prezentacji interfejs\u00f3w w 4K, nagrywanie z wyra\u017anym banerem dla wszystkich uczestnik\u00f3w. I sufler, kt\u00f3ry s\u0142ucha rozmowy i podpowiada handlowcowi na \u017cywo, niewidoczny dla klienta.<\/p>\n\n<h2>Co zbudowali\u015bmy. Cztery modu\u0142y JSONMeet.<\/h2>\n\n<div class=\"jm-modules\">\n  <div class=\"jm-module\">\n    <div class=\"jm-module__n\">Modu\u0142 01<\/div>\n    <h4>Komunikator: kana\u0142y, czat, DM-y<\/h4>\n    <p>Uk\u0142ad jak w Discordzie: workspace&#8217;y, kana\u0142y tekstowe i g\u0142osowe w kategoriach, panel cz\u0142onk\u00f3w ze statusami na \u017cywo. Trwa\u0142y czat z wzmiankami, plikami, reakcjami i odpowiedziami. Wiadomo\u015bci prywatne. Pe\u0142notekstowa wyszukiwarka po kana\u0142ach i w\u0142asnych rozmowach. Wszystko po jednym po\u0142\u0105czeniu WebSocket: wiadomo\u015bci, obecno\u015b\u0107, \u201episze\u2026&#8221;, liczniki nieprzeczytanych.<\/p>\n  <\/div>\n  <div class=\"jm-module\">\n    <div class=\"jm-module__n\">Modu\u0142 02<\/div>\n    <h4>Spotkania z klientem i nagrywanie<\/h4>\n    <p>Pok\u00f3j pod linkiem. Cz\u0142onek zespo\u0142u wchodzi od razu, go\u015b\u0107 klienta trafia do poczekalni i czeka na wpuszczenie jednym klikni\u0119ciem. Go\u015b\u0107 nie dotyka serwera medi\u00f3w, dop\u00f3ki gospodarz nie zatwierdzi. Nagrywanie po stronie serwera do MP4 z banerem \u201eNagrywanie&#8221; widocznym dla wszystkich, lista nagra\u0144 z retencj\u0105 i automatycznym kasowaniem.<\/p>\n  <\/div>\n  <div class=\"jm-module\">\n    <div class=\"jm-module__n\">Modu\u0142 03<\/div>\n    <h4>Prezenter HQ i udost\u0119pnianie ekranu do 4K<\/h4>\n    <p>W przegl\u0105darce presety 1080p60, 1440p60, 1440p30 \u201eostry tekst&#8221; i 4K30, zmieniane w trakcie. Do prezentacji studyjnej osobna aplikacja desktopowa: OBS lub GStreamer koduje obraz sprz\u0119towo i wysy\u0142a go protoko\u0142em WHIP prosto do serwera medi\u00f3w, kt\u00f3ry przekazuje strumie\u0144 dalej bez rekompresji. Serwer prawie nie zu\u017cywa CPU, a odbiorcy widz\u0105 to, co wysz\u0142o z karty graficznej prezentera.<\/p>\n  <\/div>\n  <div class=\"jm-module\">\n    <div class=\"jm-module__n\">Modu\u0142 04<\/div>\n    <h4>Sufler AI dla handlowca<\/h4>\n    <p>Transkrypcja rozmowy na \u017cywo trafia do modelu j\u0119zykowego z playbookiem firmy: macierz 26 obiekcji, zasady negocjacji cenowych, brief o firmie. Sufler pokazuje handlowcowi wykryt\u0105 obiekcj\u0119, gotow\u0105 odpowied\u017a, pytania do zadania i wska\u017anik gotowo\u015bci do domkni\u0119cia w skali 0 do 100. Przed rozmow\u0105 wybierasz leada z CRM i sufler dostaje jego kontekst. Klient tego panelu nigdy nie widzi. Po rozmowie: analiza, scorecard, wyszukiwanie po transkrypcjach.<\/p>\n  <\/div>\n<\/div>\n\n<!-- SCREENY: odkomentowa\u0107 po wgraniu zrzut\u00f3w do biblioteki medi\u00f3w WP i podmianie src\n<div class=\"jm-screens\">\n  <figure><img decoding=\"async\" src=\"SRC_1\" alt=\"JSONMeet: kana\u0142 g\u0142osowy z kamerkami i panelem cz\u0142onk\u00f3w\" loading=\"lazy\"><figcaption>Kana\u0142 g\u0142osowy z kamerkami. Po prawej panel cz\u0142onk\u00f3w ze statusami na \u017cywo.<\/figcaption><\/figure>\n  <figure><img decoding=\"async\" src=\"SRC_2\" alt=\"JSONMeet: poczekalnia go\u015bcia przed spotkaniem\" loading=\"lazy\"><figcaption>Go\u015b\u0107 klienta czeka w poczekalni. Gospodarz wpuszcza jednym klikni\u0119ciem.<\/figcaption><\/figure>\n  <figure><img decoding=\"async\" src=\"SRC_3\" alt=\"JSONMeet: panel Suflera AI podczas rozmowy sprzeda\u017cowej\" loading=\"lazy\"><figcaption>Sufler AI: wykryta obiekcja, gotowa odpowied\u017a, gotowo\u015b\u0107 do domkni\u0119cia.<\/figcaption><\/figure>\n  <figure><img decoding=\"async\" src=\"SRC_4\" alt=\"JSONMeet: udost\u0119pnianie ekranu z presetem 4K\" loading=\"lazy\"><figcaption>Udost\u0119pnianie ekranu. Presety od 1080p60 do 4K30, zmiana w trakcie.<\/figcaption><\/figure>\n<\/div>\n-->\n\n<h3>Pod mask\u0105<\/h3>\n\n<p>Frontend w React 18 z Vite i Tailwind CSS 4. Backend w Node.js na Fastify 5 z Prism\u0105 6 i PostgreSQL 17, Redis 7 do sesji, obecno\u015bci i kolejek. Media obs\u0142uguje serwer LiveKit w wersji open source, postawiony samodzielnie: SFU dla d\u017awi\u0119ku i wideo, Egress do nagrywania, Ingress do przyjmowania strumienia WHIP z prezentera. Kamera idzie w VP9 z trzema warstwami jako\u015bci, ekran w H.264 simulcast, wi\u0119c s\u0142abszy odbiorca dostaje l\u017cejsz\u0105 warstw\u0119 bez pogarszania obrazu innym.<\/p>\n\n<p>Redukcja szum\u00f3w (RNNoise) i wirtualne t\u0142o (MediaPipe) dzia\u0142aj\u0105 lokalnie w przegl\u0105darce uczestnika. Za firmowymi firewallami ratuje wbudowany TURN po TLS i awaryjny transport po TCP. Aplikacja desktopowa w Electronie \u0142\u0105czy si\u0119 z instancj\u0105 firmy i sama dostaje ka\u017cd\u0105 aktualizacj\u0119 interfejsu; dodaje tray, globalny skr\u00f3t push-to-talk, licznik nieprzeczytanych na ikonie i deep-linki do spotka\u0144.<\/p>\n\n<p>Transkrypcja i model j\u0119zykowy suflera dzia\u0142aj\u0105 na naszych w\u0142asnych serwerach GPU, po\u0142\u0105czonych z serwerem aplikacji prywatn\u0105 sieci\u0105. Produkcja to jeden VPS w OVHcloud w Warszawie (8 vCPU, 16 GB RAM) z us\u0142ugami pod systemd, bez Dockera. Wdro\u017cenie: archiwum z gita, build na serwerze, migracje, restart us\u0142ug.<\/p>\n\n<div class=\"jm-stack\">\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">Frontend<\/span><span class=\"jm-stack__v\">React 18, Vite, Tailwind CSS 4, komponenty LiveKit<\/span><\/div>\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">Backend<\/span><span class=\"jm-stack__v\">Node.js, Fastify 5, Prisma 6, PostgreSQL 17, Redis 7<\/span><\/div>\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">Media<\/span><span class=\"jm-stack__v\">LiveKit OSS (SFU, Egress, Ingress), VP9 SVC, H.264 simulcast, wbudowany TURN<\/span><\/div>\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">Prezenter<\/span><span class=\"jm-stack__v\">OBS lub GStreamer, WHIP, kodowanie sprz\u0119towe bez rekompresji na serwerze<\/span><\/div>\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">Desktop<\/span><span class=\"jm-stack__v\">Electron, globalny push-to-talk, deep-linki, RNNoise i MediaPipe lokalnie<\/span><\/div>\n  <div class=\"jm-stack__row\"><span class=\"jm-stack__k\">AI i hosting<\/span><span class=\"jm-stack__v\">Transkrypcja i model j\u0119zykowy na w\u0142asnych GPU, jeden VPS OVHcloud Warszawa pod systemd<\/span><\/div>\n<\/div>\n\n<h2>Przed i po. Ten sam zesp\u00f3\u0142, jedno narz\u0119dzie.<\/h2>\n\n<div class=\"jm-ba\">\n  <div class=\"jm-ba__col jm-ba__col--before\">\n    <div class=\"jm-ba__col-label\">\u274c Przed JSONMeet<\/div>\n    <ul>\n      <li><strong>4 narz\u0119dzia<\/strong>: TeamSpeak, Slack\/Discord, Google Meet, osobne nagrywanie<\/li>\n      <li>Nagrania rozm\u00f3w in the provider's cloud, retention on its terms<\/li>\n      <li>Klient instaluje lub loguje si\u0119, \u017ceby wej\u015b\u0107 na spotkanie<\/li>\n      <li>Wiedza o obiekcjach w dokumentach, poza rozmow\u0105<\/li>\n      <li>Ekran udost\u0119pniany w jako\u015bci, jak\u0105 narz\u0119dzie uzna za stosown\u0105<\/li>\n      <li>Abonament per u\u017cytkownik w ka\u017cdym z narz\u0119dzi<\/li>\n    <\/ul>\n  <\/div>\n  <div class=\"jm-ba__col jm-ba__col--after\">\n    <div class=\"jm-ba__col-label\">\u2705 Po JSONMeet<\/div>\n    <ul>\n      <li><strong>1 aplikacja<\/strong>: kana\u0142y g\u0142osowe, czat, DM-y, spotkania, nagrania<\/li>\n      <li>Recordings and transcripts na w\u0142asnym serwerze, retencja ustawiana per plan<\/li>\n      <li>Klient wchodzi z linku w przegl\u0105darce, przez poczekalni\u0119<\/li>\n      <li>Sufler podpowiada w trakcie rozmowy, klient go nie widzi<\/li>\n      <li>Presety do 4K30 i 1440p60, prezenter bez rekompresji<\/li>\n      <li>Jeden VPS, koszt sta\u0142y niezale\u017cnie od liczby os\u00f3b<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n\n<h2>Liczby projektu.<\/h2>\n\n<div class=\"jm-metrics\">\n  <div class=\"jm-metric\">\n    <span class=\"jm-metric__num\">8 weeks.<\/span>\n    <span class=\"jm-metric__unit\">od projektu do produkcji<br><small>99 commit\u00f3w<\/small><\/span>\n  <\/div>\n  <div class=\"jm-metric\">\n    <span class=\"jm-metric__num\">48 tys.<\/span>\n    <span class=\"jm-metric__unit\">linii TypeScript<br><small>frontend, backend, desktop, prezenter<\/small><\/span>\n  <\/div>\n  <div class=\"jm-metric\">\n    <span class=\"jm-metric__num\">~30<\/span>\n    <span class=\"jm-metric__unit\">uczestnik\u00f3w w pokoju<br><small>test: 10 nadawc\u00f3w &lt; 50% CPU<\/small><\/span>\n  <\/div>\n  <div class=\"jm-metric\">\n    <span class=\"jm-metric__num\">26<\/span>\n    <span class=\"jm-metric__unit\">obiekcji w playbooku suflera<br><small>plus negocjacje cenowe<\/small><\/span>\n  <\/div>\n<\/div>\n\n<p>Do tego: 22 migracje bazy, 26 plik\u00f3w test\u00f3w backendu, 4 plany z egzekwowanymi limitami (FREE, STARTER, PRO, ENTERPRISE), 2 r\u00f3wnoleg\u0142e nagrania na serwerze, deep-linki <code>jsonmeet:\/\/join\/&lt;kod&gt;<\/code> z aplikacji desktopowej.<\/p>\n\n<!-- CYTAT: do akceptacji przez autora przed publikacj\u0105 -->\n<div class=\"jm-quote\">\n  <blockquote>\n    <p>Nie chodzi\u0142o o to, \u017ceby mie\u0107 w\u0142asnego Meeta dla zasady. Chodzi\u0142o o to, \u017ce rozmowa sprzeda\u017cowa to najcenniejsze dane w firmie, a my oddawali\u015bmy je komu\u015b innemu. Teraz nagranie, transkrypcja i podpowiedzi s\u0105 nasze. I dzia\u0142aj\u0105 w trakcie rozmowy, nie po niej.<\/p>\n    <footer>Szymon Stelmach, JSON Crew, autor JSONMeet<\/footer>\n  <\/blockquote>\n<\/div>\n\n<h2>Jak wygl\u0105da\u0142a budowa. Osiem tygodni.<\/h2>\n\n<div class=\"jm-timeline\">\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>1<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Projekt i fundament<\/h4>\n      <p>Dokument projektowy: wymagania, ryzyka, model danych, plan etap\u00f3w. Fundament: wiele firm w izolacji na jednej instancji, konta i sesje, role z uprawnieniami rozwi\u0105zywanymi przy logowaniu, zaproszenia kopiowalnym linkiem. Serwer medi\u00f3w postawiony na VPS z wbudowanym TURN.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>2<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Spotkania pod linkiem<\/h4>\n      <p>Pok\u00f3j z kodem, poczekalnia dla go\u015bci trzymana po stronie serwera, spotlight i siatka, udost\u0119pnianie ekranu z presetami. Nagrywanie ca\u0142ej kompozycji pokoju do MP4 z banerem dla uczestnik\u00f3w i list\u0105 nagra\u0144 z retencj\u0105.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>3<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Prezenter HQ<\/h4>\n      <p>Osobna aplikacja desktopowa dla prezentera: OBS lub GStreamer koduje sprz\u0119towo, strumie\u0144 idzie protoko\u0142em WHIP do Ingress i dalej bez rekompresji. Decyzja: WHIP zamiast RTMP, bo RTMP wymusza ponowne kodowanie na serwerze.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>4\u20135<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Komunikator<\/h4>\n      <p>Sta\u0142y uk\u0142ad aplikacji: pasek workspace&#8217;\u00f3w, kana\u0142y w kategoriach, tre\u015b\u0107, panel cz\u0142onk\u00f3w. Trwa\u0142y czat z wzmiankami, plikami, reakcjami i odpowiedziami, DM-y, wyszukiwarka. Kana\u0142y g\u0142osowe dzia\u0142aj\u0105ce niezale\u017cnie od nawigacji: klikasz po aplikacji, rozmowa trwa. Push-to-talk bez renegocjacji po\u0142\u0105czenia.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>6<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Aplikacja desktopowa<\/h4>\n      <p>Electron \u0142\u0105cz\u0105cy si\u0119 z instancj\u0105 firmy: tray, globalny skr\u00f3t push-to-talk, licznik nieprzeczytanych, w\u0142asny wyb\u00f3r okna do udost\u0119pnienia, deep-linki do spotka\u0144. Pierwsze uruchomienie to adres serwera i akceptacja certyfikatu; aktualizacje interfejsu przychodz\u0105 z serwera.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>7<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Transkrypcja i sufler<\/h4>\n      <p>Transkrypcja na \u017cywo na w\u0142asnym GPU. Sufler z playbookiem 26 obiekcji, briefem firmy i kontekstem leada pobieranym z CRM. Widoczny tylko dla zespo\u0142u, konfigurowany per workspace. Jedno wej\u015bcie do modelu j\u0119zykowego dla wszystkich funkcji AI, wi\u0119c zmiana modelu to zmiana konfiguracji.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"jm-tl-item\">\n    <div class=\"jm-tl-week\">Tydzie\u0144<br>8<\/div>\n    <div class=\"jm-tl-body\">\n      <h4>Analizy rozm\u00f3w i produkcja<\/h4>\n      <p>Analiza rozmowy po fakcie z rozpoznawaniem m\u00f3wc\u00f3w, scorecard, sygna\u0142y i wyszukiwanie po transkrypcjach. Higiena obrazu i d\u017awi\u0119ku: redukcja szum\u00f3w, wirtualne t\u0142o, automatyczne obni\u017cenie rozdzielczo\u015bci, gdy kamera USB spada do kilku klatek. Wdro\u017cenie na jednym VPS w Warszawie pod systemd, bez Dockera.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<section class=\"cs-seo-article\" id=\"poradnik\">\n  <h2>Self-hosted messenger dla firmy: kiedy w\u0142asny serwer ma sens, a kiedy nie<\/h2>\n  <p class=\"cs-seo-lead\">Tekst dla w\u0142a\u015bcicieli firm i szef\u00f3w sprzeda\u017cy, kt\u00f3rzy zastanawiaj\u0105 si\u0119 nad przeniesieniem czatu, rozm\u00f3w g\u0142osowych i spotka\u0144 z klientami na w\u0142asn\u0105 infrastruktur\u0119. Odpowiadamy, kiedy komunikator self-hosted dla firmy jest rozs\u0105dnym wyborem, co trzeba w nim zaprojektowa\u0107 i jakie ryzyka zaplanowa\u0107 od pierwszego dnia.<\/p>\n\n  <h3>Czym jest komunikator self-hosted i czym r\u00f3\u017cni si\u0119 od Slacka czy Meet<\/h3>\n  <p>Self-hosted messenger to aplikacja do czatu, rozm\u00f3w i wideokonferencji uruchomiona na serwerze, kt\u00f3rym zarz\u0105dza firma (w\u0142asnym albo dzier\u017cawionym VPS). Wiadomo\u015bci, nagrania i transkrypcje le\u017c\u0105 w jej infrastrukturze, a nie w chmurze dostawcy SaaS.<\/p>\n  <p>R\u00f3\u017cnica nie dotyczy tylko storage locations danych. Przy w\u0142asnym wdro\u017ceniu firma decyduje o retencji nagra\u0144, o tym, kto ma do nich dost\u0119p, i o tym, jakie narz\u0119dzia (np. modele AI) mog\u0105 je przetwarza\u0107. W gotowych us\u0142ugach te decyzje podejmuje dostawca w regulaminie.<\/p>\n  <p>Self-hosted messenger dla firmy nie musi oznacza\u0107 pisania wszystkiego od zera. Rozs\u0105dne wdro\u017cenie sk\u0142ada si\u0119 z dojrza\u0142ych komponent\u00f3w open source (serwer medi\u00f3w, baza danych, kolejki) i w\u0142asnej warstwy aplikacji, kt\u00f3ra odpowiada na konkretne potrzeby zespo\u0142u.<\/p>\n\n  <h3>Alternatywa dla Slacka i Google Meet: kiedy warto j\u0105 rozwa\u017cy\u0107<\/h3>\n  <p>Dla wi\u0119kszo\u015bci firm gotowe narz\u0119dzia wystarcz\u0105. W\u0142asne rozwi\u0105zanie zaczyna mie\u0107 sens w trzech sytuacjach, kt\u00f3re cz\u0119sto wyst\u0119puj\u0105 razem:<\/p>\n  <ul>\n    <li>rozmowy z klientami s\u0105 danymi, kt\u00f3rych nie chcesz oddawa\u0107 (nagrania, transkrypcje, notatki sprzeda\u017cowe),<\/li>\n    <li>zesp\u00f3\u0142 korzysta r\u00f3wnolegle z kilku narz\u0119dzi i p\u0142aci za ka\u017cde per u\u017cytkownik,<\/li>\n    <li>chcesz, \u017ceby AI pracowa\u0142o na Twoim playbooku i danych z CRM w trakcie rozmowy, a nie tylko podsumowywa\u0142o j\u0105 po fakcie.<\/li>\n  <\/ul>\n  <p>W opisanym wy\u017cej wdro\u017ceniu zesp\u00f3\u0142 pracowa\u0142 na czterech narz\u0119dziach: TeamSpeak do g\u0142osu, Slack i Discord do czatu, Google Meet do spotka\u0144 z klientami i osobne nagrywanie. Cztery loginy, cztery zestawy powiadomie\u0144, a ustalenia gin\u0119\u0142y mi\u0119dzy nimi. JSONMeet zast\u0105pi\u0142 je jedn\u0105 aplikacj\u0105.<\/p>\n\n  <table>\n    <thead>\n      <tr><th>Issue<\/th><th>Gotowe narz\u0119dzia SaaS<\/th><th>Self-hosted messenger<\/th><\/tr>\n    <\/thead>\n    <tbody>\n      <tr><td>Recordings and transcripts<\/td><td>in the provider's cloud, retention on its terms<\/td><td>on the company's server, with retention set by you<\/td><\/tr>\n      <tr><td>Billing<\/td><td>abonament per u\u017cytkownik w ka\u017cdym narz\u0119dziu<\/td><td>koszt serwera i utrzymania, niezale\u017cny od liczby os\u00f3b<\/td><\/tr>\n      <tr><td>AI during the call<\/td><td>limited to the vendor's features<\/td><td>dowolny model, w\u0142asny playbook, dane z CRM<\/td><\/tr>\n      <tr><td>Maintenance<\/td><td>on the vendor's side<\/td><td>handled by the company or a technical partner<\/td><\/tr>\n      <tr><td>Launch<\/td><td>immediately<\/td><td>projekt i wdro\u017cenie (tu: 8 tygodni)<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n\n  <h3>Nagrywanie rozm\u00f3w na w\u0142asnym serwerze: wymagania, kt\u00f3re warto spisa\u0107<\/h3>\n  <p>Zanim powstanie pierwsza linia kodu, warto spisa\u0107 wymagania biznesowe. W opisanym projekcie by\u0142y to: jedna aplikacja, w\u0142asny serwer, klient wchodzi z linku bez konta i instalacji, udost\u0119pnianie ekranu wystarczaj\u0105ce do pokazania interfejsu w 4K oraz nagrywanie z wyra\u017an\u0105 informacj\u0105 dla wszystkich uczestnik\u00f3w.<\/p>\n  <p>Z tego wynikaj\u0105 konkretne funkcje. Go\u015b\u0107 trafia do poczekalni i nie \u0142\u0105czy si\u0119 z serwerem medi\u00f3w, dop\u00f3ki gospodarz go nie wpu\u015bci. Nagranie powstaje po stronie serwera do pliku MP4, a baner \u201eNagrywanie\u201d jest widoczny przez ca\u0142\u0105 rozmow\u0119. Lista nagra\u0144 ma retencj\u0119 z automatycznym kasowaniem, konfigurowan\u0105 od 7 dni do bez limitu.<\/p>\n  <p>Ten ostatni punkt ma znaczenie przy RODO. Je\u015bli nagrania le\u017c\u0105 u Ciebie, nie potrzebujesz kolejnej umowy powierzenia za ka\u017cdym razem, gdy chcesz je transkrybowa\u0107 albo analizowa\u0107 innym narz\u0119dziem.<\/p>\n\n  <h3>Architektura: WebRTC, serwer medi\u00f3w i firewalle klient\u00f3w<\/h3>\n  <p>Rdzeniem ka\u017cdego komunikatora z wideo jest serwer medi\u00f3w SFU, kt\u00f3ry odbiera strumienie od uczestnik\u00f3w i rozsy\u0142a je dalej. W JSONMeet jest to samodzielnie postawiony LiveKit w wersji open source: SFU dla d\u017awi\u0119ku i wideo, Egress do nagrywania, Ingress do przyjmowania strumienia z aplikacji prezentera.<\/p>\n  <p>Najcz\u0119stsze ryzyko przy self-hostingu WebRTC to firmowy firewall po stronie klienta. Trzeba je zaplanowa\u0107 od pocz\u0105tku. Tu serwer ma wbudowany TURN po TLS na porcie 5349 i awaryjny transport po TCP, a na najbardziej restrykcyjne sieci przewidziano drugi adres IP z TURN na porcie 443, kt\u00f3ry dla firewalla wygl\u0105da jak zwyk\u0142y ruch HTTPS.<\/p>\n  <p>Druga decyzja to jako\u015b\u0107 obrazu. Kamera idzie w VP9 z trzema warstwami jako\u015bci, ekran w H.264 simulcast, wi\u0119c odbiorca ze s\u0142abszym \u0142\u0105czem dostaje l\u017cejsz\u0105 warstw\u0119 bez pogarszania obrazu innym. Do prezentacji studyjnych osobna aplikacja koduje obraz sprz\u0119towo i wysy\u0142a go protoko\u0142em WHIP bez rekompresji na serwerze. Presety si\u0119gaj\u0105 4K30 i 1440p60.<\/p>\n\n  <h3>AI prompter for sales reps: AI during the call, not after it<\/h3>\n  <p>Podsumowanie spotkania po fakcie niewiele pomaga handlowcowi, kt\u00f3ry s\u0142yszy obiekcj\u0119 i ma kilka sekund na odpowied\u017a. Dlatego w opisanym wdro\u017ceniu transkrypcja rozmowy trafia na \u017cywo do modelu j\u0119zykowego razem z playbookiem firmy: macierz\u0105 26 obiekcji, zasadami negocjacji cenowych i briefem o firmie.<\/p>\n  <p>Przed rozmow\u0105 handlowiec wybiera leada z CRM, a sufler dostaje jego kontekst. W trakcie pokazuje wykryt\u0105 obiekcj\u0119, propozycj\u0119 odpowiedzi, pytania do zadania i wska\u017anik gotowo\u015bci do domkni\u0119cia w skali 0 do 100. Klient tego panelu nie widzi. Po rozmowie dost\u0119pna jest analiza, scorecard i wyszukiwanie po transkrypcjach.<\/p>\n  <p>Wa\u017cny szczeg\u00f3\u0142: transkrypcja i model dzia\u0142aj\u0105 na w\u0142asnych serwerach GPU, po\u0142\u0105czonych z serwerem aplikacji sieci\u0105 prywatn\u0105. Tre\u015b\u0107 rozm\u00f3w nie trafia do zewn\u0119trznego dostawcy AI. Jedno wej\u015bcie do modelu dla wszystkich funkcji AI sprawia, \u017ce zmiana modelu to zmiana konfiguracji.<\/p>\n\n  <h3>Utrzymanie komunikatora self-hosted bez zespo\u0142u DevOps<\/h3>\n  <p>Cz\u0119ste pytanie brzmi: kto b\u0119dzie to utrzymywa\u0142. Odpowied\u017a zale\u017cy od tego, jak prosto zaprojektujesz produkcj\u0119. JSONMeet dzia\u0142a na jednym VPS w Warszawie (8 vCPU, 16 GB RAM) z us\u0142ugami pod systemd, bez Dockera i orkiestratora. Wdro\u017cenie to jeden skrypt: archiwum z gita, build, migracje bazy, restart us\u0142ug.<\/p>\n  <p>Taki serwer w te\u015bcie obs\u0142u\u017cy\u0142 pok\u00f3j z oko\u0142o 30 uczestnikami, z czego 10 nadawa\u0142o obraz, przy obci\u0105\u017ceniu CPU poni\u017cej 50%. Ping z Polski wynosi oko\u0142o 10 ms. Aplikacja desktopowa w Electronie pobiera aktualizacje interfejsu z serwera, wi\u0119c nie trzeba jej r\u0119cznie aktualizowa\u0107 na ka\u017cdym komputerze.<\/p>\n  <p>Dla firm, kt\u00f3re nie chc\u0105 prowadzi\u0107 serwera samodzielnie, rozs\u0105dn\u0105 opcj\u0105 jest instancja utrzymywana przez partnera technicznego. Dane nadal zostaj\u0105 w dedykowanej infrastrukturze, a odpowiedzialno\u015b\u0107 za aktualizacje i bezpiecze\u0144stwo jest opisana w umowie.<\/p>\n  <p>Przed decyzj\u0105 warto policzy\u0107 trzy rzeczy: ile os\u00f3b i narz\u0119dzi obejmie zmiana, jak cenne s\u0105 dla Ciebie nagrania rozm\u00f3w oraz czy AI ma dzia\u0142a\u0107 na Twoich danych. Je\u015bli odpowiedzi wskazuj\u0105 na kontrol\u0119 nad danymi, komunikator self-hosted dla firmy jest wart rozwa\u017cenia.<\/p>\n\n  <p class=\"cs-seo-links\">We design similar systems as part of <a href=\"https:\/\/jsoncrew.com\/oferta\/aplikacje-webowe\/\">aplikacji webowych na zam\u00f3wienie<\/a>, a funkcje oparte na modelach j\u0119zykowych, takie jak sufler, w ramach <a href=\"https:\/\/jsoncrew.com\/oferta\/wdrozenia-ai\/\">wdro\u017ce\u0144 AI<\/a>; po\u0142\u0105czenie komunikatora z CRM opisujemy przy <a href=\"https:\/\/jsoncrew.com\/oferta\/integracje-erp-crm\/\">ERP and CRM integrations<\/a>.<\/p>\n<\/section>\n\n<h2>Trzy pytania, kt\u00f3re s\u0142yszymy, gdy pokazujemy JSONMeet.<\/h2>\n\n<div class=\"jh-faq jm-faq\">\n<details class=\"jm-faq-item\"><summary>Po co w\u0142asny komunikator, skoro Google Meet i Slack s\u0105 gotowe i tanie?<\/summary><p>Dla wi\u0119kszo\u015bci firm gotowe narz\u0119dzia wystarcz\u0105. W\u0142asne ma sens, gdy rozmowy z klientami s\u0105 danymi, kt\u00f3rych nie chcesz oddawa\u0107 (nagrania, transkrypcje, notatki sprzeda\u017cowe), gdy p\u0142acisz per u\u017cytkownik za cztery narz\u0119dzia naraz, albo gdy chcesz AI, kt\u00f3re dzia\u0142a na Twoim playbooku i Twoim CRM w trakcie rozmowy, nie po niej. JSONMeet powsta\u0142 z tych trzech powod\u00f3w jednocze\u015bnie.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>WebRTC za firmowym firewallem klienta nie zadzia\u0142a.<\/summary><p>To jest realne ryzyko i zaplanowali\u015bmy je od pierwszego dnia. Serwer medi\u00f3w ma wbudowany TURN po TLS na porcie 5349 i awaryjny transport po TCP. W scenariuszu najbardziej restrykcyjnej sieci klienta przewidziany jest drugi adres IP z TURN na porcie 443, kt\u00f3ry wygl\u0105da dla firewalla jak zwyk\u0142y ruch HTTPS. Go\u015b\u0107 wchodzi z przegl\u0105darki, bez instalacji.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>Kto to b\u0119dzie utrzymywa\u0142? Nie mamy zespo\u0142u DevOps.<\/summary><p>Produkcja to jeden VPS i sze\u015b\u0107 us\u0142ug pod systemd: serwer medi\u00f3w, API, reverse proxy, Redis oraz kontenery do nagrywania i przyjmowania strumienia. Wdro\u017cenie to jeden skrypt: archiwum z gita, build, migracje, restart. Nie ma orkiestratora, nie ma Docker Compose. Aplikacja desktopowa aktualizuje interfejs sama, z serwera. Dla klient\u00f3w zewn\u0119trznych oferujemy JSONMeet jako instancj\u0119 utrzymywan\u0105 przez nas.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>Czy sufler AI dzia\u0142a w trakcie rozmowy czy tylko po niej?<\/summary><p>W trakcie. Transkrypcja rozmowy leci na \u017cywo do modelu j\u0119zykowego uruchomionego na naszych GPU, z playbookiem 26 obiekcji i kontekstem leada pobranym z CRM. Sufler wykrywa obiekcje w wypowiedzi klienta, podpowiada gotowe odpowiedzi i pokazuje wska\u017anik gotowo\u015bci do domkni\u0119cia w skali 0\u2013100. Klient panelu suflera nie widzi. Analiza po fakcie (scorecard, wyszukiwanie po transkrypcjach) te\u017c jest, ale nie zast\u0119puje suflera na \u017cywo.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>Czy nagrania rozm\u00f3w zostaj\u0105 wy\u0142\u0105cznie na naszym serwerze?<\/summary><p>Tak, o to by\u0142a ca\u0142a gra. Nagranie do MP4 trafia na wolumen podpi\u0119ty do Waszego VPS-a. Retencja jest konfigurowana per plan (od 7 dni do bez limitu). Klient s\u0142yszy komunikat o nagrywaniu i widzi banner \u201eNagrywanie\u201d przez ca\u0142y czas trwania rozmowy. Ani nagrania, ani transkrypcje nie opuszczaj\u0105 Waszej infrastruktury \u2014 nie ma zewn\u0119trznego dostawcy chmurowego.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>Ile kosztuje self-hosting JSONMeet w por\u00f3wnaniu z op\u0142atami za Slack + Meet + TeamSpeak?<\/summary><p>Zale\u017cy od zespo\u0142u, ale zwrot z inwestycji w JSONMeet zaczyna si\u0119 typowo od 8\u201315 os\u00f3b, gdy koszty per-user w gotowych narz\u0119dziach zaczynaj\u0105 si\u0119 sumowa\u0107. Konkretny rachunek zale\u017cy od tego, kt\u00f3rych modu\u0142\u00f3w potrzebujesz \u2014 przelicz kalkulatorem poni\u017cej. W ofercie mamy te\u017c instancj\u0119 zarz\u0105dzan\u0105 przez nas, je\u015bli nie chcecie w\u0142asnego DevOps.<\/p><\/details>\n<details class=\"jm-faq-item\"><summary>Czy JSONMeet zast\u0119puje CRM i narz\u0119dzia sprzeda\u017cowe?<\/summary><p>Nie. JSONMeet to warstwa komunikacyjna, kt\u00f3ra integruje si\u0119 z Waszym CRM (Pipedrive, HubSpot, Salesforce, w\u0142asne API). Kontekst leada z CRM zasila suflera przed rozmow\u0105, a wynik rozmowy (transkrypcja, scorecard, notatka) wraca do CRM po jej zako\u0144czeniu. Rozmowa sprzeda\u017cowa jest w JSONMeet, dane o leadzie s\u0105 w CRM \u2014 i te dwa systemy rozmawiaj\u0105 ze sob\u0105 po REST.<\/p><\/details>\n<\/div>\n\n<!-- LINKI WEWN\u0118TRZNE -->\n<div class=\"jm-related\">\n  <h3>Czytaj te\u017c<\/h3>\n  <ul>\n    <li><a href=\"\/2026\/09\/03\/prywatny-llm-w-firmie-on-premise\/\">Private LLM in a company: on-premise<\/a>: kiedy trzymanie modelu i danych na w\u0142asnym sprz\u0119cie daje sens finansowy i compliance&#8217;owy<\/li>\n    <li><a href=\"\/2026\/09\/08\/agent-ai-sprzedaz-b2b-6-zadan-handlowca\/\">Agent AI w sprzeda\u017cy B2B: 6 zada\u0144 handlowca<\/a>: co dok\u0142adnie AI mo\u017ce zdj\u0105\u0107 z handlowca w trakcie i po rozmowie<\/li>\n    <li><a href=\"\/2026\/08\/19\/automatyzacja-dzialu-sprzedazy-b2b\/\">Automatyzacja dzia\u0142u sprzeda\u017cy B2B<\/a>: od pierwszego kontaktu po zamkni\u0119cie \u2014 gdzie AI faktycznie przyspiesza<\/li>\n    <li><a href=\"\/2026\/09\/14\/ile-kosztuje-wdrozenie-ai-w-firmie-b2b-2026-parp-roi\/\">Ile kosztuje wdro\u017cenie AI w firmie B2B<\/a>: benchmarki koszt\u00f3w, ROI, dotacje PARP<\/li>\n    <li><a href=\"\/case-studies\/app-smart-control\/\">KG Elektronik \u2014 App Smart Control<\/a>: siostrzana dedykowana aplikacja webowa JSON Crew (12 tys. pod\u0142\u0105czonych kot\u0142\u00f3w)<\/li>\n    <li><a href=\"\/case-studies\/json-hub-biuro-rachunkowe-krakow\/\">JSON Hub: accounting office from Krakow<\/a>: drugi produkt w\u0142asny JSON Crew, kt\u00f3rego CRM zasila suflera<\/li>\n  <\/ul>\n<\/div>\n\n<div class=\"jh-calc-wrap\" id=\"calc-wrapper-jm\">\n<h3>Policz koszt wdro\u017cenia<\/h3>\n<p class=\"jh-calc-intro\">Wybierz zakres wdro\u017cenia JSONMeet w firmie. Cena jednorazowa obejmuje instalacj\u0119 na Waszym serwerze, konfiguracj\u0119 modu\u0142\u00f3w i szkolenie zespo\u0142u. Subskrypcja miesi\u0119czna pokrywa hosting, patche bezpiecze\u0144stwa i aktualizacje.<\/p>\n\n<div class=\"jh-calc-step calc-step\">\n  <div class=\"jh-calc-step-label calc-step-label\"><span class=\"jh-calc-step-num calc-step-num\">Step 1<\/span><strong>Modu\u0142y JSONMeet<\/strong><em class=\"jh-calc-step-hint calc-step-hint\">wybierz zestaw funkcji, kt\u00f3rych faktycznie u\u017cywacie<\/em><\/div>\n  <div class=\"jh-calc-options-list calc-options-list\">\n    <div class=\"jh-calc-option-wrap calc-option-wrap\" data-price=\"18000\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-tpl-chat\">\n    <input type=\"checkbox\" class=\"jh-calc-tpl-check calc-tpl-check\" id=\"jm-tpl-chat\" data-price=\"18000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Komunikator (kana\u0142y, czat, DM-y)<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">uk\u0142ad jak w Discordzie, workspace, wyszukiwarka<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-tpl-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-option-wrap\" data-price=\"8000\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-tpl-meet\">\n    <input type=\"checkbox\" class=\"jh-calc-tpl-check calc-tpl-check\" id=\"jm-tpl-meet\" data-price=\"8000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Customer Meetings + Recording<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">pok\u00f3j pod linkiem, poczekalnia, nagrania MP4<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-tpl-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-option-wrap\" data-price=\"6000\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-tpl-hq\">\n    <input type=\"checkbox\" class=\"jh-calc-tpl-check calc-tpl-check\" id=\"jm-tpl-hq\" data-price=\"6000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">HQ Presenter (4K desktop app)<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">OBS\/GStreamer, WHIP, bez rekompresji na serwerze<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-tpl-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-option-wrap\" data-price=\"15000\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-tpl-sufler\">\n    <input type=\"checkbox\" class=\"jh-calc-tpl-check calc-tpl-check\" id=\"jm-tpl-sufler\" data-price=\"15000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Sufler AI dla handlowca<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">transkrypcja na \u017cywo, playbook obiekcji, kontekst z CRM<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-tpl-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"jh-calc-step calc-step\">\n  <div class=\"jh-calc-step-label calc-step-label\"><span class=\"jh-calc-step-num calc-step-num\">Step 2<\/span><strong>Integrations<\/strong><em class=\"jh-calc-step-hint calc-step-hint\">\u017ceby sufler dosta\u0142 kontekst leada, a nagrania trafi\u0142y tam, gdzie nale\u017c\u0105<\/em><\/div>\n  <div class=\"jh-calc-options-list calc-options-list\">\n    <div class=\"jh-calc-option-wrap calc-int-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-int-crm\">\n    <input type=\"checkbox\" class=\"jh-calc-int-check calc-int-check\" id=\"jm-int-crm\" data-price=\"4500\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Customer Relationship Management<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">Pipedrive, HubSpot, Salesforce, w\u0142asny CRM po REST<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-int-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-int-calendar\">\n    <input type=\"checkbox\" class=\"jh-calc-int-check calc-int-check\" id=\"jm-int-calendar\" data-price=\"2500\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Kalendarz Google\/Outlook<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">linki do spotka\u0144 z zaproszenia w kalendarzu<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-int-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-int-booking\">\n    <input type=\"checkbox\" class=\"jh-calc-int-check calc-int-check\" id=\"jm-int-booking\" data-price=\"3000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">CalendarBook \/ system rezerwacji<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">client books a slot, gets a link to JSONMeet<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n<div class=\"jh-calc-option-wrap calc-int-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-int-sso\">\n    <input type=\"checkbox\" class=\"jh-calc-int-check calc-int-check\" id=\"jm-int-sso\" data-price=\"5000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">LDAP \/ SSO<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">Google Workspace, Microsoft Entra, Okta<\/div>\n    <\/div>\n  <\/label>\n  <div class=\"jh-calc-qty-wrap calc-int-qty-wrap\"><em class=\"jh-calc-qty-label-sm calc-qty-label-sm\">Ilo\u015b\u0107:<\/em><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"-\">\u2212<\/button><span class=\"jh-calc-qty-val calc-qty-val\">1<\/span><button type=\"button\" class=\"jh-calc-qty-btn calc-qty-btn\" aria-label=\"+\">+<\/button><\/div>\n<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"jh-calc-step calc-step\">\n  <div class=\"jh-calc-step-label calc-step-label\"><span class=\"jh-calc-step-num calc-step-num\">Step 3<\/span><strong>Wdro\u017cenie i szkolenia<\/strong><em class=\"jh-calc-step-hint calc-step-hint\">setup Waszego serwera i przeszkolenie zespo\u0142u handlowego<\/em><\/div>\n  <div class=\"jh-calc-options-list calc-options-list\">\n    <div class=\"jh-calc-option-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-addon-deploy\">\n    <input type=\"checkbox\" class=\"jh-calc-addon-check calc-addon-check\" id=\"jm-addon-deploy\" data-price=\"4000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Wdro\u017cenie on-premise<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">setup VPS\/serwera Waszego + konfiguracja us\u0142ug pod systemd<\/div>\n    <\/div>\n  <\/label>\n<\/div>\n<div class=\"jh-calc-option-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-addon-train\">\n    <input type=\"checkbox\" class=\"jh-calc-addon-check calc-addon-check\" id=\"jm-addon-train\" data-price=\"3000\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Szkolenie zespo\u0142u handlowego (1 dzie\u0144)<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">jak u\u017cywa\u0107 suflera, jak nagrywa\u0107, jak dzieli\u0107 si\u0119 linkiem<\/div>\n    <\/div>\n  <\/label>\n<\/div>\n<div class=\"jh-calc-option-wrap\">\n  <label class=\"jh-calc-option calc-option calc-option--check\" for=\"jm-addon-support\">\n    <input type=\"checkbox\" class=\"jh-calc-addon-check calc-addon-check\" id=\"jm-addon-support\" data-price=\"1500\">\n    <div class=\"jh-calc-option-body calc-option-body\">\n      <div class=\"jh-calc-option-name calc-option-name\">Pakiet 4h wsparcia w pierwszym miesi\u0105cu<\/div>\n      <div class=\"jh-calc-option-desc calc-option-desc\">strojenie modelu, playbook obiekcji, integracje<\/div>\n    <\/div>\n  <\/label>\n<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"jh-calc-summary\" id=\"jm-calc-summary\">\n  <div class=\"jh-calc-summary-row calc-summary-row\" id=\"jm-row-onboarding\" hidden><span id=\"jm-row-onboarding-label\">Wdro\u017cenie<\/span><strong id=\"jm-row-onboarding-price\">0 z\u0142<\/strong><\/div>\n  <div class=\"jh-calc-summary-row calc-summary-row\" id=\"jm-row-integrations\" hidden><span id=\"jm-row-integrations-label\">Integrations<\/span><strong id=\"jm-row-integrations-price\">0 z\u0142<\/strong><\/div>\n  <div class=\"jh-calc-summary-row calc-summary-row\" id=\"jm-row-addons\" hidden><span>Szkolenia i wsparcie<\/span><strong id=\"jm-row-addons-price\">0 z\u0142<\/strong><\/div>\n  <div class=\"jh-calc-total-line calc-total-line\"><span>Razem jednorazowo<\/span><strong id=\"jm-total-onetime\">0 z\u0142<\/strong><\/div>\n  <button type=\"button\" class=\"jh-calc-cta\" id=\"jm-calc-cta\">Poka\u017c wycen\u0119 i porozmawiajmy<\/button>\n<\/div>\n\n<div class=\"jh-calc-form-panel\" id=\"jm-calc-form-panel\" hidden>\n  <span class=\"jh-calc-form-badge\" id=\"jm-calc-form-badge\">400 z\u0142\/mies. (hosting i utrzymanie) + 0 z\u0142 jednorazowo<\/span>\n  <form id=\"jm-calc-form\">\n    <input type=\"hidden\" name=\"action\" value=\"jshub_calc_lead\">\n    <input type=\"hidden\" name=\"source_page\" value=\"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/\">\n    <input type=\"hidden\" name=\"calc_total_onetime\" id=\"jm-calc-total-hidden\" value=\"0\">\n    <textarea name=\"calc_summary_text\" id=\"jm-calc-summary-text\" hidden><\/textarea>\n    <label for=\"jm-f-nip\">Company TIN <em style=\"color:#dc2626\">*<\/em><\/label>\n    <input type=\"text\" id=\"jm-f-nip\" name=\"nip\" autocomplete=\"off\">\n    <span class=\"jh-calc-field-error calc-field-error\" id=\"jm-err-nip\"><\/span>\n    <label for=\"jm-f-email\">E-mail <em style=\"color:#dc2626\">*<\/em><\/label>\n    <input type=\"email\" id=\"jm-f-email\" name=\"email\" autocomplete=\"email\">\n    <span class=\"jh-calc-field-error calc-field-error\" id=\"jm-err-email\"><\/span>\n    <label for=\"jm-f-tel\">Phone <em style=\"color:#dc2626\">*<\/em><\/label>\n    <input type=\"tel\" id=\"jm-f-tel\" name=\"tel\" autocomplete=\"tel\">\n    <span class=\"jh-calc-field-error calc-field-error\" id=\"jm-err-tel\"><\/span>\n    <label class=\"jh-privacy\"><input type=\"checkbox\" name=\"privacy\" value=\"1\"> Akceptuj\u0119 <a href=\"\/polityka-prywatnosci\/\" target=\"_blank\" rel=\"noopener\">polityk\u0119 prywatno\u015bci<\/a> i zgadzam si\u0119 na kontakt handlowy.<\/label>\n    <span class=\"jh-calc-field-error calc-field-error\" id=\"jm-err-privacy\"><\/span>\n    <div class=\"jh-calc-form-actions\">\n      <button type=\"button\" class=\"jh-calc-back\" id=\"jm-calc-back\">Wr\u00f3\u0107<\/button>\n      <button type=\"submit\" class=\"jh-calc-submit\" id=\"jm-calc-submit\">Wy\u015blij zapytanie<\/button>\n    <\/div>\n  <\/form>\n  <div class=\"jh-calc-success\" id=\"jm-calc-success\" hidden>\n    <strong>Dzi\u0119kujemy!<\/strong>\n    Wycena wraz z Twoimi danymi wp\u0142yn\u0119\u0142a do nas. Odezwiemy si\u0119 w ci\u0105gu 24 godzin (dni robocze) z propozycj\u0105 terminu 30-minutowej rozmowy diagnostycznej.\n  <\/div>\n<\/div>\n\n<\/div>\n\n<script>\n(function () {\n  var AJAX_URL = '\/wp-admin\/admin-ajax.php';\n  var pfx = 'jm';\n  var wrapper = document.getElementById('calc-wrapper-' + pfx);\n  if (!wrapper) return;\n  function byId(id) { return document.getElementById(id); }\n  function fmt(n) { return Number(n).toLocaleString('pl-PL') + ' z\u0142'; }\n  var MONTHLY_LABEL = '400 z\u0142\/mies. (hosting i utrzymanie)';\n  var tplWraps = wrapper.querySelectorAll('.calc-option-wrap[data-price]');\n  tplWraps.forEach(function(wrap) {\n    var inp = wrap.querySelector('.calc-tpl-check');\n    var qtyWrap = wrap.querySelector('.calc-tpl-qty-wrap');\n    var qtyVal = wrap.querySelector('.calc-qty-val');\n    var btns = wrap.querySelectorAll('.calc-qty-btn');\n    var qty = 1;\n    inp.addEventListener('change', function() {\n      inp.closest('.calc-option').classList.toggle('is-selected', inp.checked);\n      if (inp.checked) { qtyWrap.classList.add('is-open'); qty = 1; qtyVal.textContent = '1'; }\n      else { qtyWrap.classList.remove('is-open'); }\n      recalc();\n    });\n    btns[0].addEventListener('click', function() { if (qty > 1) { qty--; qtyVal.textContent = qty; recalc(); } });\n    btns[1].addEventListener('click', function() { if (qty < 10) { qty++; qtyVal.textContent = qty; recalc(); } });\n  });\n  var intWraps = wrapper.querySelectorAll('.calc-int-wrap');\n  intWraps.forEach(function(wrap) {\n    var inp = wrap.querySelector('.calc-int-check');\n    var qtyWrap = wrap.querySelector('.calc-int-qty-wrap');\n    var qtyVal = wrap.querySelector('.calc-qty-val');\n    var btns = wrap.querySelectorAll('.calc-qty-btn');\n    var qty = 1;\n    inp.addEventListener('change', function() {\n      inp.closest('.calc-option').classList.toggle('is-selected', inp.checked);\n      if (inp.checked) { qtyWrap.classList.add('is-open'); qty = 1; qtyVal.textContent = '1'; }\n      else { qtyWrap.classList.remove('is-open'); }\n      recalc();\n    });\n    btns[0].addEventListener('click', function() { if (qty > 1) { qty--; qtyVal.textContent = qty; recalc(); } });\n    btns[1].addEventListener('click', function() { if (qty < 10) { qty++; qtyVal.textContent = qty; recalc(); } });\n  });\n  wrapper.querySelectorAll('.calc-addon-check').forEach(function(c) {\n    c.addEventListener('change', function() {\n      c.closest('.calc-option').classList.toggle('is-selected', c.checked);\n      recalc();\n    });\n  });\n  function recalc() {\n    var tplTotal = 0, tplTotalQty = 0, tplParts = [];\n    tplWraps.forEach(function(wrap) {\n      var inp = wrap.querySelector('.calc-tpl-check');\n      if (!inp.checked) return;\n      var price = parseInt(wrap.getAttribute('data-price')) || 0;\n      var qty = parseInt(wrap.querySelector('.calc-qty-val').textContent) || 1;\n      tplTotal += price * qty;\n      tplTotalQty += qty;\n      var name = wrap.querySelector('.calc-option-name').textContent;\n      tplParts.push(name + (qty > 1 ? ' \u00d7' + qty : ''));\n    });\n    var tplDiscountPct = tplTotalQty >= 5 ? 20 : (tplTotalQty >= 3 ? 10 : 0);\n    var tplDiscount = tplDiscountPct > 0 ? Math.round(tplTotal * tplDiscountPct \/ 100) : 0;\n    var tplNet = tplTotal - tplDiscount;\n    var intTotal = 0, intTotalQty = 0, intParts = [];\n    intWraps.forEach(function(wrap) {\n      var inp = wrap.querySelector('.calc-int-check');\n      if (!inp.checked) return;\n      var price = parseInt(inp.getAttribute('data-price')) || 0;\n      var qty = parseInt(wrap.querySelector('.calc-qty-val').textContent) || 1;\n      intTotal += price * qty;\n      intTotalQty += qty;\n      var name = wrap.querySelector('.calc-option-name').textContent;\n      intParts.push(name + (qty > 1 ? ' \u00d7' + qty : ''));\n    });\n    var intDiscountPct = intTotalQty >= 5 ? 20 : (intTotalQty >= 3 ? 10 : 0);\n    var intDiscount = intDiscountPct > 0 ? Math.round(intTotal * intDiscountPct \/ 100) : 0;\n    var intNet = intTotal - intDiscount;\n    var addonTotal = 0, addonParts = [];\n    wrapper.querySelectorAll('.calc-addon-check:checked').forEach(function(c) {\n      addonTotal += parseInt(c.getAttribute('data-price')) || 0;\n      addonParts.push(c.closest('.calc-option').querySelector('.calc-option-name').textContent);\n    });\n    var onetime = tplNet + intNet + addonTotal;\n    var rowOnb = byId(pfx + '-row-onboarding');\n    var rowInt = byId(pfx + '-row-integrations');\n    var rowAddons = byId(pfx + '-row-addons');\n    if (tplNet > 0) { byId(pfx + '-row-onboarding-price').textContent = fmt(tplNet); rowOnb.removeAttribute('hidden'); } else { rowOnb.setAttribute('hidden', ''); }\n    if (intNet > 0) { byId(pfx + '-row-integrations-price').textContent = fmt(intNet); rowInt.removeAttribute('hidden'); } else { rowInt.setAttribute('hidden', ''); }\n    if (addonTotal > 0) { byId(pfx + '-row-addons-price').textContent = fmt(addonTotal); rowAddons.removeAttribute('hidden'); } else { rowAddons.setAttribute('hidden', ''); }\n    byId(pfx + '-total-onetime').textContent = fmt(onetime);\n    byId(pfx + '-calc-total-hidden').value = onetime;\n    var badge = byId(pfx + '-calc-form-badge');\n    if (badge) badge.textContent = MONTHLY_LABEL + ' + ' + fmt(onetime) + ' jednorazowo';\n    var lines = ['Subskrypcja: ' + MONTHLY_LABEL];\n    tplParts.forEach(function(p) { lines.push('Wdro\u017cenie: ' + p); });\n    if (tplDiscount > 0) lines.push('Rabat na wdro\u017cenie (' + tplDiscountPct + '%): -' + tplDiscount + ' z\u0142');\n    intParts.forEach(function(p) { lines.push('Integracja: ' + p); });\n    if (intDiscount > 0) lines.push('Rabat na integracje (' + intDiscountPct + '%): -' + intDiscount + ' z\u0142');\n    addonParts.forEach(function(p) { lines.push('Szkolenie\/wsparcie: ' + p); });\n    lines.push('Razem jednorazowo: ' + onetime + ' z\u0142');\n    byId(pfx + '-calc-summary-text').value = lines.join('\\n');\n  }\n  byId(pfx + '-calc-cta').addEventListener('click', function() {\n    byId(pfx + '-calc-summary').setAttribute('hidden', '');\n    byId(pfx + '-calc-form-panel').removeAttribute('hidden');\n  });\n  byId(pfx + '-calc-back').addEventListener('click', function() {\n    byId(pfx + '-calc-form-panel').setAttribute('hidden', '');\n    byId(pfx + '-calc-summary').removeAttribute('hidden');\n  });\n  byId(pfx + '-calc-form').addEventListener('submit', function(e) {\n    e.preventDefault();\n    var form = this;\n    var nip = byId(pfx + '-f-nip');\n    var email = byId(pfx + '-f-email');\n    var tel = byId(pfx + '-f-tel');\n    var privacy = form.querySelector('input[name=\"privacy\"]');\n    byId(pfx + '-err-nip').textContent = nip.value.trim() ? '' : 'NIP jest wymagany.';\n    byId(pfx + '-err-email').textContent = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email.value.trim()) ? '' : 'Podaj prawid\u0142owy e-mail.';\n    byId(pfx + '-err-tel').textContent = tel.value.trim() ? '' : 'Telefon jest wymagany.';\n    byId(pfx + '-err-privacy').textContent = privacy.checked ? '' : 'Wymagana zgoda.';\n    if (byId(pfx+'-err-nip').textContent || byId(pfx+'-err-email').textContent || byId(pfx+'-err-tel').textContent || byId(pfx+'-err-privacy').textContent) return;\n    var btn = byId(pfx + '-calc-submit');\n    btn.disabled = true; btn.textContent = 'Wysy\u0142am\u2026';\n    fetch(AJAX_URL, { method: 'POST', body: new FormData(form) })\n      .then(function(r) { return r.json(); })\n      .then(function(res) {\n        if (res.success) { form.style.display = 'none'; byId(pfx + '-calc-success').removeAttribute('hidden'); }\n        else { btn.disabled = false; btn.textContent = 'Wy\u015blij zapytanie'; alert(res.data && res.data.message ? res.data.message : 'B\u0142\u0105d wysy\u0142ania.'); }\n      })\n      .catch(function() { btn.disabled = false; btn.textContent = 'Wy\u015blij zapytanie'; alert('B\u0142\u0105d po\u0142\u0105czenia.'); });\n  });\n  recalc();\n})();\n<\/script>\n\n<!-- CTA -->\n<div class=\"jm-cta\">\n  <h3>Chcesz rozmowy z klientami na w\u0142asnym serwerze, z AI po Twojej stronie?<\/h3>\n  <p>Poka\u017cemy Ci JSONMeet na \u017cywo: wejdziesz jako go\u015b\u0107 przez poczekalni\u0119, zobaczysz suflera od strony handlowca. 30 minut, bez prezentacji sprzeda\u017cowej.<\/p>\n  <div class=\"jm-cta__btns\">\n    <a href=\"https:\/\/calendly.com\/jsoncrew\/diagnoza\" class=\"jm-cta__btn jm-cta__btn--primary\" target=\"_blank\" rel=\"noopener\">Um\u00f3w rozmow\u0119: 30 min<\/a>\n    <a href=\"\/oferta\/aplikacje-webowe\/\" class=\"jm-cta__btn jm-cta__btn--ghost\">Web applications<\/a>\n  <\/div>\n<\/div>\n\n<\/div>\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"Article\", \"headline\": \"JSONMeet: self-hosted komunikator z suflerem AI. 8 tygodni budowy\", \"description\": \"Case study JSONMeet \u2014 produkt w\u0142asny JSON Crew. Discord, TeamSpeak, Slack i Meet w jednym self-hosted narz\u0119dziu z transkrypcj\u0105 i suflerem AI na w\u0142asnych GPU. 8 tygodni od projektu do produkcji.\", \"image\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg\", \"width\": 1280, \"height\": 720}, \"author\": {\"@type\": \"Organization\", \"name\": \"JSON Crew\", \"url\": \"https:\/\/jsoncrew.com\/\"}, \"publisher\": {\"@type\": \"Organization\", \"name\": \"JSON Crew\", \"logo\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/03\/jsoncrew-logo.png\"}}, \"datePublished\": \"2026-09-15T10:00:00+02:00\", \"dateModified\": \"2026-09-15T10:00:00+02:00\", \"mainEntityOfPage\": {\"@type\": \"WebPage\", \"@id\": \"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/\"}, \"keywords\": \"self-hosted komunikator, sufler AI dla handlowca, LiveKit WebRTC, transkrypcja rozm\u00f3w on-premise, alternatywa Slack Meet TeamSpeak, JSONMeet\"}<\/script>\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"BreadcrumbList\", \"itemListElement\": [{\"@type\": \"ListItem\", \"position\": 1, \"name\": \"Strona g\u0142\u00f3wna\", \"item\": \"https:\/\/jsoncrew.com\/\"}, {\"@type\": \"ListItem\", \"position\": 2, \"name\": \"Case Studies\", \"item\": \"https:\/\/jsoncrew.com\/case-studies\/\"}, {\"@type\": \"ListItem\", \"position\": 3, \"name\": \"JSONMeet \u2014 komunikator z suflerem AI\", \"item\": \"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/\"}]}<\/script>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Case study JSONMeet \u2014 self-hosted komunikator z suflerem AI. Discord, TeamSpeak, Slack i Meet w jednym narz\u0119dziu na w\u0142asnym serwerze. 8 tygodni od projektu do produkcji.<\/p>","protected":false},"featured_media":2394,"template":"","meta":{"_acf_changed":false,"footnotes":""},"brevo_track":[],"class_list":["post-2336","case_studies","type-case_studies","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.8 (Yoast SEO v28.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Self-hosted messenger dla firmy: JSONMeet | JSON Crew<\/title>\n<meta name=\"description\" content=\"Komunikator self-hosted dla firmy: czat, spotkania i nagrania na w\u0142asnym serwerze plus sufler AI na \u017cywo. JSONMeet zast\u0105pi\u0142 4 narz\u0119dzia w 8 tygodni.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jsoncrew.com\/en\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JSONMeet: self-hosted komunikator z suflerem AI. 8 tygodni budowy\" \/>\n<meta property=\"og:description\" content=\"Discord, TeamSpeak, Slack i Meet w jednym self-hosted narz\u0119dziu z transkrypcj\u0105 i suflerem AI na w\u0142asnych GPU. Produkt w\u0142asny JSON Crew.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jsoncrew.com\/en\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"JSON Crew\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T21:16:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"JSONMeet: self-hosted komunikator z suflerem AI. 8 tygodni budowy\" \/>\n<meta name=\"twitter:description\" content=\"Discord, TeamSpeak, Slack i Meet w jednym self-hosted narz\u0119dziu z transkrypcj\u0105 i suflerem AI na w\u0142asnych GPU. Produkt w\u0142asny JSON Crew.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/\",\"url\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/\",\"name\":\"Self-hosted messenger dla firmy: JSONMeet | JSON Crew\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/jsoncrew.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/jsonmeet-hero.jpg\",\"datePublished\":\"2026-09-15T15:14:55+00:00\",\"dateModified\":\"2026-10-09T21:16:49+00:00\",\"description\":\"Self-hosted messenger dla firmy: czat, spotkania i nagrania na w\u0142asnym serwerze plus sufler AI na \u017cywo. JSONMeet zast\u0105pi\u0142 4 narz\u0119dzia w 8 tygodni.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/#primaryimage\",\"url\":\"https:\\\/\\\/jsoncrew.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/jsonmeet-hero.jpg\",\"contentUrl\":\"https:\\\/\\\/jsoncrew.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/jsonmeet-hero.jpg\",\"width\":1280,\"height\":720,\"caption\":\"JSONMeet: kana\u0142y g\u0142osowe, spotkania z klientem i sufler AI w jednym narz\u0119dziu na w\u0142asnym serwerze.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\\\/\\\/jsoncrew.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Case Studies\",\"item\":\"https:\\\/\\\/jsoncrew.com\\\/case-studies\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"JSONMeet. Slack, Meet i TeamSpeak w jednym, na w\u0142asnym serwerze.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jsoncrew.com\\\/#website\",\"url\":\"https:\\\/\\\/jsoncrew.com\\\/\",\"name\":\"JSON Crew: automations, configurators, interactive meeting rooms, interactive kiosks\",\"description\":\"automations, configurators, interactive conference rooms, interactive kiosks\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/jsoncrew.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Self-hosted messenger dla firmy: JSONMeet | JSON Crew","description":"Self-hosted messenger dla firmy: czat, spotkania i nagrania na w\u0142asnym serwerze plus sufler AI na \u017cywo. JSONMeet zast\u0105pi\u0142 4 narz\u0119dzia w 8 tygodni.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jsoncrew.com\/en\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/","og_locale":"en_US","og_type":"article","og_title":"JSONMeet: self-hosted komunikator z suflerem AI. 8 tygodni budowy","og_description":"Discord, TeamSpeak, Slack i Meet w jednym self-hosted narz\u0119dziu z transkrypcj\u0105 i suflerem AI na w\u0142asnych GPU. Produkt w\u0142asny JSON Crew.","og_url":"https:\/\/jsoncrew.com\/en\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/","og_site_name":"JSON Crew","article_modified_time":"2026-10-09T21:16:49+00:00","og_image":[{"url":"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_title":"JSONMeet: self-hosted komunikator z suflerem AI. 8 tygodni budowy","twitter_description":"Discord, TeamSpeak, Slack i Meet w jednym self-hosted narz\u0119dziu z transkrypcj\u0105 i suflerem AI na w\u0142asnych GPU. Produkt w\u0142asny JSON Crew.","twitter_image":"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg","twitter_misc":{"Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/","url":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/","name":"Self-hosted messenger dla firmy: JSONMeet | JSON Crew","isPartOf":{"@id":"https:\/\/jsoncrew.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/#primaryimage"},"image":{"@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg","datePublished":"2026-09-15T15:14:55+00:00","dateModified":"2026-10-09T21:16:49+00:00","description":"Self-hosted messenger dla firmy: czat, spotkania i nagrania na w\u0142asnym serwerze plus sufler AI na \u017cywo. JSONMeet zast\u0105pi\u0142 4 narz\u0119dzia w 8 tygodni.","breadcrumb":{"@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/#primaryimage","url":"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg","contentUrl":"https:\/\/jsoncrew.com\/wp-content\/uploads\/2026\/09\/jsonmeet-hero.jpg","width":1280,"height":720,"caption":"JSONMeet: kana\u0142y g\u0142osowe, spotkania z klientem i sufler AI w jednym narz\u0119dziu na w\u0142asnym serwerze."},{"@type":"BreadcrumbList","@id":"https:\/\/jsoncrew.com\/case-studies\/jsonmeet-komunikator-self-hosted-z-suflerem-ai\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/jsoncrew.com\/"},{"@type":"ListItem","position":2,"name":"Case Studies","item":"https:\/\/jsoncrew.com\/case-studies\/"},{"@type":"ListItem","position":3,"name":"JSONMeet. Slack, Meet i TeamSpeak w jednym, na w\u0142asnym serwerze."}]},{"@type":"WebSite","@id":"https:\/\/jsoncrew.com\/#website","url":"https:\/\/jsoncrew.com\/","name":"JSON Crew: automations, configurators, interactive meeting rooms, interactive kiosks","description":"automations, configurators, interactive conference rooms, interactive kiosks","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jsoncrew.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/case_studies\/2336","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/case_studies"}],"about":[{"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/types\/case_studies"}],"version-history":[{"count":6,"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/case_studies\/2336\/revisions"}],"predecessor-version":[{"id":2469,"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/case_studies\/2336\/revisions\/2469"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/media\/2394"}],"wp:attachment":[{"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/media?parent=2336"}],"wp:term":[{"taxonomy":"brevo_track","embeddable":true,"href":"https:\/\/jsoncrew.com\/en\/wp-json\/wp\/v2\/brevo_track?post=2336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}