Zurück zum Ranking

ekzhang/rustpad

Rustrustpad.io

Efficient and minimal collaborative code editor, self-hosted, no database required

collaborative-editingrusttokiocode-editorself-hosteddistributed-systemsreacttypescriptasyncoperational-transformation
Sterne-Wachstum
Sterne
4.1k
Forks
212
Wochenwachstum
Issues
11
2k3k4k
Juni 2021Feb. 2023Nov. 2024Juli 2026
Artefaktecrates.iocargo add rustpad
README

Rustpad

Docker Pulls Docker Image Size GitHub Workflow Status

Rustpad is an efficient and minimal open-source collaborative text editor based on the operational transformation algorithm. It lets users collaborate in real time while writing code in their browser. Rustpad is completely self-hosted and fits in a tiny Docker image, no database required.


rustpad.io

The server is written in Rust using the warp web server framework and the operational-transform library. We use wasm-bindgen to compile text operation logic to WebAssembly code, which runs in the browser. The frontend is written in TypeScript using React and interfaces with Monaco, the text editor that powers VS Code.

Architecturally, client-side code communicates via WebSocket with a central server that stores in-memory data structures. This makes the editor very fast, allows us to avoid provisioning a database, and makes testing much easier. The tradeoff is that documents are transient and lost between server restarts, or after 24 hours of inactivity.

Development setup

To run this application, you need to install Rust, wasm-pack, and Node.js. Then, build the WebAssembly portion of the app:

wasm-pack build rustpad-wasm

When that is complete, you can install dependencies for the frontend React application:

npm install

Next, compile and run the backend web server:

cargo run

While the backend is running, open another shell and run the following command to start the frontend portion.

npm run dev

This command will open a browser window to http://localhost:5173, with hot reloading on changes.

Testing

To run integration tests for the server, use the standard cargo test command. For the WebAssembly component, you can run tests in a headless browser with

wasm-pack test --chrome --headless rustpad-wasm

Configuration

Although the default behavior of Rustpad is to store documents solely in memory and collect garbage after 24 hours of inactivity, this can be configured by setting the appropriate variables. The application server looks for the following environment variables on startup:

  • EXPIRY_DAYS: An integer corresponding to the number of days that inactive documents are kept in memory before being garbage collected by the server (default 1 day).
  • SQLITE_URI: A SQLite connection string used for persistence. If provided, Rustpad will snapshot document contents to a local file, which enables them to be retained between server restarts and after their in-memory data structures expire. (When deploying a Docker container, this should point to the path of a mounted volume.)
  • PORT: Which local port to listen for HTTP connections on (defaults to 3030).
  • RUST_LOG: Directives that control application logging, see the env_logger docs for more information.

Deployment

Rustpad is distributed as a single 6 MB Docker image, which is built automatically from the Dockerfile in this repository. You can pull the latest version of this image from Docker Hub. It has multi-platform support for linux/amd64 and linux/arm64.

docker pull ekzhang/rustpad

(You can also manually build this image with docker build -t rustpad . in the project root directory.) To run locally, execute the following command, then open http://localhost:3030 in your browser.

docker run --rm -dp 3030:3030 ekzhang/rustpad

We deploy a public instance of this image using Fly.io.

In the media


All code is licensed under the MIT license.
Ähnliche Repositories
yjs/yjs

Shared data types for building collaborative software

JavaScriptnpmOtheryjscrdt
docs.yjs.dev
22.2k791
ether/etherpad

Etherpad: A modern really-real-time collaborative document editor.

TypeScriptnpmApache License 2.0etherpadcollaboration
etherpad.org
18.5k3k
ether/etherpad-lite

Etherpad: A modern really-real-time collaborative document editor.

TypeScriptnpmApache License 2.0etherpadcollaboration
docs.etherpad.org
17.2k2.9k
cryptpad/cryptpad

Collaborative office suite, end-to-end encrypted and open-source.

JavaScriptnpmGNU Affero General Public License v3.0collaborative-editingcryptpad
cryptpad.org
7.8k836
loro-dev/loro

Make your JSON data collaborative and version-controlled with CRDTs

Rustcrates.ioMIT Licensecrdtlocal-first
loro.dev
5.9k157
ueberdosis/hocuspocus

The Yjs CRDT WebSocket backend for conflict-free real-time collaboration in your app.

TypeScriptnpmMIT Licensetiptapprosemirror
tiptap.dev/docs/hocuspocus/introduction
2.5k207
atom/teletype

Share your workspace with team members and collaborate on code in real time in Atom

JavaScriptnpmMIT Licenseatompackage
teletype.atom.io
2.4k321
fantasticit/think

云策文档是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。

TypeScriptnpmMIT Licensecollaborative-editingnestjs
think.codingit.cn
2.1k396
michelson/Dante

Just another Medium wysiwyg editor clone

TypeScriptnpmwysiwygcollaborative-editing
dante-editor.dev
2k188
teamtype/teamtype

Peer-to-peer, editor-agnostic collaborative editing of local text files.

Rustcrates.ioGNU Affero General Public License v3.0collaborative-editinglocal-first
teamtype.github.io/teamtype/
1.9k50
josephg/diamond-types

The world's fastest CRDT. WIP.

Rustcrates.iocrdtcollaborative-editing
1.8k42
Sync-in/server

Sync-in Server · Sovereign platform for file storage, sharing, synchronization, and collaboration.

TypeScriptnpmGNU Affero General Public License v3.0self-hostedcloud-alternative
sync-in.com
1.6k118