# mirrorboards.chat — architektura danych i kluczy

Stan lokalnego kodu i konfiguracji: **14 września 2026**. Diagramy dotyczą obecnego `mirrorboards-chat-web`, aktywnego boardu Chatboards Chats i usług, z których korzystają. To analiza implementacji oraz deklaracji Pulumi, bez sprawdzania działających podów, ruchu produkcyjnego i polityk dostawców. Repozytoria mogą zawierać nieopublikowane zmiany; odciski analizowanych plików znajdują się w `evidence.json`.

**Najważniejszy podział:** XAuth potwierdza tożsamość logowania; System określa, kogo reprezentujesz i jakie zasoby są z nim związane; XKeys otwiera klucze na urządzeniu; Actanet obsługuje operacje i upload; Swaplock zapisuje uprawnienia i odnośniki; S3 przechowuje szyfrogramy. Użycie AI tworzy osobną ścieżkę, na której treść jest czytelna dla API i dostawcy modelu.

Legenda diagramów: **zielony** — lokalna kryptografia lub szyfrogram; **niebieski** — usługa aplikacyjna; **fioletowy** — jawne metadane lub rejestr; **pomarańczowy** — treść dostępna w postaci jawnej albo istotna granica prywatności. W diagramach sekwencji podpisy określają ochronę danych. „Jawne” oznacza brak szyfrowania aplikacyjnego, a nie brak HTTPS.

## 01 · Mapa całego przepływu

```mermaid
flowchart TB
  subgraph device["URZĄDZENIE UŻYTKOWNIKA · mirrorboards.chat / Tauri"]
    UI["React + TanStack Router<br/>ReflectionShell + boardy<br/>jawna treść podczas pracy"]:::plain
    SESSION["Runtime sesji XAuth<br/>konto + osobny transport/cache"]:::app
    VAULT["XKeys React → Web → WASM/Rust<br/>skarbiec + owner / active / memo"]:::crypto
    DATA["SDK datarooms + XKeys TS<br/>klucz pokoju → klucze treści<br/>szyfrowanie przed uploadem"]:::crypto
    LOCAL[("IndexedDB<br/>koperta + szyfrowane drafty<br/>opcjonalne jawne hasło AutoUnlock")]:::plain
    UI --> SESSION
    UI --> VAULT
    UI --> DATA
    VAULT --> DATA
    VAULT --> LOCAL
    DATA --> LOCAL
  end
  subgraph services["USŁUGI MIRRORBOARDS · HTTPS na interfejsach publicznych"]
    AUTH["XAuth API<br/>xauth.mirrorboards.chat"]:::app
    SYS["System API<br/>system.mirrorboards.chat<br/>podmioty, dostęp, konta, pokoje"]:::app
    XK["XKeys API<br/>xkeys.mirrorboards.chat<br/>koperty + relay parowania"]:::app
    ACT["Actanet API<br/>actanet.mirrorboards.chat<br/>build / broadcast / storage"]:::app
    CHAT["Chat API · Rig / AG-UI SSE<br/>api.mirrorboards.chat<br/>czyta przekazany kontekst"]:::plain
    AI["Bifrost · wewnętrzny AI gateway<br/>jawny kontekst + routing modeli"]:::plain
    XDB[("PostgreSQL · xkeys.*<br/>szyfrowane koperty / relay")]:::crypto
    SDB[("PostgreSQL · system.*<br/>jawne relacje i preferencje")]:::meta
    REG[("PostgreSQL · storage ledger<br/>rewizje, hashe, podpisane publikacje")]:::meta
    IDP["Zitadel + Redis cache<br/>logowanie i dane tożsamości"]:::meta
  end
  CHAIN[("Swaplock blockchain<br/>konta, pokoje, członkowie<br/>karty: URL + hash + wrapped DEK")]:::meta
  QUERY["Swaplock Query / indexer<br/>query.swaplock.chainpool.online<br/>odczyt + historia"]:::meta
  S3[("OVH S3 · WAW<br/>staging: prywatny szyfrogram<br/>objects: publiczny szyfrogram")]:::crypto
  PROVIDER["OpenRouter / dostawcy modeli<br/>lub Anthropic<br/>otrzymują treść do przetworzenia"]:::plain
  SESSION --> AUTH
  AUTH --> IDP
  VAULT -->|"CBOR + podpis, bez hasła"| XK
  XK --> XDB
  UI -->|"sesja + subject"| SYS
  SYS --> SDB
  SYS -->|"rejestracja konta"| ACT
  SYS -->|"weryfikacja właściciela"| QUERY
  DATA -->|"podpisane intencje / transakcje"| ACT
  DATA -->|"POST szyfrogramu, GET szyfrogramu"| S3
  ACT -->|"weryfikacja i publikacja szyfrogramu"| S3
  ACT --> REG
  ACT --> CHAIN
  CHAIN --> QUERY
  DATA -->|"metadane + opakowany klucz pokoju"| QUERY
  UI -->|"wybrane jawne wiadomości przez HTTPS"| CHAT
  CHAT --> AI --> PROVIDER
  CHAT -.->|"resolve sesji"| AUTH
  SYS -.-> AUTH
  XK -.-> AUTH
```

Źródła: [S01](#s01), [S02](#s02), [S03](#s03), [S08](#s08), [S16](#s16), [S20](#s20), [S23](#s23), [S28](#s28), [S32](#s32).

**Boardy są modułami uruchamianymi w aplikacji.** Host rejestruje Chatboards Chats, YouTube, CV, Acta Network, Go To Market, XShelf, The Map of Everything, Astral, Vet i Settings. Daje im kontekst sesji oraz klienty System, Actanet i Swaplock Query. Rejestracja boardu nie oznacza automatycznie kompletnego backendu ani identycznej polityki szyfrowania. Główny opis poniżej odtwarza przepływ Chatboards Chats; współdzielony pakiet `@mirrorboards-shell/datarooms` jest również wykorzystywany przez Go To Market. [S01](#s01), [S02](#s02), [S43](#s43)

## 02 · Hierarchia kluczy i warstwy szyfrowania

```mermaid
flowchart TB
  subgraph unlock["A · ODBLOKOWANIE SKARBCA NA URZĄDZENIU"]
    PW["Hasło urządzenia<br/>normalizacja → Argon2id"]:::plain
    PRF["Klucz sprzętowy / passkey<br/>sekret PRF uwierzytelniacza"]:::crypto
    CODE["Kod odzysku<br/>125 bitów losowości"]:::plain
    KEK["KEK strażnika · 32 B<br/>HKDF-SHA256<br/>rodzaj + vault_id + epoch"]:::crypto
    CEK["Losowy CEK · 32 B<br/>opakowany osobno dla strażników<br/>AES-256 Key Wrap / A256KW"]:::crypto
    MASTER["Losowy master · 32 B<br/>zaszyfrowany CEK<br/>COSE_Encrypt / AES-256-GCM"]:::crypto
    PW --> KEK
    PRF --> KEK
    CODE --> KEK
    KEK -->|"odwija"| CEK
    CEK -->|"odszyfrowuje"| MASTER
  end
  subgraph identity["B · TOŻSAMOŚCI WEWNĄTRZ SKARBCA"]
    ENVK["HKDF master → envelope key<br/>COSE_Encrypt0 / AES-256-GCM<br/>treść koperty + padding 512 B"]:::crypto
    WRAP["HKDF master → wrap key<br/>HKDF → klucz konkretnej identity"]:::crypto
    KEYS["Losowe prywatne klucze secp256k1<br/>owner / active / memo<br/>osobno zapieczętowane z rolą w AAD"]:::crypto
    OWNER["owner<br/>kontrola uprawnień konta"]:::crypto
    ACTIVE["active<br/>podpisy transakcji i storage proof"]:::crypto
    MEMO["memo<br/>otwieranie kopert klucza pokoju"]:::crypto
    MASTER --> ENVK
    MASTER --> WRAP --> KEYS
    ENVK -->|"chroni spis i etykiety tożsamości"| KEYS
    KEYS --> OWNER
    KEYS --> ACTIVE
    KEYS --> MEMO
  end
  subgraph rooms["C · POKÓJ I KONKRETNA REWIZJA TREŚCI"]
    ROOMENV["Publiczna koperta klucza pokoju<br/>secp256k1 ECDH + HKDF + AES-GCM<br/>adresowana do publicznego memo członka"]:::meta
    ROOM["Losowy room key · 32 B<br/>wspólny dla uprawnionych członków"]:::crypto
    DEK["Świeży losowy DEK · 32 B<br/>dla nowej rewizji / obiektu"]:::crypto
    WRAPPED["wrapped DEK / content_key<br/>AES-GCM pod kluczem z room key<br/>purpose: stored-content-key"]:::crypto
    PAYLOAD["Szyfrogram danych w S3<br/>AES-GCM pod kluczem z DEK<br/>purpose: stored-content"]:::crypto
    CONTEXT["AAD: network + room + resource<br/>revision + type<br/>wiąże dane i opakowany DEK"]:::meta
    MEMO -->|"ECDH wewnątrz WASM"| ROOMENV
    ROOMENV -->|"odszyfrowany wynik wraca do JS"| ROOM
    ROOM --> WRAPPED
    DEK --> WRAPPED
    DEK --> PAYLOAD
    CONTEXT -.-> WRAPPED
    CONTEXT -.-> PAYLOAD
  end
```

Źródła: [S04](#s04), [S05](#s05), [S06](#s06), [S07](#s07), [S11](#s11), [S12](#s12), [S13](#s13), [S14](#s14), [S15](#s15).

Hasło skarbca **nie jest kluczem pokoju**. Otwiera strażnika, który pozwala odzyskać CEK, następnie master, a z niego klucze zabezpieczające prywatne tożsamości. Room key jest osobno losowany. Każda przygotowywana rewizja treści otrzymuje nowy DEK; ponowienie tego samego przygotowanego uploadu wykorzystuje zachowany szyfrogram. To rozdziela zmianę sposobu odblokowania od szyfrowania dużych plików.

Format danych pokoju: `version (1 B) | nonce (12 B) | ciphertext | tag (16 B)`, czyli **29 B narzutu**. Hash karty to SHA-256 szyfrogramu. Przed odszyfrowaniem klient sprawdza hash, kontekst, rozmiar oraz dozwolony adres magazynu. AAD uwierzytelnia pięć pól kontekstu; `parent`, `children` i `size` należą do deskryptora/publikacji, nie do tej piątki AAD. [S14](#s14), [S15](#s15), [S19](#s19)

**Co pozostaje jawne w kopercie skarbca:** wersja, `vault_id`, epoka, rodzaje i identyfikatory strażników, parametry KDF, credential ID, zasięg i transporty. Zaszyfrowane są master oraz treść zawierająca tożsamości i etykiety. AAD koperty to CBOR z wersją, `vault_id` i epoką. Nie należy utożsamiać paddingu z ukryciem wszystkich metadanych. [S06](#s06)

**Granica WASM:** prywatne klucze tożsamości są używane przez interfejs skarbca bez zwykłego eksportowania ich do boardu. Odszyfrowany room key jest jednak przekazywany do kodu JS, a treść istnieje w pamięci React/Query. Kod wywołuje `fill(0)`/zwalnianie sekretów i czyści kontekst przy zmianie dostępu; nie jest to sprzętowa izolacja ani dowód wymazania wszystkich kopii tekstu w pamięci przeglądarki. [S11](#s11), [S18](#s18), [S22](#s22)

## 03 · Logowanie, System i rejestracja tożsamości

```mermaid
sequenceDiagram
  actor U as Użytkownik
  participant B as Przeglądarka / runtime sesji
  participant X as XAuth API
  participant Z as Zitadel
  participant S as System API + PostgreSQL
  participant V as Lokalny XKeys
  participant A as Actanet accounts
  participant C as Swaplock
  U->>B: Email + hasło logowania albo passkey
  B->>X: HTTPS: dane logowania / ceremonia passkey
  X->>Z: Utworzenie i weryfikacja sesji
  Z-->>X: session_id + session_token
  X-->>B: Cookie auth_token_SLOT, HttpOnly, Secure zależnie od konfiguracji
  Note over B,X: Token to Base64 JSON, nie szyfrogram XKeys
  B->>S: Sesja + subject w żądaniu
  S->>X: Resolve: przekazane nagłówki tożsamości
  X-->>S: user_id, session_id, login_name
  S->>S: Authorized: prawo działania jako person / system
  U->>V: Niezależne odblokowanie skarbca
  B->>S: save_challenge: register
  S-->>B: Jednorazowy nonce + tag + digest
  B->>V: Utwórz identity: owner / active / memo
  V-->>B: Klucze PUBLICZNE + dowód posiadania active
  Note over B,V: Klient sam oblicza i porównuje wyzwanie przed podpisaniem
  B->>S: save_account: subject, nazwa, tier, public keys, podpis
  S->>S: Zużycie wyzwania, weryfikacja, rezerwacja nazwy
  S->>A: Rejestracja konta z publicznymi kluczami użytkownika
  A->>C: Registrar podpisuje i opłaca account_create
  C-->>A: Konto 1.2.x
  A-->>S: account_id + chain_name
  S->>S: Wiązanie subject ↔ konto
  S-->>B: Konto i nazwa łańcuchowa
  B->>V: Zapis binding identity ↔ network / account / name
```

Źródła: [S03](#s03), [S23](#s23), [S24](#s24), [S25](#s25), [S26](#s26), [S27](#s27), [S35](#s35).

System przechowuje relacje między użytkownikiem XAuth, osobą, systemami/organizacjami, dostępami i kontami łańcuchowymi. Obsługuje także ustawienia marketplace/kolejności oraz rejestr pokoi. Te rekordy są dostępne serwerowi; XKeys nie szyfruje całej bazy System. Wariant nazwy `private` trzyma właściwą nazwę w System, a na łańcuch trafia losowy alias `mb-…`. To ukrycie przed publicznym rejestrem, nie przed System. [S24](#s24), [S25](#s25)

Transport jest przypisany do konkretnej sesji, a `X-Account-Index` wybiera slot cookie. To **pozycja konta w przeglądarce**, nie trwały identyfikator osoby ani skarbca. Zwykłe logowanie nie otwiera vaultu; reset danych logowania nie odtwarza historycznych kluczy memo/pokoi. XAuth przekazuje hasło logowania do Zitadel, podczas gdy hasło urządzenia XKeys służy lokalnej kryptografii. [S03](#s03), [S10](#s10), [S23](#s23), [S26](#s26)

Zitadel jest źródłem tożsamości i sesji. Redis stanowi opcjonalny cache m.in. listy passkeys i statusów weryfikacji, zapisany jako JSON z TTL; nie jest skarbcem kluczy treści. Wartości hashy haseł i dokładne szyfrowanie wewnętrznej bazy Zitadel nie były przedmiotem tego przeglądu. [S26](#s26), [S27](#s27)

## 04 · Utworzenie pokoju i publiczny ślad

```mermaid
sequenceDiagram
  participant B as Board + datarooms
  participant V as XKeys WASM / TS
  participant L as IndexedDB
  participant A as Actanet
  participant C as Swaplock
  participant Q as Query / indexer
  participant S as System
  B->>Q: Odczyt właściciela i jego publicznego memo
  B->>V: Wylosuj room key 32 B i zaszyfruj do memo
  V-->>B: ECIES envelope klucza pokoju
  B->>B: Nazwa techniczna dr-UUID
  B->>L: Szyfrowany draft manifestu z tytułem, purpose room-setup
  B->>A: create_build: owner, dr-UUID, marker app/storage, opakowany room key
  A-->>B: Zbudowana transakcja
  B->>B: Lokalna weryfikacja treści, chainId i limitu opłaty
  B->>V: Podpis digestu kluczem active
  V-->>B: Podpis
  B->>A: Broadcast podpisanej transakcji
  A->>C: data_room_create, tag 78
  C-->>A: Receipt / room 1.23.x
  C->>Q: Indeksowanie bloku i członków
  B->>S: save_data_room: subject + room_id
  S->>Q: Sprawdź rzeczywistego właściciela
  S->>S: Czy właściciel reprezentuje subject? Zapis relacji
  S-->>B: Pokój zarejestrowany
  Note over B,C: Osobna publikacja: manifest z tytułem → szyfrowany S3 + karta
```

Źródła: [S16](#s16), [S17](#s17), [S24](#s24), [S29](#s29), [S35](#s35).

W obecnych pokojach Chatboards `description` jest markerem `{app: "chatboards", storage: "s3", version: 1}`. Nazwa użytkowa, podsumowanie i sloty dokumentów znajdują się w szyfrowanym manifeście aplikacji. Techniczna nazwa `dr-UUID`, identyfikator właściciela i istnienie pokoju pozostają publiczne. System rejestruje pokój niezależnie od nazwy boardu; nie wymaga `app == chatboards`. [S17](#s17), [S24](#s24), [S29](#s29)

Konta mają identyfikatory `1.2.x`, pokoje `1.23.x`, a content cards `1.26.x`. Rejestracja pokoju w System i utworzenie go w Swaplock są oddzielnymi zapisami. Utrata odpowiedzi nie oznacza, że operacja się nie wykonała: klient przechowuje informacje o oczekującej transakcji i odzyskuje rezultat przez receipt/indexer. [S16](#s16), [S20](#s20)

**Dostęp ma dwa poziomy.** Relacja w System pomaga znaleźć zasób i określa uprawnienia podmiotu w aplikacji. Możliwość odszyfrowania wynika z klucza memo i otrzymanej koperty room key. Zmiana wyłącznie relacji w System nie unieważnia już skopiowanego klucza. Backend Actanet ma operacje członkostwa, rotacji i regrant; ich obecność nie dowodzi dostępności wszystkich wariantów w aktualnym UI. [S18](#s18), [S36](#s36)

## 05 · Gdzie trafiają wiadomości i pliki: pełny upload

```mermaid
sequenceDiagram
  participant B as Board + lokalne XKeys
  participant L as IndexedDB
  participant A as Actanet storage / rooms
  participant R as PostgreSQL registry
  participant T as OVH S3 staging PRIVATE
  participant O as OVH S3 objects PUBLIC
  participant C as Swaplock + Query
  B->>B: Serializacja danych, świeży DEK, AES-GCM, SHA-256 szyfrogramu
  B->>B: Opakuj DEK kluczem pokoju, zbuduj descriptor
  B->>L: Przygotowany szyfrogram i metadane ponowienia
  B->>A: storage/prepare: intencja + podpis active, ważny 300 s
  A->>C: Sprawdź aktualnego właściciela i jego active
  A->>R: Rezerwacja uploadu / quota / identyfikator rewizji
  A-->>B: Presigned POST, exact size/key, ACL private, do 900 s
  B->>T: Bezpośredni POST multipart: content.bin, ciphertext
  Note over B,T: Bez cookies aplikacji, Content-Type application/octet-stream
  B->>A: storage/complete + nowy podpis intencji
  A->>T: GET szyfrogramu
  A->>A: Sprawdzenie pełnego rozmiaru i SHA-256, bez odszyfrowania
  A->>R: Rejestracja próby publikacji obiektu
  A->>O: PUT zweryfikowanych bajtów pod nowy objects/UUID
  A->>R: Stan ready + stały URL
  A-->>B: upload_id + publiczny URL szyfrogramu
  B->>A: Build karty: URL, hash, wrapped DEK, descriptor
  A-->>B: Transakcja create 85 / update 86 + expected_hash
  B->>B: Zweryfikuj lokalnie i podpisz active
  B->>L: Pending publication / dokładna podpisana transakcja
  B->>A: storage/register: proof + dokładna transakcja
  A->>R: Utrwal publikację i zależności children
  B->>A: broadcast
  A->>C: Podpisana operacja karty
  C-->>A: Receipt
  A-->>B: Wynik / karta / blok
  A->>C: Reconciliation: kanoniczny nieodwracalny blok + wynik indexera
  A->>R: Potwierdzenie opublikowanej rewizji
  Note over B,R: Timeout: outcome / retry tej samej operacji, bez ślepego drugiego create
```

Źródła: [S14](#s14), [S19](#s19), [S20](#s20), [S21](#s21), [S28](#s28), [S30](#s30).

**Lokalizacja obiektów z konfiguracji:** bucket `mirrorboards-actanet-content`, OVH WAW, stałe adresy `https://mirrorboards-actanet-content.s3.waw.io.cloud.ovh.net/objects/…`. `staging/` jest prywatny; docelowy obiekt ma `public-read`. Publiczny jest szyfrogram, nie odszyfrowany dokument. Autoryzacja pobierania docelowych bajtów nie zastępuje kryptografii — link może pobrać ktoś bez sesji. Dokładny URL aplikacja otrzymuje z usług storage, a czytnik sprawdza `public_base_url`. [S19](#s19), [S28](#s28), [S30](#s30), [S33](#s33)

**Duży plik nie przechodzi przez Chat API ani System.** Najpierw idzie z przeglądarki do S3. Następnie Actanet pobiera i ponownie publikuje zweryfikowane bajty szyfrogramu, więc stwierdzenie „backend w ogóle nie dotyka bajtów pliku” byłoby nieprawdziwe. Actanet nie dostaje w tym przepływie klucza do odszyfrowania. [S28](#s28), [S30](#s30)

**Załącznik ma dwie warstwy.** Pierwszy obiekt to zaszyfrowane surowe bajty pliku typu protokołu `urn:mirrorboards:blob:1`. Drugi to szyfrowany manifest dokumentu: oryginalna nazwa, MIME, rozmiar, hash plaintextu, stan usunięcia i referencja do pierwszego obiektu, w tym jego opakowany DEK. Publikacja manifestu wskazuje `children`, które utrzymują blob przy życiu. MIME pliku i jego nazwa nie muszą trafiać do publicznej karty; publiczny `type` określa rodzaj zasobu protokołu. [S21](#s21), [S29](#s29)

Limit plaintextu wynosi 100 000 000 B, szyfrogramu 100 000 029 B. Przygotowany upload ma limit czasu; nie jest to termin ważności opublikowanego URL. Limit z kodu: 8 aktywnych uploadów i 200 000 058 B na właściciela, do 4 jednoczesnych weryfikacji w procesie. To limity implementacji, nie potwierdzone bieżące wykorzystanie produkcyjne. [S28](#s28), [S30](#s30)

## 06 · Odczyt, historia i odwoływanie dostępu

```mermaid
sequenceDiagram
  participant B as Board + datarooms
  participant S as System
  participant Q as Swaplock Query
  participant V as Otwarty XKeys
  participant O as Publiczny S3
  B->>S: Lista room_id dla subject
  B->>Q: Pokój / członkowie / content cards
  Q-->>B: Metadane + member_key + URL/hash/wrapped DEK/descriptor
  B->>B: Sprawdź sesję, aktywną identity, otwarty vault i członkostwo
  B->>V: decryptEnvelope(identity, memo, member_key)
  V-->>B: room key w pamięci JS
  opt Odczyt starszej rewizji / po rotacji room key
    B->>Q: Historyczne key epochs dla aktualnego członka
    Q-->>B: Historyczne koperty kluczy
    B->>V: Otwieraj i wybierz klucz pasujący do wrapped DEK
  end
  B->>O: GET szyfrogramu, bez cookies, redirect error
  O-->>B: application/octet-stream
  B->>B: Sprawdź URL, rozmiar, SHA-256 i kontekst
  B->>B: room key → otwórz DEK → odszyfruj dane
  B->>B: Decode / walidacja schematu → jawny stan UI
  Note over B,V: Klucz pokoju i bufory czyszczone po użyciu, tekst UI żyje w pamięci
  opt Przywrócenie wersji
    B->>B: Wybierz starą treść i zapisz jako NOWĄ rewizję
    B->>Q: Historia oryginalna pozostaje
  end
```

Źródła: [S18](#s18), [S19](#s19), [S20](#s20), [S22](#s22), [S31](#s31).

Aktualny kod posiada UI historii kart i odtwarzania wersji. Starsza notatka operacyjna nadal mówi o „UI deferred”; w tym punkcie rozstrzyga nowsza implementacja. Czytnik historii korzysta z `content_cards/get_revisions/query`. Ten indeks przedstawia stany kart na granicach bloków, więc **nie jest to gwarancja pokazania każdej pośredniej rewizji w jednym bloku**. Dokładne podpisane publikacje są osobno utrwalane w storage ledger. [S20](#s20), [S31](#s31), [S33](#s33)

Zmiana `expected_hash` zapewnia kontrolę współbieżnego zapisu: nowa wersja nie powinna nadpisać obcej zmiany bez zauważenia konfliktu. Usunięcie dokumentu w boardzie publikuje `deleted: true`. Nie jest równoznaczne z fizycznym usunięciem obiektu S3 ani historii. Potwierdzone rewizje są zachowywane, a GC ma dotyczyć osieroconych uploadów po co najmniej 24 godzinach i tylko po bezpiecznej weryfikacji braku referencji. [S20](#s20), [S21](#s21), [S30](#s30), [S33](#s33)

**Trzy różne rotacje:** zmiana strażnika dotyczy otwierania mastera; rotacja mastera zmienia epokę skarbca i przepakowuje jego zawartość; rotacja room key dotyczy nowych danych pokoju i kopert członków. Usunięcie strażnika bez rotacji nie odbiera mu możliwości otwarcia zachowanej starej koperty. Usunięcie członka nie usuwa jego wcześniejszych kopii room key, treści ani szyfrogramów. Brak podstaw, aby deklarować forward secrecy dla każdej wiadomości: tutaj nie ma protokołu ratchet per wiadomość. To wnioski z opisanej konstrukcji. [S04](#s04), [S18](#s18), [S36](#s36)

## 07 · Rozmowa z AI: granica poufności

```mermaid
sequenceDiagram
  participant U as Użytkownik / UI
  participant L as Lokalny szyfrowany draft
  participant C as Chat API · Rust / Rig
  participant X as XAuth
  participant G as Bifrost gateway
  participant P as OpenRouter / model / Anthropic
  participant R as Zdalny zapis S3 + Swaplock
  U->>L: Szyfrowany checkpoint przed wysłaniem
  U->>U: Wybór kontekstu: do 200 wiadomości i 128 KiB
  U->>C: POST chat.run przez HTTPS: jawne wiadomości + thread/run IDs
  C->>X: Resolve sesji użytkownika
  X-->>C: Zweryfikowana tożsamość
  C->>C: Walidacja, limit równoległości, profil modelu
  C->>G: Chat Completions + klucz wirtualny aplikacji
  Note over C,G: W Pulumi: HTTP wewnątrz klastra, mTLS niezweryfikowane
  G->>G: Alias mb/fast-open lub mb/agent-open → reguły routingu
  G->>P: Jawny kontekst w API dostawcy, klucz dostawcy z gateway
  P-->>G: Strumień odpowiedzi
  G-->>C: Strumień modelu
  C-->>U: AG-UI SSE: start / delty / finish lub error
  U->>L: Szyfrowane checkpointy lokalne
  U->>R: Po zakończeniu / stop / błędzie: zaszyfrowany snapshot rozmowy
  Note over U,R: Zapis obejmuje historię, okno wysłane modelowi jest ograniczone osobno
```

Źródła: [S32](#s32), [S34](#s34), [S37](#s37), [S38](#s38), [S39](#s39).

Chatboards wysyła wiadomości rozmowy; **materiały projektu nie są jeszcze automatycznie dołączane**. Sam upload PDF nie oznacza OCR, indeksowania wektorowego ani RAG. UI mówi o tym wprost, a runtime nie ma w tej ścieżce narzędzia pobierającego pliki projektu. Nie przenoszę możliwości dawnych proxy i innych boardów do obecnego Chat API. [S32](#s32), [S34](#s34)

Snapshot w S3 może przechowywać pełną historię, nazwy i statusy wiadomości. Request modelu ogranicza się do maksymalnie 200 wiadomości i 128 KiB serializacji; pomija wskazane nieudane wiadomości oraz puste odpowiedzi asystenta. API dodatkowo waliduje wejście. SSE nie jest trwałym logiem rozmowy: runtime używa `without_memory()`, a trwały zapis inicjuje frontend. Domyślne limity backendu: 120 s, 4096 tokenów odpowiedzi, 2 jednoczesne uruchomienia na konto w procesie. [S29](#s29), [S32](#s32), [S34](#s34), [S37](#s37)

**Wartość domyślna zależy od warstwy.** Kod ChatConfig domyślnie wybiera `agent`, ale Pulumi ustawia `AI_MODEL_PROFILE_DEFAULT=fast`. Oba domyślne aliasy to klasa `-open`. Lokalny katalog gateway opisuje tę klasę jako dopuszczającą trening u dostawców; to opis intencji konfiguracji, nie przeprowadzona tutaj weryfikacja bieżących warunków OpenRoutera lub konkretnego modelu. Alias `mb/agent-std` jest zdefiniowany w gateway, lecz nie należy do domyślnej mapy profili Chat API. [S37](#s37), [S38](#s38), [S39](#s39)

**Logowanie gateway jest włączone w wykonywanej konfiguracji:** `EnableLogging: true`, `LogsStore.Enabled: true`, SQLite `/app/data/logs.db`. Wolumen `/app/data` jest `emptyDir`, więc nie jest trwałą historią po usunięciu poda. Starszy komentarz w `main.go` mówi o wyłączonych logach; rozstrzygają wartości w `config.go`. Zakres przechowywania promptów/odpowiedzi, redakcja i eksport logów nie zostały sprawdzone, dlatego diagram nie obiecuje „zero retention”. [S38](#s38), [S39](#s39)

Zaszyfrowane przechowywanie rozmowy **nie oznacza**, że treść pozostaje nieczytelna podczas inferencji. Plaintext zna przeglądarka, Chat API, AI gateway i wybrany dostawca; routing i fallbacki mogą zmieniać ostatniego odbiorcę.

## 08 · Kopie skarbca, AutoUnlock i nowe urządzenie

```mermaid
flowchart TB
  subgraph first["URZĄDZENIE A"]
    V["Otwarty vault<br/>master + CEK + tożsamości"]:::crypto
    LOCAL["local_snapshot<br/>lokalna koperta CBOR<br/>z device-password guardian"]:::crypto
    AUTO["AutoUnlock opt-in<br/>jawne hasło w osobnym rekordzie<br/>IndexedDB xkeys / envelopes"]:::plain
    EXPORT["export przenośnej koperty<br/>BEZ device-password recipient<br/>wymaga podróżującego strażnika"]:::crypto
    PDF["Lokalny PDF<br/>jawny kod odzysku + vault_id<br/>nie zawiera całej koperty"]:::plain
    V --> LOCAL
    AUTO -->|"automatycznie otwiera"| LOCAL
    V --> EXPORT
    V --> PDF
  end
  STORE["XKeys API + PostgreSQL<br/>exported envelope<br/>revision / epoch / write_public_key<br/>zapis podpisany Ed25519"]:::crypto
  BACKUP["Pobrany plik backupu<br/>przenośna zaszyfrowana koperta"]:::crypto
  RELAY["XKeys pairing relay<br/>pakiety CPace + sealed payload<br/>120 s / do 3 prób<br/>to samo konto XAuth"]:::crypto
  subgraph second["URZĄDZENIE B"]
    CODE["Generuje 6-znakowy kod<br/>kod przepisany do A poza relay"]:::plain
    PAKE["CPace → klucz sesji<br/>otwiera master + CEK + vault_id"]:::crypto
    RESTORE["Odtworzenie vaultu<br/>koperta + sekret strażnika<br/>ALBO koperta + sekret z pairing"]:::crypto
    NEW["Nowy lokalny strażnik<br/>lokalna koperta urządzenia B"]:::crypto
    CODE --> PAKE
    PAKE --> RESTORE --> NEW
  end
  EXPORT --> STORE
  EXPORT --> BACKUP
  STORE --> RESTORE
  BACKUP --> RESTORE
  PDF -.->|"kod otwiera recovery guardian"| RESTORE
  CODE -.->|"użytkownik wpisuje w A"| V
  V -->|"świeży dowód strażnika + CPace + AES-GCM"| RELAY
  RELAY --> PAKE
```

Źródła: [S04](#s04), [S08](#s08), [S09](#s09), [S10](#s10), [S40](#s40), [S41](#s41), [S42](#s42).

Lokalna baza `xkeys` zawiera stores `envelopes` i `marks`. Koperta urządzenia jest adresowana `account:<user_id>`; znaczniki świeżości są przechowywane oddzielnie. AutoUnlock używa w `envelopes` osobnego klucza obejmującego API URL i `user_id`, z JSON-em `{vaultId, epoch, password}`. To **jawne hasło zapisane na tym urządzeniu**, nie dodatkowo zaszyfrowany sekret. Nie jest częścią backupu ani uploadu koperty. Zabezpieczenie aplikacyjne przy lokalnym odczycie bazy jest zatem inne niż w trybie ręcznego wpisywania hasła. [S09](#s09), [S10](#s10)

Przenośna koperta usuwa odbiorców typu device-password; hasło lokalnego urządzenia nie wystarcza do otwarcia samej koperty pobranej z serwera na nowym urządzeniu. Wspierane typy strażników to hardware key, platform passkey, device password i recovery code. Opcja odzyskiwania zarządzanego przez Mirrorboards jest w wizardzie wyłączona („Wkrótce”). MetaMask nie jest typem strażnika w bieżącym formacie. [S04](#s04), [S06](#s06), [S42](#s42)

Zapis koperty wymaga rosnącej dokładnie o jeden `revision`; `epoch` liczy rotacje mastera. Serwer sprawdza podpis Ed25519, a rotacja klucza zapisu wymaga podpisów starym i nowym kluczem. Pierwszy zapis opiera się na przedstawionym kluczu publicznym i bramce sesji. `list_owned` jest filtrowane po koncie, natomiast `get(vault_id)` wymaga sesji, lecz nie sprawdza, czy adres należy do pytającego. Poufność koperty opiera się na szyfrowaniu. [S08](#s08)

Pairing nie wysyła krótkiego kodu jako hasła szyfrującego do relay. CPace służy do uzgodnienia sekretu między urządzeniami; zaszyfrowany payload zawiera master, CEK i vault ID. Urządzenie dołączające potrzebuje również zgodnej koperty. Przyznanie dostępu wymaga ponownego dowodu strażnika. Limity i skierowanie prośby do tego samego konta XAuth są częścią ochrony. [S40](#s40), [S41](#s41)

## 09 · Rozmieszczenie usług i trwałość

```mermaid
flowchart TB
  INTERNET["Przeglądarka<br/>publiczne hosty HTTPS"]:::plain
  EDGE["Gateway / HTTPRoute<br/>Kubernetes według Pulumi"]:::app
  subgraph cluster["KLASTER APLIKACYJNY · deklaracje Pulumi"]
    WEB["mirrorboards-chat-web<br/>statyczna aplikacja + WASM"]:::app
    AUTH["xauth-api :3006"]:::app
    XKEYS["xkeys-api :3007"]:::app
    SYSTEM["system-api"]:::app
    CHAT["mirrorboards-chat-api :3005<br/>Rig, bez trwałej historii rozmów"]:::app
    ACT["actanet-api<br/>storage + rejestrator + transakcje"]:::app
    Z["Zitadel + jego baza<br/>Redis cache XAuth"]:::meta
    XDB[("AppDbEnvelope / PostgreSQL<br/>schema xkeys<br/>vaults + pairings + NOTIFY")]:::crypto
    SDB[("System PostgreSQL<br/>podmioty, dostępy, powiązania")]:::meta
    ADB[("CNPG actanet-storage-db<br/>rewizje + podpisane publikacje")]:::meta
    GW["ai-gateway.ai.svc :8080<br/>Bifrost · ClusterIP<br/>config.db + logs.db w emptyDir"]:::plain
    SEC["Infisical → External Secrets<br/>poświadczenia usług / S3 / AI<br/>odrębne od vaultów użytkownika"]:::app
    AUTH --> Z
    XKEYS --> XDB
    SYSTEM --> SDB
    ACT --> ADB
    CHAT -->|"HTTP /v1 + virtual key"| GW
    SEC -.-> GW
    SEC -.-> ACT
    SEC -.-> AUTH
  end
  subgraph storage["OVH OBJECT STORAGE"]
    OBJECTS[("mirrorboards-actanet-content<br/>staging prywatny / objects publiczny<br/>szyfrogramy treści")]:::crypto
    BACKUP[("mirrorboards-actanet-registry-backups<br/>prywatny bucket, osobne credentials<br/>base backup + WAL, retencja 30 dni")]:::meta
  end
  CHAIN["Swaplock RPC / witnesses / seeds<br/>trwały blockchain"]:::meta
  INDEX["Swaplock Query<br/>indexer + PostgreSQL"]:::meta
  MODELS["API dostawców AI"]:::plain
  INTERNET --> EDGE
  EDGE --> WEB
  EDGE --> AUTH
  EDGE --> XKEYS
  EDGE --> SYSTEM
  EDGE --> CHAT
  EDGE --> ACT
  INTERNET -->|"bezpośredni transfer szyfrogramów"| OBJECTS
  ACT --> OBJECTS
  ADB -->|"Barman: WAL + daily backup"| BACKUP
  ACT --> CHAIN --> INDEX
  GW --> MODELS
```

Źródła: [S08](#s08), [S28](#s28), [S30](#s30), [S33](#s33), [S38](#s38), [S39](#s39), [S44](#s44), [S45](#s45).

Diagram przedstawia logiczne rozmieszczenie wynikające z repozytorium; nie deklaruje, że każda usługa ma własny fizyczny serwer. W szczególności XKeys wykorzystuje `AppDbEnvelope` z rodziny czatu i schemat `xkeys`, choć obecny Chat API nie zapisuje tam wiadomości. Nazwa pakietu lub bazy nie dowodzi przechowywania treści rozmów. [S08](#s08), [S32](#s32), [S44](#s44)

Backup registry i backup vaultu rozwiązują różne problemy. Registry odtwarza historię publikacji i powiązań z obiektami; nie posiada plaintextu dokumentów ani kluczy umożliwiających ich odszyfrowanie. Odzyskanie dokumentu wymaga równocześnie zachowanego szyfrogramu, poprawnych metadanych i odpowiednich kluczy użytkownika/pokoju. Sama koperta bez strażnika albo sam bucket bez kluczy nie wystarczą. Harmonogram CNPG deklaruje codzienny backup 02:00 UTC i archiwizację WAL, prywatny bucket oraz retencję 30 dni. Ta retencja nie ogranicza czasu życia opublikowanych obiektów. Nie sprawdzałem w tej sesji skuteczności backupów ani opóźnienia WAL. [S33](#s33), [S45](#s45)

HTTPS publicznych hostów wynika z adresów aplikacji i infrastruktury. Wewnętrzne URL-e do XAuth oraz AI gateway używają `http://…svc.cluster.local`. Nie zweryfikowano aktywnego service mesh/mTLS, szyfrowania wszystkich dysków i backupów na poziomie dostawcy ani dokładnych reguł sieciowych. Nie należy dopisywać takich gwarancji do szyfrowania realizowanego przez XKeys.

## 10 · Tabela: co, gdzie i kto może przeczytać

| Dane | Miejsce | Ochrona aplikacyjna | Widoczność / ograniczenie |
|---|---|---|---|
| Wiadomości, tytuły, podsumowania w czasie pracy | React / Query / pamięć urządzenia | Odszyfrowane do użycia | Kod działający w kontekście aplikacji ma dostęp do treści. |
| Snapshot rozmowy i manifest pokoju | OVH S3 `objects/…` | AES-GCM, losowy DEK, DEK opakowany room key | Publiczne bajty są szyfrogramem; rozmiar i wzorce dostępu pozostają widoczne. |
| Surowe bajty dokumentu | Osobny obiekt S3 | Jak wyżej | Odszyfrowanie lokalne; samo pobranie szyfrogramu nie wymaga sesji. |
| Nazwa pliku, MIME, hash plaintextu | Szyfrowany manifest dokumentu | Jak treść | API storage widzi typ protokołu, hash szyfrogramu, rozmiar i powiązania. |
| URL, hash szyfrogramu, rodzaj karty, deskryptor, opakowany DEK | Swaplock, Query, registry | Metadane jawne; DEK zaszyfrowany | Istnienie zasobu, właściciel, identyfikatory, rewizje i struktura powiązań są obserwowalne. |
| Room key | Chwilowo JS; koperty członków na łańcuchu | ECIES do publicznego memo | Posiadacz odpowiedniego prywatnego memo może otworzyć kopertę. |
| Prywatne owner/active/memo | Szyfrowana zawartość vaultu; użycie w WASM | Warstwa koperty + osobno zapieczętowane klucze identity | XKeys API przechowuje szyfrogram; publiczne odpowiedniki są publikowane. |
| Hasło urządzenia XKeys | Wpisanie lokalne; opcjonalnie IndexedDB | Argon2id do KDF; AutoUnlock przechowuje jawny tekst | Nie jest wysyłane w przenośnej kopercie. |
| Kod odzysku | Pamięć kreatora / lokalny PDF | Jawny sekret użytkownika | PDF z kodem i vault ID nie jest kompletnym backupem koperty. |
| Koperta skarbca | IndexedDB / XKeys PostgreSQL / backup plikowy | CBOR + COSE AES-GCM / A256KW | Jawne metadane strażników; local_snapshot różni się od export. |
| Stan niedokończonej edycji | IndexedDB `mirrorboards-encrypted-content` | Zaszyfrowany payload lub przygotowany szyfrogram | Klucze rekordów i część metadanych ponowienia są jawne. |
| Pending transaction i dane publikacji | localStorage | Podpisana transakcja, metadane i opakowane klucze | Nie jest to ten sam magazyn co szyfrowany draft; nie powinien zawierać treści użytkowej. |
| Token logowania | Cookie / transport Tauri | Token bearer, Base64 JSON; transport sesji | Base64 nie szyfruje; browser cookie ma HttpOnly i konfigurowalny Secure. |
| Konta, e-mail, sesje, weryfikacje | XAuth / Zitadel / cache Redis | Kontrola dostępu usług | Poza szyfrowaniem treści XKeys. |
| Osoby, organizacje, dostęp, nazwy, preferencje | System PostgreSQL | Autoryzacja `Authorized` | System zna relację user ↔ subject ↔ konto ↔ pokój. |
| Prompt i odpowiedź w czasie inferencji | Chat API → Bifrost → dostawca | Transport; bez szyfrowania przed usługą AI | Usługi przetwarzające otrzymują treść jawną. |
| Historia zapytań gateway | SQLite w `emptyDir` poda Bifrost | Po stronie serwera; logowanie włączone | Zakres payloadów, redakcja i ewentualny eksport niezweryfikowane. |
| Backup storage ledger | Prywatny bucket OVH | ACL i osobne credentials; zawartość to registry | Nie jest kopią odszyfrowanych plików; warstwy szyfrowania backupu wymagają osobnej weryfikacji. |

Tabela syntetyzuje diagramy 01–09 i przypisane im źródła. Ochrona przed odczytem treści nie ukrywa wszystkich metadanych ani nie zastępuje kontroli kodu uruchamianego na urządzeniu.

## 11 · Zakres i rzeczy, których nie należy dopowiadać

1. **XFiles/IPFS nie jest ścieżką uploadu opisanego Chatboards.** Obecny router `xfiles-korea` ma pustą listę endpointów. Repozytorium zawiera historyczne komponenty IPFS i XFiles, ale analizowana ścieżka korzysta z Actanet storage i S3. Nie oznacza to, że żaden inny produkt w workspace ich nie używa. [S46](#s46)
2. **Szyfrowanie storage i prywatność AI to osobne właściwości.** Nie można określić całej aplikacji jako „serwer nigdy nie widzi wiadomości”, jeśli użytkownik wysyła je do AI.
3. **Autoryzacja nie jest kluczem deszyfrującym.** XAuth i System nie otwierają vaultu. Skopiowane wcześniej klucze/treść nie znikają po zmianie ACL.
4. **Aktualny frontend i dawny `mirrorboards-chat-proxy-ai` nie są tą samą ścieżką.** Obecny Chat API jest w Rust/Rig; diagram nie przypisuje mu dawnych narzędzi, głosu czy integracji bez dowodu wywołania. [S32](#s32), [S34](#s34)
5. **API boardów jest odrębnym rozszerzeniem.** Host zna `boards.mirrorboards.chat`; ta rodzina montuje routery Astral/Marketing/Strategy/Crossword. Nie bierze udziału w pokazanym uploadzie Chatboards. Każdy konkretny board z własnym backendem wymaga odrębnego prześledzenia zakresu wysyłanych danych. [S01](#s01), [S47](#s47)
6. **To mapa kodu, nie atest bezpieczeństwa.** Nie uruchamiałem testów kryptograficznych, pentestu, produkcyjnego capture ruchu ani restore drill. Walidacja artefaktu obejmuje renderowanie diagramów, otwieranie HTML, interakcje i spójność odnośników do istniejących plików.

## 12 · Źródła i możliwość aktualizacji

Odnośniki poniżej prowadzą do kodu w repozytoriach GitHub; prywatne repozytoria wymagają uprawnionego konta. Odciski opisują analizowany stan lokalny. Przy pliku zmienionym względem HEAD odnośnik pokazuje bazowy commit, a SHA-256 identyfikuje analizowany plik. `evidence.json` zawiera SHA-256 pliku, commit repozytorium i informację, czy dany plik różnił się od HEAD. Nazwy sekretów opisują zależności; dokument nie zawiera ich wartości. Diagramy można edytować jako Mermaid w tym pliku lub w katalogu `diagrams/`. HTML ma osadzone SVG, działa bez CDN i bez kontaktu z API produktu.

<!-- SOURCES -->

### S01 · Host, konfiguracja usług i boardy

<a id="s01"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/env.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/env.ts)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/api.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/api.ts)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/boards.tsx](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/boards.tsx) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S02 · Wstrzyknięcie klientów usług

<a id="s02"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/routes/u/$accountIndex/boards/route.tsx](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/routes/u/%24accountIndex/boards/route.tsx)



### S03 · Runtime sesji i porty skarbca

<a id="s03"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/sessions.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/sessions.ts)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/components/vault/ports.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/components/vault/ports.ts)



### S04 · Cykl życia vaultu i export/local_snapshot

<a id="s04"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-core/src/vault.rs](https://github.com/mirrorboards-xkeys/xkeys-core/blob/0c11bf3bf673c53eb4a2531dd2d8b17eabacbbeb/src/vault.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-core/src/guardian.rs](https://github.com/mirrorboards-xkeys/xkeys-core/blob/0c11bf3bf673c53eb4a2531dd2d8b17eabacbbeb/src/guardian.rs)



### S05 · KDF strażników i rozdział dziedzin

<a id="s05"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/kek.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/kek.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/derive.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/derive.rs)



### S06 · Format jawnej/zapieczętowanej koperty

<a id="s06"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/envelope.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/envelope.rs)



### S07 · COSE i wewnętrzne klucze tożsamości

<a id="s07"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/cose.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/cose.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/content.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/content.rs)



### S08 · Magazyn XKeys, autoryzacja zapisu i odczytu

<a id="s08"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/core/src/db.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/core/src/db.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/core/src/rules.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/core/src/rules.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/router/src/routes/xkeys/vault/_query/get.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/router/src/routes/xkeys/vault/_query/get.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/router/src/routes/xkeys/vault/_command/put.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/router/src/routes/xkeys/vault/_command/put.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/router/src/state.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/router/src/state.rs)



### S09 · IndexedDB skarbca

<a id="s09"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/storage.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/storage.ts)



### S10 · AutoUnlock

<a id="s10"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/components/vault/useAutoUnlock.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/components/vault/useAutoUnlock.ts)



### S11 · Granica WASM i generowanie tożsamości

<a id="s11"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-wasm/src/lib.rs](https://github.com/mirrorboards-xkeys/xkeys-wasm/blob/d9b88fbbe7f35243308017129dfe212727fcf6bd/src/lib.rs)



### S12 · Role kluczy łańcuchowych

<a id="s12"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-chain/src/identity.rs](https://github.com/mirrorboards-xkeys/xkeys-chain/blob/7b38065b48bd811af5675915475cba8a2292d400/src/identity.rs)



### S13 · ECIES i losowy room key

<a id="s13"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-ts/src/ecies.ts](https://github.com/mirrorboards-xkeys/xkeys-ts/blob/ab0977a7ff87383340db40df64ae026f2ebb1248/src/ecies.ts)

- [mirrorboards/mirrorboards-xkeys/xkeys-ts/src/room-key.ts](https://github.com/mirrorboards-xkeys/xkeys-ts/blob/ab0977a7ff87383340db40df64ae026f2ebb1248/src/room-key.ts)



### S14 · DEK, wrapping i AAD stored content

<a id="s14"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-ts/src/stored-content.ts](https://github.com/mirrorboards-xkeys/xkeys-ts/blob/ab0977a7ff87383340db40df64ae026f2ebb1248/src/stored-content.ts)



### S15 · HKDF i AES-GCM payloadów

<a id="s15"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-ts/src/content.ts](https://github.com/mirrorboards-xkeys/xkeys-ts/blob/ab0977a7ff87383340db40df64ae026f2ebb1248/src/content.ts)



### S16 · Tworzenie i odnajdywanie pokoju

<a id="s16"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/creation/prepare.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/creation/prepare.ts)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useCreateDataRoom.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useCreateDataRoom.ts)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/services/rooms.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/services/rooms.ts)



### S17 · Nazwa i prywatny manifest pokoju Chatboards

<a id="s17"></a>

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/hooks/useCreateChatboard.ts](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/hooks/useCreateChatboard.ts) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-messages/src/room.ts](https://github.com/mirrorboards-boards/chatboards-chats-messages/blob/1fb348a793a18edaf1b17f5031a5fd3cba41d4ff/src/room.ts) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S18 · Aktualne członkostwo i historyczne klucze

<a id="s18"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useDataRoomAccess.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useDataRoomAccess.ts)



### S19 · Descriptor i weryfikacja pobranego szyfrogramu

<a id="s19"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/services/storedContent.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/services/storedContent.ts)



### S20 · Publikacja kart, CAS i pending transaction

<a id="s20"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useDataRoomCard.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useDataRoomCard.ts)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/services/cards.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/services/cards.ts)



### S21 · Upload pliku i szyfrowany manifest dokumentu

<a id="s21"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useStoredBlob.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useStoredBlob.ts)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/hooks/useProjectDocuments.ts](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/hooks/useProjectDocuments.ts) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S22 · Drafty i prywatny kontekst pamięci

<a id="s22"></a>

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/services/draftStore.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/services/draftStore.ts)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useDataRoomDraft.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useDataRoomDraft.ts)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/access/usePrivateDataScope.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/access/usePrivateDataScope.ts)



### S23 · Rozwiązywanie sesji przez XAuth

<a id="s23"></a>

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-core/src/session/resolve.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-core/src/session/resolve.rs)



### S24 · System: subject i rejestr pokoi

<a id="s24"></a>

- [applications/applications-system/system-korea/system-router/src/authorized.rs](https://github.com/mirrorboards-system/system-korea/blob/90bfa8a831762e897fe1b99eda110ff504d4f260/system-router/src/authorized.rs)

- [applications/applications-system/system-korea/system-router/src/routes/system/data_rooms/save_data_room.rs](https://github.com/mirrorboards-system/system-korea/blob/90bfa8a831762e897fe1b99eda110ff504d4f260/system-router/src/routes/system/data_rooms/save_data_room.rs)

- [applications/applications-system/system-korea/system-core/src/store/data_rooms.rs](https://github.com/mirrorboards-system/system-korea/blob/90bfa8a831762e897fe1b99eda110ff504d4f260/system-core/src/store/data_rooms.rs)



### S25 · System: rejestracja nazw i kont

<a id="s25"></a>

- [applications/applications-system/system-korea/system-router/src/routes/system/chain/_command/save_account.rs](https://github.com/mirrorboards-system/system-korea/blob/90bfa8a831762e897fe1b99eda110ff504d4f260/system-router/src/routes/system/chain/_command/save_account.rs)

- [applications/applications-system/system-korea/system-router/src/preferences/marketplace/save_board.rs](https://github.com/mirrorboards-system/system-korea/blob/90bfa8a831762e897fe1b99eda110ff504d4f260/system-router/src/preferences/marketplace/save_board.rs)



### S26 · XAuth: logowanie, token, cookie

<a id="s26"></a>

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-router/src/routes/xauth/accounts/human/_command/login_with_password.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-router/src/routes/xauth/accounts/human/_command/login_with_password.rs)

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-core/src/session/token.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-core/src/session/token.rs)

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-core/src/session/cookie.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-core/src/session/cookie.rs)



### S27 · Zitadel i Redis cache

<a id="s27"></a>

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-core/src/cache.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-core/src/cache.rs)

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-core/src/session/zitadel.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-core/src/session/zitadel.rs)

- [mirrorboards/mirrorboards-xauth/xauth-korea/xauth-router/src/routes/xauth/credentials/passkeys/_query/get_active_list.rs](https://github.com/xauth-net/xauth-korea/blob/2cb78edaf524a95a07faf78ac1c0559a7f51295e/xauth-router/src/routes/xauth/credentials/passkeys/_query/get_active_list.rs)



### S28 · API Actanet storage i dowody właściciela

<a id="s28"></a>

- [applications/applications-actanet/actanet-api/src/routers/storage.rs](https://github.com/actanet/actanet-api/blob/1a9bf464affea6342ef3609e2415a9dedea933f2/src/routers/storage.rs)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/services/storageUpload.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/services/storageUpload.ts)



### S29 · Schematy utrwalanych danych

<a id="s29"></a>

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-messages/src/schemas.ts](https://github.com/mirrorboards-boards/chatboards-chats-messages/blob/1fb348a793a18edaf1b17f5031a5fd3cba41d4ff/src/schemas.ts)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-messages/src/room.ts](https://github.com/mirrorboards-boards/chatboards-chats-messages/blob/1fb348a793a18edaf1b17f5031a5fd3cba41d4ff/src/room.ts) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/services/chatSnapshot.ts](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/services/chatSnapshot.ts) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S30 · Trwały cykl życia S3 i GC

<a id="s30"></a>

- [applications-boards-legacy/boards-actanet/actanet-korea-operator/core/src/upload/storage.rs](https://github.com/actanet/actanet-korea-operator/blob/d995366f166c018cb452d1fcd1300967ef1dca54/core/src/upload/storage.rs)



### S31 · UI historii i przywracania

<a id="s31"></a>

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/components/CardHistory/DocumentHistory.tsx](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/components/CardHistory/DocumentHistory.tsx) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/pages/ProjectChat/ProjectChat.tsx](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/pages/ProjectChat/ProjectChat.tsx) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)

- [mirrorboards/mirrorboards-shell/mirrorboards-shell-datarooms/src/hooks/useDataRoomCard.ts](https://github.com/mirrorboards-shell/mirrorboards-shell-datarooms/blob/d5e2f8b3d069b17583b931a59db18dc4a67d4678/src/hooks/useDataRoomCard.ts)



### S32 · Aktywny backend czatu Rust/Rig

<a id="s32"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api-korea/core/src/runtime.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api-korea/blob/3bc7bf2aeb91484010c34410c0ddef20febb2ee6/core/src/runtime.rs)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api-korea/router/src/routes/run.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api-korea/blob/3bc7bf2aeb91484010c34410c0ddef20febb2ee6/router/src/routes/run.rs)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api/src/routers/chat.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api/blob/5b07bbf8e50a649a3a8856953ce6430a81cc993e/src/routers/chat.rs)



### S33 · Notatka operacyjna storage; częściowo starsza niż UI

<a id="s33"></a>

- [applications/applications-actanet/actanet-api/docs/storage-operations.md](https://github.com/actanet/actanet-api/blob/1a9bf464affea6342ef3609e2415a9dedea933f2/docs/storage-operations.md)



### S34 · Wysyłanie kontekstu i checkpoint czatu

<a id="s34"></a>

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/services/chatConnection.ts](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/services/chatConnection.ts)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/services/chatContext.ts](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/services/chatContext.ts)

- [mirrorboards-boards-chats/boards-chatboards-chats/chatboards-chats-board/src/pages/ProjectChat/ProjectChat.tsx](https://github.com/mirrorboards-boards/chatboards-chats-board/blob/a91d30bb0ee126e28dd66151622a353dcd54e5f2/src/pages/ProjectChat/ProjectChat.tsx) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S35 · Weryfikowanie wyzwań i transakcji przed podpisaniem

<a id="s35"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/registration.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/registration.ts)

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/transaction.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/transaction.ts)

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/swaplock.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/swaplock.ts)



### S36 · Backend operacji członków i rotacji

<a id="s36"></a>

- [applications/applications-actanet/actanet-korea-swaplock/router/src/routes/actanet/swaplock/rooms/_command/mod.rs](https://github.com/actanet/actanet-korea-swaplock/blob/340ddedde615fa81d33e471fe0e78a8ca5ec1f23/router/src/routes/actanet/swaplock/rooms/_command/mod.rs)

- [applications/applications-actanet/actanet-korea-swaplock/core/src/rooms.rs](https://github.com/actanet/actanet-korea-swaplock/blob/340ddedde615fa81d33e471fe0e78a8ca5ec1f23/core/src/rooms.rs)



### S37 · Profile i limity Chat API

<a id="s37"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api-korea/core/src/config.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api-korea/blob/3bc7bf2aeb91484010c34410c0ddef20febb2ee6/core/src/config.rs)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api-korea/core/src/input.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api-korea/blob/3bc7bf2aeb91484010c34410c0ddef20febb2ee6/core/src/input.rs)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-api-korea/router/src/state.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-api-korea/blob/3bc7bf2aeb91484010c34410c0ddef20febb2ee6/router/src/state.rs)



### S38 · Gateway: routing i faktyczne ustawienia logowania

<a id="s38"></a>

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-ai/ai-bifrost/config.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-ai/ai-bifrost/config.go)



### S39 · Pulumi: Chat API i Bifrost

<a id="s39"></a>

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-applications/applications-mirrorboards-chat/mirrorboards-chat-host-api/main.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-applications/applications-mirrorboards-chat/mirrorboards-chat-host-api/main.go)

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-ai/ai-bifrost/main.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-ai/ai-bifrost/main.go)



### S40 · CPace i zaszyfrowany payload parowania

<a id="s40"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-format/src/pairing.rs](https://github.com/mirrorboards-xkeys/xkeys-format/blob/767174c06a52aedd789125647471b4c7fd38ff9a/src/pairing.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-core/src/pairing.rs](https://github.com/mirrorboards-xkeys/xkeys-core/blob/0c11bf3bf673c53eb4a2531dd2d8b17eabacbbeb/src/pairing.rs)



### S41 · Relay: limity, DB i klient parowania

<a id="s41"></a>

- [mirrorboards/mirrorboards-xkeys/xkeys-korea/core/src/pairing.rs](https://github.com/mirrorboards-xkeys/xkeys-korea/blob/2b4afa0cff396152db5ee924d07eaf7de14162e7/core/src/pairing.rs)

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/pairing.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/pairing.ts)



### S42 · Recovery, backup oraz niedostępny managed recovery

<a id="s42"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/boards/settings/VaultWizard.tsx](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/boards/settings/VaultWizard.tsx)

- [applications/applications-mirrorboards-chat/mirrorboards-chat-web/src/boards/settings/recoveryPdf.ts](https://github.com/mirrorboards-chat/mirrorboards-chat-web/blob/04d5d490526db3ad9fe1da48cc7e8c2213c95b17/src/boards/settings/recoveryPdf.ts)

- [mirrorboards/mirrorboards-xkeys/xkeys-web/src/backup.ts](https://github.com/mirrorboards-xkeys/xkeys-web/blob/b5ca29275ee73ea0fc0322e55c41ad97219b1334/src/backup.ts)



### S43 · Przykład współdzielenia datarooms przez Go To Market

<a id="s43"></a>

- [mirrorboards-boards-chats/boards-go-to-market-chats/go-to-market-chats-board/src/components/RoomContext/RoomContext.tsx](https://github.com/mirrorboards-boards/go-to-market-chats-board/blob/be3c0fa3ab7c19c276cfdbde9d341764f4e3c8d2/src/components/RoomContext/RoomContext.tsx) (lokalny plik różnił się od HEAD; link pokazuje wersję bazową)



### S44 · Baza rodziny czatu i niezależny host XKeys

<a id="s44"></a>

- [applications/applications-mirrorboards-chat/mirrorboards-chat-envelopes/src/app_db.rs](https://github.com/mirrorboards-chat/mirrorboards-chat-envelopes/blob/522f847c777591025e0d27fcb987a4ee573ef84a/src/app_db.rs)

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-applications/applications-xkeys/xkeys-host-api/main.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-applications/applications-xkeys/xkeys-host-api/main.go)



### S45 · CNPG registry i prywatne backupy OVH

<a id="s45"></a>

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-applications/applications-actanet/actanet-host-api/storage.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-applications/applications-actanet/actanet-host-api/storage.go)

- [platforms/mirrorboards-platform/networks-platform/stacks/networks-platform-applications/applications-actanet/actanet-host-api/storage_backup.go](https://github.com/mirrorboards-platform/mirrorboards-platform-networks-platform-stacks/blob/a6be82f9e2e99f87247dca76728d2d0aea094541/networks-platform-applications/applications-actanet/actanet-host-api/storage_backup.go)



### S46 · Stan routera XFiles

<a id="s46"></a>

- [applications/applications-xfiles/xfiles-korea/src/routes/mod.rs](https://github.com/mirrorboards-xfiles/xfiles-korea/blob/d9a387ba276487417ffed63a520c14371bbec9b0/src/routes/mod.rs)



### S47 · Odrębne API boardów

<a id="s47"></a>

- [applications/applications-mirrorboards-boards/mirrorboards-boards-api/src/routers/mod.rs](https://github.com/mirrorboards-boards/mirrorboards-boards-api/blob/14646e9274544ccb9a4fd7427cf3d8d8b3117655/src/routers/mod.rs)


