Spaces:
Sleeping
Sleeping
Commit History
-
Anyone with the link: read a project without an account
A second way to share, next to inviting people by username: one long unguessable URL that opens the project read-only, for someone who has no Hugging Face account and should not need one. The token (24 random bytes) is exchanged for a cookie the moment the visitor lands on /p/<token>, so nothing downstream has to carry it: the REST snapshot, the websocket handshake and the <img> requests are all covered by the same grant. Lookup is constant-time, and an unknown or revoked token is a 404 that does not confirm the project exists. Read-only is enforced where it counts. The connection is marked readOnly in onAuthenticate, so hocuspocus drops any update or awareness message the client sends: a visitor who types sees their own keystrokes and nothing else does. REST keeps requireUser everywhere except GET of the project and its page tree, so a link cannot suggest, comment, add a page, re-share or delete. The non-editable editor and the hidden buttons are a courtesy on top of that, not the m…3a73292
-
Merge pull request #18 from huggingface/agent-privacy
Leandro von WerraUnverified signatureAn agent you register is not shared with your collaboratorsb622b57
-
Merge pull request #16 from thomwolf/sidebar-search
Thomas WolfUnverified signatureThe sidebar box searches page text, not just page titlesf9e13f4 -
Add a private default agent for each user
Agent Manager314a59f -
The sidebar box searches page text, not just page titles
Filtering the tree by title only finds a page if you already remember what it is called. Every page of a project is a named fragment of the one Yjs document the tab already syncs, so the text to search is in memory before the first keystroke — no endpoint, no per-page fetch, and no permission logic to re-derive, since the socket handshake already decided access. The index is built from the live CRDT, so it follows a collaborator's typing. A match now shows its occurrences as snippets under the page, each labelled with the heading it sits under, and clicking one opens that page scrolled to that occurrence and no other. Hits in the open document are marked in amber — not the accent green, which on this page always means somebody said something about the text. The query lives in the URL (?q=&n=), so a search is a link you can send someone. Titles and slugs still match from the first character; searching text waits for a second one, or one letter highlights half the prose. Co-Authored-B…8c82c03 -
Comment beside a paragraph, from a hover in the right margin
Claude +1: Claude Opus 5 (1M context)Hover the right third of the page and a small comment button appears out in the page's own right margin, level with the paragraph you are next to. Click it and you get a comment anchored to that place, with no selected span. The anchor is one Yjs relative position taken inside that paragraph — the same machinery the existing span comments use, written into both anchor fields so every path that already resolves a thread's anchors keeps working and simply sees an empty range. The card shows the paragraph's opening words as a locator instead of a quote, because there is nothing quoted; agents get anchor_kind + anchor_context so a null excerpt is not mistaken for deleted text. Deleting the paragraph never closes the thread. The zone is hover-only and invisible: no gutter, nothing while a selection or a composer owns the flow, and nothing at all on touch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>f9ca812
-
Download: this page or the project, as markdown or PDF
A Download button in the header opens two choices — how much (this page / whole project) and in what shape (markdown / PDF). MARKDOWN is a zip built server-side: one .md per page in sidebar order, plus an assets/ folder holding the images those pages use, with every /files/<hash> reference rewritten to its bundled copy. That rewrite is the point — a /files URL only resolves for someone signed in to this Space, so without it an exported document renders as broken images anywhere else. Project scope also carries structure.yaml, since the yaml IS the project's shape (order, nesting, group headers) and without it an unzipped project is a flat pile of files. An image whose bytes have gone missing is listed in assets/MISSING.txt rather than failing the whole export. The zip is written by server/zip.js, ~100 lines over node's zlib, rather than by adding a dependency: the Space builds with `npm ci`, which hard-fails on any package.json/package-lock disagreement, and this is not worth that ri…3b2fb14
-
Dialog-free UI, project-name header, rl-wiki sidebar polish
The Space runs in an iframe where Chrome suppresses native dialogs, so confirm()/alert()/prompt() silently did nothing — deletes looked broken. All 33 call sites are gone: sidebar deletes/dissolves are now arm-to-confirm buttons with toasts for errors; everything else goes through new in-app uiConfirm/uiAlert/uiPrompt/uiToast helpers (common.js, keyboard-complete, dark-mode aware). The browser tests now fail on any native dialog. The top-left selector always shows the project name (tab becomes 'page · project'), server-rendered too, live while renaming home. Sidebar: exact rl-wiki type scale and row treatments, search replaces the 'Pages' heading, trash sits at the far right of rows, and the bar is a seamless full-height surface — page background, no right border, reaching the writing sheet. treedrag no longer arms drags from buttons/inputs, so control clicks can't be swallowed. Co-Authored-By: Codex <noreply@openai.com> Co-Authored-By: Claude Opus <noreply@anthropic.com> Co-Authore…d3283b8 -
rl-wiki-style sidebar: restyle, search filter, multi-select, inline renames
Full-height sticky sidebar with a title filter on top (Cmd/Ctrl-K, Escape clears; drag pauses while filtering). rl-wiki look: big right-side carets, vertical bars under branches, accent-tinted current row distinct from gray multi-selected rows. File/folder icon buttons create an untitled page (focus lands in its empty H1 once synced) or a group that opens straight into inline rename — no prompt() modals anywhere. Double-click renames pages and groups in place; shift/cmd-click builds a selection that drags as one block. The Structure link row is gone (the page keeps its URL). Co-Authored-By: Codex <noreply@openai.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>8a9d88a -
Sidebar groups, collapse carets, and drag-and-drop
Group headers render as small-caps section rows (click to fold, double-click to rename, hover trash to dissolve — children are promoted, never deleted). Carets fold any branch; the state is per-user in localStorage and the current page's ancestors stay open. Pages and groups reorder and re-nest by pointer drag; drops become structure/move calls so the server serializes concurrent edits. Unfiled pages are draggable into the tree to file them. Includes a manual browser test (test/e2e-dnd.mjs) driving real pointer drags against the built bundle. Co-Authored-By: Codex <noreply@openai.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>2b806f6 -
Remove the temporary layout tuner
5d6c651 -
Add a temporary layout sizing tuner
1596003 -
Make the page sidebar space-aware
46a2576 -
Comments are closed, not ticked off — and the sheet answers the thumb (#8)
- Comments are closed, not ticked off — and the sheet answers the thumb (a3c1c4271a2cf4fa88ab255027a2288cf6314b9d)04b2acc
-
Document style switch: Google Docs' Arial, or a serif reading setting (#3)
- Document style switch: Google Docs' Arial, or a serif reading setting (6a0e4d3ec49a41633b87521c9dfac82a33fa7b22) Co-authored-by: Thomas Wolf <thomwolf@users.noreply.huggingface.co>2460317 -
One page: the document is the app, and a switcher replaces the index (#4)
- One page: the document is the app, and a switcher replaces the index (ac3feac1b80222a90bc8cc12bc15c89ae775c5aa) Co-authored-by: Thomas Wolf <thomwolf@users.noreply.huggingface.co>f35d3f6
-
LaTeX math via lazily-loaded KaTeX ($x$ inline, $$...$$ display), agent-proposable; Enter sends a comment, Shift+Enter adds a line
Verified signature735a30f
-
Faster loads: brotli bundles, immutable asset caching, self-hosted font, session+title inlined in the shell, loading skeletons
Verified signatureec6b346
-
Dark mode: follows the OS, toggle in the header, all colours behind theme variables
Verified signature8012b6f -
Editing/Suggesting mode switch in the header; selection opens the margin box directly (pre-mentioning your first agent); @ menu takes arrow keys
Verified signature784680a -
Document surface matches Google Docs: Arial 11pt/1.15, 8.5in page with 1in margins, Docs heading scale, links and tables
Verified signaturec23950a
-
Upload folder using huggingface_hub
Verified signature93ef16f
-
Upload folder using huggingface_hub
Verified signature9d479ea
-
Upload folder using huggingface_hub
Verified signature4fcf51c -
Upload folder using huggingface_hub
Verified signaturee5e233a
-
Upload folder using huggingface_hub
Verified signature0ac04b5 -
Upload folder using huggingface_hub
Verified signature07c5477 -
Upload folder using huggingface_hub
Verified signature53148eb -
Upload folder using huggingface_hub
Verified signatureec3a520 -
Upload folder using huggingface_hub
Verified signature45ebf29 -
Upload folder using huggingface_hub
Verified signatureb60973d -
Upload folder using huggingface_hub
Verified signature6912fd3
-
Upload folder using huggingface_hub
Verified signature99a44ac