Severian 11c244fdd2 Read the request by role, not by position
Some users' JanitorAI sends a "." user turn between the card and the
greeting; others' does not. Sucker read fixed indices, so on the shorter
shape every slot was off by one: first_mes was set to the name line, and
the name slot did not exist at all. That TypeError was caught by the
handler and reported as the "you dingus, read the directions" message,
which blamed the user for a shape they never chose.

src/lib/messages.ts now resolves the slots by role instead — the card is
the system turn, the greeting is the first assistant turn, the user's
latest input is the last user turn, and sucker's own previous reply is the
last assistant turn. All four hold in both shapes and in a continued
conversation, so the conversation token is found in either as well.

Extraction now throws a description of what is missing rather than a
TypeError, and tests/messages.test.ts pins both shapes. The tests need no
framework: `npm test` runs node's built-in runner.

Existing cards are unaffected: the update path already discards the
extracted name and keeps the original.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NX2SsmUqQftWTZAY4BDuFa
2026-09-11 04:14:04 +08:00
2025-12-09 10:40:18 +08:00
2026-01-30 18:22:16 +08:00
2026-01-30 18:22:16 +08:00
2025-01-19 21:47:26 +08:00
2025-12-11 08:42:20 +08:00
2025-12-11 08:42:20 +08:00
2026-01-30 18:22:16 +08:00
2025-01-19 21:47:35 +08:00
2025-12-09 10:40:18 +08:00

Sucker

Environment Variables

Add these to your .env.local file (optional):

# Disable Discord community banner (defaults to showing banner)
NEXT_PUBLIC_DISABLE_DISCORD_BANNER=true

Usage

Pull this repostory and build with npm run build. You can start the server with node ./.next/standalone/server.js

You can also build and run Sucker as a Docker container with docker compose build and docker compose up.

Changelog

  • 2.4: CSS editor for Janitor profiles. New banner links to the live-preview editor at tools.from-avalon.com/janitor-profile-maker.
  • 2.3: ECHO. Put ECHO: anywhere in a message and sucker repeats whatever comes after it in the reply — for triggering char-side script and lorebook keywords.
  • 2.2: Added support for directly inputting webp file names or character image links when creating PNG character cards
  • 2.1: updated deps, note about image fetching, list of mirrors
  • 2.0: from Tui: Multimessage support! Tracks changes to character descriptions and scenarios across multiple extractions. Shows version badges, message counts, and provides detailed change history viewer.
  • also 2.0: V2 charcard format and alternate greetings.
  • 1.9: Not again. They changed stuff again. What is this?
  • 1.8: Handling for new prompt structure, new instructions
  • 1.7: Handling for nested XML character tags
  • 1.6: First message formatting, copy button for first message and other fields
  • 1.5: {{user}} substitution for user persona name
  • 1.4: Mooth just keeps finding bugs, damn.
  • 1.3: Mooth found a bug, fixed it.
  • 1.2: Fix for Janitor having changed their prompt system
  • 1.1: Fix for R1 handling change, blank user persona bug
  • 1.0: Yup.
S
Description
Char card extractor for you-know-what
Readme 2.5 MiB
Languages
TypeScript 96.4%
JavaScript 2.3%
CSS 1.3%