Rename project from LLM-Shield to PasteGuard (#5)
authorStefan Gasser <redacted>
Fri, 9 Jan 2026 12:57:21 +0000 (13:57 +0100)
committerGitHub <redacted>
Fri, 9 Jan 2026 12:57:21 +0000 (13:57 +0100)
After positive community response (100+ GitHub stars), committing fully
to this project. The name PasteGuard better describes the core function:
"guard what you paste" before sending to LLMs.

Changes:
- Update all branding: package.json, README, CONTRIBUTING
- Rename response headers: X-LLM-Shield-* β†’ X-PasteGuard-*
- Update dashboard UI and page title
- Update /info endpoint metadata
- Update startup banner
- Update config files and defaults
- Update CI workflow docker tag
- Regenerate bun.lock with new package name

Domain pasteguard.com secured. Old GitHub links redirect automatically.

17 files changed:
.github/workflows/ci.yml
CLAUDE.md
CONTRIBUTING.md
README.md
bun.lock
config.example.yaml
docker-compose.yml
package.json
presidio/Dockerfile
presidio/languages.yaml
src/config.ts
src/index.ts
src/routes/dashboard.tsx
src/routes/info.test.ts
src/routes/info.ts
src/routes/proxy.ts
src/views/dashboard/page.tsx

index 921a10fd27423d6204579a26d0af5ce867090005..840018628e57b73780ebdbc00487bb4f3c7343ff 100644 (file)
@@ -38,4 +38,4 @@ jobs:
       - uses: actions/checkout@v4
 
       - name: Test Docker build
-        run: docker build -t llm-shield:test .
\ No newline at end of file
+        run: docker build -t pasteguard:test .
\ No newline at end of file
index 601e9948c38fb38282b5ef35edceb0860e93d857..1cddc1b3766486958e008f866aa555e68cdda1c9 100644 (file)
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,4 +1,4 @@
-# LLM-Shield
+# PasteGuard
 
 OpenAI-compatible proxy with two privacy modes: route to local LLM or mask PII for upstream.
 
@@ -8,7 +8,7 @@ OpenAI-compatible proxy with two privacy modes: route to local LLM or mask PII f
 - Framework: Hono (with JSX for dashboard)
 - Validation: Zod
 - Styling: Tailwind CSS v4
-- Database: SQLite (`data/llm-shield.db`)
+- Database: SQLite (`data/pasteguard.db`)
 - PII Detection: Microsoft Presidio (Docker)
 - Code Style: Biome (see @biome.json)
 
@@ -81,4 +81,4 @@ bun install && bun run dev
 - `GET /info` - Mode info
 - `POST /openai/v1/chat/completions` - Main endpoint
 
-Response header `X-LLM-Shield-PII-Masked: true` indicates PII was masked.
+Response header `X-PasteGuard-PII-Masked: true` indicates PII was masked.
index 808761fe93b9eea05c6106c39057d36930d61623..7fe6e189af57729aba68c35b50a85a790cf21118 100644 (file)
@@ -1,6 +1,6 @@
-# Contributing to LLM-Shield
+# Contributing to PasteGuard
 
-Thank you for considering contributing to LLM-Shield!
+Thank you for considering contributing to PasteGuard!
 
 ## Development Setup
 
index 619234c3d9c12f9f31b16c692feaa02a27e67883..7d0e84939c32a4fa76fd4ff145c26eaa1b2f5a83 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
-# πŸ›‘️ LLM-Shield
+# πŸ›‘️ PasteGuard
 
-[![CI](https://github.com/sgasser/llm-shield/actions/workflows/ci.yml/badge.svg)](https://github.com/sgasser/llm-shield/actions/workflows/ci.yml)
+[![CI](https://github.com/sgasser/pasteguard/actions/workflows/ci.yml/badge.svg)](https://github.com/sgasser/pasteguard/actions/workflows/ci.yml)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
 
 Privacy proxy for LLMs. Masks personal data before sending to your provider (OpenAI, Azure, etc.), or routes sensitive requests to local LLM.
 
-<img src="docs/dashboard.png" width="100%" alt="LLM-Shield Dashboard">
+<img src="docs/dashboard.png" width="100%" alt="PasteGuard Dashboard">
 
 ## Mask Mode (Default)
 
@@ -56,8 +56,8 @@ Powered by [Microsoft Presidio](https://microsoft.github.io/presidio/).
 ### Docker (recommended)
 
 ```bash
-git clone https://github.com/sgasser/llm-shield.git
-cd llm-shield
+git clone https://github.com/sgasser/pasteguard.git
+cd pasteguard
 cp config.example.yaml config.yaml
 
 # Option 1: English only (default, ~1.5GB)
@@ -71,8 +71,8 @@ LANGUAGES=en,de,fr,es,it docker compose up -d
 ### Local Development
 
 ```bash
-git clone https://github.com/sgasser/llm-shield.git
-cd llm-shield
+git clone https://github.com/sgasser/pasteguard.git
+cd pasteguard
 bun install
 cp config.example.yaml config.yaml
 
@@ -113,7 +113,7 @@ LANGUAGES=en,de,fr,it,es docker compose build
 - Text language is auto-detected for each request
 - If detected language is not installed, falls back to `fallback_language` (default: `en`)
 - Dashboard shows fallback as `FRβ†’EN` when French text is detected but only English is installed
-- Response header `X-LLM-Shield-Language-Fallback: true` indicates fallback was used
+- Response header `X-PasteGuard-Language-Fallback: true` indicates fallback was used
 
 Update `config.yaml` to match your installed languages:
 
@@ -175,7 +175,7 @@ pii_detection:
 
 ```yaml
 logging:
-  database: ./data/llm-shield.db
+  database: ./data/pasteguard.db
   retention_days: 30           # 0 = keep forever
   log_content: false           # Log full request/response
   log_masked_content: true     # Log masked content for dashboard
@@ -213,12 +213,12 @@ See [config.example.yaml](config.example.yaml) for all options.
 | Header | Value |
 |--------|-------|
 | `X-Request-ID` | Request identifier (forwarded or generated) |
-| `X-LLM-Shield-Mode` | `route` / `mask` |
-| `X-LLM-Shield-PII-Detected` | `true` / `false` |
-| `X-LLM-Shield-PII-Masked` | `true` / `false` (mask mode) |
-| `X-LLM-Shield-Provider` | `upstream` / `local` |
-| `X-LLM-Shield-Language` | Detected language code |
-| `X-LLM-Shield-Language-Fallback` | `true` if fallback was used |
+| `X-PasteGuard-Mode` | `route` / `mask` |
+| `X-PasteGuard-PII-Detected` | `true` / `false` |
+| `X-PasteGuard-PII-Masked` | `true` / `false` (mask mode) |
+| `X-PasteGuard-Provider` | `upstream` / `local` |
+| `X-PasteGuard-Language` | Detected language code |
+| `X-PasteGuard-Language-Fallback` | `true` if fallback was used |
 
 ## Development
 
index 3a80089f20950ddb3fcc3d5a36f274f0737ffd7c..368494dd492a97254253ae84528155a2dd91070e 100644 (file)
--- a/bun.lock
+++ b/bun.lock
@@ -3,7 +3,7 @@
   "configVersion": 1,
   "workspaces": {
     "": {
-      "name": "llm-shield",
+      "name": "pasteguard",
       "dependencies": {
         "@hono/zod-validator": "^0.7.6",
         "eld": "^2.0.1",
@@ -91,7 +91,7 @@
 
     "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
 
-    "eld": ["eld@2.0.1", "", {}, "sha512-Lo+M5M7IL/N3MSXMbnfBrdsn+qu0rScPyOA/POvxKU7HsLEOfFOJuEBC96vmYxMJShxXtH+wnWVOhgu+rf7u9A=="],
+    "eld": ["eld@2.0.2", "", {}, "sha512-8ECUdQkhChI68V4n2j1zLsUKRGtOtBm3hA2RHrA05I9Y+BU7iLgClZnpGdEUpmAw3xKyVHQcSzuBVDkjCkP4ag=="],
 
     "enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="],
 
index 98fb32b7398096b830ccd5b75fd9a6eb24e388dc..a554321519b4937fe7cc43e2b2d5b606eb9638b5 100644 (file)
@@ -1,4 +1,4 @@
-# LLM-Shield Configuration
+# PasteGuard Configuration
 # Copy this file to config.yaml and adjust the values
 
 # Privacy mode: "mask" or "route"
@@ -92,7 +92,7 @@ pii_detection:
 # Logging settings
 logging:
   # SQLite database for request logs
-  database: ./data/llm-shield.db
+  database: ./data/pasteguard.db
 
   # Log retention in days (0 = keep forever)
   retention_days: 30
index 8fceec9609921a3ea944fdd80481fa88faf9d95e..64d538a2fd384fbde14069450b6c214178ca4a85 100644 (file)
@@ -1,5 +1,5 @@
 services:
-  llm-shield:
+  pasteguard:
     build: .
     ports:
       - "3000:3000"
index ab316a5950de9e20dc9a127c84f750accf57bcac..e56e02e3017ff847f9724699a79fc7d8f24069ea 100644 (file)
@@ -1,7 +1,7 @@
 {
-  "name": "llm-shield",
+  "name": "pasteguard",
   "version": "0.1.0",
-  "description": "Intelligent privacy-aware routing for LLMs - OpenAI-compatible proxy that routes requests based on PII detection",
+  "description": "Guard your paste - Privacy-aware LLM proxy that masks PII before sending to cloud LLMs",
   "type": "module",
   "main": "src/index.ts",
   "scripts": {
@@ -42,6 +42,6 @@
   "license": "Apache-2.0",
   "repository": {
     "type": "git",
-    "url": "https://github.com/sgasser/llm-shield"
+    "url": "https://github.com/sgasser/pasteguard"
   }
 }
index f3799c9516c7eb5711c7074ab753ac662190b483..a99b3877c3431b1e6f416f6860ff8e7459464a04 100644 (file)
@@ -1,4 +1,4 @@
-# LLM-Shield Presidio Analyzer
+# PasteGuard Presidio Analyzer
 # Multi-language PII detection with configurable language support
 #
 # Build with specific languages:
index a241e49eaf2f2fd9ff7bfe75de55fb886a7b855a..b27bbd427b668c5b98e8c9f6ae6462254f165576 100644 (file)
@@ -1,4 +1,4 @@
-# LLM-Shield Language Registry
+# PasteGuard Language Registry
 # All 24 spaCy languages with trained pipelines
 #
 # Usage: Set LANGUAGES build arg to select which to install
index a5bc8fc13bd6409bafb6a619c2f928b9462e0fdd..0526de13f9c7c0c84be7d839ce855dfc2a9b2fe9 100644 (file)
@@ -76,7 +76,7 @@ const ServerSchema = z.object({
 });
 
 const LoggingSchema = z.object({
-  database: z.string().default("./data/llm-shield.db"),
+  database: z.string().default("./data/pasteguard.db"),
   retention_days: z.coerce.number().int().min(0).default(30),
   log_content: z.boolean().default(false),
   log_masked_content: z.boolean().default(true),
index 4724522e0b08aa7c00c63d48253e3825e77872d1..b7552458b84b7e4b7a548d9d58c089b9e333ac0f 100644 (file)
@@ -154,8 +154,8 @@ Provider:
 
   console.log(`
 β•”═══════════════════════════════════════════════════════════╗
-β•‘                       LLM-Shield                          β•‘
-β•‘         Intelligent privacy-aware LLM proxy               β•‘
+β•‘                       PasteGuard                          β•‘
+β•‘         Guard your paste - Privacy-aware LLM proxy        β•‘
 β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
 
 Server:     http://${host}:${port}
index d7eccc0c1f56ea874f76ec5e801148df54f82427..d36daaa7a2248670d35cbf198041204a5f6be0ef 100644 (file)
@@ -24,7 +24,7 @@ if (config.dashboard.auth) {
                basicAuth({
                        username: config.dashboard.auth.username,
                        password: config.dashboard.auth.password,
-                       realm: "LLM-Shield Dashboard",
+                       realm: "PasteGuard Dashboard",
                }),
        );
 }
index f7ef900f50e6d16bcffae316d0ebf78185ca23b2..e5990a685f1245406549ca7018fa876abfd76cd4 100644 (file)
@@ -12,7 +12,7 @@ describe("GET /info", () => {
     expect(res.status).toBe(200);
 
     const body = (await res.json()) as Record<string, unknown>;
-    expect(body.name).toBe("LLM-Shield");
+    expect(body.name).toBe("PasteGuard");
     expect(body.version).toBe("0.1.0");
     expect(body.mode).toBeDefined();
     expect(body.providers).toBeDefined();
index 009041d47ace40fd6358147c70a25ec3f9fe21b9..c4358ccb244354649213f2d0c3502c199cef7422 100644 (file)
@@ -14,9 +14,9 @@ infoRoutes.get("/info", (c) => {
   const languageValidation = detector.getLanguageValidation();
 
   const info: Record<string, unknown> = {
-    name: "LLM-Shield",
+    name: "PasteGuard",
     version: pkg.version,
-    description: "Intelligent privacy-aware LLM proxy",
+    description: "Guard your paste - Privacy-aware LLM proxy",
     mode: config.mode,
     providers: {
       upstream: {
index f3a10c76b45a07342573fc4a77d44eca8ec2a45b..5549411e48c234267f2e08f70d8c1331e7b9171d 100644 (file)
@@ -126,18 +126,18 @@ async function handleCompletion(
 }
 
 /**
- * Set X-LLM-Shield response headers
+ * Set X-PasteGuard response headers
  */
 function setShieldHeaders(c: Context, decision: RoutingDecision) {
-  c.header("X-LLM-Shield-Mode", decision.mode);
-  c.header("X-LLM-Shield-Provider", decision.provider);
-  c.header("X-LLM-Shield-PII-Detected", decision.piiResult.hasPII.toString());
-  c.header("X-LLM-Shield-Language", decision.piiResult.language);
+  c.header("X-PasteGuard-Mode", decision.mode);
+  c.header("X-PasteGuard-Provider", decision.provider);
+  c.header("X-PasteGuard-PII-Detected", decision.piiResult.hasPII.toString());
+  c.header("X-PasteGuard-Language", decision.piiResult.language);
   if (decision.piiResult.languageFallback) {
-    c.header("X-LLM-Shield-Language-Fallback", "true");
+    c.header("X-PasteGuard-Language-Fallback", "true");
   }
   if (decision.mode === "mask") {
-    c.header("X-LLM-Shield-PII-Masked", decision.piiResult.hasPII.toString());
+    c.header("X-PasteGuard-PII-Masked", decision.piiResult.hasPII.toString());
   }
 }
 
index 1156628237832d5789aa0383534a6584b4fa3f5f..a1a5124fc4c92a3890caed3b28ccab706873ca5a 100644 (file)
@@ -6,7 +6,7 @@ const DashboardPage: FC = () => {
                        <head>
                                <meta charset="UTF-8" />
                                <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-                               <title>LLM-Shield Dashboard</title>
+                               <title>PasteGuard Dashboard</title>
                                <link rel="preconnect" href="https://fonts.googleapis.com" />
                                <link
                                        rel="preconnect"
@@ -119,7 +119,7 @@ const Header: FC = () => (
                                πŸ›‘️
                        </div>
                        <div class="text-xl font-bold tracking-tight text-text-primary">
-                               LLM<span class="text-amber">Shield</span>
+                               Paste<span class="text-amber">Guard</span>
                        </div>
                </div>
                <div class="flex items-center gap-4">
git clone https://git.99rst.org/PROJECT