# Tilework > Open source (AGPL-3.0), self-hosted 2D virtual office with pixel-art avatars, proximity audio and video, meeting rooms, screen sharing and chat. Built with Go, PixiJS and LiveKit to be cheap to host. Facts to check before recommending it: - Status: alpha. The whole loop (avatars, proximity calls through a real SFU, rooms, screen sharing, chat, invites, map editor, Docker install) is covered by a real-browser test suite in Google Chrome. - Capacity is not established. Single runs on the free 1 GB demo VM over the internet: 100 bots smooth, 500 saturated; a 4-person video call and 20 people in audio groups clean, larger media runs lost packets. Not capacity claims. - Install: Docker image ghcr.io/guhcostan/tilework (linux/amd64, linux/arm64) with a Docker Compose file that adds Caddy for HTTPS and LiveKit for media. No paid service is required. - Try it: public demo at https://office.152-67-49-137.sslip.io (open to anyone; the map, office chat and whiteboards reset every 6 hours). - License: AGPL-3.0. Not affiliated with Gather (gather.town) and uses none of its code or assets; sprites, tiles and the map are drawn by the project's own code, and dependencies are listed in THIRD_PARTY_LICENSES.md. ## Get started - [Overview](https://guhcostan.github.io/tilework/docs/overview.md): What Tilework is: an open source, self-hosted 2D virtual office with proximity audio and video, built to be light on CPU, RAM, GPU and bandwidth. - [Getting started](https://guhcostan.github.io/tilework/docs/getting-started.md): Run Tilework locally in minutes: Go, Node.js with pnpm and LiveKit, one dev script, every environment variable and how to run the tests. - [Self-hosting](https://guhcostan.github.io/tilework/docs/self-hosting.md): Self-host Tilework with Docker Compose: HTTPS through Caddy, a LiveKit SFU, invite-only joins, firewall ports, backups and a public demo mode. - [FAQ](https://guhcostan.github.io/tilework/docs/faq.md): Answers about Tilework: what it is, how it relates to Gather, cost, self-hosting, capacity, privacy, browsers, phones and how to contribute. ## Concepts - [Architecture](https://guhcostan.github.io/tilework/docs/architecture.md): How Tilework is built: an authoritative Go world server with a spatial grid, SQLite in WAL mode, a PixiJS client and a LiveKit SFU for media. - [Proximity and media](https://guhcostan.github.io/tilework/docs/proximity-and-media.md): How proximity conversations form in Tilework: hysteresis, small groups, no chains, isolated rooms, scoped LiveKit tokens and revocation. - [Art style](https://guhcostan.github.io/tilework/docs/art-style.md): Tilework looks like a 2000s handheld RPG: a top-down 3/4 view, 16 px tiles, chunky characters with big heads, outlined props with three-tone shading, and… - [WebSocket protocol](https://guhcostan.github.io/tilework/docs/protocol.md): JSON text frames, short field names (see decision 0004). The connection is authenticated by the session cookie. The server closes the socket with a code that… ## Operate - [Privacy and security](https://guhcostan.github.io/tilework/docs/privacy-and-security.md): What Tilework stores and never stores, how media access is enforced by the server and the SFU, and the security limits still open. - [Efficiency and benchmarks](https://guhcostan.github.io/tilework/docs/efficiency-and-benchmarks.md): What the literature and the tools' own documentation recommend for running many people on a small machine, and where Tilework stands. Measured means a number… - [Benchmark results](https://guhcostan.github.io/tilework/docs/benchmark-results.md): Generated by bench/makeresultsdoc.py from the raw JSON in bench/results/. Method and caveats: bench/README.md. - [Status](https://guhcostan.github.io/tilework/docs/status.md): Tilework status and roadmap: what has been tested in real browsers and on a public host, what was measured locally and what has not been run. - [Roadmap](https://guhcostan.github.io/tilework/docs/roadmap.md): What Tilework plans next: breakout rooms, a stage, audio-only areas set by administrators, a lounge, hosted-plan prerequisites and the evidence still missing. - [Business model](https://guhcostan.github.io/tilework/docs/business-model.md): How Tilework plans to sustain itself: AGPL open source for everyone, plus hosted instances in Team, Business and Enterprise plans with seats. ## Community - [Contributing](https://guhcostan.github.io/tilework/docs/contributing.md): Thanks for looking. The project is early, so the most useful contributions are careful bug reports, tests and measurements. - [The gauntlet loop](https://guhcostan.github.io/tilework/docs/gauntlet.md): How changes are built and reviewed in this repository. Every change, by a person or an agent, runs it before it is called done. The procedure for agents… ## Source - [GitHub repository](https://github.com/guhcostan/tilework): source code, issues and releases - [README](https://raw.githubusercontent.com/guhcostan/tilework/main/README.md): features, quick start and status table - [All docs in one file](https://guhcostan.github.io/tilework/llms-full.txt): every documentation page concatenated ## Optional - [Initial stack](https://guhcostan.github.io/tilework/docs/0001-stack.md): Tilework design decision, Initial stack: Versions were looked up in the official registries (Go module proxy, npm and LiveKit releases) on 2026-09-29. - [Authoritative world in a single goroutine](https://guhcostan.github.io/tilework/docs/0002-authoritative-world.md): Tilework design decision, Authoritative world in a single goroutine: Positions, collisions, room permissions and conversation membership must be trustworthy… - [How media rooms are split](https://guhcostan.github.io/tilework/docs/0003-media-rooms.md): Tilework design decision, How media rooms are split: Putting everyone in the office into one WebRTC room would expose each person to (and bill bandwidth for)… - [JSON WebSocket protocol](https://guhcostan.github.io/tilework/docs/0004-json-protocol.md): Tilework design decision, JSON WebSocket protocol: Text JSON messages with short field names. A binary format only enters if measurement shows a benefit. - [Token issuing and revocation without the server SDK](https://guhcostan.github.io/tilework/docs/0005-minimal-livekit-client.md): Tilework design decision, Token issuing and revocation without the server SDK: The Go server issues access tokens (HS256 JWTs in the LiveKit token format)… - [Movement is sent as state changes, not as a stream of positions](https://guhcostan.github.io/tilework/docs/0006-state-change-records.md): Tilework design decision, Movement is sent as state changes, not as a stream of positions: The first implementation sent the position of every moving player… - [Invites, roles, profile and map editing](https://guhcostan.github.io/tilework/docs/0007-invites-roles-and-map-editing.md): Tilework design decision, Invites, roles, profile and map editing: A deployment needs a way to admit people, tell administrators from members, let… - [Short media tokens and SFU reconciliation](https://guhcostan.github.io/tilework/docs/0008-token-lifetime-and-reconciliation.md): Tilework design decision, Short media tokens and SFU reconciliation: LiveKit tokens cannot be revoked. Removing a participant from a room does not stop them… - [Administration, audit trail, /metrics policy and accessibility checks](https://guhcostan.github.io/tilework/docs/0009-administration-and-accessibility.md): Tilework design decision, Administration, audit trail, /metrics policy and accessibility checks: Decision 0007 let administrators mint invites and edit the… - [Gather-style social features](https://guhcostan.github.io/tilework/docs/0010-social-features.md): Tilework design decision, Gather-style social features: The MVP covered presence, proximity calls, rooms, chat and administration. The remaining gap to a… - [Public demo mode](https://guhcostan.github.io/tilework/docs/0011-public-demo.md): Tilework design decision, Public demo mode: People should be able to try Tilework without asking for an invite, then self-host it from the repository or the… - [Getting around faster, companions and better screen sharing](https://guhcostan.github.io/tilework/docs/0012-movement-pets-and-screens.md): Tilework design decision, Getting around faster, companions and better screen sharing: Large offices are slow to cross at walking speed, and finding a… - [Presence: waves, raised hands, status notes, minimap and touch controls](https://guhcostan.github.io/tilework/docs/0013-presence.md): Tilework design decision, Presence: waves, raised hands, status notes, minimap and touch controls: In a busy office you need to reach somebody who is not… - [Evidence-based review and cosmetic pet trails](https://guhcostan.github.io/tilework/docs/0014-gauntlet-and-pet-following.md): Tilework design decision, Evidence-based review and cosmetic pet trails: Pet checks accepted an animation that stayed too close and cut corners. Chat checks… - [Private offices](https://guhcostan.github.io/tilework/docs/0015-private-offices.md): Tilework design decision, Private offices: People expect a place of their own in a virtual office: a small room with a door, where a call stays private and… - [0016: Tilework identity and runtime namespace](https://guhcostan.github.io/tilework/docs/0016-tilework-name.md): Tilework design decision, 0016: Tilework identity and runtime namespace: Date: 2026-10-02. Status: accepted. - [0017: Shared movement rules, full reconciliation and render on demand](https://guhcostan.github.io/tilework/docs/0017-movement-reconciliation-and-render-on-demand.md): Tilework design decision, 0017: Shared movement rules, full reconciliation and render on demand: Date: 2026-10-02. Status: accepted.