Debug information for this character card
Paste character URLs below (one per line):
Select or drag & drop character card PNG files, or a Character Library bundle (.zip):
Scanning character for remote media...
Scanning library...
Scanning library for unlinked characters...
The app has three main views, accessible via the tabs at the top:
On mobile, swipe left/right on the main screen to switch between views.
Character Library is a self-hosted app: one server owns your library and serves this page.
npm start and open /library.html on the port it prints (7788 by default).data/ next to the server, one folder per user.Multi-user mode is off by default and everything belongs to a single user. Turn it on with multiUser: true in data/server.yaml:
data/<user>/.Click any character card to open their detail modal with tabs:
Cycle through your characters without returning to the grid:
Right-click any character card (or long-press on mobile) for quick actions:
When multiple characters are selected, the context menu shows bulk actions instead.
Use special search prefixes to filter your character library:
creator:name
Filter by author/creator name
linked:yes / linked:no
Filter characters linked/not linked to any provider
chub:yes / chub:no
Filter by ChubAI link status
janny:yes / janny:no
Filter by JannyAI link status
ct:yes / ct:no
Filter by CharacterTavern link status
pygmalion:yes / pygmalion:no
Filter by Pygmalion link status
wyvern:yes / wyvern:no
Filter by Wyvern link status
dc:yes / dc:no
Filter by DataCat link status
saucepan:yes / saucepan:no
Filter by Saucepan link status
botbooru:yes / bb:no
Filter by Botbooru link status
janitorai:yes / jai:no
Filter by JanitorAI link status
favorite:yes / fav:no
Filter by favorite status
version:text
Filter by character_version field (version:none for empty)
gallery:id
Filter by legacy gallery_id alias (gallery:none for characters without one)
uid:id
Filter by version_uid (uid:none for characters without one)
playlist:name
Filter by playlist name (playlist:none for unassigned, playlist:any for in any playlist)
Combine prefixes with each other and with regular text: creator:john linked:yes dark elf finds linked characters by "john" matching "dark elf".
Click tags in the filter panel to cycle through states:
Multiple tag filters combine: include tags use OR logic (match any), exclude tags are all applied.
Add or remove tags from multiple characters at once:
Space or click the multi-select button in the toolbar to enter selection modeSave your current filter configuration and reload it later with one click:
Useful for switching between focused workflows: a "sfw fantasy" preset, a "my tagged characters" preset, a "recently created" preset, etc.
Link your local characters to their online source for update checking, version history, and gallery downloads. Supported providers:
How to link:
Click the Link indicator in the character detail sidebar, or right-click → Link to Provider. Search by name across all providers, or paste a direct URL.
Once linked:
Bulk-link your entire library automatically:
Live status display while the scan runs:
147/892) and a progress fill bar showing scan completionThe Online tab lets you browse and import characters from providers:
Configure provider order in Settings → Online. NSFW preference is remembered from each provider toggle.
If a provider fails to load, the error banner's Copy error report button produces a paste-ready summary for support requests; it includes settings only as on/off flags, never your tokens.
The DataCat provider combines multiple data sources to give you the best coverage for JanitorAI characters. Each sort order pulls from a different source:
DataCat sort orders (Recent, plus Freshest / Score / Chat Count and more over 24h and 7d windows):
JanitorAI (MeiliSearch) sort orders (Newest, Oldest, Most/Least Tokens, Relevant):
JanitorAI (Hampter) sort orders (Latest, Trending, Trending 24h, Popular, Relevance):
Cloudflare and signing in are two separate things. Mixing them up is the usual reason a setup looks broken, so, plainly:
cf_clearance) that only a real browser can earn. It decides whether a request reaches janitorai.com at all.Neither one fixes the other. Signing in will not get you past Cloudflare, and clearing Cloudflare will not sign you in. Here they are independent, and an account is optional. The JanitorAI provider is different: there both are required.
Two different tools, and they are not interchangeable. Which one you need depends only on what you are using:
What needs no setup at all: DataCat's own sorts and its MeiliSearch janny_* sorts, JannyAI browsing and search, and signing in. A JannyAI card will still import without the userscript, but with no personality and no greeting, which is not much of a character.
Cloudflare's pass expires on a fixed timer rather than on idleness, so it lapses often. The managed browser handles that itself; userscript v1.2.1+ renews it by briefly opening the site in a background tab. On mobile, a userscript-capable browser such as Firefox for Android works.
Across all modes: Pasting a JanitorAI character URL into the search bar will look up the character on DataCat. If it's found, the preview opens directly. If not, an extraction panel appears letting you request the character from DataCat's cloud service.
Extraction: When a character only exists on JanitorAI and hasn't been indexed by DataCat yet, the Import button changes to Extract. This sends a request to DataCat's cloud service, which visits the JanitorAI page and retrieves the full character definition. You can also paste a JanitorAI URL directly into the search bar to look up and extract specific characters.
DataCat browsing is proxied by the server, so it works without any browser extension.
Re-extract on update checks: Toggle in Settings → Online → DataCat to force DataCat to pull fresh data from JanitorAI before each update check. Slower, but avoids comparisons against stale cached data on DataCat's side.
Botbooru is a tag-driven character card catalog. SFW browsing and importing works without an account; logging in (Settings → Online → Botbooru, or the key button in the browse toolbar) unlocks NSFW, favorites, and follows, and applies your account's tag blacklist.
Username/password login is handled by the server. Without it, paste a token manually in the login dialog; a copied "Bearer " prefix is stripped automatically.
First-party access to janitorai.com. Roughly half of all JanitorAI characters withhold their hidden definition (the field is simply absent from the API), and this provider recovers them at the source. DataCat and JannyAI can recover hidden definitions too, but DataCat has been progressively closing itself off, and JannyAI's copies come without alternate greetings or creator browsing, so this is the complete, first-party path. Beta, and off by default.
It needs a real browser, and only a real browser. janitorai.com puts Cloudflare in front of everything, and passing that challenge earns a cf_clearance cookie that no server-side request can hold. On a normal desktop with Chrome or Edge installed, that means: Settings → Online → JanitorAI → Start now, then press Test, and you are done. The browser runs invisibly and stops itself when idle.
The Test button is the contract. Its checks measure what Cloudflare actually cares about, a real GPU above all: software rendering never clears the challenge and no flag changes that. Red checks mean your browser environment does not meet the spec yet; making it pass on servers, VMs, containers, phones, or ARM boards is power user territory and your own research (the README's JanitorAI section lists the exact requirements and the desktop endpoint runner for GPU-less hosts). Green checks with a misbehaving provider is a Character Library bug: please report that one.
Signing in is the second requirement, not an optional extra. The browser gets you to JanitorAI; an account gets you the content. Without one you get the first page of results and nothing else: no follows, and no character extraction, so no hidden definitions. It happens in Settings rather than in the browser, and only works once the browser above does, since JanitorAI's login captcha runs only on their own page.
What recovering a hidden definition does to your JanitorAI account. There is no API for it, so Character Library makes the site assemble the prompt and reads it back. For that one request it creates a throwaway persona with a random name, adds a temporary proxy preset pointed at an unroutable address so nothing is ever sent anywhere, opens one chat, and sends one message. The persona, the preset, the chat, and your original generation settings are all removed and restored afterwards. It runs only for characters whose definition is actually hidden, and only when you press Recover definition or import one.
The companion userscript has nothing to do with this provider and cannot substitute for the browser. It serves DataCat's Hampter sorts and JannyAI card definitions only.
A mirror of JanitorAI content. It needs no browser endpoint, which makes it lighter to set up than the JanitorAI provider, at the cost of alternate greetings and following. No account needed.
Card definitions need the companion userscript. JannyAI now Cloudflare-gates its card pages, and the card page is where the character actually lives. Browsing and searching still work without it, but an import without the userscript gets you the name, avatar, tags, and the site blurb as creator's notes, with no description, no greeting, no scenario, and no example dialogue. That is a stub, not a character.
Install it exactly as for DataCat's Hampter sorts; one install covers both. If definitions stop loading even with it installed, your Cloudflare pass has expired: open jannyai.com in the same browser, let it load, then reopen the preview.
Browsing saucepan.ai needs no account, but importing does. Beta, and off by default.
Definitions are extracted natively rather than downloaded as a card file, and that extraction is what needs the token. Some companions have a locked definition that is not publicly available; the preview says so, and extraction may return an incomplete body for those.
Everything goes through this app’s server, browsing included, because saucepan.ai sends no CORS headers at all. Log in under Settings → Online → Saucepan, or paste a bearer token from your own session. Opening a character that needs authentication turns the preview's import button into Configure Token, which takes you to the same place. The token lives in the server's memory and is pushed back automatically after a restart, so you should not need to log in again.
Track changes to your character cards with snapshots and diffs:
How ChubAI remote versions work:
card.json), including the full merged lorebookConfigure max auto-backup count in Settings → General → Version History.
Edit all character card fields directly in the library:
When a character card includes a lorebook, it exists in two places:
These two copies are independent and diverge after import.
During a card update check:
When you apply a lorebook update:
Safety check for local-only entries:
TL;DR: Updates only change the card's embedded data. Your World Info file (the copy that matters for chats) is never modified.
For characters linked to a provider, you can choose whether the library shows the card's own name or the provider listing name (the title used on the provider's page). The card data is never modified; this is purely a display preference.
Useful when a creator's listing title differs from the card's internal name field, e.g. "Ada (Cyberpunk Bartender)" on the listing vs. just "Ada" on the card.
Find potential duplicates in your library:
Adjust the minimum score threshold in Settings to control sensitivity.
The characters grid is served pre-resized images instead of full card PNGs, which cuts decode cost and bandwidth. The detail modal, gallery, and full-screen viewer always keep full resolution.
Biggest win: mobile decode cost drops sharply on fast-scroll, and large libraries on slow connections feel snappier. On desktop with plenty of decode budget, the win is mostly bandwidth.
Full-screen media viewer for character gallery images, GIFs, and videos:
0 to reset zoomEscape to closeDownload remote media (images, audio, video) referenced in character cards for offline access:
Enable "Replace remote media URLs" in Settings to auto-swap URLs when viewing. Use Bulk Localization in Settings → Media to process your entire library at once.
Let imports finish immediately and run media downloads quietly in a background queue:
Some character cards can link to galleries on external image hosts instead of embedding direct image URLs. Character Library walks these links, resolves the underlying images, and downloads them into the character's gallery folder.
Supported hosts:
Extractors run automatically when you trigger Download Embedded Media from the Gallery tab or use Bulk Localization. No configuration is required for public content.
Civitai API key: Required only for private or hidden Civitai posts. Configure in Settings → Media → Civitai API Key. Generate at civitai.com/user/account. The key is stored per user on your server and pushed to the provider service when you save it, so it stays server-side at request time.
Get AI-powered character recommendations based on a natural-language prompt:
The recommender sends character names, tags, creator, taglines, and creator notes (short excerpts); optionally the description if you enable it in its settings. Conversation history is never sent.
Select multiple characters for bulk actions:
Space or click the multi-select button, then click cards to selectEscape to exit selection modeAvailable bulk actions:
The Chats tab lets you browse all chat histories across all characters:
Create new characters from scratch or edit existing ones with AI assistance. Open via ⋮ menu → Create Character.
Each card field (description, personality, scenario, first message, etc.) has a wand icon button that opens the AI Studio panel for that field.
The AI Studio is a conversational assistant for generating and refining card fields:
Ctrl+Z / Ctrl+Y (when not focused in a text input). Opening a different field starts a fresh historyWhen editing the Description field, a lightbulb icon appears in the AI Studio toolbar. Click it to enter Brainstorm Mode:
Brainstorm mode is great when you have a vague idea but aren't sure how to put it into words yet. Let the LLM interview you instead of staring at a blank page.
Select (highlight) any portion of text in the AI Studio content area to enter revision mode:
This is useful for tweaking a single paragraph without regenerating the entire field.
Click the gear icon in the AI Studio toolbar to open field-specific settings:
Presets are saved per field and persist across sessions. A dot indicator appears on the gear icon when a field has active overrides (custom prompt or disabled context fields).
Add endpoints under Settings → AI. With more than one profile configured, a Profile dropdown appears in the sidebar under AI Assist, so a feature can run on a different model from the rest. API keys are stored server-side against your account and are never sent to the browser.
Click Import from Library to load an existing character into the creator form. This populates every field including tags, avatar, alternate greetings, and lorebook. You can then modify and save as a new character or overwrite the original.
Space
Toggle multi-select mode (character grid)
Escape
Close modals, exit multi-select, close gallery viewer
← / →
Navigate images in gallery viewer
0
Reset zoom in gallery viewer
Page Up / Page Down
Scroll through character list
Home / End
Scroll to top / bottom of character list
The ⋮ More Options button in the topbar contains additional tools:
Review the following changes before saving:
Search, sort, and display preferences
Configure online character source connections and features
Drag to reorder. First provider opens by default in the Online tab.
Automatically load more characters as you scroll. When disabled, a manual "Load More" button is shown instead.
Online cards that look like a character already in your library get a "Possible Match" badge whose brightness reflects confidence.
--remote-debugging-port=9222 and paste that endpoint here.
cf_clearance cookie that only a browser can hold, so no server-side request ever gets through on its own. Hidden definitions: around half of all characters withhold theirs (the field is simply absent from the API) and the only way to see one is to let JanitorAI build a chat prompt and read it back.
Download and manage embedded media
Your session on this server
Project information and links
LLM endpoints for the AI features. Keys stay on the server and are never sent back to the browser.
Who you are in a conversation, and how much history the model sees.
{{user}} and {{persona}} when a prompt is built.
Debugging and troubleshooting tools