Konfiguracja

Lokalizacja konfiguracji

repartee przechowuje swoją konfigurację w ~/.repartee/config.toml. Plik ten jest tworzony automatycznie przy pierwszym uruchomieniu z rozsądnymi wartościami domyślnymi.

Pełna struktura katalogu:

~/.repartee/
  config.toml          # main configuration
  .env                 # credentials (passwords, SASL)
  themes/              # custom themes
  scripts/             # user scripts (Lua)
  logs/messages.db     # chat logs (SQLite)
  dicts/               # Hunspell dictionaries (.dic/.aff)
  sessions/            # Unix sockets for detached sessions
  certs/               # TLS certificates for web frontend
  web_sessions.bin     # persistent web session tokens (HMAC-hashed, perm 0600)
  web_thumbnails/      # cached image-preview thumbnails (web frontend)

Pełny przykład z adnotacjami

[general]
nick = "mynick"
username = "mynick"
realname = "repartee user"
theme = "default"
timestamp_format = "%H:%M:%S"
flood_protection = true
ctcp_version = "repartee"
# default_bind_ip = "192.0.2.10" # host-wide outgoing IP for servers without per-server bind_ip

[display]
nick_column_width = 8
nick_max_length = 8
nick_alignment = "right"       # "left", "right", or "center"
nick_truncation = true
nick_colors = true             # deterministic per-nick coloring (WeeChat-style)
nick_colors_in_nicklist = true # also color nicks in the sidebar nick list
nick_color_saturation = 0.65   # HSL saturation (0.0–1.0), truecolor only
nick_color_lightness = 0.65    # HSL lightness (0.0–1.0), tune per theme
show_timestamps = true
scrollback_lines = 2000
backlog_lines = 20             # history lines loaded when buffer opens (0 = off)
mentions_buffer = true         # show Mentions buffer at top of sidebar

[sidepanel.left]
width = 20
visible = true

[sidepanel.right]
width = 18
visible = true

[statusbar]
enabled = true
border = true                  # pozioma linia oddzielająca nad paskiem statusu i polem wprowadzania
items = ["active_windows", "nick_info", "channel_info", "typing", "lag", "time"]

[servers.libera]
label = "Libera"
address = "irc.libera.chat"
port = 6697
tls = true
tls_verify = true
autoconnect = true
channels = ["#repartee", "#secret mykey"]
autosendcmd = "MSG NickServ identify pass; WAIT 2000; MODE $N +i"
# nick = "othernick"           # nadpisanie nicka per serwer
# sasl_user = "mynick"
# sasl_pass = "hunter2"
# sasl_mechanism = "SCRAM-SHA-256"  # automatyczny wybór gdy pominięte; lub PLAIN, EXTERNAL, SCRAM-SHA-1/256/512, ECDSA-NIST256P-CHALLENGE, OAUTHBEARER
# client_cert_path = "libera.pem"   # łańcuch certyfikatów PEM + klucz prywatny dla TLS client auth / SASL EXTERNAL
# bouncer_network_id = "42"    # bezpośrednie powiązanie z ID sieci bouncera Soju/Lurker
# bouncer_control = false      # true = połączenie sterujące Soju (wykrywa i otwiera sieci bouncera)
# bind_ip = "192.168.1.100"   # powiązanie z konkretnym lokalnym adresem IP (vhost)
# auto_reconnect = true
# reconnect_delay = 30
# reconnect_max_retries = 10

[image_preview]
enabled = true
inline = false                 # true = renderuj miniaturki bezpośrednich linków do obrazków pod wiadomościami w TUI
protocol = "auto"              # "auto", "kitty", "iterm2", "sixel", "halfblocks"
max_width = 0                  # 0 = auto
max_height = 0                 # 0 = auto
cache_max_mb = 100
cache_max_days = 7
fetch_timeout = 30             # seconds
max_file_size = 10485760       # bytes (10 MB)
kitty_format = "rgba"

[logging]
enabled = true
encrypt = false
retention_days = 0             # 0 = keep forever
event_retention_hours = 72     # auto-prune join/part/quit/nick/kick/mode (0 = keep forever)
exclude_types = []             # e.g. ["join", "part", "quit"]

[aliases]
ns = "/msg NickServ $*"
cs = "/msg ChanServ $*"
wc = "/close"
j = "/join $0; /msg $0 hello everyone"

[keyboard]
key_timeout = 0                # ms przed zresetowaniem niekompletnej sekwencji klawiszy (0 = czekaj bez limitu)

[keyboard.bindings]
# meta-a = { action = "active_window" }
# meta-l = { action = "bare_display" }
# meta-p = { action = "seek_previous_highlight" }
# meta-n = { action = "seek_next_highlight" }

[scripts]
autoload = ["slap"]
# debug = true

[scripts.values.keepnick]
# Libera = "mynick"            # trwałe wartości skryptów zapisywane przez api.config.set()

[dcc]
timeout = 300                  # seconds before pending requests expire
own_ip = ""                    # override IP in DCC offers (empty = auto-detect)
port_range = "0"               # "0" = OS-assigned, "1025 65535" = range
autoaccept_lowports = false    # allow auto-accept from ports < 1024
# autochat_masks = ["*!*@trusted.host"]  # hostmask patterns for auto-accept
max_connections = 10

[spellcheck]
enabled = true
languages = ["en_US"]              # Hunspell language codes
dictionary_dir = ""                # default: ~/.repartee/dicts

[shrink]
enabled = false                    # skracarka URL (opt-in, wymaga też SHRINK_API_KEY w .env)
api_url = "https://shr.al"
outgoing_enabled = true            # skracaj długie URL-e w wiadomościach, które wysyłasz
incoming_enabled = true            # skracaj długie URL-e w wiadomościach, które odbierasz (z podpowiedzią `[host]`)
min_url_length = 50                # skracaj tylko URL-e o długości >= tej wartości (>= 25)
outgoing_timeout_ms = 2000         # maks. czas oczekiwania na odpowiedź; po nim wysyłka oryginalnym URL-em
incoming_timeout_ms = 2000
cache_max_entries = 500            # LRU w pamięci dla ostatnio skróconych URL-i

[typing]
show = true                        # odbieraj i wyświetlaj wskaźniki pisania innych osób
send_channels = true               # wysyłaj własne +typing podczas pisania na kanale
send_queries = true                # wysyłaj własne +typing podczas pisania w prywatnym query

[translate]
enabled = false
backend = "none"
my_lang = "pl"
show_original_in = true
show_original_out = true
timeout_ms = 15000
max_in_flight = 4
max_queue = 200

[web]
enabled = false                    # enable embedded web frontend
bind_address = "127.0.0.1"        # listen address (0.0.0.0 for LAN)
port = 8443                        # HTTPS port
tls_cert = ""                      # custom cert (empty = auto self-signed)
tls_key = ""                       # custom key
timestamp_format = "%H:%M"        # web UI timestamp format
line_height = 1.35                 # CSS line-height for chat messages
theme = "nightfall"                # web theme (nightfall, catppuccin-mocha, etc.)
session_days = 90                  # cookie lifetime (sessions persist across browser restarts)
username = "repartee"              # pre-filled in the login form (decorative — only the password is checked)
image_previews = false             # opt-in inline image previews under chat messages
image_previews_max_per_msg = 4    # cap of preview thumbnails rendered per message
thumbnail_cache_mb = 200           # max size of ~/.repartee/web_thumbnails/ (LRU by mtime)
# cloudflare_tunnel_name = ""     # future: Cloudflare tunnel name

[[ignores]]
mask = "*!*@spammer.host"
levels = ["ALL"]

Opis sekcji

[general]

Globalna tożsamość i zachowanie. Pola nick, username i realname są używane jako domyślne dla wszystkich serwerów, chyba że zostaną nadpisane per serwer. Ustaw theme na nazwę pliku motywu w ~/.repartee/themes/ (bez rozszerzenia .theme).

Adres źródłowy (hosty z wieloma IP): default_bind_ip ustawia wychodzący adres IP dla każdego serwera, który nie definiuje własnego bind_ip. Pełna kolejność wyboru źródłowego adresu IRC:

  1. servers.<id>.bind_ip -- jawny wybór per serwer (również /server add ... -bind=<ip> / /connect -bind=<ip>)
  2. repartee -h <ip> / --bind=<ip> -- nadpisanie z linii poleceń (w stylu irssi, tylko na czas działania -- nigdy nie zapisywane do config.toml)
  3. general.default_bind_ip -- domyślny adres dla całego hosta
  4. Domyślny adres systemowy (tablica routingu jądra)

Ustaw interaktywnie poleceniem /set general.default_bind_ip <ip>; pusty ciąg czyści wartość.

[display]

Kontroluje sposób wyświetlania wiadomości. nick_column_width ustawia kolumnę o stałej szerokości dla nicków w widoku czatu. scrollback_lines to liczba wiadomości przechowywanych w pamięci na bufor. backlog_lines określa, ile historycznych wiadomości załadować z bazy logów przy pierwszym otwarciu kanału, query lub bufora DCC (0 aby wyłączyć).

Bufor wzmianek: mentions_buffer = true (domyślnie) wyświetla trwały bufor Wzmianek przypięty na górze paska bocznego. Agreguje wszystkie wzmianki z podświetleniami ze wszystkich sieci w przewijalnym widoku czatu. Backlog jest ograniczony do 7 dni lub 1000 wiadomości. Użyj /clear w buforze wzmianek, aby wyczyścić wszystkie zapisane wzmianki. Ustaw na false, aby ukryć bufor (wzmianki są nadal przechowywane w bazie danych i pojawią się ponownie po włączeniu).

Kolorowanie nicków: nick_colors = true włącza deterministyczne kolorowanie per nick (w stylu WeeChat). Każdy nick otrzymuje stały kolor oparty na hashu jego nazwy. Terminale truecolor używają koła barw HSL (~360 różnych kolorów); terminale 256-kolorowe korzystają z wyselekcjonowanej palety 68 kolorów; terminale 16-kolorowe używają 12 bezpiecznych kolorów ANSI. Możliwości terminala są wykrywane automatycznie (i ponownie wykrywane przy repartee a -- ponownym dołączeniu). Ustaw nick_colors_in_nicklist = false, aby lista nicków na pasku bocznym używała kolorów motywu, podczas gdy wiadomości na czacie pozostaną kolorowane. Dostosuj nick_color_saturation i nick_color_lightness (0.0-1.0) per motyw -- ciemne motywy dobrze działają z ~0.65, jasne motywy z ~0.40.

[sidepanel]

Lewy panel pokazuje listę buforów, prawy panel pokazuje listę nicków. Ustaw visible = false, aby ukryć panel. Szerokości podane są w kolumnach terminala.

[statusbar]

Konfiguruje elementy wyświetlane na pasku statusu. Dostępne elementy: active_windows, nick_info, channel_info, typing, lag, time. Element typing pokazuje, kto właśnie pisze wiadomość w aktywnym buforze -- zobacz sekcję [typing] poniżej.

border = true (domyślnie) rysuje poziomą linię oddzielającą nad paskiem statusu i polem wprowadzania. Ustaw /set statusbar.border false, aby ukryć tę linię zarówno w TUI, jak i w interfejsie webowym.

typing znajduje się na domyślnej liście elementów i jest jednorazowo dopisywany do konfiguracji zapisanych przez starsze wersje (wstawiany po channel_info, bez zmiany kolejności pozostałych elementów). Jeśli usuniesz go poleceniem /items remove typing, pozostanie usunięty.

[servers.*]

Każdy serwer otrzymuje unikalny identyfikator (klucz po servers.). Tablica channels zawiera listę kanałów do automatycznego dołączenia po połączeniu. Kanały z kluczami używają formatu "#channel key".

Pozostaw sasl_mechanism bez wartości, aby automatycznie wybrać najsilniejszy dostępny mechanizm: EXTERNAL, ECDSA-NIST256P-CHALLENGE, SCRAM-SHA-512, SCRAM-SHA-256, SCRAM-SHA-1, a na końcu PLAIN. Jawne ustawienie blokuje cichy downgrade.

SASL OAUTHBEARER: Dla bouncerów obsługujących OAuth (np. Soju skonfigurowanego z walidatorem OAuth2/OIDC bearer) ustaw jawnie sasl_mechanism = "OAUTHBEARER" i zapisz token bearer w <SERVER>_SASL_PASS w ~/.repartee/.env. OAUTHBEARER nigdy nie jest wybierany automatycznie przy pominiętym sasl_mechanism, ponieważ zwykłe hasło w .env nie jest poprawnym tokenem OAuth. Podczas korzystania z tokenów bearer wymagaj zweryfikowanego TLS (tls = true oraz tls_verify = true).

Certyfikat klienta TLS (EXTERNAL): Ustaw client_cert_path na pojedynczy plik PEM zawierający zarówno łańcuch certyfikatów klienta, jak i niezaszyfrowany klucz prywatny (PKCS#8, PKCS#1 RSA lub SEC1 EC). Ścieżki względne są rozwiązywane wewnątrz ~/.repartee/certs/. Dla kont Soju możesz także wygenerować i przypiąć dedykowany certyfikat klienta bezpośrednio z poziomu Repartee poleceniem /bcert create <name>.

Bindowanie sieci bouncera (Soju i Lurker): Ustaw bouncer_network_id (lub użyj /server add ... -bouncer-network=<id>), aby wysłać BOUNCER BIND <id> podczas negocjacji capability. Soju wymaga uwierzytelnienia SASL przed zbindowaniem sieci; Lurker akceptuje również sesje uwierzytelnione przez PASS. Po zbindowaniu lokalny autojoin z tablicy channels jest wyciszany, aby bouncer odtworzył własną listę dołączonych kanałów.

Połączenie sterujące bouncera (Soju): Ustaw bouncer_control = true (lub użyj /server add ... -bouncer-control), aby traktować wpis serwera jako połączenie sterujące Soju. Repartee negocjuje soju.im/bouncer-networks, wykrywa dostępne sieci i automatycznie otwiera oraz utrzymuje połączenia potomne dla każdej wykrytej sieci z ustawionym host. Sieciami możesz też zarządzać ręcznie przez /bouncer (list, refresh, connect, add, change, delete).

Istniejące konfiguracje bouncerów USER/PASS: Tradycyjne konfiguracje bouncerów wybierające sieć przez username (np. user/network@client) lub PASS (user/network:password) działają nadal bez włączania bouncer_control czy bouncer_network_id. Gdy serwer rozgłasza możliwości bouncera (soju.im/bouncer-networks lub BOUNCER), Repartee automatycznie odpytuje BOUNCER LISTNETWORKS podczas rejestracji, aby potwierdzić tożsamość zbindowanej sieci, wycisza lokalny autojoin channels i korzysta z historii przechowywanej po stronie serwera.

Historia i rozmowy bouncera: Na połączeniach bouncerowych rozgłaszających draft/chathistory Repartee wykrywa aktywne kanały i rozmowy prywatne przez CHATHISTORY TARGETS oraz pobiera ostatnią historię (display.backlog_lines) z bouncera. Wiadomości na połączeniach bouncerowych pozostają po stronie serwera i nie są duplikowane w lokalnej bazie SQLite (rozmowy DCC nadal korzystają z lokalnych logów). Otwarcie pustego bufora query automatycznie pobiera jego ostatni backlog z bouncera.

Izolacja tożsamości bouncera: Stan powiązany z bouncerem (cache historii, kontekst szyfrowania E2E, cache uchwytów peerów) jest kluczowany stabilnym zakresem łączącym ID serwera, endpoint, selektory logowania (username, sasl_user, sasl_mechanism) oraz ID sieci bouncera, dzięki czemu przełączanie kont lub sieci bouncera nigdy nie miesza stanów.

Ustaw bind_ip, aby powiązać z konkretnym lokalnym adresem IP podczas łączenia. Przydatne dla hostów z wieloma adresami IP (vhosty/bouncery). Obsługuje zarówno IPv4, jak i IPv6 -- rozwiązywanie DNS automatycznie filtruje dopasowanie do rodziny adresów. Można również ustawić per połączenie za pomocą /connect -bind=<ip> lub /server add -bind=<ip>.

[image_preview]

Steruje podglądem obrazków w terminalu (enabled = true domyślnie). Naciśnij Enter na wiadomości z adresem URL lub użyj skrótu podglądu, aby otworzyć okno z podglądem, albo ustaw inline = true (/set image_preview.inline true), aby renderować miniaturki bezpośrednich linków do obrazków (slot 48×8 komórek) bezpośrednio pod wiadomościami czatu w TUI.

Obsługiwane protokoły: "auto" (automatycznie wykrywa Kitty, iTerm2, Sixel lub przełącza na znaki halfblocks Unicode), "kitty", "iterm2", "sixel" oraz "halfblocks". Podgląd inline w terminalu pobiera do 4 obrazków równolegle przez potok HTTP chroniony przed SSRF, z pamięcią podręczną LRU na 32 zdekodowane obrazki (limit 8192×8192 px / 64 MiB zdekodowanej ramki).

[logging]

Logowanie czatu do SQLite. Gdy encrypt = true, wiadomości są szyfrowane za pomocą AES-256-GCM. retention_days = 0 przechowuje logi na zawsze. event_retention_hours kontroluje, jak długo wiadomości zdarzeń (join/part/quit/nick/kick/mode) są przechowywane przed automatycznym czyszczeniem -- domyślnie 72 godziny. Ustaw na 0, aby przechowywać wiadomości zdarzeń na zawsze. Czyszczenie zdarzeń odbywa się co godzinę w tle i jest niezależne od retention_days.

[aliases]

Własne skróty poleceń. Klucz to nazwa aliasu, wartość to szablon polecenia.

Szablony obsługują argumenty pozycyjne ($0-$9), argumenty zakresowe ($1-), wszystkie argumenty ($*), zmienne kontekstowe ($C kanał, $N nick, $S serwer, $T bufor) oraz łączenie poleceń za pomocą ;. Jeśli w szablonie nie pojawia się $, automatycznie dołączane jest $*. Rozwijanie odbywa się w jednym przebiegu, więc znaki $ i ; wewnątrz argumentów podanych przez użytkownika są traktowane dosłownie i nie dzielą komendy.

[aliases]
ns = "/msg NickServ $*"
cs = "/msg ChanServ $*"
wc = "/close"
j = "/join $0; /msg $0 hello everyone"
w = "/who $C"

Zarządzaj aliasami w czasie działania za pomocą /alias i /unalias.

[keyboard]

Własne skróty klawiszowe w stylu irssi oraz wieloklawiszowe sekwencje z prefiksem. Zarządzaj nimi interaktywnie poleceniem /bind (/bind -list, /bind <key> <action> [<data>], /bind -delete <key>, /bind -reset <key>) lub w sekcji Keyboard panelu /wizard. Skróty są współdzielone między TUI a frontendem webowym.

key_timeout (domyślnie 0 ms) określa, jak długo niekompletna sekwencja wieloklawiszowa czeka przed zresetowaniem (0 czeka bez limitu czasu). Domyślne edytowalne skróty nawigacji obejmują meta-a / meta-A (active_window -- skok do nieprzeczytanego bufora o najwyższym priorytecie), meta-0..meta-9 (change_window), meta-left / meta-right (previous_window / next_window) oraz meta-l (bare_display). Możesz też przypisać akcje seek_previous_highlight i seek_next_highlight, aby przeskakiwać między podświetlonymi wiadomościami (highlightami) w aktywnym oknie.

[scripts]

Tablica autoload zawiera nazwy skryptów do załadowania przy uruchomieniu. Skrypty znajdują się w ~/.repartee/scripts/ jako pliki .lua (a dołączone skrypty, takie jak keepnick.lua, są też wyszukiwane w katalogu instalacyjnym). Ustawienia skryptów zapisywane przez api.config.set(key, value) są utrwalane w sekcji [scripts.values.<nazwa_skryptu>] pomiędzy przeładowaniami skryptu i restartami klienta.

[dcc]

Ustawienia czatu DCC (Direct Client-to-Client). DCC CHAT ustanawia bezpośrednie połączenia TCP peer-to-peer, które omijają serwer IRC.

own_ip nadpisuje adres IP ogłaszany w ofertach DCC. Gdy pusty, Repartee automatycznie wykrywa go z lokalnego adresu gniazda IRC (jak getsockname w irssi). Ustaw na swój publiczny adres IP, jeśli jesteś za NAT.

port_range kontroluje port TCP dla listenerów DCC. "0" pozwala systemowi przypisać wolny port. Użyj "1025 65535" lub "5000-5100", aby ograniczyć do zakresu (przydatne dla reguł firewalla).

autochat_masks to lista wzorców masek nick!ident@host z wildcardami. Przychodzące oferty DCC CHAT pasujące do dowolnego wzorca są automatycznie akceptowane bez pytania.

[spellcheck]

Wbudowane sprawdzanie pisowni. Gdy enabled = true, błędnie napisane słowa są podkreślane na czerwono podczas pisania. Naciśnij Tab, aby przełączać sugestie, Spację, aby zaakceptować, Escape, aby cofnąć. languages to lista kodów języków Hunspell (np. en_US, pl_PL, de_DE) -- słowo jest uznawane za poprawne, jeśli dowolny aktywny słownik je akceptuje. Umieść pliki .dic/.aff w ~/.repartee/dicts/ (lub ustaw dictionary_dir na własną ścieżkę).

[shrink]

Opcjonalna integracja ze skracarką URL. Gdy enabled = true i SHRINK_API_KEY jest ustawiony w .env, repartee skraca długie URL-e przez skonfigurowane API (domyślnie shr.al).

  • Wychodzące (outgoing_enabled) -- URL-e w wiadomościach, które wysyłasz, są podmieniane przed wysłaniem na sieć, więc inni użytkownicy, log IRC i twój własny bufor widzą już skróconą formę. Skracanie jest pierwszym etapem pipeline'u wychodzącego, przed E2E i echo-message, z konfigurowalnym limitem czasu na wywołanie (outgoing_timeout_ms, domyślnie 2 s).
  • Przychodzące (incoming_enabled) -- URL-e w wiadomościach, które odbierasz, są skracane przed wyświetleniem i zapisem. Po skróconym linku dopisywana jest mała podpowiedź [host], żeby docelowa domena była nadal widoczna.
  • Ręcznie -- /shrink <url> skraca pojedynczy URL na żądanie i wypisuje wynik jako lokalne zdarzenie w bieżącym buforze.

min_url_length (>= 25) ogranicza wyzwalanie, żeby krótkie URL-e były pomijane. cache_max_entries ogranicza LRU w pamięci -- powtórzony URL w tej samej sesji nie pójdzie do API dwa razy. SHRINK_API_KEY jest czytany wyłącznie z .env i nigdy nie trafia do config.toml. Zmiany api_url, outgoing_timeout_ms, incoming_timeout_ms lub cache_max_entries przez /set są zapamiętywane przy starcie workerów -- /set zwraca informację restart required dla tych kluczy.

[typing]

Wskaźniki pisania oparte na zatwierdzonym tagu klienta IRCv3 +typing. Wysyłanie i odbieranie są sterowane niezależnie, a wszystkie trzy klucze są wartościami logicznymi -- używaj /set typing.show false, a nie off.

KluczDomyślnaOpis
showtrueOdbieraj i wyświetlaj informację o pisaniu innych osób -- na pasku statusu w TUI i w interfejsie webowym. Steruje przyjmowaniem danych, a nie tylko ich wyświetlaniem -- ustawienie na false czyści też wszystkich aktualnie pokazywanych
send_channelstrueWysyłaj własne +typing, gdy piszesz na kanale
send_queriestrueWysyłaj własne +typing, gdy piszesz w prywatnym query
Warning:

Wysyłanie jest domyślnie włączone. Zaraz po instalacji osoby na twoich kanałach i w query widzą, kiedy piszesz wiadomość. Wyłącz to poleceniami /set typing.send_channels false i /set typing.send_queries false.

Wskaźniki pisania korzystają z TAGMSG i wymagają jedynie capability message-tags, więc działają na każdym serwerze, który ją obsługuje (a na tych, które jej nie obsługują lub blokują tag przez CLIENTTAGDENY, są po cichu pomijane). repartee wysyła wyłącznie zatwierdzony +typing, ale przy odbiorze nadal akceptuje starszy +draft/typing. Zaczęta treść /me liczy się jako pisanie; zaczęte /command -- nie. Dodaj typing do [statusbar] items, aby umieścić wskaźnik na pasku statusu -- domyślnie już tam jest.

[translate]

Steruje tłumaczeniem na żywo per bufor. Mapowaniami zarządzają /translate addin, addout, delin i delout; szczegóły zawiera strona Tłumaczenie na żywo.

[web]

Wbudowany frontend webowy. Gdy enabled = true i WEB_PASSWORD jest ustawiony w .env, aplikacja uruchamia serwer HTTPS obok interfejsu terminalowego. Oba współdzielą ten sam stan -- przeczytaj wiadomość w przeglądarce, a zostanie oznaczona jako przeczytana w terminalu i odwrotnie.

Ustaw bind_address = "0.0.0.0", aby umożliwić dostęp z sieci lokalnej. TLS jest zawsze włączony -- jeśli nie podano własnego certyfikatu/klucza, automatycznie generowany jest certyfikat samopodpisany w ~/.repartee/certs/.

Ustawienie theme kontroluje wygląd interfejsu webowego. Dostępne: nightfall (domyślny ciemny), catppuccin-mocha, tokyo-storm, gruvbox-light, catppuccin-latte.

Trwałe sesje: session_days (domyślnie 90) kontroluje czas życia ciasteczka logowania. Sesje są zapisywane do ~/.repartee/web_sessions.bin (uprawnienia 0600), a tokeny przechowywane są jako HMAC-SHA256(token, WEB_SESSION_SECRET) -- surowy token nigdy nie trafia na dysk. Sesja przeżywa restart przeglądarki, instalację PWA i zmianę sieci (powiązania z IP/User-Agent zostały usunięte). Rotacja WEB_SESSION_SECRET w .env unieważnia wszystkie istniejące sesje.

Login z polem użytkownika: username (domyślnie "repartee") jest podpowiadany w formularzu logowania, dzięki czemu 1Password, iCloud Keychain i Bitwarden rozpoznają formularz. Wartość jest jedynie dekoracyjna -- serwer weryfikuje tylko hasło.

Podglądy obrazków: image_previews = false domyślnie. Po włączeniu serwer wykrywa adresy URL w przychodzących wiadomościach, pobiera je przez istniejący moduł image_preview z zabezpieczeniem przed SSRF (cele prywatne, loopback, link-local i metadane chmury są blokowane na poziomie bezpośrednich URL-i, przekierowań i podążania za og:image), generuje miniatury 400x300 JPEG (q80) i cache'uje wynik w ~/.repartee/web_thumbnails/. Przeglądarka pobiera każdą miniaturę przez uwierzytelnione GET /api/preview?h=<hmac-hash>, więc dostępne są wyłącznie URL-e, które wcześniej wyłuskał sam serwer. Limit podglądów na wiadomość kontroluje image_previews_max_per_msg (domyślnie 4), a łączny rozmiar cache thumbnail_cache_mb (domyślnie 200, czyszczone LRU po mtime). Bezpośrednie URL-e z Imgura (i.imgur.com/abc.png) są ładowane po stronie klienta, ponieważ Imgur blokuje większość IP serwerów.

[[ignores]]

Wzorce ignorowania do filtrowania niechcianych wiadomości. Używa dopasowania z wildcardami (*!*@host). Poziomy: MSGS, PUBLIC, NOTICES, ACTIONS, JOINS, PARTS, QUITS, NICKS, KICKS, CTCPS, ALL.

Dane uwierzytelniające

Hasła i dane SASL nie powinny znajdować się w config.toml -- zamiast tego przechowuj je w ~/.repartee/.env.

# ~/.repartee/.env
LIBERA_SASL_USER=mynick
LIBERA_SASL_PASS=hunter2
LIBERA_PASSWORD=serverpassword
WEB_PASSWORD=mysecretpassword
SHRINK_API_KEY=your_shrink_api_key
OPENROUTER_API=your_openrouter_key
OLLAMA_API=your_ollama_key
GEMINI_API=your_gemini_key
GROQ_API_KEY=your_groq_key
# WEB_SESSION_SECRET=...   # generowany automatycznie przy pierwszym uruchomieniu; rotacja wylogowuje wszystkich

Dane uwierzytelniające serwera używają identyfikatora serwera zapisanego wielkimi literami. WEB_PASSWORD jest wymagany dla frontendu webowego -- serwer nie uruchomi się bez niego. WEB_SESSION_SECRET jest generowany automatycznie przy pierwszym uruchomieniu i zapisywany do .env; to klucz HMAC używany do hashowania tokenów sesji na dysku, więc rotacja unieważnia wszystkie aktywne sesje.

Zmiany w czasie działania

  • /wizard -- otwórz interaktywny panel ustawień w TUI oraz w interfejsie webowym (10 sekcji: Networks & Connections, Appearance, Messages, Notifications, History & Privacy, Keyboard, Extensions, E2E Encryption, Translation oraz Advanced, z wyszukiwarką Ctrl+F, walidacją zmian, przywracaniem wartości domyślnych sekcji oraz kreatorami kanałów dla szyfrowania E2E i tłumaczeń). Użyj /wizard server [id], aby przejść bezpośrednio do dodawania lub edycji serwera.
  • /set section.field value -- zmień wartość konfiguracji w czasie działania. Zmiany są zapisywane natychmiast. Ujmij wartość w "..." lub '...', aby zachować wiodące/końcowe spacje, albo użyj "" / '', aby wyczyścić listę lub opcjonalne nadpisanie serwera.
  • /bind -- przeglądaj lub modyfikuj skróty klawiszowe oraz sekwencje wieloklawiszowe w czasie działania.
  • /reload -- przeładuj motyw i konfigurację z dysku.