Signal drop!
Relay (operand.online) is unreachable.
Usually, a dropped signal means an upgrade is happening. Hold on!
Sorry, no connección.
Hang in there while we get back on track
gram: essay
tiny essay editor
This is a simple collaborative Markdown editor built in React, with inline format preview and inline commenting.
It's built on automerge and automerge-repo for CRDT-based storage and sync. It uses Codemirror for markdown editing UI, and automerge-codemirror to connect to Codemirror.
Usage
If you visit the root domain the app will make a new doc. Or you can hit the New button.
Once you have a doc, the URL will update with a doc ID. If you share that URL to another browser/device, it should sync live. Hold on to the URL if you want to come back to that doc!
Features
- Edit Markdown with inline format preview
- Write inline comments + replies
- Live sync through Automerge
- Stores data to local device
- Save out .md file with a Download button
- Typeset similarly to Ink & Switch essays
Status
This app is primarily intended for internal use at Ink & Switch for editing essays, so there are some features that are specialized towards that use case. We don't plan to develop it into a general-purpose editor that anyone can use for anything. But of course, it can edit any Markdown document too. If you want to actually use this editor in earnest, you might want to fork it to build your own ideas.
Hopefully the code serves as a useful sample for building apps based on automerge-repo, automerge-codemirror, and React.
Development
Run it
yarn
yarn dev
Dual deployment
This app is designed for normal webapp deployment as well as experimental deployment to an internal I&S platform. The code is almost entirely shared but there are two entry points:
src/main.tsxis the normal app entry pointsrc/index.tsis an experimental entry point which just exports some functions to a host environment
Adding a new datatype
This app is actually a general framework for editing automerge docs in viewers, which currently has specific support for markdown documents and tldraw whiteboards.
Basic instructions to add a new datatype:
- copy an existing
src/{datatype}directory as a template.teeis a reasonable example - Fill in
src/<your_datatype>/datatype.tswith a TS type, an init function, and other functions - Add your new datatype to the
datatypesmap insrc/datatypes.ts
Logged Changes:
2025-10-04
17:49:36 | 2ca06cb[domain] read `.call` and use included domain.17:19:31 | 736d2ee[nix] add `flake.nix`, go from `yarn` -> `deno`2024-06-17
17:16:54 | ba24a2fLitt: readme edit to bump deploy2024-05-09
17:23:40 | b83cf6bLitt: fix unique key in folderviewer17:23:10 | 7779f9aLitt: bump automerge-repo2024-05-07
14:04:44 | 96a5817Litt: Merge pull request #42 from inkandswitch/folders2024-05-06
14:24:14 | c88c77eSonnentag: fix initialization of previewMarkdownImages for old docs2024-04-29
16:40:19 | 728fb27Sonnentag: #43 add support for images in tee2024-04-26
18:14:53 | 7c6474aSonnentag: Merge pull request #45 from inkandswitch/undo09:15:22 | 7f1bf46Sonnentag: fix typescript errors09:13:06 | 55deba6Sonnentag: update @automerge/automerge-codemirror2024-04-18
10:00:09 | a2d67efSonnentag: use new automerge-codemirror api2024-04-16
09:54:46 | 76b7e55Litt: add Folders to the sidebar08:11:27 | be682efSonnentag: Merge pull request #40 from inkandswitch/remove-vendored-automerge-repo2024-04-15
18:19:34 | 3524122Litt: remove unnecessary keymap bindings15:22:00 | 8194e95Litt: tweak comment10:50:58 | 2e079a4Sonnentag: delete vendored automerge-repo10:35:26 | 94abde7Sonnentag: remove vendored useDocument hook10:31:43 | 63022afSonnentag: remove setup instructions for git submodule10:29:53 | 39c1294Sonnentag: monkey patch doc handle to set author and timestamp metadata by default10:29:01 | 1511d05Sonnentag: remove automerge-repo submodule2024-02-26
19:19:56 | af4f2f5Litt: Merge pull request #29 from joshuahhh/main10:31:43 | 7def181Horowitz: allow pasting in urls with embedded automerge urls2024-02-16
15:58:51 | e6c143dLitt: slightly improve handling of unknown doc types15:58:10 | 8bf4ec7Litt: adjust readme2024-01-30
18:23:53 | 076f570Litt: fix z-index16:28:15 | a0d80davan Hardenberg: fix type errors15:14:38 | 462d6fevan Hardenberg: fix presence14:28:26 | c166328van Hardenberg: put semis back on account14:24:24 | 9cb93a6van Hardenberg: fix mark copy12:40:07 | 4b89fdfvan Hardenberg: init and icon12:37:27 | 1309755van Hardenberg: repair asMarkdownFile -- bit of a botch job10:27:03 | 6b168d0van Hardenberg: resemi08:59:51 | a622a15van Hardenberg: fix navigation2024-01-29
16:20:02 | ac76231van Hardenberg: works16:10:34 | 29e5014van Hardenberg: WIP13:25:30 | 3e8c30avan Hardenberg: a first draft of TLDraw in TEE2024-01-12
16:30:27 | 0cc5273Litt: Merge pull request #19 from inkandswitch/tee-change-attribution16:21:50 | 1fb80c3Litt: build command to handle vendored automerge-repo14:51:35 | 91814d1Litt: try an https url14:38:14 | 9aadc1cLitt: bump again09:57:16 | d47ed62Litt: bump the repo to trigger deploy13:47:00 | 0e74106Sonnentag: Use new metadata api2024-01-11
12:54:59 | 566573cSonnentag: Fix README12:40:07 | f85c748Sonnentag: Update instructions in README for setting up the repo12:19:08 | a430bd1Sonnentag: Rename automerge-repo -> vendored-automerge-repo09:43:13 | 740b109Sonnentag: Add automerge-repo as a submodule2024-01-10
16:16:51 | fd15a95Litt: whoops, re-enable line wrapping plugin15:41:35 | d3ec9deLitt: fix rectangular selection bug by disabling drawSelection2024-01-04
11:24:20 | 3c14659Litt: remove unused LLM file for now2024-01-03
11:18:23 | 3289c05Litt: add a teeny bit of margin to comments10:17:09 | 4bfda72Litt: fix type error2024-01-02
16:07:00 | f5fe437Litt: improve positioning of comments16:06:47 | ae82582Litt: keyboard shortcut for adding comment15:55:44 | 5d472a8Litt: fix bug: jitter on selectio15:32:26 | 90678b9Litt: center editor horizontally and improve responsiveness a bit15:11:34 | dd5b21fLitt: indent wrapped lines in outlines better14:25:45 | 16c1df0Litt: fix bug where scrolling in editor view wouldn't update visible comments2023-12-22
11:07:44 | b35cea2Litt: Merge pull request #12 from inkandswitch/knapsack11:01:40 | dcf8fdfLitt: dont show name after signing out10:48:47 | 39dbb9bLitt: tweak avatar design10:48:36 | 1923c24Litt: improve handling of account doc loading10:30:55 | 26704a4Litt: migrate accounts on login2023-12-21
11:04:41 | 9cbbaeeLitt: add logic to migrate existing accounts + fix open logic10:38:34 | e342b73Litt: remove clickable links feature for now2023-12-20
16:41:37 | 454684cLitt: enter to make new document14:29:34 | f1838ffLitt: address first round of Paul comments14:13:58 | a9fa6a8Litt: short circuit when root folder doc hasn't been loaded yet2023-12-19
18:13:04 | dae08ffSonnentag: Merge pull request #15 from inkandswitch/sync-indicator-state-machine18:10:33 | 462832bSonnentag: fix env access in main.tsx17:58:34 | debd0aaSonnentag: bump automerge-repo to 1.1.0-alpha.717:57:08 | abc85c6Sonnentag: fix handle undefined env10:36:03 | f38f5ddLitt: Merge pull request #14 from inkandswitch/refactor-codemirror-plugins10:33:58 | 9a0c269Litt: split out codemirror plugins into separate files2023-12-18
10:23:51 | 7aa7e05Litt: Merge pull request #13 from inkandswitch/fix-profile-dialog-closing14:29:31 | e86f753Sonnentag: fix copy / show account token button to not close modal10:55:46 | 8137c28Sonnentag: Bump automerge version2023-12-15
17:25:01 | e528b89Sonnentag: fix import in tests17:20:57 | 8b62602Sonnentag: handle undefined 'env' variable in trail runner2023-12-13
10:45:06 | 05ed60fSonnentag: bump automerge-repo to alpha.610:42:47 | 81aba58Sonnentag: Merge branch 'main' into sync-indicator-state-machine09:09:52 | 4cc01e3Sonnentag: Merge pull request #11 from inkandswitch/profiles2023-12-12
18:38:56 | 44fe3f0Litt: remove deprecated users field from new TEE docs15:21:03 | 960d140Litt: removing claiming existing anon accounts on login16:06:40 | 90f45f4Sonnentag: Make SYNC_SERVER_URL and SYNC_SERVER_STORAGE_ID configurable14:57:44 | e83769dSonnentag: Clean up code2023-12-11
21:23:08 | 72293e4Litt: tweak UI16:48:25 | 61db39dLitt: add size check on profile pics16:09:23 | ec1cf2aLitt: tweak var name16:06:22 | 7f21be7Litt: improve name of storage key16:04:37 | 06f3eb2Litt: fix bug in login15:51:31 | 77c7e5aLitt: change format of account token15:15:56 | 48f39d5Litt: rename profile to accounts15:07:04 | 7f0ae53Litt: move non-TEE-specific UI components into their own dir11:42:05 | 0439dcbLitt: fix comment11:39:31 | 0df63dbLitt: reduce font weight of usernames in comments11:36:21 | 83eed2aLitt: refactor components into separate files11:23:57 | 1c9f30dLitt: fix DOM warnings + improve password manager handling11:13:18 | c8622b7Litt: update UI copy12:58:50 | 00e7515Sonnentag: Remove old user session code12:46:55 | 09fb1cfSonnentag: Improve profile2023-12-08
14:29:04 | cd2cee8Sonnentag: Remove logging14:20:38 | 87db2ecSonnentag: Rename profile Url -> secrete code13:41:01 | fba2730Sonnentag: Fix hook bugs2023-12-07
15:21:41 | ef72ff0Sonnentag: Clean up15:09:34 | cbc5ca1Sonnentag: Add details to sync indicator2023-12-06
14:46:52 | 1c2a556Sonnentag: Use new contacts in comments13:51:57 | 4ab57a3Sonnentag: Implement login11:50:22 | a48b897Sonnentag: Show profile url when logged in11:19:04 | b8a9df3Sonnentag: allow to upload profile images10:24:24 | b5986adSonnentag: basic profile2023-12-05
13:22:39 | bf22d7dSonnentag: Fix sync state2023-12-04
11:25:03 | 84b391fLitt: initial draft of knapsack sidebar11:25:03 | 0b51451van Hardenberg: add entry point for trail-runner15:02:50 | df08e5fSonnentag: Fixes to make it run in trail runner2023-11-27
16:51:58 | 6c282b9Litt: Merge pull request #9 from inkandswitch/optimize-cursors15:35:00 | fcc8ac3Litt: remove unused imports14:20:24 | 5e6d7b2Litt: disable paren matching2023-11-24
17:33:06 | 0f4c5f9Sonnentag: Small fixes16:12:22 | 303102eSonnentag: Connect sync indicator with state machine2023-11-23
14:56:04 | c2bfda4Sonnentag: Add state machine for sync state indicator2023-11-22
16:50:29 | f655125Litt: Merge pull request #5 from inkandswitch/tsc-to-trailrunner16:45:54 | d871493Litt: fix image path in index.ts16:37:14 | df9c016Litt: put index.css in dist, not dist/assets16:34:14 | 0b03d6cLitt: remove image from src/assets16:33:44 | ffcdccdLitt: set logo image url differently in vite and trailrunner2023-11-21
17:39:54 | ad74057Litt: put logo in src and fix asset path17:09:35 | b32e559Litt: try fixing the image17:05:38 | fe3789eLitt: readme note16:47:42 | 3115f0eLitt: add a comment16:42:54 | 0f087e0Litt: revert test change16:42:47 | d6308b3Litt: copy package json to built dir12:49:29 | 20cec7avan Hardenberg: split up the build12:07:23 | 2966d7avan Hardenberg: package.json version/name fixes for TR import00:57:53 | 8c00eedvan Hardenberg: fix assets00:55:06 | 95526dcvan Hardenberg: es module style imports00:35:25 | e37f39avan Hardenberg: fix paths00:34:13 | 42f7699van Hardenberg: not sure if this will work but it's more likely to, at least00:18:07 | 0718da8van Hardenberg: remove some hacks2023-11-20
15:35:44 | c299e13van Hardenberg: cross platform CLI2023-11-14
14:52:33 | 0f7c281van Hardenberg: bit of a WIP14:06:43 | 95d6481van Hardenberg: Merge branch 'main' into tsc-to-trailrunner15:22:29 | 3b36e74Litt: fix nesting dom warning14:33:41 | 028516dLitt: make little ux improvements to sync state19:14:38 | d76ef8bSonnentag: Merge pull request #6 from inkandswitch/sync-state18:52:48 | 56aa1abSonnentag: Fix sync timeout & ui tweaks10:48:56 | 3f6f9e3Litt: tweak popover design16:41:16 | 517271fSonnentag: quick fixes10:32:20 | 89f146eLitt: remove unused import10:30:49 | 4038542Litt: add popover with more details11:09:50 | 82801abSonnentag: fix sync timeout10:46:23 | db3e0b4Sonnentag: Wait a while for initial connection before showing an error10:27:04 | 1bbf280Sonnentag: Show sync error if we have pending changes and the server is not responding09:27:36 | 2c520caSonnentag: keep icon in place2023-11-13
10:29:34 | f763790Litt: make resolving cursor positions more efficient18:03:27 | ddc76b9Litt: cleanup18:01:57 | febb567Litt: initial draft of icons14:52:15 | e80e460van Hardenberg: patch cleanup14:51:27 | fbd2e14van Hardenberg: support local server14:45:06 | 95c1255van Hardenberg: yarn lock14:43:49 | 128393cvan Hardenberg: update deps14:43:12 | 6852957van Hardenberg: Merge branch 'main' into sync-state2023-11-10
16:11:03 | 469030bSonnentag: Indicate online and error state in syncIndicator2023-11-08
14:27:43 | dfcf6e4Litt: Update README.md14:21:33 | e531645Litt: Update README.md14:21:14 | 077a4c1Litt: update readme2023-11-06
17:42:12 | 11e578bLitt: fix listener removal bug17:41:54 | c0949b4Litt: fix formatting15:59:14 | f4cf67fSonnentag: use handle.getRemoteHeads2023-11-03
15:51:12 | 129357dSonnentag: use sync state instead of remote heads in SyncIndicator12:54:05 | 930bc23Sonnentag: allow to indent with tab2023-10-31
12:00:56 | 7212934Sonnentag: add basic sync indicator2023-10-27
16:07:38 | 051ce6dvan Hardenberg: this works, pretty much2023-10-25
08:23:16 | 5ebd6ecvan Hardenberg: getting super close i think00:03:03 | 5c1a155Litt: gracefully handle comments where cursor doesnt match2023-10-18
17:25:26 | 8871964Litt: responsive navbar17:18:34 | beb1057Litt: navbar twewaks17:14:20 | 95e95f8Litt: title to tab title and app title17:03:14 | ed3ca76Litt: more style tweaks16:07:56 | 1323f1fLitt: remove unncessary selection highlighting16:56:05 | a01eb8aLitt: tweak colors for code to make essay nicer to read16:43:16 | 9d16afcLitt: code highlighting15:27:01 | ff3667dLitt: Merge pull request #3 from geoffreylitt/toc15:23:50 | a654927Litt: cleanup15:15:06 | 10c5703Litt: working TOC13:44:19 | 396796dLitt: update captions live13:25:30 | 3002817Litt: show captions on figures10:41:53 | 5905714Litt: more left margin on wider screens10:27:33 | e58d8bbLitt: Merge pull request #2 from geoffreylitt/upgrade-codemirror14:09:49 | 53bfb1aSonnentag: load assets from Github pages2023-10-17
21:35:35 | a9db51eLitt: add inline markdown formatting preview11:40:11 | c7765b2van Hardenberg: bump to 1.0.102023-10-16
15:24:44 | d6fa4dbvan Hardenberg: bump automerge-repo15:23:31 | 5de16eevan Hardenberg: put some more stuff on window18:20:30 | c320579Litt: crash the editor if there's an exception in dispatch2023-10-15
21:29:08 | f3a33devan Hardenberg: bump to 1.0.8 for the sweet sweet frames2023-10-13
17:56:06 | e762ebaLitt: whoops, fix terrible perf regression14:48:31 | ec9543avan Hardenberg: bump automerge as well14:46:29 | 8d891cdvan Hardenberg: bump to 1.0.715:39:37 | 15999faLitt: upgrade deps14:48:29 | 140e7beLitt: properly handle user canceling save14:23:31 | 96ef2f1Litt: add a saveAutomergeFile to window2023-10-11
16:50:59 | f677239Litt: store userid per doc16:20:55 | b38bffeLitt: highlight keywords16:07:40 | 42bf1a7Litt: tweak img + video code styling16:05:17 | 98a5f90Litt: don't use incrementing IDs, causes problems with id clashes across docs16:02:18 | 57779c4Litt: kinda fix downloads in safari15:55:55 | 9653063Litt: try fixing videos10:16:54 | ab57487Litt: try fixing images14:59:31 | 62a1ea7Sonnentag: show preview of embedded figures11:51:23 | 4bd32d4Sonnentag: Display whitespaces in comments correctly2023-10-09
12:43:34 | 1cbc68fLitt: some basic responsive tweaks12:40:55 | ed9afe8Litt: very very basic mobile view, no comments there yet11:56:30 | 266fd43Litt: unknown user as Anonymous11:30:10 | d7f719dLitt: fix bug in user menu11:22:29 | f218eb6Litt: allow users not in pre-existing list10:52:51 | 3b87cd0Litt: improve UX of adding a comment10:26:01 | 8e22475Litt: fix comment sorting and display threads better10:12:35 | ce31cc8Litt: position comments properly2023-10-06
17:52:52 | f2c1206Litt: initial glitchy comment stacking12:36:16 | 9d94ddbLitt: fix undefined user comments2023-10-05
10:41:23 | 2d92a39Litt: make cmd-s work properly10:22:15 | 777dec1Litt: cmd-s10:17:29 | 4da7372Litt: fixed topbar10:08:42 | 7b76040Litt: fix comment max width09:58:52 | 7cff794Litt: tweak comments styling09:53:50 | 64f8b55Litt: adjust line width09:48:55 | a23bdf8Litt: fix the build09:16:08 | bb35a3dLitt: slightly better comment2023-10-04
21:31:34 | 0d7dc0bLitt: clean up comment range handling18:21:19 | c1a3d2aLitt: fix comment pos18:03:02 | 77c21f3Litt: tweak18:00:31 | f04b846Litt: get replies working17:45:44 | 00ebc1cLitt: factor out comments sidebar16:56:38 | a6d649dLitt: most of the way on positioning comments16:51:30 | cf9c367Litt: starting to display comments16:28:02 | 125a0d1Litt: UI for adding comments16:21:26 | bfe6da2Litt: position add comment button16:00:56 | 6e465dbLitt: make file saving nicer15:57:47 | 91344f3Litt: force editor min height15:53:18 | 96d8e79Litt: get build passing15:50:34 | e0723f0Litt: add download button15:34:41 | e65c816Litt: vite force on yarn dev15:23:28 | d27f0e1Litt: basic user sessions14:11:49 | 3ef6a9aLitt: install shadcn/ui14:00:21 | 0c97356Litt: wip installing shadcn13:54:33 | 7663d0fLitt: Update README.md11:30:22 | 799307fLitt: Merge pull request #1 from pvh/codemirror2023-10-03
19:40:37 | 3232707van Hardenberg: okay, there you go -- a working app19:30:58 | e88e295van Hardenberg: fix geoffrey's editor now too14:57:35 | c0dd318Litt: bit more stlying12:25:00 | bb7d882Litt: editing working2023-09-29
12:12:14 | 86c252fLitt: basic llm bot2023-09-28
18:25:28 | 1a80cefLitt: add base path to support trail-runner deployment (not sure if breaks netlify)10:57:40 | 3ed1093Litt: fix build10:54:31 | 5a2f71bLitt: improve comment display10:39:31 | eefaffbLitt: tiny silly UI10:36:54 | 3aff956Litt: basic comment attaching is working10:26:46 | 5d580b6Litt: tweaks to comment representation10:21:06 | 05ebc34Litt: wip on comment threads10:00:30 | 19f088dLitt: change app title09:52:16 | 1418733Litt: try fixing fonts09:48:00 | bdee72aLitt: upgrade automerge-repo09:46:49 | 0c80b75Litt: fix build09:38:28 | b3fff31Litt: fix pasting, make styling look closer2023-09-27
11:19:28 | 3dd10f6Litt: styling tweak11:10:29 | d4b3882Litt: downgrade slate, it works11:07:46 | 2372696Litt: slate is not gonna work11:00:17 | 7529fdfLitt: justify10:53:47 | bd0fdffLitt: tweaks10:50:19 | 3f3246eLitt: tweak styles10:44:24 | 08688c8Litt: markdown kinda working2023-09-26
17:46:15 | 5ed6d8fLitt: broken wip17:19:19 | 3eed6f2Litt: add a splicer button17:11:48 | 47a605cLitt: readme update17:11:27 | f93c1fdLitt: update readme17:08:05 | 6a5e937Litt: repro notes17:06:23 | 12e2e7fLitt: weird marks behavior16:35:52 | 3f6d66aLitt: displaying marks breaks16:21:16 | 3e2e23dLitt: use automerge next16:20:45 | 8288855Litt: initial automerge app
Code Pages:
- .eslintrc.cjs
- .gitignore
- README.md
- components.json
- deno.lock
- flake.lock
- flake.nix
- index.html
- package.json
- postcss.config.js
- public/apple-touch-icon.png
- public/assets/black-square.png
- public/assets/fira/fira-mono-v7-latin-500.woff
- public/assets/fira/fira-mono-v7-latin-500.woff2
- public/assets/fira/fira-mono-v7-latin-regular.woff
- public/assets/fira/fira-mono-v7-latin-regular.woff2
- public/assets/fira/fira-sans-v9-latin-300.woff
- public/assets/fira/fira-sans-v9-latin-300.woff2
- public/assets/fira/fira-sans-v9-latin-500.woff
- public/assets/fira/fira-sans-v9-latin-500.woff2
- public/assets/fira/fira-sans-v9-latin-600.woff
- public/assets/fira/fira-sans-v9-latin-600.woff2
- public/assets/fira/fira-sans-v9-latin-regular.woff
- public/assets/fira/fira-sans-v9-latin-regular.woff2
- public/assets/highlight.css
- public/assets/logo-favicon-128x128.png
- public/assets/logo-favicon-16x16.png
- public/assets/logo-favicon-192x192.png
- public/assets/logo-favicon-196x196.png
- public/assets/logo-favicon-310x310-transparent.png
- public/assets/logo-favicon-32x32.png
- public/assets/logo-favicon-64x64.png
- public/assets/logo-favicon-96x96.png
- public/assets/logo-favicon-apple-touch.png
- public/assets/logo-lockup.svg
- public/assets/merriweather/Merriweather-Black.ttf
- public/assets/merriweather/Merriweather-BlackItalic.ttf
- public/assets/merriweather/Merriweather-Bold.ttf
- public/assets/merriweather/Merriweather-BoldItalic.ttf
- public/assets/merriweather/Merriweather-Italic.ttf
- public/assets/merriweather/Merriweather-Light.ttf
- public/assets/merriweather/Merriweather-LightItalic.ttf
- public/assets/merriweather/Merriweather-Regular.ttf
- public/assets/merriweather/merriweather-sans-v10-latin-300.woff
- public/assets/merriweather/merriweather-sans-v10-latin-300.woff2
- public/assets/merriweather/merriweather-sans-v10-latin-700.woff
- public/assets/merriweather/merriweather-sans-v10-latin-700.woff2
- public/assets/merriweather/merriweather-sans-v10-latin-800.woff
- public/assets/merriweather/merriweather-sans-v10-latin-800.woff2
- public/assets/merriweather/merriweather-sans-v10-latin-regular.woff
- public/assets/merriweather/merriweather-sans-v10-latin-regular.woff2
- public/assets/merriweather/merriweather-v20-latin-700.woff
- public/assets/merriweather/merriweather-v20-latin-700.woff2
- public/assets/merriweather/merriweather-v20-latin-regular.woff
- public/assets/merriweather/merriweather-v20-latin-regular.woff2
- public/assets/prism.js
- public/assets/splat-article-last.svg
- public/assets/splat-separator-1.svg
- public/assets/splat-span.svg
- public/assets/splat-underline-1-default.svg
- public/assets/splat-underline-1-hover.svg
- public/assets/splat-underline-2-default.svg
- public/assets/splat-underline-2-hover.svg
- public/assets/splat.svg
- public/favicon-16x16.png
- public/favicon-32x32.png
- public/favicon.ico
- public/vite.svg
- service-worker.js
- src/DocExplorer/account.ts
- src/DocExplorer/components/AccountPicker.tsx
- src/DocExplorer/components/ContactAvatar.tsx
- src/DocExplorer/components/DocExplorer.tsx
- src/DocExplorer/components/FillFlexParent.tsx
- src/DocExplorer/components/LoadingScreen.tsx
- src/DocExplorer/components/Sidebar.tsx
- src/DocExplorer/components/SyncIndicator.tsx
- src/DocExplorer/components/Topbar.tsx
- src/DocExplorer/hooks/useSelectedDocLink.tsx
- src/DocExplorer/hooks/useSyncDocTitles.ts
- src/DocExplorer/index.css
- src/DocExplorer/main.tsx
- src/DocExplorer/mount.ts
- src/DocExplorer/navigation.ts
- src/DocExplorer/tools.ts
- src/DocExplorer/utils.ts
- src/components/ui/avatar.tsx
- src/components/ui/button.tsx
- src/components/ui/command.tsx
- src/components/ui/context-menu.tsx
- src/components/ui/dialog.tsx
- src/components/ui/dropdown-menu.tsx
- src/components/ui/input.tsx
- src/components/ui/label.tsx
- src/components/ui/popover.tsx
- src/components/ui/progress.tsx
- src/components/ui/tabs.tsx
- src/components/ui/textarea.tsx
- src/components/ui/tooltip.tsx
- src/datatypes.ts
- src/folders/components/FolderViewer.tsx
- src/folders/datatype.ts
- src/folders/useDocumentWithLinks.ts
- src/folders/useFolderDocWithChildren.ts
- src/index.ts
- src/lib/utils.ts
- src/tee/assets.ts
- src/tee/codemirrorPlugins/codeMonospace.ts
- src/tee/codemirrorPlugins/commentThreads.ts
- src/tee/codemirrorPlugins/dragAndDropFiles.ts
- src/tee/codemirrorPlugins/dropCursor.ts
- src/tee/codemirrorPlugins/frontmatter.ts
- src/tee/codemirrorPlugins/highlightKeywords.ts
- src/tee/codemirrorPlugins/lineWrapping.ts
- src/tee/codemirrorPlugins/previewFigures.ts
- src/tee/codemirrorPlugins/previewMarkdownImages.ts
- src/tee/codemirrorPlugins/tableOfContentsPreview.tsx
- src/tee/codemirrorPlugins/theme.ts
- src/tee/components/CommentsSidebar.tsx
- src/tee/components/MarkdownEditor.tsx
- src/tee/components/TinyEssayEditor.tsx
- src/tee/datatype.ts
- src/tee/index.css
- src/tee/main.tsx
- src/tee/mount.ts
- src/tee/schema.ts
- src/tee/utils.ts
- src/tldraw/components/TLDraw.tsx
- src/tldraw/datatype.ts
- src/tldraw/main.tsx
- src/tldraw/mount.ts
- src/tldraw/schema.ts
- src/vendor/automerge-wasm/LICENSE
- src/vendor/automerge-wasm/README.md
- src/vendor/automerge-wasm/index.d.ts
- src/vendor/automerge-wasm/package.json
- src/vendor/automerge-wasm/web/automerge_wasm.js
- src/vendor/automerge-wasm/web/automerge_wasm_bg.wasm
- src/vendor/automerge-wasm/web/index.js
- src/vite-env.d.ts
- standalone.html
- tailwind.config.cjs
- test/SyncIndicator.test.ts
- test/useFolderDocWithChildren.test.tsx
- tsconfig.json
- tsconfig.node.json
- tsconfig.trailrunner.json
- vite.config.ts
- vitest.config.ts