Shared Sessions for Claude Code
Share a Claude Code session with a link. Teammates join from their own Claude Code and work in it together.
Quality-of-life tweaks for LegendKeeper: page tabs, tag shortcuts, tree-preserving filters, cover-image icons and more.
PluginsJavaScript · CSSGitHub @MackachooOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
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
Unofficial Chrome extension with optional quality-of-life tweaks for LegendKeeper: page tabs, pinned tag shortcuts, filters that keep the tree, suggested pages, cover-image icons and bulk page settings.
Taken from the repository README
Loading the full README.
Read the full README ↗A Chrome extension that adds quality-of-life tweaks to LegendKeeper, the worldbuilding wiki for tabletop games and fiction: page tabs, tag shortcuts, a Project Browser filter that keeps your tree intact, cover images as page icons, bulk page settings, recent pages and more.
It mostly changes how LegendKeeper looks and behaves in your browser. The one exception is Set for subpages, which changes page settings in your world, and only after you review and confirm it.
This repo also holds two companion tools for working on LegendKeeper with Claude: an MCP server and a Claude skill for the LegendKeeper SDK.
I'm a software developer, but this is very much a vibe-coded project. It isn't trying to replace anything in LegendKeeper or be a permanent part of it. It's a collection of tweaks and quality-of-life changes that I find really useful day to day.
Everything here is about usability: making LegendKeeper easier and quicker to get around, and easier to filter. It doesn't add new content or content features. That's deliberate, and it's the rule for what goes in (see Contributing).
Page tabs. A tab bar along the top of the page content, so you can keep several pages open and switch in one click. The Project Browser on the left keeps its full height, and the page's sidebar on the right sits below the tabs.
Set for subpages. Right-click a page in the Project Browser and choose Set for subpages… to change settings on that page and everything under it, in one go:
| Group | Settings |
|---|---|
| Layout | Full-width, Table of contents |
| Access | Lock, Hide |
| Sidebar | Show sidebar by default, Sidebar scrolling |
| Icon | Icon (Font Awesome name, e.g. dragon) and icon colour (shown on map pins and in collection lists) |
| Tags | Add tags to every page (comma-separated, suggestions from your existing tags) or remove tags; pages that already have / lack them are skipped |
| Sidebar blocks | Add a block (Tags, Image, Properties, Text, Aliases, Backlinks or Collection) to every page's sidebar, optionally skipping pages that already have one; remove every block with a given title (e.g. "Facts") |
Each setting starts on Leave; only the ones you switch to On, Off or Set are changed. Removing blocks deletes them and their contents, so before anything is deleted the dialog shows how many blocks on how many pages and asks you to click again. Pages that already have the value are skipped. Changes go through the same LegendKeeper functions its own page menu (⋮) uses, one page at a time, with progress shown. Permissions are deliberately not included.
Reading time. Longer pages (300+ words) show "4 min read · 900 words" at the end of the title row.
Block handle size. A slider for the grip you drag content blocks by, from 0.75× to 2× in quarter steps.
LegendKeeper's left-hand panel (Project / Templates / Assets). "Sidebar" in LegendKeeper means the panel on the right of a page.
Tag shortcuts. Pin tags next to LegendKeeper's own shortcuts and filter by them with one click.
Pins are saved per project, in this browser only.
Keep tree when filtering. If a pinned page is selected in LegendKeeper's shortcut bar, only matches inside it are shown, as in the unfiltered tree. Normally, filtering by tag or name flattens the Project Browser into an alphabetical list. With this on, matching pages stay where they are in the hierarchy. The parent pages needed to reach them are shown greyed out, and you can still click them. Folders keep the open/closed state you had, and you can open and close them as normal while filtering; a greyed-out folder means there are matches inside.
Keep tag filter after reload. The tags you've filtered by stay selected when you reload or come back to the project.
Recent pages and Suggested pages. Each has its own setting for where it appears: don't show, under the filter box, at the bottom of the Project Browser, or in the tab bar as faint tabs. Each can also be shown as its own tab next to Project, Templates and Assets (Show as a tab). By default, recent pages show at the bottom of the Project Browser and as a Recents tab, and suggested pages show in the tab bar.
Suggestions are learned from how you use the project, in this browser only, and worked out for the page you're on, so every tab gets its own:
Hover a suggestion to see why it's there. The Suggested tab's Reset button forgets the learned history for the project.
Expand / collapse all. Two buttons beside the filter box open or close every folder in the tree, using LegendKeeper's own Expand all / Collapse all.
Quick filter key /. Press / anywhere outside a text box to jump into the Project Browser's "Find by name or #tag" box, ready to type.
Covers as page icons. A page's icon in the Project Browser becomes a small square crop of its cover image. The cover is the image property marked as cover, otherwise the page's main image. Optionally it can fall back to the page banner.
Also in page content. The same thumbnails appear before @mention links in page text, in tabs and recent pages, and replace the icon in Backlinks and collection list rows.
Load covers for all pages. LegendKeeper only loads a page's images once you've opened it. With this on (the default), the extension looks up covers for the rest using LegendKeeper's own read-only batch loader, the one behind link previews. That's a few requests per project, once per browser session. Covers are remembered per project either way.
Preview on hover (on by default). Hover a page in the tree to see a larger version of its cover.
Click the gear-logo button next to Share in LegendKeeper's top bar (or the extension's toolbar icon). Every tweak can be switched on or off, and settings sync across your Chrome profile.
The extension isn't on the Chrome Web Store yet, so you load it unpacked:
chrome://extensions and turn on Developer mode (top right).manifest.json).To update, pull the latest changes, click the reload icon (↻) on the extension's card in chrome://extensions, then reload LegendKeeper.
It works in other Chromium browsers (Edge, Brave, Arc) the same way.
localStorage under keys starting with lkt:. Settings go in chrome.storage.sync.To reset everything for a project, run this in DevTools on a LegendKeeper tab:
Object.keys(localStorage).filter((k) => k.startsWith("lkt:")).forEach((k) => localStorage.removeItem(k));
LegendKeeper is a Next.js app bundled with Turbopack.
src/page-hook.js runs at document_start in the page's own JavaScript context and wraps globalThis.TURBOPACK, so it sees every module before it runs. It makes nine small, regex-located edits to the Project Browser's ResourceBrowser module:
nested-tag-filter: before LegendKeeper builds its flat filtered list, hand the matches and the full tree to __LKT.nestFilter, which returns a pruned tree (matches plus their ancestors).nested-filter-expand: keeps your folder open/closed state (and the chevrons) working while the nested filter is on; LegendKeeper normally drops it while filtering.nested-filter-drag: turns the tree's drag-and-drop back on while the nested filter is on, so pages can be moved between folders; LegendKeeper switches it off while filtering, which made drops there misbehave.expose-root: passes the page the shortcut bar has narrowed the tree to, for per-page tag pins.expose-tag-filter: passes the Project Browser's tag-filter state and setter to the extension, so tag shortcuts drive the real filter.expose-entity-store: passes LegendKeeper's client-side data store (read only), used for cover images, tag counts and page names.expose-navigate: passes the Project Browser's navigate-to-page function, the same one LegendKeeper's shortcut bar uses (Recent pages, tabs).expose-tree-expand: passes the tree's own Expand all / Collapse all functions, for the filter-row buttons.expose-adapter: passes LegendKeeper's data adapter, used to look up covers and page details, and by Set for subpages to call LegendKeeper's own update functions.<style id="lkt-covers">). LegendKeeper's DOM, including the rich-text editor, is never modified for them.data-insp-path source annotations LegendKeeper ships in production and the tree's data-testid="resource-tree-item-<id>" rows.src/features/ holds the larger features (suggestions.js, tabs.js, bulk-settings.js, page-extras.js, browser-tabs.js). They load after page-hook.js and plug into it through window.__LKT.util and __LKT.onRender().Minified names change with every LegendKeeper release, so the patches match on code structure rather than names. If one stops matching:
[LK Tweaks] patch "…" did not matchRun window.__LKT.patches in DevTools to see the status of each patch (applied, no-match or compile-error).
manifest.json Chrome extension manifest (MV3)
src/
page-hook.js Page-world script: Turbopack patches, core tweaks, shared helpers
features/
tabs.js Page tabs
bulk-settings.js Right-click menu items and the Set for subpages dialog
page-extras.js Cover hover preview, reading time
suggestions.js Suggested pages: usage tracking and scoring
browser-tabs.js Recents / Suggested tabs in the Project Browser
bridge.js Isolated world: settings bridge
settings-button.js Isolated world: top-bar settings button and popover
tweaks.css Styles for injected UI
popup/ Settings page (toolbar popup and top-bar popover)
icons/ Logo (icon.svg) and PNG sizes
.github/ This README, the license and GitHub workflows
.claude/
mcp/legendkeeper-mcp/ MCP server for LegendKeeper (see below)
skills/legendkeeper-sdk/ Claude skill for the LegendKeeper API and SDK
.claude/mcp/legendkeeper-mcp is a Model Context Protocol server that lets Claude read and edit your LegendKeeper worlds through the official v3 API. Claude can browse, search, read and write pages in Markdown, set infobox facts, add map pins and timeline events, and upload images.
cd .claude/mcp/legendkeeper-mcp
npm install
npm run build
claude mcp add legendkeeper -e LEGENDKEEPER_KEY_OOO=lk_... -- node "$PWD/dist/index.js"
You need an API key per world: Project Settings → Developers → API Keys (requires a paid plan). Never commit keys. Keep them in your MCP client's config or in a local .env, which is git-ignored. See .claude/mcp/legendkeeper-mcp/README.md for all options, including Claude desktop setup, Docker, multiple worlds and read-only mode.
.claude/skills/legendkeeper-sdk is a Claude skill covering LegendKeeper's v3 REST API and the @legendkeeper/sdk TypeScript client: operations, schemas, a style guide and 40+ runnable examples. Claude Code picks it up automatically when working in this repo. To use it everywhere, copy the folder to ~/.claude/skills/.
There is no build step. Edit the files, reload the extension in chrome://extensions, then reload LegendKeeper.
Useful while working on it:
window.__LKT.patches: patch status.window.__LKT.store(): LegendKeeper's entity store (for example __LKT.store().resources.get(id)).window.__LKT.render(): force a re-sync of the injected UI.Issues and pull requests are very welcome, whether that's a bug, a fix, or an idea for a new tweak.
The one rule: changes should be quality-of-life and usability only, not new content. Things like navigation, filtering, layout, shortcuts and speed-ups are in scope. New block types, new kinds of page content, or anything that stores extra data inside pages is out.
That's because of how LegendKeeper is used. Projects are often shared by lots of people, and everything this extension does only changes things for you, in your browser; nobody else in the project is affected. New content would break that. If the extension added its own blocks or markup to pages, everyone without it would see odd or broken content. So, as a rule, those don't go in.
When you open a pull request:
manifest.json.Pushing to main doesn't publish anything. To release to the Chrome Web Store, bump version in manifest.json, then push a matching tag:
git tag v0.8.9
git push origin v0.8.9
The deploy workflow checks the tag matches the manifest version, packages the extension and publishes it. It can also be run by hand from the Actions tab.
LegendKeeper Tweaks is an unofficial, personal project. It is not affiliated with or endorsed by LegendKeeper. The icon is a gear around a dragon from Font Awesome Free (CC BY 4.0); it doesn't use LegendKeeper's logo.
src/bridge.js runs in the extension's isolated world and copies settings from chrome.storage.sync onto <html data-lkt-settings> for the page script.src/settings-button.js adds the top-bar button, which opens popup/popup.html in a popover themed to match LegendKeeper.