
Research
/Security News
Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.
@lenml/char-card-reader
Advanced tools
A lightweight library for reading SillyTavern character card metadata from image files (PNG, JPEG, WEBP) and JSON without external dependencies.
npm install @lenml/char-card-reader
# or
yarn add @lenml/char-card-reader
# or
pnpm install @lenml/char-card-reader
import { CharacterCard } from "@lenml/char-card-reader";
import fs from "fs";
(async () => {
// Load from image file
const file = fs.readFileSync("./path/to/character.png");
const card = await CharacterCard.from_file(file);
// Or load from JSON data
const jsonData = {
// character data, support v1/v2/v3 format
};
const jsonCard = CharacterCard.from_json(jsonData);
// Access card properties
console.log("Character Name:", card.name);
console.log("Description:", card.description);
console.log("First Message:", card.first_message);
// Convert between specs
const v1Data = card.toSpecV1();
const v2Data = card.toSpecV2();
const v3Data = card.toSpecV3();
})();
<script type="module">
import { CharacterCard } from "https://esm.run/@lenml/char-card-reader";
const fileInput = document.getElementById("character-file");
fileInput.addEventListener("change", async (e) => {
const file = e.target.files[0];
if (!file) return;
// Load from image file
if (file.type.startsWith("image/")) {
const arrayBuffer = await file.arrayBuffer();
const card = await CharacterCard.from_file(arrayBuffer);
console.log("Character Info:", card.toSpecV3());
}
// Or load from JSON file
else if (file.type === "application/json") {
const jsonText = await file.text();
const jsonData = JSON.parse(jsonText);
const card = CharacterCard.from_json(jsonData);
console.log("Character Info:", card.toSpecV3());
}
});
</script>
from_file(file: ArrayBuffer | Uint8Array): Promise<CharacterCard> - Creates a CharacterCard instance from a filefrom_json(raw_data: CharRawData, fallback_avatar = ""): CharacterCard - Creates a CharacterCard instance from JSON dataavatar - Character avatar URLname - Character namedescription - Character descriptionfirst_message - First message/opening linepersonality - Personality descriptionscenario - Scenario contextalternate_greetings - Array of alternate greetingstags - Array of character tagstoSpecV1() - Converts to v1 spec formattoSpecV2() - Converts to v2 spec formattoSpecV3() - Converts to v3 spec formatfrom character card
import { CharacterCard } from "@lenml/char-card-reader";
const file = fs.readFileSync("./path/to/character.png");
const card = await CharacterCard.from_file(file);
const book = card.get_book();
const entries = book.scan(card.first_message);
from json data
import { CharacterBook } from "@lenml/char-card-reader";
const json_data = {
entries: [
/*...*/
],
};
const book = CharacterBook.from_json(json_data);
const entries = book.scan("this xxoo world.");
click to [Read generated document]
AGPL-3.0
FAQs
SillyTavern character card info reader
The npm package @lenml/char-card-reader receives a total of 28 weekly downloads. As such, @lenml/char-card-reader popularity was classified as not popular.
We found that @lenml/char-card-reader demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.

Research
/Security News
The North Korean malware loader hides in a Packagist-listed package and its GitHub branch to fetch and execute remote code in a likely Contagious Interview-style lure.

Security News
The Rust project is moving toward formal rules on LLM use in contributions after months of internal debate over maintainer burden, code quality, and contributor experience.