Lattice
A workspace for your research.
A simple, client-side markdown editor
Translation pending
ProductivityJavaScript · CSSGitHub @jmelahmanOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A WYSIWYG Markdown editor that runs entirely in the browser. No build step, and nothing leaves your machine.
## , * , > , ```| Key | Action |
|---|---|
Ctrl+B / Ctrl+I | Bold / italic |
Ctrl+K | Link |
Tab / Shift+Tab | Indent / outdent a list item |
Ctrl+Z / Ctrl+Shift+Z | Undo / redo |
Ctrl+O | Open |
Ctrl+S / Ctrl+Shift+S | Save / save as |
Right-click a table cell to add, remove, or align rows and columns.
Rich mode keeps the document as a tree, not as text, and writes Markdown back
out in its own style. A file opened and saved there can change where nothing
was edited: - bullets become *, _emphasis_ becomes *emphasis*, tables
are realigned, the lines of a paragraph are joined into one, a line break
forced within a paragraph starts a new paragraph, and reference-style link
definitions are not preserved.
Markdown mode leaves the source as typed, for as long as the document stays
in it.
Raw HTML is the exception. Front matter, comments, common blocks (<div>,
<details>, <svg>, and the like), and inline tags such as <kbd> and
<sub> are shown in rich mode and written back exactly as they were. A block
can be moved or deleted there, but only edited in Markdown mode. A document
with any other HTML opens in Markdown mode, and switching it to rich mode
asks first, as that would leave only the text.
SVG is drawn without styles, scripts, gradients, or embedded HTML.
Images with a remote address are fetched by the browser when shown. Relative image paths do not resolve, as the page cannot see the folder a file came from.
Only some browsers let a page write back to a file on disk. Served from a
machine that has the files, the editor can do it through the server instead.
For that the server has to offer, under /files/,
autoindex_format json givesGET and PUTOpen and Save as then choose among those files, and Save writes back to the
one that is open. Reloading the page shows the file as it is on disk; changes
that had not been saved are kept as a revision. Without /files/ the editor
works with the browser's own files, as before.
Editing is done by TOAST UI Editor 3.2.2
(MIT), vendored unmodified in vendor/toastui-editor. Its usage statistics
are switched off, and its HTML sanitizer is replaced by the allowlist in
app.js.
vendor/ is generated by vinder: package.json and bun.lock
pin the versions, vinder.toml says what goes into vendor/, and
vendor.src/ holds the bundle entry and the license the npm package does
not ship. prosemirror-model is held at 1.19.0 because later releases break
toastui 3.2.2's HTML rendering. After changing any of these:
vinder sync # regenerate vendor/
vinder check # confirm vendor/ matches bun.lock
vinder audit # check what is vendored against OSV
Open index.html in a browser, or serve the directory:
python -m http.server
The tests run in a browser, against the page itself, as there is no other place the editor exists. With Bun and Firefox or Chromium installed:
bun test/run.mjs
Or open /test/ on the server above to run them in a browser of your own.