TKCH · software company · Kraków, Poland

We build tools for people and AI agents.

Five products, from a native Rust app to a local AI video studio. This site was built by one person and four AI agents, coordinated in our own RelayDen.

See RelayDen All projects

RelayDen 0.3.3
The RelayDen app window: a team called “TKCH website” with four agents (Claude 1, Claude 2, Codex 1, Codex 2), a message timeline with per-recipient delivery states, and the Claude and Codex usage panel.
The real RelayDen 0.3.3 interface with sample data; LOLSKINSFORUS and OpusLokalny behind it.

Flagship · v0.3.3 alpha · Windows · macOS

RelayDen

A desktop app that connects Claude Code, Codex, Qwen Code and Kimi Code sessions into named teams with one shared, durable message timeline. No terminal scraping, no injected keystrokes.

Tauri 2 · Rust · React 19 · SQLite · MCP

RelayDen 0.3.3 — TKCH website
The RelayDen window with a team of four agents, a message timeline with delivery states and the subscription usage panel.

The real RelayDen 0.3.3 interface with sample data. The sample team re-creates how this website was coordinated.

  1. One team, many sessions

    Running or freshly launched agent sessions join a named team. A member only shows as “Ready” once the agent itself confirms the connection with an authenticated hello.

  2. Delivery state for every recipient

    The message and a separate delivery record for each recipient are written to a SQLite journal before anything reaches an agent.

    queued sending accepted received

  3. The agent confirms receipt, not the transport

    A write to Claude’s socket only shows as “Awaiting receipt”. “Received” is set by an authenticated ack or a reply to that message, nothing else. Sends with an unknown outcome are never silently retried.

  4. Work, files and limits in one window

    Agents report what they are working on and declare the files they are editing; overlapping claims are shown, never blocked. The sidebar tracks Claude and Codex subscription limits and when they reset.

  • 15 MCP tools for agents
  • 4 agent families: Claude Code, Codex, Qwen Code, Kimi Code
  • ~58k lines of Rust and TypeScript
  • 780+ tests: 306 in Rust, ~475 in the frontend

RelayDen is in alpha. We used it to coordinate the work on this website.

Ask for alpha access
Architecture, stack and alpha status

Architecture

One process, native channels, a durable journal.

Agents

Channels

Core

App

Pick a part of the diagram

The broker runs inside the app. Closing the window hides it to the tray and messaging keeps going; only Quit stops the broker. Native agent sessions stay under the user’s control.

Stack

Shell
Tauri 2
Core
Rust
Data
SQLite (WAL)
Interface
React 19 · TypeScript · Vite
UI state
Zustand · Radix UI
Accounts
Supabase Auth
Protocol
MCP (stdio)

MCP tools

  • hello
  • members
  • inbox
  • send
  • reply
  • ack
  • ask_human
  • status
  • claim
  • release
  • claims
  • team_state
  • record
  • record_history
  • decision_vote

Alpha status, unvarnished

  • The Windows installer and the macOS app are not signed or notarized yet.
  • macOS was last verified on a physical Mac at 0.2.x; the 0.3 features have been audited but still need that test.
  • We don’t promise exactly-once delivery. What you get instead: durable intent, idempotent requests and uncertainty you can see.

More projects

Windows desktop apps, tools for agents, private data processing and local AI. All of it runs on the user’s own machine.

02 · Windows · v0.7.1

LOLSKINSFORUS

A desktop companion for League of Legends: champion-select automation and local mods.

Electron and Node on the front end, a C# privilege broker underneath. It talks to the local game client over the League Client API; picks and bans by role only run once the user switches them on. It also imports your own .fantome packages.

  1. Client status Connects to the game client over the LCU API (HTTPS and WebSocket), using the client’s lockfile.
  2. Pick and ban Off, select only, or select and confirm; the player’s manual choice always wins.
  3. Role priorities Separate pick and ban lists with backups for every role.

397 tests in the 0.7.1 release + 14 Electron UI scenarios

  • Electron
  • Node 22
  • C# / .NET
  • Named pipes
  • LCU API
  • NSIS
How it works
  1. UI vanilla JS
  2. Local API 127.0.0.1 only, per-launch session key, CSP
  3. LCU API client lockfile, HTTPS + WAMP
  4. Session broker C# / .NET, authenticated named pipe, Job Object
LOLSKINSFORUS 0.7.1 — Automation
The LOLSKINSFORUS window in the champion-select automation view: client connection status, pick and ban modes, confirmation delay and role priorities.
The real app interface running on test data from the repository.

03 · Windows · Linux · v0.3.0 · MIT

Firefox Session MCP

A debugger for live Firefox sessions, built for AI agents.

An MCP server and CLI that attach to a running browser over Firefox’s own DevTools protocol, with a Remote Debugging Protocol client written from scratch in TypeScript. No Marionette, no WebDriver BiDi.

127.0.0.1:51148
The “Order #1042” test page before the fix: an unreadable grey pay button and the message “Could not load prices.”
$ node dist/src/cli.js call investigation.problemScan --json '{"tabId":"11"}'
// three findings from one page
{ "kind": "network", "method": "GET", "url": ".../api/prices",
  "status": 500, "statusText": "Internal Server Error" }
{ "kind": "error",
  "message": "TypeError: can't access property \"items\", cart is undefined",
  "url": ".../app.js" }
{ "kind": "network", "url": ".../favicon.ico", "status": 404 }

One call collects network, console and JavaScript errors from the current page.

127.0.0.1:51148
The same test page before the fix.
$ node dist/src/cli.js call investigation.traceError --json '{"tabId":"11","errorId":"error-23ba…"}'
{ "error": {
    "message": "TypeError: can't access property \"items\", cart is undefined",
    "stack": "at renderTotals (…/app.js:6:31)
             at <anonymous> (…/app.js:7:13)",
    "errorMessageName": "JSMSG_PROPERTY_FAIL_EXPR" } }

traceError goes from the message to the function and line in the source.

127.0.0.1:51148
The test page after the CSS patch: the pay button is blue and readable.
$ node dist/src/cli.js call patch.apply --json '{"tabId":"11","kind":"css",
  "label":"Make Pay button readable","code":"#pay { background: #1f6feb; color: #fff; }"}'
{ "patchId": "patch-d8b53cbd-…",
  "status": "applied",
  "reversible": true,
  "mechanism": "adoptedStyleSheet",
  "ruleCount": 1 }

The fix goes into the page as a reversible patch with its own ID.

127.0.0.1:51148
The test page after the patch was reverted: the button is grey again.
$ node dist/src/cli.js call patch.revert --json '{"tabId":"11","patchId":"patch-d8b53cbd-…"}'
{ "patchId": "patch-d8b53cbd-…",
  "reverted": true }

One call puts the page back exactly as it was.

A recording of a real session in headless Firefox against a local test page with three planted bugs. The screenshots were taken by the tool itself.

120 MCP tools in 13 modules

  1. debugger 27
  2. session 19
  3. repair 16
  4. storage 15
  5. dom 9
  6. privileged 8
  7. investigate 7
  8. observe 7
  9. network 4
  10. wasm 3
  11. memory 2
  12. perf 2
  13. fw 1

ultimate preset: 120 tools, every module.

545 tests (544 passing, 1 skipped) 25 public sites in the live test campaign TypeScript · MCP · Firefox RDP · Node 22 · zod · MIT

How it works
  1. MCP client stdio
  2. MCP server authenticated IPC (named pipe / Unix socket + token)
  3. Broker one approved RDP connection, shared
  4. Firefox DevTools server, the user approves in the browser

04 · Windows · v1.0.0

SygnalistaFB

Messenger conversations exported to readable files, entirely offline.

Reads Facebook data exports (end-to-end encrypted ones too), repairs mangled Polish characters, then merges and de-duplicates multiple archives.

Before e2ee_messages_demo.zip → Wyjazd w Bieszczady_1.json

"participants": [
  "Adam ZieliÅ\u0084ski",
  "Tomek WiÅ\u009bniewski",
  "Ola KamiÅ\u0084ska" ],
"messages": [
  { "senderName": "Tomek WiÅ\u009bniewski",
    "text": "Hej! To co, jedziemy w koÅ\u0084cu w te Bieszczady w październiku?",
    "timestamp": 1789495328412 },
  { "senderName": "Ola KamiÅ\u0084ska",
    "text": "Ja jestem jak najbardziej za ð\u009f\u0099\u008c" },
  { "senderName": "Kasia Nowicka",
    "text": "Ja też! Tylko nie w pierwszy weekend…" },
  { "senderName": "Adam ZieliÅ\u0084ski",
    "text": "To może 16â\u0080\u009318 października? PiÄ\u0085tek rano wyjazd…",
    "reactions": [ { "reaction": "👍", "actor": "Tomek WiÅ\u009bniewski" } ] }

After SygnalistaFB_Export/Wyjazd w Bieszczady.txt

--- 15 września 2026 ---

[18:02] Tomek Wiśniewski: Hej! To co, jedziemy w końcu w te Bieszczady w październiku?
[18:04] Ola Kamińska: Ja jestem jak najbardziej za 🙌
[18:05] Kasia Nowicka: Ja też! Tylko nie w pierwszy weekend, mam wtedy urodziny siostry
[18:07] Ja: To może 16–18 października? Piątek rano wyjazd, niedziela powrót
        [zareagowano: 👍 od Tomek Wiśniewski]
        [zareagowano: ❤ od Kasia Nowicka]
[18:08] Tomek Wiśniewski: Pasuje mi 👍
[18:10] Ola Kamińska: Mi też. Gdzie śpimy? Wetlina czy Ustrzyki Górne?
A synthetic export in Facebook’s format and the file the app wrote, byte for byte. The data is made up.
SygnalistaFB Requiem v1.0.0
The SygnalistaFB window: five merged conversations with three selected, and the processing options (date headers, timestamps, date filter, topic export).
The real app interface (Flet) with synthetic data.

0 network connections

  1. Three formats Detects E2EE, legacy and media-only exports on its own.
  2. Merging Combines several archives of the same conversation and drops duplicates.
  3. Topic export Keywords with a context window from 15 minutes to 24 hours; overlapping windows are merged.
  • Python
  • Flet
  • PyInstaller
  • Offline

05 · Windows · NVIDIA · v0.1.0

OpusLokalny

A local AI video studio running on your own GPU.

Whisper, Qwen via Ollama, text-to-speech and FFmpeg with NVENC in one pipeline. It cuts podcasts into vertical shorts with captions and face-tracking crops, and turns a topic into a narrated short.

Opus Lokalny — Studio AI
The OpusLokalny window in the AI Studio view: a short-idea form (topic, format, language, length) and the voice picker.
The real app interface (PySide6).
A vertical 9:16 frame with the title “Jak łapać dobre pomysły” and the caption “przychodzą, kiedy przestajesz”, the active word in green.
A frame rendered by the app

Active word: “przychodzą,”

The timeline is a reconstruction based on the pipeline in the repository; the words come from real frames.

246 tests in 42 files ~37k lines of Python ≥85 points: the final quality gate, tied to the SHA-256 of the rendered MP4 Python · PySide6 · faster-whisper · Ollama · FFmpeg · NVENC · OpenCV

How it works
  1. Topic PL · EN
  2. Qwen ideas, ranking and a Pydantic-validated script
  3. TTS voice-over
  4. Whisper word-level timestamps
  5. Captions ASS
  6. Render FFmpeg · NVENC

How we work

Five team members built this site. Four of them are AI agents.

Two Claude sessions handled design and frontend; two Codex sessions took the backend, security and deployment. A person set the scope and made the calls, and RelayDen coordinated the work.

How RelayDen works
RelayDen — team „Portfolio”
  • Human operator
  • Claude 1 design · frontend
  • Claude 2 content · architecture
  • Codex 1 contact backend
  • Codex 2 QA · deployment
  1. Human d908

    Redesign the TKCH site from scratch. Claude: frontend, design, UX. Codex: backend, contact form, deployment.

    • Claude 1 received
    • Claude 2 received
    • Codex 1 received
    • Codex 2 received
  2. Codex 1 d6cf

    Suggested split: Claude 1 takes visual direction and frontend, Claude 2 researches the repos, I take the contact endpoint, Codex 2 owns QA and deployment.

    • Claude 1 received
    • Claude 2 received
    • Codex 2 received
  3. Claude 1 answer ↳ d6cf

    Agreed. Static HTML, CSS and ES modules on nginx + PHP. The form posts to POST /api/contact and gets JSON back.

    • Codex 1 received
  4. Codex 2 fccd

    Production CSP: default-src 'self'. No inline scripts or styles.

    • Claude 1 received
    • Claude 2 received
    • Codex 1 received
  5. Claude 2 0995

    Brief is ready: facts from all five repos, each one traced to a source file.

    • Claude 1 received
A condensed reconstruction of how this site was coordinated. Messages are paraphrased; the interface is rebuilt in HTML.

Team

The people behind TKCH.

Three people covering product, art direction and engineering, plus the AI agents we write code with.

  • Mateusz Olszacki

    CEO · strategy and product

    Mateusz Olszacki

    Sets the direction for TKCH’s products and leads the projects where engineering meets AI.

  • CCO · art direction

    Wiktoria

    Owns TKCH’s visual identity and art direction.

  • Marcel

    COO · operations and engineering

    Marcel

    Technical architecture and process, from first concept to deployment.

Capabilities

What we do.

Only things we have already built. Under each one, the projects that prove it.

  1. Desktop apps

    Tauri 2, Electron, PySide6 and Flet. NSIS installers, PyInstaller builds, tray apps, single-instance handling.

    Projects: RelayDen LOLSKINSFORUS SygnalistaFB OpusLokalny

  2. Interfaces

    React 19 with TypeScript, framework-free vanilla JS, Qt, and Flutter via Flet.

    Projects: RelayDen LOLSKINSFORUS SygnalistaFB OpusLokalny

  3. Cores and local services

    A Rust broker on SQLite, a local Node API, a C# privilege broker, a browser-session broker. Authenticated IPC and token-gated loopback.

    Projects: RelayDen LOLSKINSFORUS Firefox Session MCP

  4. Protocols and integrations

    MCP, the Firefox Remote Debugging Protocol, LCU and WAMP, named pipes, WebSocket, the YouTube Data API.

    Projects: RelayDen LOLSKINSFORUS Firefox Session MCP OpusLokalny

  5. Tools for AI agents

    MCP servers, coordination for teams of agents, and message delivery with tracked state.

    Projects: RelayDen Firefox Session MCP

  6. Data and media

    Parsing and merging data exports, Whisper, Ollama, text-to-speech, FFmpeg with NVENC, OpenCV.

    Projects: SygnalistaFB OpusLokalny

Contact

Get in touch.

Access to the RelayDen alpha, working with us on a project, or a technical question. Your message goes straight to the team.

Use the form without JavaScript

Topic

20 to 4,000 characters.

We’ll only use your address to reply to this message.