Tehnološki stog
HansaChat je poslovni chat iz EU s operativnim slojem za terenske timove, koji je osmislila i izgradila te ga vodi jedna osoba. Ova stranica pokazuje od čega je izgrađen svaki dio i zašto je odabran.
Verzije i brojke provjerene su u listopadu 2026.
Prebrojeno u repozitorijima
- ConnectRPC servisa sa 179 RPC poziva, svi definirani u Protobufu
- 18
- Go binarne datoteke iz jedne baze koda: API, worker, outbox relay, administracija
- 4
- platformi iz jednog klijenta: web, macOS, Windows, Linux, iOS, Android
- 6
- jezika na javnom web-mjestu
- 22
- jezika sučelja u aplikaciji
- 23
- Playwright specifikacija za cjelovito (end-to-end) testiranje na izoliranom stogu
- 70
Kako se dijelovi uklapaju
Tri aplikacije dijele jedan rubni sloj i jedan klaster. Web-mjesto upravlja naplatom i registrom radnih prostora, pozadinski sustav u Go upravlja svime unutar radnog prostora, a web-aplikacija komunicira s pozadinskim sustavom putem generiranih ConnectRPC klijenata.
Klijenti
Preglednik
Web-mjesto i web-aplikacija
Tauri
Ljuske za stolna računala i mobilne uređaje
hansa CLI
Skripte i agenti
Rubni sloj
Bunny.net CDN
TLS, predmemoriranje, DDoS zaštita
IONOS Managed Kubernetes, Njemačka
Traefik
Ingress za svaku aplikaciju
Web-aplikacija Vue + Vite
Statični Vue build
Chat API
Go s ConnectRPC
- Worker
- Outbox relay
Web-mjesto Laravel + FrankenPHP
Naplata, registar, dodjela resursa
NATS JetStream
Trajne naredbe i događaji
Centrifugo
WebSocket distribucija
Valkey Sentinel + HAProxy
Predmemorija, prisutnost, sesije
LiveKit
Mediji poziva
Upravljani podaci na IONOS-u
MariaDB
Jedna baza podataka po radnom prostoru plus središnji registar
Objektna pohrana S3
Datoteke i avatari
Vanjske usluge
ElevenLabs · LLM · Clef
Transkripcija, prijevod, trijaža
Creem · EmailLabs
Plaćanja i e-pošta
Izvan klastera
Cloudflare Workers D1
Vanjske provjere statusa
Bunny Storage restic
Šifrirane sigurnosne kopije u Frankfurtu i Stockholmu
Put jedne poruke
- Klijent poziva servis za poruke putem ConnectRPC-a.
- API prihvaća zahtjev tek nakon što NATS JetStream trajno pohrani naredbu.
- Worker u jednoj transakciji zapisuje poruku i outbox događaj u bazu podataka radnog prostora.
- Outbox relay objavljuje potvrđeni događaj u NATS i Centrifugo.
- Svaki otvoreni klijent prima ga putem WebSocketa; nakon prekida klijenti ponovno učitavaju mjerodavno stanje iz API-ja.
Pozadinski sustav chata
Sve što se događa unutar radnog prostora radi u Go: poruke, kanali, datoteke, pozivi, komunikacija u stvarnom vremenu, uvozi i operativni paket za tvrtke za čišćenje. Web-mjesto nikada ne dira podatke radnih prostora.
- Go 1.26
-
Četiri binarne datoteke iz jedne modularne baze koda: API, worker za poruke, outbox relay i zaštićena administratorska naredba. Isporučuju se kao statične binarne datoteke u jednoj maloj slici.
Zašto
Snažna standardna biblioteka, predvidljive performanse i jednostavna konkurentnost odgovaraju pozadinskom sustavu sastavljenom od dugotrajnih workera. Jedan jezik za cijelu jezgru radnog prostora omogućuje da je održava jedna osoba.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
18 servisa i 179 RPC poziva definirano je u Protobufu. buf generira Go poslužitelj i TypeScript klijente pomoću lokalnih dodataka, tako da nijedna shema ne napušta računalo.
Zašto
Jedan ugovor služi web-klijentima, klijentima za stolna računala, mobilnim klijentima i klijentima naredbenog retka. Nema ručno pisanih HTTP putanja ni raščlanjivanja odgovora, a promjena ugovora pokazuje se kao pogreška pri prevođenju, a ne kao kvar tijekom izvođenja.
- Jedna baza podataka po radnom prostoru MariaDB · sqlc
-
Svaki radni prostor dobiva vlastitu fizičku MariaDB bazu podataka. API određuje radni prostor prema njegovoj domeni i otvara odgovarajući skup veza; workeri ga sami ponovno određuju i nikada ne vjeruju nazivu baze podataka iz poruke u redu čekanja. Upiti su čisti SQL koji sqlc prevodi u tipizirani Go kod.
Zašto
Izolacija je strukturna, a ne filtar u svakom upitu. Izvoz, uvoz, obnova i brisanje rade zasebno za svaku tvrtku.
- NATS JetStream 2.10
-
Trajni tokovi za naredbe, poslove i događaje, uz tok za neisporučive poruke (dead-letter). Zapisivanje poruka odvija se u 64 uređene particije.
Zašto
Poruka se prihvaća tek nakon trajne potvrde. Poruke u jednom kanalu ostaju u redoslijedu, dok se neovisni kanali obrađuju paralelno.
- Transakcijski outbox
-
Retci domenskih podataka i odlazni događaj potvrđuju se u istoj transakciji. Relay objavljuje potvrđene događaje u NATS i Centrifugo, uklanja duplikate prema ID-u događaja i bilježi neuspjehe za ponovni pokušaj.
Zašto
Nema izgubljenih ni fantomskih događaja kada se proces zaustavi između zapisa u bazu podataka i objave.
- Centrifugo v5
-
WebSocket isporuka poruka, prisutnosti, indikatora tipkanja i stanja poziva. Klijenti se pretplaćuju kratkotrajnim tokenima za pojedini kanal, koje API izdaje tek nakon provjere članstva u radnom prostoru.
Zašto
Namjenski poslužitelj za stvarno vrijeme drži dugotrajne veze izvan procesa API-ja, a svaki token navodi i radni prostor i korisnika, tako da se identiteti iz odvojenih baza podataka ne mogu sukobiti.
- Objektna pohrana kompatibilna s S3 aws-sdk-go-v2
-
Datoteke i avatari pohranjeni su u IONOS Object Storageu u EU i dostupni putem kratkotrajnih potpisanih poveznica.
Zašto
Pohrana datoteka skalira se neovisno o bazama podataka i šifrirana je u mirovanju na strani poslužitelja.
- LiveKit 1.9
-
Samostalno hostirani WebRTC medijski poslužitelj za pozive u izravnim porukama i pretežno glasovne pozive u kanalima s kamerom i dijeljenjem zaslona.
Zašto
Otvorenog koda i prikladan za samostalno hostiranje, tako da mediji poziva rade na infrastrukturi kojom upravlja HansaChat.
- ElevenLabs Scribe
-
Pretvaranje govora u tekst za glasovne poruke. Transkript se prilaže poruci i može se pretraživati i prevoditi kao svaki drugi tekst.
Zašto
Terenske ekipe više govore nego što tipkaju.
- Prijevod pomoću LLM-a
-
Prijevod za svakog čitatelja zasebno putem API-ja kompatibilnog s OpenAI. Svaka se poruka prevodi na zahtjev, sprema u predmemoriju jednom po ciljnom jeziku i preskače kada čitatelj već koristi isti jezik.
Zašto
Višejezična ekipa radi u jednom razgovoru, dok svaki član čita na vlastitom jeziku. Pružatelj usluge ostaje zamjenjiv iza jednog sučelja.
- Cloudflare Clef
-
Model odlučivanja razvrstava operativne poruke prema kategoriji, hitnosti i stupnju pouzdanosti. Vraća vjerojatnosti za unaprijed zadana pitanja, a ne generirani tekst. Trenutačno u pilotnoj fazi.
Zašto
Nema slobodnog teksta za raščlanjivanje. Voditelji vide što zahtijeva pažnju; postupanje uvijek ostaje ljudska odluka.
- go-pdf 0.9
-
Evidencije radnog vremena i servisna izvješća u formatu A4 generiraju se na poslužitelju.
Zašto
Biblioteka napisana isključivo u Go održava sliku pozadinskog sustava malom i bez headless preglednika.
- Sentry + slog
-
Pogreške i tragovi šalju se u Sentry, zapisnici su strukturirani JSON iz standardne biblioteke, a workeri izlažu metrike u tekstnom formatu Prometheusa.
Zašto
Malo pokretnih dijelova za održavanje, a svaki kvar stiže sa svojim kontekstom.
Aplikacije i CLI
Jedan Vue klijent poslužuje web, a Tauri ga pakira za stolna računala i mobilne uređaje. Klijent naredbenog retka koristi isti javni API kao i aplikacije.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Jedan klijent sa 118 jednodatotečnih komponenti, Pinia spremištima, vue-routerom i vue-i18n na 23 jezika sučelja, testiran pomoću Vitesta.
Zašto
Zreo, čitljiv model komponenti i strogi TypeScript čine velik klijent upravljivim za vrlo mali tim.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
Alat za izgradnju i sloj stilova: Tailwind CSS 4 sa svijetlom i tamnom temom.
Zašto
Brze izgradnje i dizajnerski tokeni koji prate istu dokumentiranu paletu kao web-mjesto.
- Tauri 2.10
-
Pakira isti web-klijent za macOS, Windows, Linux, iOS i Android, s izvornim obavijestima, dubokim poveznicama i potpisanim ažuriranjima za stolna računala.
Zašto
Jedno sučelje posvuda, koje koristi sistemski webview umjesto ugrađivanja preglednikovog pogona u svaku aplikaciju.
- Generirani Connect klijenti connect-web 2.1 · protobuf-es 2
-
TypeScript klijenti generirani iz Protobuf definicija pozadinskog sustava i kopirani u web-aplikaciju. Nikada se ne uređuju ručno.
Zašto
Promjena ugovora postaje pogreška tipa u klijentu umjesto iznenađenja u produkciji.
- centrifuge-js + livekit-client 5.7 · 2.20
-
Klijentske biblioteke za komunikaciju u stvarnom vremenu putem Centrifuga i za pozive putem LiveKita.
Zašto
Ponovno povezivanje, oporavak i obrada medija dolaze iz projekata koji razvijaju same poslužitelje.
- TipTap 3.22
-
Uređivač poruka sa spominjanjima, poveznicama i blokovima koda s isticanjem sintakse.
Zašto
Strukturirani uređivač umjesto krhke obrade nizova znakova.
- hansa CLI Go 1.26 · Cobra
-
Klijent naredbenog retka bez stanja za ljude, skripte i LLM agente. Zadani izlaz je JSON, vjerodajnice su u privjesku ključeva operacijskog sustava, a kontrolni zbrojevi izdanja potpisani su pomoću Minisigna.
Zašto
Koristi isti javni API kao i aplikacije. Njegovi Protobuf ugovori kopiraju se iz pozadinskog sustava i zaključavaju SHA-256 sažecima, tako da CI otkriva odstupanja.
Web-mjesto, naplata i registar
Laravel pokreće javno web-mjesto, dokumentaciju za korisnike, plaćanje, pretplate i središnji registar radnih prostora. Radni prostor stvara pozivom pozadinskog sustava u Go putem autentificiranog HTTP-a, bez zajedničkog koda i bez zajedničkih redova čekanja.
- Laravel + PHP Laravel 12 · PHP 8.5
-
Javno web-mjesto, dokumentacija za korisnike, plaćanje, pretplate, kuponi, obavijesti o životnom ciklusu i središnji registar radnih prostora i domena.
Zašto
Naplata, e-pošta, raspoređivanje zadataka, redovi čekanja i obrasci područja su u kojima je Laravel najjači. Chat ostaje u Go, a granica između njih jedno je autentificirano HTTP sučelje.
- FrankenPHP 1.13
-
PHP aplikacijski poslužitelj unutar slike spremnika, izgrađen na zajedničkoj osnovnoj slici koja PHP, njegova proširenja i alate fiksira prema digestu.
Zašto
Aplikaciju poslužuje jedan proces, a ponovna izgradnja istog commita daje isto izvršno okruženje.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Stranice renderirane na poslužitelju s malim Alpine.js komponentama, stilizirane pomoću Tailwind CSS-a i spakirane pomoću Vitea.
Zašto
Sadržajne stranice brzo se učitavaju bez isporuke okvira za jednostranične aplikacije.
- 22 jezika
-
Svaka javna stranica postoji na 22 jezika EU, s URL-ovima s jezičnim prefiksom, hreflang poveznicama i lokaliziranom kartom web-mjesta. Test ne prolazi ako u bilo kojem jeziku nedostaje ključ ili se pojavljuje engleski tekst.
Zašto
Europski proizvod trebao bi biti čitljiv na jeziku kupca već od prve stranice.
- Creem
-
Plaćanje, porezi, računi i pretplate, usklađeni putem potpisanih webhookova.
Zašto
Plaćanje, porezi i izdavanje računa ostaju kod specijaliziranog pružatelja usluge, dok web-mjesto čuva usklađenu kopiju svake pretplate.
- EmailLabs
-
Transakcijska i servisna e-pošta, primjerice pozivnice, poveznice za lozinku i obavijesti.
Zašto
Pružatelj usluga e-pošte iz EU za proizvod iz EU.
- Pest 4.4
-
Više od 130 testnih datoteka pokriva rute, naplatu, dodjelu resursa, prijevode i SEO, uključujući testove u pregledniku.
Zašto
Brzi, čitljivi testovi koji se pokreću pri svakoj promjeni.
Platforma i operacije
Produkcijsko i pretpregledno okruženje rade na IONOS-u u Njemačkoj. Svaka se aplikacija isporučuje kao slika spremnika s vlastitim Helm chartom i implementira se ručno pokrenutim poslom u GitLabu.
- IONOS Managed Kubernetes
-
Produkcijski i pretpregledni klasteri, upravljana MariaDB i objektna pohrana kompatibilna s S3, sve kod njemačkog pružatelja usluga u Njemačkoj.
Zašto
Europski pružatelj usluga pod jurisdikcijom EU, a ne EU regija neeuropskog oblaka.
- Helm + Traefik
-
Svaka aplikacija ima vlastiti chart. Traefik usmjerava promet unutar klastera, a migracije baza podataka radnih prostora izvode se kao hook prije svake implementacije pozadinskog sustava.
Zašto
Svaka implementacija je verzionirana, ponovljiva i lako se vraća na prethodno stanje.
- Bunny.net
-
CDN, DNS i DDoS zaštita ispred klastera te pohrana za šifrirane sigurnosne kopije.
Zašto
Europska tvrtka upravlja rubnim slojem i čuva sigurnosne kopije, tako da ni jedno ni drugo ne ovisi o neeuropskom oblaku.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Tri replike s preuzimanjem pri kvaru putem Sentinela i HAProxy posrednikom koji uvijek pokazuje na trenutačni primarni čvor. Služi za predmemoriranje, sesije, prisutnost i posrednika za stvarno vrijeme.
Zašto
Preuzimanje pri kvaru ne zahtijeva promjenu u aplikaciji jer svaka usluga nastavlja komunicirati s istom adresom.
- restic 0.18
-
Šifrirane sigurnosne kopije baza podataka svakih 6 sati na dvije lokacije u EU, uz tjedne provjere integriteta i automatiziranu mjesečnu vježbu obnove.
Zašto
Sigurnosna kopija vrijedi tek kada je obnova iz nje dokazana.
- GitLab CI
-
Testovi, izgradnja slika i provjere Helm chartova izvode se u CI-ju. Implementacije u pretpregledno i produkcijsko okruženje zasebni su, ručno pokretani poslovi.
Zašto
Automatizacija obavlja posao koji se ponavlja; čovjek odlučuje kada nešto stiže do korisnika.
Oko proizvoda
Alati zahvaljujući kojima tvrtka jedne osobe ostaje pod nadzorom, dostupna i objašnjiva.
- Cloudflare Workers + D1
-
Vanjska stranica statusa koja svakih pet minuta provjerava aplikaciju i web-mjesto te bilježi incidente.
Zašto
Dostupnost se mjeri izvan infrastrukture koju opisuje.
- Umami 3.2
-
Samostalno hostirana web-analitika koja se pokreće tek nakon što posjetitelj odabere postavke privole.
Zašto
Podaci o posjetiteljima ostaju na infrastrukturi HansaChata umjesto da hrane oglašivačku mrežu.
- Remotion 4.0
-
Videozapisi proizvoda snimaju se iz stvarne aplikacije pomoću alata za cjelovito (end-to-end) testiranje i sastavljaju se u kodu uz AI glasovnu naraciju.
Zašto
Kada se sučelje promijeni, videozapis se ponovno renderira umjesto da se ponovno snima.
- TwentyCRM + WireGuard
-
Samostalno hostirani CRM dostupan samo putem privatnog VPN-a.
Zašto
Prodajni podaci uopće nisu izloženi javnom internetu.
Inženjerske prakse
Navike koje jednoj osobi omogućuju isporuku višekorisničkog (multi-tenant) proizvoda bez zasebnog tima za QA ili operacije.
Ugovori se generiraju, nikada se ne pišu ručno
Protobuf je jedini izvor za Go poslužitelj, TypeScript klijente i CLI. Generatori su fiksirani na točne verzije, a CLI bilježi sažetak svake datoteke ugovora koju koristi.
Migracije vode evidenciju
Svaka baza podataka radnog prostora bilježi koje su migracije na njoj primijenjene. Hook pri implementaciji primjenjuje samo one koje nedostaju i ponovno provjerava stanje nakon uvođenja. Web-mjesto zadržava svoje izvorne početne migracije, tako da ih postojeće baze podataka nikada ne pokreću dvaput.
Cjeloviti testovi na izoliranom stogu
Jedna naredba pokreće baze podataka, NATS, Valkey, Centrifugo i objektnu pohranu na slobodnim portovima, gradi Go binarne datoteke, pokreće web-aplikaciju i izvodi 70 Playwright specifikacija sa svježim radnim prostorom za svaki test.
Testovi na svakom sloju
478 Go testnih funkcija, uključujući testove izolacije između dva radna prostora, 109 Vitest datoteka u klijentu i više od 130 Pest datoteka na web-mjestu.
Zaštitne ograde u CI-ju
Provjere formatiranja, ograničenje od 1000 redaka po Go datoteci i testovi Helm chartova izvode se u CI-ju uz skupove testova.
Ručna vrata za implementaciju
CI automatski gradi i testira, ali implementacije u pretpregledno i produkcijsko okruženje zasebni su ručni poslovi. U produkciju se implementira oznaka izdanja koja se stvara tek nakon spajanja promjene.
Sigurnosne kopije potvrđene obnovama
Svako pokretanje izrade sigurnosnih kopija se prati, a automatizirana vježba svaki mjesec obnavlja baze podataka i provjerava tablice i broj redaka.
Jedan sustav dizajna
Web-mjesto i aplikacija dijele jednu dokumentiranu paletu, tipografsku ljestvicu i pravila komponenti, uz svijetlu i tamnu temu u aplikaciji.
Uz pomoć AI-ja, pod ljudskim nadzorom
AI agenti za programiranje rade prema datoteci s uputama u svakom repozitoriju koja upućuje na jedan središnji repozitorij inženjerske dokumentacije. Ponovljivi tijekovi rada, poput cjelovitog testnog pokretanja, zapakirani su kao vještine agenata. Svaka promjena i dalje prolazi iste testove, a implementacije ostaju ručne.
Upravljanje sigurnošću u pripremi
HansaChat se priprema za certifikaciju prema ISO/IEC 27001 s registrom rizika, registrom dokaza i dnevnikom odluka. Trenutačno nije certificiran.
Što ova stranica tvrdi, a što ne
Sve gore navedeno opisuje ono što je danas implementirano i prebrojeno je iz izvornih repozitorija. HansaChat ne tvrdi da ima sigurnosni certifikat. Trijaža poruka je u pilotnoj fazi, a push obavijesti za zatvorene aplikacije još nisu aktivne.
Pitanja o arhitekturi?
Inženjeri koji procjenjuju HansaChat dobivaju izravne odgovore od osobe koja ga je izgradila.