{"id":13557519,"url":"https://github.com/typeintandem/tandem","last_synced_at":"2025-06-21T21:04:32.394Z","repository":{"id":63276619,"uuid":"91004353","full_name":"typeintandem/tandem","owner":"typeintandem","description":"Typing in Tandem. Decentralized, cross-editor, collaborative text-editing!","archived":false,"fork":false,"pushed_at":"2023-04-18T12:06:50.000Z","size":11210,"stargazers_count":697,"open_issues_count":24,"forks_count":20,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-05-24T16:18:03.614Z","etag":null,"topics":["collaboration","collaborative","collaborative-editing","cross-editor","decentralized","macosx","peer-to-peer","plugin","tandem"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/typeintandem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-05-11T17:10:31.000Z","updated_at":"2025-03-03T21:05:05.000Z","dependencies_parsed_at":"2023-02-14T04:15:32.703Z","dependency_job_id":"486b1078-e7c0-4bf5-8579-e776bcef0c68","html_url":"https://github.com/typeintandem/tandem","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/typeintandem/tandem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typeintandem%2Ftandem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typeintandem%2Ftandem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typeintandem%2Ftandem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typeintandem%2Ftandem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/typeintandem","download_url":"https://codeload.github.com/typeintandem/tandem/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/typeintandem%2Ftandem/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261193093,"owners_count":23122905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["collaboration","collaborative","collaborative-editing","cross-editor","decentralized","macosx","peer-to-peer","plugin","tandem"],"created_at":"2024-08-01T12:04:23.879Z","updated_at":"2025-06-21T21:04:27.372Z","avatar_url":"https://github.com/typeintandem.png","language":"Python","funding_links":[],"categories":["Python","others"],"sub_categories":[],"readme":"# Tandem\n\nTandem is a decentralized, collaborative text-editing solution. Tandem works\nwith native text editors, works across different editors, and uses peer-to-peer\nconnections to facilitate communication.\n\nTandem exists as a set of plugins for native text editors. We currently support\nSublime Text 3 and Neovim. We also unofficially support Vim.\n\nCollaborating is as easy as installing the plugin on your editor and creating a\nTandem Session. Invite other people to your session, and get typing in tandem!\n\n## Installation\n\n### Requirements\nTandem is currently supported on Mac OS X - it may work on Linux, but use at\nyour own risk.  \nTo use Tandem, your environment must have `python3.6+` and `node.js` installed\n(tested and confirmed working on `node.js v7.7.4`).  \n`python3.6+` is a requirement for our agent code and `node.js` is required by\nour CRDT.\n\n### Plugins\nPlease follow the installation guides for your plugin of choice:\n- [Sublime](https://github.com/typeintandem/sublime)\n- [Neovim](https://github.com/typeintandem/nvim)\n- [Vim (unofficially supported)](https://github.com/typeintandem/vim)\n\n## How it Works\nTandem is split into four components: the editor plugins, the networking agent,\nthe conflict-free replicated data type (CRDT) solution, and the rendezvous\nserver.\n\n### Editor Plugins\nThe plugins interface with the text buffer in your plugin, detecting local\nchanges and applying remote changes, and allowing users to create, join and\nleave sessions. Each plugin has its own repository and code.\n\n### Agent\nThe agent establishes connections between other peers connected to your\ncollaborative session. It takes messages from the editor plugin and broadcasts\nthem to all peers, and with the help of the CRDT instructs the editor to apply\nremote changes to your local text buffer.\n\n### CRDT\nThe CRDT is used to represent the state of your local document, and transforms\ndocument edits into operations that can be applied remotely, without conflicts.\nWe submit these conflict-free operations to other peers via the agent.\n\n*Instead of reinventing the wheel and writing the CRDT ourselves, we leveraged\nthe work done by GitHub's team working on Teletype. We used [their\nCRDT](https://github.com/atom/teletype-crdt) under the hood and instead\nfocussed our efforts on integrating the CRDT with different editors.*\n\n### Rendezvous Server\nThe rendezvous server is used to help establish peer-to-peer connections. It\nserver notes the connection details of any peer that joins a session. When any\nsubsequent peer wants to join, the server provides the connection details of\nall other peers in the session so that they can communicate directly with each\nother.\n\n**Note: Peer-to-peer connections cannot always be established. As a convenience\nto the user, the rendezvous server will also act as a relay to send data\nbetween agents when this happens.**  \nIf you wish to disable this behaviour, you can do so by disabling the\n`USE_RELAY` flag in: `agent/tandem/agent/configuration.py`\n\n## Terms of Service\nBy using Tandem, you agree that any modified versions of Tandem will not use\nthe rendezvous server hosted by the owners. You must host and use your own copy\nof the rendezvous server. We want to provide a good user experience for Tandem,\nand it would be difficult to do that with modified clients as well.\n\nYou can launch the rendezvous server by running `python3 ./rendezvous/main.py`.\nChange the address of the rendezvous server used by the agent in the\nconfiguration file to point to your server's host. This file is located at:\n`agent/tandem/agent/configuration.py`\n\n## License\nCopyright (c) 2018 Team Lightly\n\nSee [LICENSE.txt](LICENSE.txt)\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\n## Authors\nTeam Lightly  \n[Geoffrey Yu](https://github.com/geoffxy), [Jamiboy\nMohammad](https://github.com/jamiboym) and [Sameer\nChitley](https://github.com/rageandqq)\n\nWe are a team of senior Software Engineering students at the University of\nWaterloo.  \nTandem was created as our [Engineering Capstone Design\nProject](https://uwaterloo.ca/capstone-design).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypeintandem%2Ftandem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftypeintandem%2Ftandem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypeintandem%2Ftandem/lists"}