{"id":21045026,"url":"https://github.com/quansight/jupyter-datastore","last_synced_at":"2026-04-29T02:39:14.199Z","repository":{"id":98606115,"uuid":"222478721","full_name":"Quansight/jupyter-datastore","owner":"Quansight","description":"tmp repo to coordinate plan around jupyter datastore","archived":false,"fork":false,"pushed_at":"2019-12-06T16:23:25.000Z","size":140,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-10T15:17:09.693Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Quansight.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-18T15:15:48.000Z","updated_at":"2019-12-06T16:23:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"a8840614-1a40-4742-b795-844410199e82","html_url":"https://github.com/Quansight/jupyter-datastore","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quansight%2Fjupyter-datastore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quansight%2Fjupyter-datastore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quansight%2Fjupyter-datastore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quansight%2Fjupyter-datastore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Quansight","download_url":"https://codeload.github.com/Quansight/jupyter-datastore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243489835,"owners_count":20299001,"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":[],"created_at":"2024-11-19T14:19:37.035Z","updated_at":"2025-12-30T03:24:33.429Z","avatar_url":"https://github.com/Quansight.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JupyterLab Real Time Collaboration Plan!\n\n## Comparison\n\nOur current approach is to handle all communication on the clients. Alternatively,\nhere we propse having a server side datastore peer that handles keeping the models\nup to date from the Jupyter server. It expose REST API endpoints to trigger\nactions on the server, that are similar to the existing kernel endpoints, except\ninstead of returning the state they update the RTC models. They also expose many\nof the kernel websocket methods as REST calls.\n\n## Why?\n\n- Keep models updated when clients are closed.\n- Reduce complexity on the clients.\n- Works with existing infrastructure, i.e. Jupyter Server; doesn't disrupt old way to interact with server (can be run side-by-side).\n- Single source of truth datastore on the server.\n- Similar REST API to existing Jupyter Server REST API — less work for clients to switch to RTC.\n\n![](./diagram.png)\n\n- [ ] `jupyterlab/jupyter-datastore` API spec\n  - [x] kernelspecs\n  - [x] status\n  - [x] terminals\n  - [x] kernels\n  - [x] sessions\n  - [x] contents\n  - [ ] config (Maybe we dont need this?)\n  - [ ] Rewrite to clone existing API more closely\n  - [ ] Add REST endpoints for execution with cell ID\n  - [ ] Add a table for kernel executions (for consoles)\n  - [ ] Deal with `request_input`, either in websockets or CRDT.\n  - [ ] Spec out websockets for comms\n  - [ ] Add config for refresh\n- [ ] Research alternative communication layers\n  - [ ] https://resgate.io/\n  - [ ] https://www.cncf.io/blog/2018/10/24/grpc-web-is-going-ga/\n  - [ ] https://wamp-proto.org/\n- [ ] `jupyterlab/lumino-datastore` API spec\n  - [ ] Create API spec based on Vidar's work\n- [ ] Look into ORM on top of tables, using Ian's work\n- [ ] Think about undo/redo behavior!\n- [ ] Think about users and permissioning!\n\n## `jupyterlab/lumino-datastore`\n\nIncludes client and server side components for synchronized CRDTs in the browser.\n\n## `jupyterlab/jupyter-datastore`\n\nThe Jupyter Datastore package gives you an up to date data model of the Jupyter Server data structures in your browser. It also provides an interface to take actions on the Jupyter Server.\n\nIt is meant to be a building block for any Jupyter web UIs.\n\nGoals:\n\n- Save notebook outputs even when client is closed\n- Add undo/redo\n- Sync models between browser windows\n\nRTC models in [`./spec.ts`](./spec.ts)\n\n## API spec in [`main.py`](./main.py), translated to OpenAPI spec in [`spec.json`](./spec.json) which will be implemented in Node.\n\nhttps://jupyter-client.readthedocs.io/en/stable/messaging.html\n\nhttp://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/notebook/master/notebook/services/api/api.yaml#/contents/post_api_contents__path_\n\nhttps://github.com/jupyter/jupyter/wiki/Jupyter-Notebook-Server-API\n\nGenerating spec:\n\n```bash\npython main.py \u003e spec.json\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquansight%2Fjupyter-datastore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquansight%2Fjupyter-datastore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquansight%2Fjupyter-datastore/lists"}