Preskoči na vsebino o tehnologiji
Nazaj na domačo stran

Tehnološki sklad

HansaChat je poslovni klepet iz EU z operativno plastjo za terenske ekipe, ki ga je zasnoval in izdelal ter ga upravlja en sam človek. Ta stran prikazuje, s čim je zgrajen posamezen del in zakaj je bil izbran.

Različice in številke so bile preverjene oktobra 2026.

Prešteto v repozitorijih

storitev ConnectRPC s 179 klici RPC, vse definirane v Protobufu
18
binarne datoteke Go iz ene kodne baze: API, worker, outbox relay, administracija
4
platform iz enega odjemalca: splet, macOS, Windows, Linux, iOS, Android
6
jezikov na javnem spletnem mestu
22
jezikov vmesnika v aplikaciji
23
specifikacij Playwright za teste od konca do konca na izoliranem skladu
70

Kako se deli povezujejo

Tri aplikacije si delijo en robni sloj in en grozd. Spletno mesto skrbi za obračunavanje in register delovnih prostorov, zaledje v Go skrbi za vse znotraj delovnega prostora, spletna aplikacija pa z zaledjem komunicira prek generiranih odjemalcev ConnectRPC.

Odjemalci

Brskalnik

Spletno mesto in spletna aplikacija

Tauri

Lupine za namizne in mobilne naprave

hansa CLI

Skripte in agenti

Robni sloj

Bunny.net CDN

TLS, predpomnjenje, zaščita pred DDoS

IONOS Managed Kubernetes, Nemčija

Traefik

Ingress za vsako aplikacijo

Spletna aplikacija Vue + Vite

Statična gradnja Vue

API klepeta

Go s ConnectRPC

  • Worker
  • Outbox relay

Spletno mesto Laravel + FrankenPHP

Obračunavanje, register, vzpostavljanje

NATS JetStream

Trajni ukazi in dogodki

Centrifugo

Razpošiljanje prek WebSocket

Valkey Sentinel + HAProxy

Predpomnilnik, prisotnost, seje

LiveKit

Mediji klicev

Upravljani podatki pri IONOS

MariaDB

Ena baza podatkov na delovni prostor in osrednji register

Objektna shramba S3

Datoteke in avatarji

Zunanje storitve

ElevenLabs · LLM · Clef

Prepis, prevod, razvrščanje

Creem · EmailLabs

Plačila in e-pošta

Zunaj grozda

Cloudflare Workers D1

Zunanja preverjanja stanja

Bunny Storage restic

Šifrirane varnostne kopije v Frankfurtu in Stockholmu

Pot enega sporočila

  1. Odjemalec prek ConnectRPC pokliče storitev za sporočila.
  2. API sprejme zahtevo šele, ko NATS JetStream ukaz trajno shrani.
  3. Worker v eni transakciji zapiše sporočilo in dogodek outbox v bazo podatkov delovnega prostora.
  4. Outbox relay objavi potrjeni dogodek v NATS in Centrifugo.
  5. Vsak odprt odjemalec ga prejme prek WebSocket; po prekinitvi odjemalci znova naložijo verodostojno stanje iz API.

Zaledje klepeta

Vse, kar se dogaja znotraj delovnega prostora, teče v Go: sporočila, kanali, datoteke, klici, sprotna komunikacija, uvozi in operativni paket za čistilna podjetja. Spletno mesto se podatkov delovnih prostorov nikoli ne dotakne.

Go 1.26

Štiri binarne datoteke iz ene modularne kodne baze: API, worker za sporočila, outbox relay in zaščiten skrbniški ukaz. Dobavljajo se kot statične binarne datoteke v eni majhni sliki.

Zakaj

Močna standardna knjižnica, predvidljiva zmogljivost in preprosta sočasnost ustrezajo zaledju, ki ga sestavljajo dolgotrajno delujoči workerji. En jezik za celotno jedro delovnega prostora omogoča, da ga vzdržuje en sam človek.

ConnectRPC + Protobuf connect-go 1.20 · buf 1.71

18 storitev in 179 klicev RPC je definiranih v Protobufu. buf z lokalnimi vtičniki generira strežnik v Go in odjemalce v TypeScriptu, zato nobena shema ne zapusti računalnika.

Zakaj

Ena pogodba služi spletnim, namiznim, mobilnim in ukaznovrstičnim odjemalcem. Ni ročno napisanih poti HTTP ali razčlenjevanja odgovorov, sprememba pogodbe pa se pokaže kot napaka pri prevajanju, ne kot napaka med izvajanjem.

Ena baza podatkov na delovni prostor MariaDB · sqlc

Vsak delovni prostor dobi svojo fizično bazo podatkov MariaDB. API določi delovni prostor po njegovi domeni in odpre ustrezen bazen povezav; workerji ga sami določijo znova in nikoli ne zaupajo imenu baze podatkov iz sporočila v čakalni vrsti. Poizvedbe so navaden SQL, ki ga sqlc prevede v tipizirano kodo Go.

Zakaj

Izolacija je strukturna, ne pa filter v vsaki poizvedbi. Izvoz, uvoz, obnovitev in brisanje delujejo za vsako podjetje posebej.

NATS JetStream 2.10

Trajni tokovi za ukaze, opravila in dogodke ter tok za nedostavljiva sporočila (dead-letter). Zapisovanje sporočil poteka v 64 urejenih particijah.

Zakaj

Sporočilo je sprejeto šele po trajni potrditvi. Sporočila v enem kanalu ostanejo v pravem vrstnem redu, neodvisni kanali pa se obdelujejo vzporedno.

Transakcijski outbox

Domenske vrstice in odhodni dogodek se potrdijo v isti transakciji. Relay objavlja potrjene dogodke v NATS in Centrifugo, odstranjuje dvojnike po ID-ju dogodka in beleži neuspehe za ponovni poskus.

Zakaj

Ni izgubljenih ali fantomskih dogodkov, ko se proces ustavi med zapisom v bazo podatkov in objavo.

Centrifugo v5

Dostava sporočil, prisotnosti, indikatorja tipkanja in stanja klicev prek WebSocket. Odjemalci se naročijo s kratkotrajnimi žetoni za posamezen kanal, ki jih API izda šele po preverjanju članstva v delovnem prostoru.

Zakaj

Namenski strežnik za sprotno komunikacijo drži dolgotrajne povezave zunaj procesa API, vsak žeton pa navaja tako delovni prostor kot uporabnika, zato identitete iz ločenih baz podatkov ne morejo trčiti.

Objektna shramba, združljiva s S3 aws-sdk-go-v2

Datoteke in avatarji so shranjeni v IONOS Object Storage v EU in se izdajajo prek kratkotrajnih podpisanih povezav.

Zakaj

Shramba datotek se skalira neodvisno od baz podatkov in je na strani strežnika šifrirana v mirovanju.

LiveKit 1.9

Samostojno gostovan medijski strežnik WebRTC za klice v neposrednih sporočilih in pretežno zvočne klice v kanalih s kamero in deljenjem zaslona.

Zakaj

Odprtokoden in primeren za samostojno gostovanje, zato mediji klicev tečejo na infrastrukturi, ki jo upravlja HansaChat.

ElevenLabs Scribe

Pretvorba govora v besedilo za glasovna sporočila. Prepis je pripet k sporočilu in ga je mogoče iskati in prevajati kot vsako drugo besedilo.

Zakaj

Terenske ekipe več govorijo, kot tipkajo.

Prevajanje z LLM

Prevod za vsakega bralca posebej prek API, združljivega z OpenAI. Vsako sporočilo se prevede na zahtevo, enkrat predpomni za vsak ciljni jezik in preskoči, kadar bralec že uporablja isti jezik.

Zakaj

Večjezična ekipa dela v enem pogovoru, medtem ko vsak član bere v svojem jeziku. Ponudnik ostaja zamenljiv za enotnim vmesnikom.

Cloudflare Clef

Odločitveni model razvršča operativna sporočila po kategoriji, nujnosti in stopnji zanesljivosti. Vrača verjetnosti za vnaprej določena vprašanja, ne generiranega besedila. Trenutno v pilotni fazi.

Zakaj

Ni prostega besedila, ki bi ga bilo treba razčlenjevati. Nadzorniki vidijo, kaj zahteva pozornost; ukrepanje vedno ostane človeška odločitev.

go-pdf 0.9

Evidence delovnega časa in servisna poročila v formatu A4 se generirajo na strežniku.

Zakaj

Knjižnica, napisana izključno v Go, ohranja sliko zaledja majhno in brez headless brskalnika.

Sentry + slog

Napake in sledi gredo v Sentry, dnevniki so strukturiran JSON iz standardne knjižnice, workerji pa izpostavljajo metrike v besedilnem formatu Prometheus.

Zakaj

Malo gibljivih delov za upravljanje, vsaka napaka pa pride s svojim kontekstom.

Aplikacije in CLI

En odjemalec Vue služi spletu, Tauri pa ga zapakira za namizne in mobilne naprave. Odjemalec za ukazno vrstico uporablja isti javni API kot aplikacije.

Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3

En sam odjemalec s 118 enodatotečnimi komponentami, shrambami Pinia, vue-router in vue-i18n v 23 jezikih vmesnika, testiran z Vitest.

Zakaj

Zrel, berljiv komponentni model in strog TypeScript omogočata, da zelo majhna ekipa obvladuje velik odjemalec.

Vite + Tailwind CSS Vite 8 · Tailwind 4

Orodje za gradnjo in sloj za oblikovanje: Tailwind CSS 4 s svetlo in temno temo.

Zakaj

Hitre gradnje in oblikovalski žetoni, ki sledijo isti dokumentirani paleti kot spletno mesto.

Tauri 2.10

Isti spletni odjemalec zapakira za macOS, Windows, Linux, iOS in Android, z izvornimi obvestili, globokimi povezavami in podpisanimi posodobitvami za namizje.

Zakaj

En vmesnik povsod, ki uporablja sistemski webview, namesto da bi v vsako aplikacijo vgradil brskalniški pogon.

Generirani odjemalci Connect connect-web 2.1 · protobuf-es 2

Odjemalci v TypeScriptu, generirani iz definicij Protobuf v zaledju in kopirani v spletno aplikacijo. Nikoli se ne urejajo ročno.

Zakaj

Sprememba pogodbe postane napaka tipa v odjemalcu, ne pa presenečenje v produkciji.

centrifuge-js + livekit-client 5.7 · 2.20

Odjemalske knjižnice za sprotno komunikacijo s Centrifugo in za klice z LiveKit.

Zakaj

Ponovno povezovanje, obnovitev in obdelava medijev prihajajo iz projektov, ki razvijajo same strežnike.

TipTap 3.22

Urejevalnik sporočil z omembami, povezavami in bloki kode z barvnim poudarjanjem sintakse.

Zakaj

Strukturiran urejevalnik namesto krhkega upravljanja nizov.

hansa CLI Go 1.26 · Cobra

Odjemalec za ukazno vrstico brez stanja za ljudi, skripte in agente LLM. Privzeto izpisuje JSON, poverilnice hrani v obesku za ključe operacijskega sistema, kontrolne vsote izdaj pa so podpisane z Minisign.

Zakaj

Uporablja isti javni API kot aplikacije. Njegove pogodbe Protobuf so kopirane iz zaledja in zaklenjene z zgoščenimi vrednostmi SHA-256, zato CI zazna odstopanja.

Spletno mesto, obračunavanje in register

Laravel poganja javno spletno mesto, dokumentacijo za stranke, zaključek nakupa, naročnine in osrednji register delovnih prostorov. Delovni prostor ustvari tako, da prek overjenega HTTP pokliče zaledje v Go, brez skupne kode in brez skupnih čakalnih vrst.

Laravel + PHP Laravel 12 · PHP 8.5

Javno spletno mesto, dokumentacija za stranke, zaključek nakupa, naročnine, kuponi, obvestila o življenjskem ciklu ter osrednji register delovnih prostorov in domen.

Zakaj

Obračunavanje, pošta, razporejanje opravil, čakalne vrste in obrazci so področja, kjer je Laravel najmočnejši. Klepet ostaja v Go, meja med njima pa je en sam overjen vmesnik HTTP.

FrankenPHP 1.13

Aplikacijski strežnik PHP v sliki vsebnika, zgrajen na skupni osnovni sliki, ki PHP, njegove razširitve in orodja pripne po digestu.

Zakaj

Aplikacijo streže en sam proces, ponovna gradnja istega commita pa ustvari enako izvajalno okolje.

Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7

Strani, upodobljene na strežniku, z majhnimi komponentami Alpine.js, oblikovane s Tailwind CSS in zapakirane z Vite.

Zakaj

Vsebinske strani se naložijo hitro, brez ogrodja za enostranske aplikacije.

22 jezikov

Vsaka javna stran obstaja v 22 jezikih EU, z URL-ji z jezikovno predpono, povezavami hreflang in lokaliziranim zemljevidom spletnega mesta. Test ne uspe, če v katerem koli jeziku manjka ključ ali je ostalo angleško besedilo.

Zakaj

Evropski izdelek bi moral biti berljiv v jeziku kupca že od prve strani.

Creem

Zaključek nakupa, davki, računi in naročnine, usklajeni prek podpisanih webhookov.

Zakaj

Plačila, davki in izdajanje računov ostajajo pri specializiranem ponudniku, spletno mesto pa hrani usklajeno kopijo vsake naročnine.

EmailLabs

Transakcijska in servisna e-pošta, kot so povabila, povezave za geslo in obvestila.

Zakaj

Ponudnik e-pošte iz EU za izdelek iz EU.

Pest 4.4

Več kot 130 testnih datotek pokriva poti, obračunavanje, vzpostavljanje, prevode in SEO, vključno s testi v brskalniku.

Zakaj

Hitri, berljivi testi, ki se izvedejo ob vsaki spremembi.

Platforma in delovanje

Produkcijsko in predogledno okolje tečeta pri IONOS v Nemčiji. Vsaka aplikacija se dobavlja kot slika vsebnika z lastnim Helm chartom in se postavi z ročno sproženim opravilom v GitLabu.

IONOS Managed Kubernetes

Produkcijski in predogledni grozdi, upravljana MariaDB in objektna shramba, združljiva s S3, vse pri nemškem ponudniku v Nemčiji.

Zakaj

Evropski ponudnik pod pristojnostjo EU, ne pa regija EU neevropskega oblaka.

Helm + Traefik

Vsaka aplikacija ima svoj chart. Traefik usmerja promet znotraj grozda, migracije baz podatkov delovnih prostorov pa se izvedejo kot hook pred vsako postavitvijo zaledja.

Zakaj

Vsaka postavitev je različicirana, ponovljiva in jo je preprosto povrniti.

Bunny.net

CDN, DNS in zaščita pred DDoS pred grozdom ter shramba za šifrirane varnostne kopije.

Zakaj

Robni sloj upravlja in varnostne kopije hrani evropsko podjetje, zato nobeno od tega ni odvisno od neevropskega oblaka.

Valkey + Sentinel + HAProxy Valkey 9.1

Tri replike s preklopom ob odpovedi prek Sentinel in posrednikom HAProxy, ki vedno kaže na trenutno primarno vozlišče. Podpira predpomnjenje, seje, prisotnost in posrednika za sprotno komunikacijo.

Zakaj

Preklop ob odpovedi ne zahteva sprememb v aplikaciji, ker vsaka storitev še naprej komunicira z istim naslovom.

restic 0.18

Šifrirane varnostne kopije baz podatkov vsakih 6 ur na dve lokaciji v EU, s tedenskimi preverjanji celovitosti in samodejno mesečno vajo obnovitve.

Zakaj

Varnostna kopija šteje šele, ko je obnovitev iz nje dokazana.

GitLab CI

Testi, gradnje slik in preverjanja Helm chartov tečejo v CI. Postavitve v predogledno in produkcijsko okolje so ločena, ročno sprožena opravila.

Zakaj

Avtomatizacija opravi ponavljajoče se delo; o tem, kdaj nekaj pride do strank, odloči človek.

Okoli izdelka

Orodja, s katerimi podjetje enega človeka ostaja opazljivo, dosegljivo in razložljivo.

Cloudflare Workers + D1

Zunanja stran stanja, ki vsakih pet minut preveri aplikacijo in spletno mesto ter beleži incidente.

Zakaj

Razpoložljivost se meri zunaj infrastrukture, ki jo opisuje.

Umami 3.2

Samostojno gostovana spletna analitika, ki se zažene šele, ko obiskovalec izbere možnost glede privolitve.

Zakaj

Podatki o obiskovalcih ostanejo na infrastrukturi HansaChat, namesto da bi napajali oglaševalsko omrežje.

Remotion 4.0

Predstavitveni videoposnetki izdelka so posneti iz prave aplikacije z izvajalnikom testov od konca do konca in sestavljeni v kodi z glasovnim komentarjem AI.

Zakaj

Ko se vmesnik spremeni, se videoposnetek znova upodobi, namesto da bi ga znova snemali.

TwentyCRM + WireGuard

Samostojno gostovan CRM, dosegljiv le prek zasebnega VPN.

Zakaj

Prodajni podatki sploh niso izpostavljeni javnemu internetu.

Inženirske prakse

Navade, ki enemu človeku omogočajo izdajanje večnajemniškega izdelka brez ločene ekipe za QA ali delovanje.

Pogodbe se generirajo, nikoli ne pišejo ročno

Protobuf je edini vir za strežnik v Go, odjemalce v TypeScriptu in CLI. Generatorji so pripeti na točne različice, CLI pa beleži zgoščeno vrednost vsake datoteke s pogodbo, ki jo uporablja.

Migracije vodijo evidenco

Vsaka baza podatkov delovnega prostora beleži, katere migracije so bile na njej izvedene. Hook ob postavitvi izvede le manjkajoče in po uvedbi ponovno preveri stanje. Spletno mesto ohranja svoje izvirne osnovne migracije, zato jih obstoječe baze podatkov nikoli ne izvedejo dvakrat.

Testi od konca do konca na izoliranem skladu

En ukaz zažene baze podatkov, NATS, Valkey, Centrifugo in objektno shrambo na prostih vratih, zgradi binarne datoteke Go, zažene spletno aplikacijo in izvede 70 specifikacij Playwright s svežim delovnim prostorom za vsak test.

Testi na vsaki plasti

478 testnih funkcij v Go, vključno s testi izolacije med dvema delovnima prostoroma, 109 datotek Vitest v odjemalcu in več kot 130 datotek Pest na spletnem mestu.

Varovala v CI

Preverjanja oblikovanja, omejitev 1000 vrstic na datoteko Go in testi Helm chartov tečejo v CI ob testnih zbirkah.

Ročna vrata za postavitev

CI samodejno gradi in testira, postavitve v predogledno in produkcijsko okolje pa so ločena ročna opravila. V produkcijo se postavi oznaka izdaje, ki se ustvari šele po združitvi spremembe.

Varnostne kopije, dokazane z obnovitvami

Vsak zagon varnostnega kopiranja se nadzoruje, samodejna vaja pa vsak mesec obnovi baze podatkov ter preveri tabele in število vrstic.

En oblikovalski sistem

Spletno mesto in aplikacija si delita eno dokumentirano paleto, tipografsko lestvico in pravila komponent, aplikacija pa ima svetlo in temno temo.

S pomočjo AI, pod človeškim nadzorom

Agenti AI za programiranje delajo po datoteki z navodili v vsakem repozitoriju, ki kaže na en osrednji repozitorij inženirske dokumentacije. Ponovljivi poteki dela, kot je izvedba testov od konca do konca, so zapakirani kot veščine agentov. Vsaka sprememba še vedno opravi iste teste, postavitve pa ostajajo ročne.

Upravljanje varnosti v pripravi

HansaChat se pripravlja na certificiranje po ISO/IEC 27001 z registrom tveganj, registrom dokazov in dnevnikom odločitev. Danes ni certificiran.

Kaj ta stran trdi in česa ne

Vse zgoraj opisuje, kar je danes izvedeno, in je bilo prešteto iz izvornih repozitorijev. HansaChat ne trdi, da ima varnostni certifikat. Razvrščanje sporočil je v pilotni fazi, potisna obvestila za zaprte aplikacije pa še niso na voljo.

Vprašanja o arhitekturi?

Inženirji, ki ocenjujejo HansaChat, dobijo neposredne odgovore od človeka, ki ga je zgradil.

Pišite razvijalcu