Su­pa­ba­se als KI-Ba­ckend: pg­vec­tor, Edge Func­tions und die Kon­so­li­die­rungs­fra­ge

Eine se­pa­ra­te Vek­tor­da­ten­bank im Stack ist für die meis­ten Un­ter­neh­mens-Use-Ca­ses ein ge­lös­tes Pro­blem, das man sich neu ein­kauft. War­um Su­pa­ba­se mit pg­vec­tor und Edge Func­tions als KI-Ba­ckend eine Kon­so­li­die­rungs- und kei­ne Hype-Ent­schei­dung ist – und wo die Gren­ze ehr­lich liegt.
8 Min. LesezeitMatthias RadscheitMatthias Radscheit
Happycodingde-DE

TL;DR

Supabase wird zum KI-Backend, weil pgvector RAG und semantische Suche direkt in PostgreSQL erlaubt – ohne separate Vektordatenbank. Edge Functions bringen Embedding-Erzeugung und API-Proxying an den Stack. Für die meisten Unternehmens-Use-Cases ist das eine Komponente weniger im Betrieb, nicht ein KI-Feature mehr im Marketing.

  • pgvector macht RAG und semantische Suche direkt in PostgreSQL möglich – kein separater Vektor-Store, der gesichert, synchronisiert und betrieben werden muss.
  • Edge Functions sind für kurzlebige Aufgaben gebaut (Embeddings erzeugen, Webhooks, API-Proxy), nicht für lange Heavy-Compute-Jobs: 256 MB RAM, 2 Sekunden CPU-Zeit pro Request.
  • Die zentrale Skalierungsgrenze von pgvector ist physikalisch: Sobald der HNSW-Index nicht mehr in den RAM passt, bricht die Query-Performance nichtlinear ein.
  • Faustregel: Unter rund fünf bis zehn Millionen Vektoren mit moderater Query-Last ist pgvector der pragmatische Default. Darüber unter Last lohnt der Blick auf Qdrant, Pinecone oder Weaviate.
  • Die Entscheidung ist betriebswirtschaftlich, nicht technisch verliebt: weniger bewegliche Teile bedeuten weniger Betriebsrisiko, weniger Vendor-Schnittstellen und planbarere TCO.

Die meis­ten KI-Pro­jek­te schei­tern nicht am Mo­dell. Sie schei­tern an der In­fra­struk­tur drum­her­um, die nie­mand be­trei­ben woll­te und am Ende doch je­mand be­trei­ben muss.

Wenn ein Team heu­te "wir bau­en RAG" sagt, lan­det auf dem Ar­chi­tek­tur-White­board fast re­flex­ar­tig eine zwei­te Da­ten­bank: eine de­di­zier­te Vek­tor­da­ten­bank ne­ben der be­stehen­den Post­greS­QL. Pi­ne­co­ne, Wea­via­te, Qdrant – die Na­men wech­seln, das Mus­ter bleibt. Mit der zwei­ten Da­ten­bank kommt die zwei­te Back­up-Stra­te­gie, das zwei­te Mo­ni­to­ring, die zwei­te Zu­griffs­kon­trol­le und der Sync-Job, der die Da­ten zwi­schen Pri­mär-DB und Vek­tor-Store kon­sis­tent hal­ten soll. Ge­nau die­ser Sync ist die Stel­le, an der spä­ter um drei Uhr nachts das Pa­ger-Duty-Te­le­fon klin­gelt.

War­um Su­pa­ba­se als KI-Ba­ckend eine Kon­so­li­die­rungs­ent­schei­dung ist

Su­pa­ba­se ist im Kern ver­wal­te­tes Post­greS­QL mit Auth, Sto­rage, Re­al­time und Edge Func­tions oben­drauf. Wer noch nicht im De­tail weiß, was das be­deu­tet, fin­det die Ein­ord­nung in un­se­rem Grund­la­gen­ar­ti­kel zu Su­pa­ba­se. Der für KI ent­schei­den­de Bau­stein ist eine Post­greS­QL-Ex­ten­si­on na­mens pg­vec­tor. Sie fügt ei­nen na­ti­ven Da­ten­typ für Vek­to­ren hin­zu und macht Ähn­lich­keits­su­che zu ei­ner SQL-Ope­ra­ti­on. Da­mit wird die Vek­tor­da­ten­bank Post­greS­QL nicht zu ei­nem Mar­ke­ting-Slo­gan, son­dern zu ei­ner schlich­ten Tat­sa­che: Der Vek­tor-In­dex lebt in der­sel­ben Da­ten­bank wie Ihre Ge­schäfts­da­ten.

Das ver­schiebt die Fra­ge. Sie lau­tet nicht mehr "wel­che Vek­tor­da­ten­bank kau­fen wir", son­dern "müs­sen wir über­haupt eine kau­fen". Für ein Un­ter­neh­men, das KI-Fea­tures ins ei­ge­ne Pro­dukt in­te­grie­ren will – se­man­ti­sche Su­che über die Wis­sens­da­ten­bank, ein Sup­port-As­sis­tent auf den ei­ge­nen Do­ku­men­ten, Pro­dukt­emp­feh­lun­gen über Em­bed­dings – ist die Ant­wort in den meis­ten Fäl­len: nein.

Der Pra­xis­an­ker ist ba­nal und ge­nau des­halb stark. Eine RAG An­wen­dung auf be­reits vor­han­de­nem Post­greS­QL auf­zu­set­zen heißt: kei­ne zwei­te Da­ten­bank ein­füh­ren, be­trei­ben, si­chern und syn­chro­ni­sie­ren. We­ni­ger be­weg­li­che Tei­le be­deu­ten we­ni­ger Be­triebs­ri­si­ko. Das ist kein KI-Ar­gu­ment. Das ist ein Ope­ra­ti­ons-Ar­gu­ment, und Ope­ra­ti­ons-Ar­gu­men­te sind die, die vor dem CFO stand­hal­ten.

Wie pg­vec­tor RAG und se­man­ti­sche Su­che über­haupt löst

Ein Em­bed­ding ist ein Vek­tor – eine Lis­te von Zah­len, die die Be­deu­tung ei­nes Tex­tes, Bil­des oder Pro­dukts im Raum ver­or­tet. In­hal­te, die sich äh­neln, lie­gen nah bei­ein­an­der. Se­man­ti­sche Su­che ist dann nichts an­de­res als: Fin­de die Vek­to­ren, die dem Such-Vek­tor am nächs­ten sind. pg­vec­tor lie­fert da­für die Di­stanz-Ope­ra­to­ren di­rekt in SQL – Co­si­ne-Di­stanz mit <=>, L2 mit <->, das ne­ga­ti­ve in­ne­re Pro­dukt mit <#>, das in der Pra­xis am schnells­ten ist.

Der ent­schei­den­de Punkt für die Ar­chi­tek­tur: Die­se Su­che läuft als Teil ei­ner nor­ma­len SQL-Ab­fra­ge. Sie kön­nen Vek­tor­ähn­lich­keit mit klas­si­schen WHE­RE-Be­din­gun­gen kom­bi­nie­ren – nur Do­ku­men­te die­ses Man­dan­ten, nur Ar­ti­kel aus die­sem Zeit­raum, nur Da­ten­sät­ze, die der an­ge­mel­de­te Nut­zer se­hen darf. In ei­ner se­pa­ra­ten Vek­tor­da­ten­bank pfle­gen Sie die­se Me­ta­da­ten-Fil­ter par­al­lel und hof­fen, dass bei­de Sys­te­me die­sel­be Wahr­heit er­zäh­len.

In Su­pa­ba­se kap­selt man das RAG-Re­trie­val üb­li­cher­wei­se in ei­ner Post­greS­QL-Funk­ti­on mit match_th­res­hold und match_count, weil die dar­über­lie­gen­de API-Schicht Vek­tor­di­stan­zen nicht di­rekt aus­drü­cken kann. Das ist in der Su­pa­ba­se-Do­ku­men­ta­ti­on zu Vec­tor Co­lum­ns sau­ber be­schrie­ben. Der Ne­ben­ef­fekt wiegt schwe­rer als die Ein­schrän­kung: Die Zu­griffs­kon­trol­le über Row Le­vel Se­cu­ri­ty greift au­to­ma­tisch – auch auf die Such­ergeb­nis­se. Wer ver­ste­hen will, war­um RLS hier so viel Last von den Schul­tern nimmt, fin­det die Be­grün­dung in un­se­rem Ar­ti­kel dazu, war­um Su­pa­ba­se RLS ein Game Ch­an­ger ist. Eine Vek­tor­da­ten­bank ohne zei­len­ge­naue Be­rech­ti­gungs­lo­gik zwingt Sie, ge­nau die­se Si­cher­heit in der An­wen­dungs­schicht nach­zu­bau­en. Das ist die Art von Ei­gen­bau, die in ei­nem Pen­test auf­fällt.

Für die In­dex-Wahl gibt pg­vec­tor zwei Op­tio­nen. HNSW baut ei­nen mehr­schich­ti­gen Gra­phen, lässt sich auf ei­ner lee­ren Ta­bel­le an­le­gen und lie­fert den bes­se­ren Trade-off zwi­schen Ge­schwin­dig­keit und Re­call. IVF­Flat ist schnel­ler ge­baut und spar­sa­mer im Spei­cher, muss aber nach dem Be­fül­len er­stellt wer­den, weil er Zen­tro­ide trai­niert, und bleibt im Speed-Re­call-Ver­gleich schwä­cher. Für die meis­ten pro­duk­ti­ven Set­ups ist HNSW die Wahl. Su­pa­ba­se hat das in ei­nem ei­ge­nen Bench­mark ge­gen IVF­Flat ge­mes­sen: HNSW lag bei ho­her Ge­nau­ig­keit um mehr als das Sechs­fa­che vorn, und bei sehr ho­hem Re­call über­traf pg­vec­tors HNSW auf glei­cher Com­pu­te so­gar eine de­di­zier­te Vek­tor­da­ten­bank wie Qdrant. Die ab­so­lu­ten Th­rough­put-Zah­len aus den Se­kun­där­zu­sam­men­fas­sun­gen sind nur als gro­be In­di­ka­ti­on zu le­sen – der re­le­van­te Be­fund sind die re­la­ti­ven Mul­ti­pli­ka­to­ren, und die sind deut­lich.

Was Edge Func­tions an den Stack brin­gen

Em­bed­dings müs­sen ir­gend­wo er­zeugt wer­den, und der API-Schlüs­sel für das Em­bed­ding-Mo­dell hat im Brow­ser-Front­end nichts zu su­chen. Hier kom­men Su­pa­ba­se Edge Func­tions ins Spiel: ser­ver­lo­se Funk­tio­nen auf Deno-Ba­sis, die di­rekt ne­ben der Da­ten­bank lau­fen. Der ty­pi­sche KI-Pfad sieht so aus: Ein neu­er Da­ten­satz wird ein­ge­fügt, ein Trig­ger reiht ihn in eine Queue, ein Sche­du­ler ruft im Batch eine Edge Func­tion, die das Em­bed­ding beim Mo­dell an­fragt und als Vek­tor zu­rück­schreibt. Su­pa­ba­se hat die­ses Mus­ter un­ter dem Na­men Au­to­ma­tic Em­bed­dings mit vier Ex­ten­si­ons stan­dar­di­siert – pg­vec­tor für die Spei­che­rung, pgmq für die Queue, pg_net für asyn­chro­nes HTTP, pg_cron für das Sche­du­ling. Das ist kein Bas­tel­werk, son­dern ein do­ku­men­tier­ter Pfad.

Wich­tig ist, Edge Func­tions nicht zu über­schät­zen. Sie sind für kurz­le­bi­ge Auf­ga­ben ge­baut, und die of­fi­zi­el­len Li­mits sa­gen das deut­lich: 256 MB RAM, 2 Se­kun­den CPU-Zeit pro Re­quest (rei­ne asyn­chro­ne I/O zählt nicht mit), ma­xi­mal 150 bis 400 Se­kun­den Wall-Clock je nach Plan, 20 MB Bund­le-Grö­ße. Web­hooks, Em­bed­ding-Er­zeu­gung, ein API-Pro­xy vor Ope­nAI oder ei­nem self-hos­ted Mo­dell – da­für sind sie ide­al. Ein lang­lau­fen­der Re-In­dex­ing-Job über meh­re­re Mil­lio­nen Do­ku­men­te ge­hört nicht in eine Edge Func­tion, son­dern in ei­nen se­pa­ra­ten Wor­ker. Wer die­se Gren­ze re­spek­tiert, be­kommt ein sau­be­res Werk­zeug. Wer sie igno­riert, baut sich Time­outs ein, die er spä­ter nicht ver­steht.

Die Ge­gen­po­si­ti­on: Wann eine de­di­zier­te Vek­tor­da­ten­bank die bes­se­re Wahl ist

Ich tue nicht so, als gäbe es kei­ne Fäl­le für Pi­ne­co­ne, Wea­via­te oder Qdrant. Es gibt sie. Bei zig Mil­lio­nen Vek­to­ren und ho­her, an­hal­ten­der Que­ry-Last ska­lie­ren spe­zia­li­sier­te Sys­te­me bes­ser, bie­ten fei­ne­re Tu­ning-Knöp­fe, ho­ri­zon­ta­le Shar­ding-Mo­del­le und Be­triebs­mo­di, die eine ge­ne­ri­sche Da­ten­bank nicht von Haus aus mit­bringt. Wer eine öf­fent­li­che Such­ma­schi­ne über hun­der­te Mil­lio­nen Em­bed­dings be­treibt, baut nicht auf pg­vec­tor. Das wäre das fal­sche Werk­zeug, und ich wür­de es nie­man­dem emp­feh­len.

Die ehr­li­che Faust­re­gel aus Ver­gleichs­ana­ly­sen – aus­drück­lich eine Dau­men­re­gel, kei­ne vom An­bie­ter ga­ran­tier­te Schwel­le: Un­ter­halb von grob fünf bis zehn Mil­lio­nen Vek­to­ren bei mo­de­ra­ter Que­ry-Last ist pg­vec­tor der prag­ma­ti­sche De­fault, wenn oh­ne­hin Post­greS­QL im Stack liegt. ACID-Trans­ak­tio­nen, ko-lo­ka­li­sier­te Da­ten, eine Kom­po­nen­te we­ni­ger, die güns­tigs­te Op­ti­on. Dar­über, un­ter ernst­haf­ter Last, ge­hört der Blick auf eine de­di­zier­te Vek­tor­da­ten­bank ins Las­ten­heft.

Der Punkt ist die Ver­tei­lung der Rea­li­tät. Die al­ler­meis­ten Un­ter­neh­mens-Use-Ca­ses – die in­ter­ne Wis­sens­su­che über zehn­tau­sen­de Con­fluence-Sei­ten, der Pro­dukt­ka­ta­log mit ei­ni­gen hun­dert­tau­send Ar­ti­keln, der Sup­port-Bot auf der Do­ku­men­ta­ti­on – lie­gen um Grö­ßen­ord­nun­gen un­ter die­ser Schwel­le. Für sie ist eine de­di­zier­te Vek­tor­da­ten­bank kein Vor­teil, son­dern über­di­men­sio­nier­te In­fra­struk­tur, die je­mand be­trei­ben, be­zah­len und ge­gen­über dem Ven­dor ver­ant­wor­ten muss. Man kauft sich Kom­ple­xi­tät für ein Ska­lie­rungs­pro­blem, das man nie ha­ben wird.

Der un­be­que­me Punkt: pg­vec­tor hat rea­le, phy­si­ka­li­sche Gren­zen

Jetzt die Stel­le, an der ich mei­ne ei­ge­ne The­se ehr­lich kom­pli­zie­re. pg­vec­tor ist gut, aber es ist kein Zau­ber­trick, und die Gren­zen sind real.

Die zen­tra­le Li­mi­tie­rung ist phy­si­ka­lisch: Der HNSW-In­dex muss in den Ar­beits­spei­cher pas­sen. So­lan­ge er das tut, lie­fert pg­vec­tor be­ein­dru­cken­de Wer­te. So­bald der In­dex grö­ßer wird als die shared_buf­fers, bricht die Que­ry-Per­for­mance nicht­li­ne­ar ein – und zwar bru­tal. Im do­ku­men­tier­ten Per­for­mance-Is­sue #700 des pg­vec­tor-Pro­jekts sind die Zah­len nach­zu­le­sen: Auf ei­ner Ma­schi­ne mit 16 GB shared_buf­fers lie­fer­te der In­dex bei 2 Mil­lio­nen Vek­to­ren rund 2.110 Queries pro Se­kun­de. Bei 3 Mil­lio­nen wa­ren es noch 102. Bei 5 Mil­lio­nen knapp 13. Das ist kein sanf­tes Ab­fla­chen, das ist eine Klip­pe.

Das­sel­be gilt für den In­dex-Build. HNSW baut nur schnell, so­lan­ge der Graph in main­ten­an­ce_work_mem passt – der Post­greS­QL-De­fault von 64 MB ist für ernst­haf­te Builds zu klein. Wird er über­schrit­ten, fällt der Build auf ei­nen Disk-Spill-Pfad zu­rück, der laut Se­kun­där­quel­len zehn- bis fünf­zig­mal lang­sa­mer ist. Bei sehr gro­ßen Vek­tor­men­gen wird der In­dex-Build da­mit zu ei­nem ech­ten Kos­ten­fak­tor, und HNSW zwingt zu­sätz­lich zum Tu­ning zwi­schen Re­call und La­tenz über Pa­ra­me­ter wie ef_search.

Die Kon­se­quenz ist klar, nicht "es kommt dar­auf an": Wer von Tag 1 hun­der­te Mil­lio­nen Vek­to­ren mit ga­ran­tier­ter Sub-10-Mil­li­se­kun­den-La­tenz braucht, soll nicht so tun, als sei Post­gres die Ant­wort. Für den ist die rich­ti­ge Ar­chi­tek­tur eine de­di­zier­te Vek­tor­da­ten­bank, Punkt. Aber die­ses An­for­de­rungs­pro­fil ist die Aus­nah­me, und es ist in­tel­lek­tu­ell un­red­lich, eine prag­ma­ti­sche De­fault-Ent­schei­dung mit ei­nem Ex­trem­fall zu er­schla­gen, den man wahr­schein­lich nie er­reicht. Die rich­ti­ge Fra­ge an das ei­ge­ne Pro­jekt ist nicht "was wäre, wenn wir Goog­le wür­den", son­dern "wie vie­le Vek­to­ren ha­ben wir rea­lis­tisch in drei Jah­ren". Die­se Zahl kennt das Team meis­tens. Sie liegt fast im­mer im grü­nen Be­reich.

Die Da­ten­schutz-Di­men­si­on, die nie­mand weg­mo­de­rie­ren kann

Ein KI-Ba­ckend ver­ar­bei­tet oft ge­nau die Da­ten, die re­gu­la­to­risch hei­kel sind – Kun­den­do­ku­men­te, in­ter­ne Wis­sens­be­stän­de, Sup­port-Ver­läu­fe. Su­pa­ba­se er­laubt die Wahl ei­ner EU-Re­gi­on pro Pro­jekt, etwa Frank­furt, und der ge­sam­te Stack ist via Do­cker self-host­bar. Das ist die gute Nach­richt für die Da­ten­sou­ve­rä­ni­tät.

Die un­be­que­me Nu­an­ce bleibt: Su­pa­ba­se Inc. ist ein US-in­kor­po­rier­tes Un­ter­neh­men und kann da­mit po­ten­zi­ell dem CLOUD Act un­ter­lie­gen, auch bei EU-Spei­cher­ort. Das ist eine ju­ris­ti­sche Ein­ord­nung, kei­ne In­fra­struk­tur-Li­mi­tie­rung – aber für re­gu­lier­te Bran­chen ein Punkt fürs Risk Ma­nage­ment. Wer ma­xi­ma­le Kon­trol­le braucht, be­treibt den Stack self-hos­ted auf ei­ge­ner EU-In­fra­struk­tur, wo der CLOUD-Act-An­griffs­vek­tor schlicht ent­fällt. Die recht­li­che Tie­fe dazu lie­fert un­ser Pra­xis­leit­fa­den zu DSGVO-kon­for­mer KI auf der Web­site. Bei der Em­bed­ding-Er­zeu­gung selbst gilt die­sel­be Sorg­falt: Wel­ches Mo­dell die Da­ten sieht und wo es läuft, ist Teil der­sel­ben Sou­ve­rä­ni­täts­fra­ge – nicht je­des Em­bed­ding muss zwin­gend bei ei­nem US-Hy­pers­ca­ler er­zeugt wer­den.

Was ich Ent­schei­dern rate

Be­han­deln Sie die Wahl des KI-Ba­ckends nicht als KI-Fra­ge, son­dern als das, was sie ist: eine Ope­ra­ting-Mo­del-Ent­schei­dung. Jede zu­sätz­li­che Kom­po­nen­te im Stack ist ein Ver­trag, ein Be­triebs­auf­wand, eine Schnitt­stel­le, die bre­chen kann. pg­vec­tor in ei­nem oh­ne­hin vor­han­de­nen Post­greS­QL ist für die über­wie­gen­de Mehr­heit der Un­ter­neh­mens-Use-Ca­ses die Ar­chi­tek­tur mit den we­nigs­ten be­weg­li­chen Tei­len – und da­mit dem nied­rigs­ten Be­triebs­ri­si­ko und der plan­bars­ten TCO. Wer wis­sen will, wie sich die­se Lo­gik über drei Jah­re rech­net, fin­det die Zah­len in un­se­rer TCO-Be­trach­tung von Su­pa­ba­se in Pro­duk­ti­on, und die stra­te­gi­sche Ge­samt­ein­ord­nung von Su­pa­ba­se als eu­ro­päi­sche Ba­ckend-Platt­form steht auf un­se­rer Su­pa­ba­se-Über­sichts­sei­te.

Die Kon­so­li­die­rung ist der Ge­winn, nicht das KI-Fea­ture. Das Fea­ture kann je­der bau­en. Eine Kom­po­nen­te we­ni­ger zu be­trei­ben, ist der Un­ter­schied zwi­schen ei­nem Sys­tem, das Ihr Team be­herrscht, und ei­nem, das Ihr Team nur noch ver­wal­tet. Fra­gen Sie nicht zu­erst, wel­che Vek­tor­da­ten­bank die bes­te ist. Fra­gen Sie, ob Sie über­haupt eine zwei­te brau­chen. Bei den meis­ten Pro­jek­ten ist die ehr­li­che Ant­wort: nein – noch nicht, und viel­leicht nie.

Häufige Fragen

Brauche ich für RAG und semantische Suche zwingend eine dedizierte Vektordatenbank?
Nein. Mit pgvector lässt sich Vektorsuche direkt in PostgreSQL betreiben. Für die meisten Unternehmens-Use-Cases – grob bis in den niedrigen zweistelligen Millionenbereich an Vektoren mit moderater Query-Last – reicht das aus und spart eine komplette Infrastrukturkomponente. Dedizierte Vektor-DBs wie Pinecone, Weaviate oder Qdrant lohnen sich erst bei sehr großen Mengen unter hoher Last.
Wofür eignen sich Supabase Edge Functions im KI-Kontext und wofür nicht?
Edge Functions sind für kurzlebige Aufgaben gebaut: Embeddings erzeugen, Webhooks verarbeiten, externe KI-APIs proxen, ohne Schlüssel an den Client zu geben. Sie haben 256 MB RAM und 2 Sekunden CPU-Zeit pro Request (reine Async-I/O zählt nicht mit). Für lange, rechenintensive Batch-Jobs oder Modell-Training sind sie nicht gedacht.
Was ist die wichtigste Skalierungsgrenze von pgvector?
Der HNSW-Index muss in den Arbeitsspeicher passen. Solange er das tut, liefert pgvector hohe Query-Throughput-Werte. Sobald der Index größer wird als der verfügbare RAM beziehungsweise shared_buffers, bricht die Performance nichtlinear ein – dokumentiert sind Stürze von über 2.000 auf rund 100 Queries pro Sekunde. Das ist eine physikalische, keine Lizenzgrenze.
Bleibt mein RAG-Use-Case bei Supabase DSGVO-konform?
Die Region lässt sich pro Projekt auf einen EU-Standort wie Frankfurt setzen, und der Stack ist self-hostbar. Datenschutzrechtlich relevant bleibt, dass Supabase Inc. US-inkorporiert ist und damit potenziell dem CLOUD Act unterliegt. Wer maximale Datensouveränität braucht, sollte die self-hosted Variante auf eigener EU-Infrastruktur prüfen.

Quellen

Ähnliche Artikel

Offen für ausgewählte Projekte

Lassen Sie uns über Ihr Projekt sprechen

Bu­chen Sie ei­nen un­ver­bind­li­chen Ter­min, schrei­ben Sie uns eine E-Mail oder nut­zen Sie das For­mu­lar – wir freu­en uns auf Ihre Nach­richt.

150+
Abgeschlossene Projekte
15
Jahre Erfahrung
8
Senior‑Level Teammitglieder