Firmowa wiki od devstyle

Wiedza firmy. Dla ludzi. I dla agentów AI.

WikiStyle to firmowa wiki, którą zbudowaliśmy w devstyle dla naszych firm. Agenci AI czytają ją i piszą do niej przez API tak samo łatwo, jak ludzie przez panel. Strony w Markdown, karty z polami, historia każdej zmiany i uprawnienia pilnowane na serwerze.

  • REST + OpenAPI
  • Klucze dla agentów
  • Historia każdej zmiany
  • Wyszukiwanie hybrydowe
  • Panel po polsku
  • Gotowy na agentów AI
# agent AI czyta stronę
GET /v1/pages/by-path/produkty/cennik
Authorization: Bearer wsk_...

# długa strona? tylko jedna sekcja
GET /v1/pages/{id}?sections=rabaty

# co się zmieniło od ostatniego razu
GET /v1/events?after=1842
200 OK
{
  "path": "produkty/cennik",
  "title": "Cennik",
  "version": 7,
  "approx_tokens": 812,
  "toc": [
    { "id": "rabaty",
      "heading": "Rabaty",
      "approx_tokens": 120 }
  ],
  "content": {
    "trust": "untrusted",
    "markdown": "# Cennik\n..."
  }
}
  • 1 APIdla agentów i panelu; agent dostaje adres opisu OpenAPI i klucz
  • Każda zmianato nowa wersja z autorem: osoba albo konkretny agent
  • Klucz ≤ właścicielagent nigdy nie może więcej niż jego właściciel
  • FrankfurtAWS, baza Postgres i embeddingi w regionie eu-central-1

Dlaczego własny system

Wiki, w której agent nie jest gościem

Nasi agenci AI pracują na wiedzy firmy codziennie. Potrzebowaliśmy miejsca, z którego czytają i do którego piszą bez sztuczek, a ludzie mają przy tym pełną kontrolę: kto co widzi, kto co zmienił i jak to cofnąć.

API na pierwszym miejscu

Każda operacja panelu jest dostępna w API, bo panel korzysta z tego samego API co agenci. Nic nie jest zarezerwowane tylko dla ludzi przy ekranie.

Jedno źródło wiedzy

Wiedza firmy w jednym miejscu, dostępna dla całego zespołu i dla agentów działających gdziekolwiek: na laptopie, na serwerze, w chmurze.

Te same reguły dla każdego

Uprawnienia sprawdza serwer przy każdym odczycie i zapisie, tak samo dla człowieka i agenta. Wyszukiwarka też je respektuje.

Funkcje

Wszystko, czego potrzeba firmowej wiki. I nic ponad to.

Od pierwszej strony w Markdown, przez historię zmian i propozycje, po karty z polami, o które można pytać jak o tabelę.

Strony

Markdown i linki jak w Obsidianie

Strona to zwykły Markdown: człowiek w panelu widzi to samo, co agent w API. Linki piszesz jako [[Tytuł]], a system pamięta, dokąd prowadzą, nawet po zmianie tytułu.

  • Przestrzenie z drzewem stron, do tego tagi i alternatywne nazwy
  • Czytelne adresy z tytułu; po zmianie tytułu stary adres przekierowuje
  • Link do strony, której jeszcze nie ma, jest wyróżniony; linki zwrotne na każdej stronie
  • Załączniki do 25 MB: obrazy, PDF, dokumenty biurowe
  • Obraz z zewnętrznego adresu: system zapisuje kopię jako załącznik strony
  • Właściciel strony i data przeglądu; strona po terminie trafia na listę do sprawdzenia
<!-- produkty / Developer Jutra -->
# Developer Jutra

Program dla programistów, którzy chcą
iść dalej. Ceny: [[Cennik]].
Prowadzący: [[Mentorzy|zobacz listę]].

## Dla firm

Szczegóły:
[[sprzedaz/Oferta dla firm]].

![Okładka](https://example.com/okladka.png)
Historia i konflikty

Żadna edycja nie ginie

Każdy zapis to nowa wersja z autorem: osobą albo konkretnym agentem. Gdy dwie osoby (albo osoba i agent) zmieniają tę samą stronę, drugi zapis nie nadpisze pierwszego.

  • Lista wersji, porównanie dowolnych dwóch i przywrócenie jednym kliknięciem
  • Przywrócenie też jest nową wersją, więc niczego nie traci
  • Zapis z numerem wersji; konflikt = odrzucenie z bieżącą wersją i różnicami
  • W panelu widać, że ktoś właśnie edytuje stronę
  • Usunięta strona leży 30 dni w koszu, z przywracaniem
PATCH /v1/pages/{id}
{
  "base_version": 7,
  "ops": [
    { "op": "find_replace",
      "find": "10%", "replace": "15%" }
  ],
  "message": "Nowy rabat dla partnerów"
}

# ktoś zdążył zmienić stronę wcześniej
409 { "code": "VERSION_CONFLICT",
  "data": { "current_version": 8, "diff": ... } }
Propozycje

Ważne przestrzenie zmienia się przez propozycje

Każda przestrzeń ma przełącznik „zmiany wymagają akceptacji”. Wtedy zapis agenta albo czytelnika nie zmienia strony, tylko tworzy propozycję, którą przegląda człowiek.

  • Czytelnik bez prawa edycji może zaproponować poprawkę
  • Agent, który nie jest pewien zmiany, może złożyć propozycję w każdej przestrzeni
  • Decyduje właściciel strony; gdy nie reaguje przez 3 dni, każdy edytor przestrzeni
  • Akceptuje i odrzuca zawsze człowiek, z porównaniem zmian
# przestrzeń "finanse" wymaga akceptacji
PATCH /v1/pages/{id}
{ "base_version": 4, "ops": [ ... ] }

202 Accepted
{
  "proposal": {
    "status": "open",
    ...
  }
}
# strona bez zmian, propozycja czeka
# na decyzję człowieka
Wyszukiwarka

Szuka po słowach i po znaczeniu

Wyszukiwanie pełnotekstowe w Postgresie i semantyczne na pgvector, połączone w jeden ranking. Część semantyczna znajduje strony o podobnym znaczeniu, także gdy nie ma w nich szukanych słów.

  • Polskie znaki bez znaczenia: „zolw” znajdzie „żółw”
  • Wynik: tytuł, ścieżka, najlepiej pasująca sekcja i fragment tekstu
  • Filtry: przestrzeń, tag, typ karty, data zmiany; liczba trafień i przewijanie
  • Embeddingi liczone w tle, w AWS Bedrock we Frankfurcie
  • Strony, których nie widzisz, nie wpływają ani na wyniki, ani na ich liczbę
GET /v1/search?q=rabat dla partnerów

{
  "items": [{
    "path": "produkty/cennik",
    "title": "Cennik",
    "section": { "id": "rabaty",
                 "heading": "Rabaty" },
    "snippet": {
      "trust": "untrusted",
      "markdown": "Partnerzy dostają **rabat**..."
    }
  }],
  "total": 3
}
Karty

Karty z polami, o które można pytać

Karta to strona z typem i polami: kurs, osoba, produkt. Ma treść, historię i linki jak każda strona, a do tego dane, które da się filtrować i sortować.

  • Typy kart definiuje się w panelu albo przez API, bez programisty
  • Pola: tekst, liczba, kwota z walutą, data, tak / nie, wybór z listy, link do strony lub karty, osoba z zespołu
  • Zapytania w API i tabela z filtrami w panelu
  • Powiązania zwrotne: na karcie mentora widać jego kursy
  • Zmiana typu przechodzi tylko wtedy, gdy istniejące dane do niej pasują
# kursy droższe niż 2000 zł, od najdroższego
POST /v1/cards/query
{
  "type": "kurs",
  "where": [{
    "field": "cena", "op": "gt",
    "value": { "amount": "2000",
               "currency": "PLN" }
  }],
  "sort": [{ "field": "cena", "dir": "desc" }]
}

A do tego

Drobiazgi, które robią różnicę

Lista „do zrobienia”

Każdy widzi w panelu, co czeka na niego: propozycje do decyzji, strony po terminie przeglądu, wyłączone klucze i webhooki.

Dziennik odczytów

Kto (osoba albo klucz agenta), kiedy i którą stronę czytał. Wpisy znikają po 90 dniach. Odczyty przestrzeni zastrzeżonej widzą tylko jej członkowie.

Eksport do Obsidiana

Strony jako pliki Markdown z [[linkami]] i nagłówkiem metadanych, razem z polami kart. Eksport obejmuje tylko to, co eksportujący może czytać.

Długie strony w częściach

Spis treści podaje rozmiar każdej sekcji w tokenach. Strona do 20 tys. tokenów przychodzi w całości, dłuższa jako spis treści do pobrania po sekcjach.

Kosz na 30 dni

Usuniętą stronę (z podstronami) można przywrócić przez 30 dni. Potem znika na dobre, razem z historią, załącznikami i fragmentami w wyszukiwarce.

Wiele organizacji

devstyle i slowbiz to osobne organizacje z twardo oddzielonymi danymi. Jedno konto osoby, przełącznik organizacji w panelu.

Agenci AI

Zbudowany do pracy z agentami AI

Agent AI (na przykład Claude Code) dostaje adres opisu OpenAPI i własny klucz. Resztę wyczyta z opisu: wyszuka, przeczyta potrzebną sekcję, poprawi stronę albo zaproponuje zmianę. Ty decydujesz, ile mu wolno.

Całe API, nie wycinek

Ok. 60 operacji: strony, wersje, propozycje, karty, wyszukiwarka, załączniki, zdarzenia, webhooki, klucze. Każda z opisem i przykładem w OpenAPI, który można pobrać po obszarach.

Klucz na miarę zadania

Osobny klucz dla każdego agenta: właściciel, odczyt albo zapis, wybrane przestrzenie. Klucz nieużywany przez 90 dni wyłącza się sam, a w historii widać, który agent co zmienił.

Oszczędnie w tokenach

Spis treści z rozmiarem sekcji, pobieranie wybranych sekcji, wyniki wyszukiwania z krótkim fragmentem. Strona jako JSON albo sam Markdown, do wyboru.

Edycja bez przepisywania

Podmiana sekcji, znajdź i zamień, dopisanie na końcu albo cała treść. Zawsze z numerem wersji, więc agent nie nadpisze cudzej zmiany. Do 50 zmian stron w jednym wywołaniu.

Feed zmian i webhooki

Agent pyta o zmiany od ostatniego kursora albo dostaje webhook podpisany HMAC, z pięcioma ponowieniami (ostatnie po 6 godzinach). W zdarzeniu są tylko identyfikatory; treść pobiera przez API.

Treść strony to dane, nie polecenia

API oddaje tekst strony w polu oznaczonym jako niezaufane, a opis API mówi agentowi wprost, że nie wykonuje się go jako instrukcji.

Uprawnienia

Kto co widzi, pilnuje serwer

Agenci i ludzie dostają dokładnie tyle, ile im nadano. Reguły sprawdza API przy każdym zapytaniu, a baza danych pilnuje ich drugi raz.

  • Przestrzenie zastrzeżone

    Przestrzeń zarządu widzą tylko osoby dopisane imiennie. Admin organizacji też nie, jeśli go tam nie ma.

  • Klucz nigdy ponad właściciela

    Klucz agenta ma mniejsze z dwóch: swój zakres albo bieżące prawa właściciela. Gdy człowiek traci dostęp, jego agent traci go razem z nim.

  • Brak dostępu wygląda jak brak strony

    Wyszukiwarka, feed zmian, linki zwrotne i liczby wyników nie zdradzają, że niewidoczna strona istnieje.

  • Link bez tajemnic

    Link do strony, której czytelnik nie widzi, pokazuje „strona niedostępna”, bez tytułu i przestrzeni celu.

  • Role na organizację i przestrzeń

    Admin, edytor i czytelnik. Klucz agenta nigdy niczym nie zarządza: przestrzenie, ludzie, klucze i typy kart zostają w rękach ludzi.

  • Organizacje oddzielone w bazie

    Każdy wiersz należy do jednej organizacji, a izolację wymusza Postgres (row-level security). Testy sprawdzają, że nic nie przechodzi między organizacjami.

Prywatność i bezpieczeństwo

Wiedza firmy pod naszą kontrolą

W wiki trafiają finanse, umowy i sprawy zespołu. Dlatego bezpieczeństwo jest w fundamentach systemu, a nie doklejone na końcu.

Dane we Frankfurcie

Nasze konto AWS, baza Postgres w Supabase i embeddingi w AWS Bedrock: wszystko w regionie eu-central-1.

Logowanie przez Google

Konta firmowe Google, sesja 30 dni. Raz na dobę system sprawdza, czy konto nadal działa, więc usunięte konto traci dostęp najpóźniej po dobie.

Sekrety nie wchodzą

Zapis z kluczem API, tokenem albo hasłem jest odrzucany. Komunikat wskazuje linię i rodzaj sekretu, ale nigdy nie powtarza jego wartości.

Logi bez treści

W logach i w dzienniku zdarzeń są tylko identyfikatory: bez tytułów, treści stron, imion i adresów e-mail.

Bezpieczne wyświetlanie

Markdown przed wyświetleniem przechodzi przez filtr: bez skryptów i osadzonych ramek. Załączniki pobierasz z osobnej domeny, przez linki ważne 5 minut.

Codzienna kopia

Raz na dobę zrzut bazy trafia na nasze konto AWS i leży tam 30 dni. Nieudana kopia wysyła alarm mailem.

Panel

Przejrzysty panel. Po polsku. Także na telefonie.

Ludzie pracują w panelu, który korzysta z tego samego API co agenci. Na telefonie wygodnie się w nim czyta i robi drobne poprawki, bez instalowania aplikacji.

  • Drzewo przestrzeni i stron z boku, wyszukiwarka zawsze na górze
  • Ostatnio oglądane strony, wspólne na wszystkich urządzeniach
  • Edytor Markdown z podglądem: obok na dużym ekranie, w zakładce na telefonie
  • Historia, porównanie wersji, propozycje i kosz w kilku kliknięciach
  • Szukaj / lub CtrlK
  • Nowa strona n
  • Edytuj e
  • Zapisz CtrlS

Skróty klawiszowe w panelu. Na Macu Cmd zamiast Ctrl.

Gdzie jesteśmy

Zbudowany, teraz wdrażamy

WikiStyle jest zbudowany i sprawdzony testami. Trwa wdrożenie na nasze konto AWS; panel będzie działał pod adresem app.wikistyle.pl. Pierwsi użytkownicy to zespoły i agenci AI naszych firm.

  • devstyle
  • slowbiz

Mniej znaczy pewniej

Czego celowo nie zbudowaliśmy

Każda funkcja to kolejne miejsce, w którym coś może pójść nie tak. Agenci sami wyszukują i czytają, więc wiki nie musi myśleć za nich. Zamiast komentarza jest propozycja zmiany, a zamiast wbudowanych integracji jedno API dla wszystkich: naszych systemów i agentów.

  • Serwer MCP
  • Czat „zapytaj wiki”
  • Automatyczne streszczenia
  • Komentarze
  • Współedycja na żywo
  • Wbudowane integracje