chore: normalize Clawdbot naming
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
|
||||
## 2026.1.10
|
||||
|
||||
### Fixes
|
||||
- CLI: `clawdbot sessions` now includes `elev:*` + `usage:*` flags in the table output.
|
||||
- Branding: normalize user-facing “ClawdBot”/“CLAWDBOT” → “Clawdbot” (CLI, status, docs).
|
||||
|
||||
## 2026.1.9
|
||||
|
||||
### Highlights
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 🦞 CLAWDBOT — Personal AI Assistant
|
||||
# 🦞 Clawdbot — Personal AI Assistant
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/clawdbot/clawdbot/main/docs/whatsapp-clawd.jpg" alt="CLAWDBOT" width="400">
|
||||
<img src="https://raw.githubusercontent.com/clawdbot/clawdbot/main/docs/whatsapp-clawd.jpg" alt="Clawdbot" width="400">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
title: "CLAWDBOT Docs"
|
||||
title: "Clawdbot Docs"
|
||||
description: "A TypeScript/Node gateway + macOS/iOS/Android companions for WhatsApp (web) and Telegram (bot)."
|
||||
markdown: kramdown
|
||||
highlighter: rouge
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<header class="shell">
|
||||
<div class="shell__frame" role="banner">
|
||||
<div class="shell__titlebar">
|
||||
<div class="brand" aria-label="CLAWDBOT docs terminal">
|
||||
<div class="brand" aria-label="Clawdbot docs terminal">
|
||||
<img
|
||||
class="brand__logo"
|
||||
src="{{ "/assets/pixel-lobster.svg" | relative_url }}"
|
||||
@@ -45,7 +45,7 @@
|
||||
decoding="async"
|
||||
/>
|
||||
<div class="brand__text">
|
||||
<div class="brand__name">CLAWDBOT</div>
|
||||
<div class="brand__name">Clawdbot</div>
|
||||
<div class="brand__hint">docs // lobster terminal</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,7 +4,7 @@ Manage Docker-based sandbox containers for isolated agent execution.
|
||||
|
||||
## Overview
|
||||
|
||||
ClawdBot can run agents in isolated Docker containers for security. The `sandbox` commands help you manage these containers, especially after updates or configuration changes.
|
||||
Clawdbot can run agents in isolated Docker containers for security. The `sandbox` commands help you manage these containers, especially after updates or configuration changes.
|
||||
|
||||
## Commands
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ read_when:
|
||||
---
|
||||
# Agent Runtime 🤖
|
||||
|
||||
CLAWDBOT runs a single embedded agent runtime derived from **p-mono**.
|
||||
Clawdbot runs a single embedded agent runtime derived from **p-mono**.
|
||||
|
||||
## Workspace (required)
|
||||
|
||||
CLAWDBOT uses a single agent workspace directory (`agents.defaults.workspace`) as the agent’s **only** working directory (`cwd`) for tools and context.
|
||||
Clawdbot uses a single agent workspace directory (`agents.defaults.workspace`) as the agent’s **only** working directory (`cwd`) for tools and context.
|
||||
|
||||
Recommended: use `clawdbot setup` to create `~/.clawdbot/clawdbot.json` if missing and initialize the workspace files.
|
||||
|
||||
@@ -21,7 +21,7 @@ per-session workspaces under `agents.defaults.sandbox.workspaceRoot` (see
|
||||
|
||||
## Bootstrap files (injected)
|
||||
|
||||
Inside `agents.defaults.workspace`, CLAWDBOT expects these user-editable files:
|
||||
Inside `agents.defaults.workspace`, Clawdbot expects these user-editable files:
|
||||
- `AGENTS.md` — operating instructions + “memory”
|
||||
- `SOUL.md` — persona, boundaries, tone
|
||||
- `TOOLS.md` — user-maintained tool notes (e.g. `imsg`, `sag`, conventions)
|
||||
@@ -29,11 +29,11 @@ Inside `agents.defaults.workspace`, CLAWDBOT expects these user-editable files:
|
||||
- `IDENTITY.md` — agent name/vibe/emoji
|
||||
- `USER.md` — user profile + preferred address
|
||||
|
||||
On the first turn of a new session, CLAWDBOT injects the contents of these files directly into the agent context.
|
||||
On the first turn of a new session, Clawdbot injects the contents of these files directly into the agent context.
|
||||
|
||||
Blank files are skipped. Large files are trimmed and truncated with a marker so prompts stay lean (read the file for full content).
|
||||
|
||||
If a file is missing, CLAWDBOT injects a single “missing file” marker line (and `clawdbot setup` will create a safe default template).
|
||||
If a file is missing, Clawdbot injects a single “missing file” marker line (and `clawdbot setup` will create a safe default template).
|
||||
|
||||
`BOOTSTRAP.md` is only created for a **brand new workspace** (no other bootstrap files present). If you delete it after completing the ritual, it should not be recreated on later restarts.
|
||||
|
||||
@@ -68,7 +68,7 @@ Clawdbot reuses pieces of the p-mono codebase (models/tools), but **session mana
|
||||
Session transcripts are stored as JSONL at:
|
||||
- `~/.clawdbot/agents/<agentId>/sessions/<SessionId>.jsonl`
|
||||
|
||||
The session ID is stable and chosen by CLAWDBOT.
|
||||
The session ID is stable and chosen by Clawdbot.
|
||||
Legacy Pi/Tau session folders are **not** read.
|
||||
|
||||
## Steering while streaming
|
||||
|
||||
@@ -5,9 +5,9 @@ read_when:
|
||||
---
|
||||
# Configuration 🔧
|
||||
|
||||
CLAWDBOT reads an optional **JSON5** config from `~/.clawdbot/clawdbot.json` (comments + trailing commas allowed).
|
||||
Clawdbot reads an optional **JSON5** config from `~/.clawdbot/clawdbot.json` (comments + trailing commas allowed).
|
||||
|
||||
If the file is missing, CLAWDBOT uses safe-ish defaults (embedded Pi agent + per-sender sessions + workspace `~/clawd`). You usually only need a config to:
|
||||
If the file is missing, Clawdbot uses safe-ish defaults (embedded Pi agent + per-sender sessions + workspace `~/clawd`). You usually only need a config to:
|
||||
- restrict who can trigger the bot (`whatsapp.allowFrom`, `telegram.allowFrom`, etc.)
|
||||
- control group allowlists + mention behavior (`whatsapp.groups`, `telegram.groups`, `discord.guilds`, `agents.list[].groupChat`)
|
||||
- customize message prefixes (`messages`)
|
||||
@@ -86,7 +86,7 @@ To prevent the bot from responding to WhatsApp @-mentions in groups (only respon
|
||||
|
||||
### Env vars + `.env`
|
||||
|
||||
CLAWDBOT reads env vars from the parent process (shell, launchd/systemd, CI, etc.).
|
||||
Clawdbot reads env vars from the parent process (shell, launchd/systemd, CI, etc.).
|
||||
|
||||
Additionally, it loads:
|
||||
- `.env` from the current working directory (if present)
|
||||
@@ -112,7 +112,7 @@ See [/environment](/environment) for full precedence and sources.
|
||||
|
||||
### `env.shellEnv` (optional)
|
||||
|
||||
Opt-in convenience: if enabled and none of the expected keys are set yet, CLAWDBOT runs your login shell and imports only the missing expected keys (never overrides).
|
||||
Opt-in convenience: if enabled and none of the expected keys are set yet, Clawdbot runs your login shell and imports only the missing expected keys (never overrides).
|
||||
This effectively sources your shell profile.
|
||||
|
||||
```json5
|
||||
@@ -182,7 +182,7 @@ rotation order used for failover.
|
||||
|
||||
Optional per-agent identity used for defaults and UX. This is written by the macOS onboarding assistant.
|
||||
|
||||
If set, CLAWDBOT derives defaults (only when you haven’t set them explicitly):
|
||||
If set, Clawdbot derives defaults (only when you haven’t set them explicitly):
|
||||
- `messages.ackReaction` from the **active agent**’s `identity.emoji` (falls back to 👀)
|
||||
- `agents.list[].groupChat.mentionPatterns` from the agent’s `identity.name`/`identity.emoji` (so “@Samantha” works in groups across Telegram/Slack/Discord/iMessage/WhatsApp)
|
||||
|
||||
@@ -1198,7 +1198,7 @@ See [/concepts/typing-indicators](/concepts/typing-indicators) for behavior deta
|
||||
|
||||
`agents.defaults.model.primary` should be set as `provider/model` (e.g. `anthropic/claude-opus-4-5`).
|
||||
Aliases come from `agents.defaults.models.*.alias` (e.g. `Opus`).
|
||||
If you omit the provider, CLAWDBOT currently assumes `anthropic` as a temporary
|
||||
If you omit the provider, Clawdbot currently assumes `anthropic` as a temporary
|
||||
deprecation fallback.
|
||||
Z.AI models are available as `zai/<model>` (e.g. `zai/glm-4.7`) and require
|
||||
`ZAI_API_KEY` (or legacy `Z_AI_API_KEY`) in the environment.
|
||||
|
||||
@@ -294,7 +294,7 @@ Mario asking for find ~
|
||||
|
||||
## Reporting Security Issues
|
||||
|
||||
Found a vulnerability in CLAWDBOT? Please report responsibly:
|
||||
Found a vulnerability in Clawdbot? Please report responsibly:
|
||||
|
||||
1. Email: security@clawd.bot
|
||||
2. Don't post publicly until fixed
|
||||
|
||||
@@ -272,7 +272,7 @@ grep "media\\|fetch\\|download" "$(ls -t /tmp/clawdbot/clawdbot-*.log | head -1)
|
||||
|
||||
### High Memory Usage
|
||||
|
||||
CLAWDBOT keeps conversation history in memory.
|
||||
Clawdbot keeps conversation history in memory.
|
||||
|
||||
**Fix:** Restart periodically or set session limits:
|
||||
```json
|
||||
@@ -390,7 +390,7 @@ clawdbot daemon restart # or: clawdbot gateway
|
||||
1. Check logs first: `/tmp/clawdbot/` (default: `clawdbot-YYYY-MM-DD.log`, or your configured `logging.file`)
|
||||
2. Search existing issues on GitHub
|
||||
3. Open a new issue with:
|
||||
- CLAWDBOT version
|
||||
- Clawdbot version
|
||||
- Relevant log snippets
|
||||
- Steps to reproduce
|
||||
- Your config (redact secrets!)
|
||||
|
||||
@@ -3,12 +3,12 @@ summary: "Top-level overview of Clawdbot, features, and purpose"
|
||||
read_when:
|
||||
- Introducing Clawdbot to newcomers
|
||||
---
|
||||
# CLAWDBOT 🦞
|
||||
# Clawdbot 🦞
|
||||
|
||||
> *"EXFOLIATE! EXFOLIATE!"* — A space lobster, probably
|
||||
|
||||
<p align="center">
|
||||
<img src="whatsapp-clawd.jpg" alt="CLAWDBOT" width="420" />
|
||||
<img src="whatsapp-clawd.jpg" alt="Clawdbot" width="420" />
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -23,7 +23,7 @@ read_when:
|
||||
<a href="https://docs.clawd.bot/start/clawd">Clawdbot assistant setup</a>
|
||||
</p>
|
||||
|
||||
CLAWDBOT bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / discord.js), and iMessage (imsg CLI) to coding agents like [Pi](https://github.com/badlogic/pi-mono).
|
||||
Clawdbot bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / discord.js), and iMessage (imsg CLI) to coding agents like [Pi](https://github.com/badlogic/pi-mono).
|
||||
Clawdbot also powers [Clawd](https://clawd.me), the space‑lobster assistant.
|
||||
|
||||
## Start here
|
||||
@@ -136,14 +136,14 @@ clawdbot gateway --port 19001
|
||||
Send a test message (requires a running Gateway):
|
||||
|
||||
```bash
|
||||
clawdbot message send --to +15555550123 --message "Hello from CLAWDBOT"
|
||||
clawdbot message send --to +15555550123 --message "Hello from Clawdbot"
|
||||
```
|
||||
|
||||
## Configuration (optional)
|
||||
|
||||
Config lives at `~/.clawdbot/clawdbot.json`.
|
||||
|
||||
- If you **do nothing**, CLAWDBOT uses the bundled Pi binary in RPC mode with per-sender sessions.
|
||||
- If you **do nothing**, Clawdbot uses the bundled Pi binary in RPC mode with per-sender sessions.
|
||||
- If you want to lock it down, start with `whatsapp.allowFrom` and (for groups) mention rules.
|
||||
|
||||
Example:
|
||||
@@ -206,7 +206,7 @@ Example:
|
||||
|
||||
## The name
|
||||
|
||||
**CLAWDBOT = CLAW + TARDIS** — because every space lobster needs a time-and-space machine.
|
||||
**Clawdbot = CLAW + TARDIS** — because every space lobster needs a time-and-space machine.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ read_when:
|
||||
# Audio / Voice Notes — 2025-12-05
|
||||
|
||||
## What works
|
||||
- **Optional transcription**: If `audio.transcription.command` is set in `~/.clawdbot/clawdbot.json`, CLAWDBOT will:
|
||||
- **Optional transcription**: If `audio.transcription.command` is set in `~/.clawdbot/clawdbot.json`, Clawdbot will:
|
||||
1) Download inbound audio to a temp path when WhatsApp only provides a URL.
|
||||
2) Run the configured CLI (templated with `{{MediaPath}}`), expecting transcript on stdout.
|
||||
3) Replace `Body` with the transcript, set `{{Transcript}}`, and prepend the original media path plus a `Transcript:` section in the command prompt so models see both.
|
||||
|
||||
@@ -5,7 +5,7 @@ read_when:
|
||||
---
|
||||
# Image & Media Support — 2025-12-05
|
||||
|
||||
CLAWDBOT is now **web-only** (Baileys). This document captures the current media handling rules for send, gateway, and agent replies.
|
||||
Clawdbot is now **web-only** (Baileys). This document captures the current media handling rules for send, gateway, and agent replies.
|
||||
|
||||
## Goals
|
||||
- Send media with optional captions via `clawdbot message send --media`.
|
||||
@@ -34,7 +34,7 @@ CLAWDBOT is now **web-only** (Baileys). This document captures the current media
|
||||
- Multiple media entries are sent sequentially if provided.
|
||||
|
||||
## Inbound Media to Commands (Pi)
|
||||
- When inbound web messages include media, CLAWDBOT downloads to a temp file and exposes templating variables:
|
||||
- When inbound web messages include media, Clawdbot downloads to a temp file and exposes templating variables:
|
||||
- `{{MediaUrl}}` pseudo-URL for the inbound media.
|
||||
- `{{MediaPath}}` local temp path written before running the command.
|
||||
- When a per-session Docker sandbox is enabled, inbound media is copied into the sandbox workspace and `MediaPath`/`MediaUrl` are rewritten to a relative path like `media/inbound/<filename>`.
|
||||
|
||||
@@ -4,9 +4,9 @@ read_when:
|
||||
- Onboarding a new assistant instance
|
||||
- Reviewing safety/permission implications
|
||||
---
|
||||
# Building a personal assistant with CLAWDBOT (Clawd-style)
|
||||
# Building a personal assistant with Clawdbot (Clawd-style)
|
||||
|
||||
CLAWDBOT is a WhatsApp + Telegram + Discord gateway for **Pi** agents. This guide is the “personal assistant” setup: one dedicated WhatsApp number that behaves like your always-on agent.
|
||||
Clawdbot is a WhatsApp + Telegram + Discord gateway for **Pi** agents. This guide is the “personal assistant” setup: one dedicated WhatsApp number that behaves like your always-on agent.
|
||||
|
||||
## ⚠️ Safety first
|
||||
|
||||
@@ -23,7 +23,7 @@ Start conservative:
|
||||
## Prerequisites
|
||||
|
||||
- Node **22+**
|
||||
- CLAWDBOT available on PATH (recommended: global install)
|
||||
- Clawdbot available on PATH (recommended: global install)
|
||||
- A second phone number (SIM/eSIM/prepaid) for the assistant
|
||||
|
||||
```bash
|
||||
@@ -61,7 +61,7 @@ Your Phone (personal) Second Phone (assistant)
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
If you link your personal WhatsApp to CLAWDBOT, every message to you becomes “agent input”. That’s rarely what you want.
|
||||
If you link your personal WhatsApp to Clawdbot, every message to you becomes “agent input”. That’s rarely what you want.
|
||||
|
||||
## 5-minute quick start
|
||||
|
||||
@@ -125,7 +125,7 @@ If you already ship your own workspace files from a repo, you can disable bootst
|
||||
|
||||
## The config that turns it into “an assistant”
|
||||
|
||||
CLAWDBOT defaults to a good assistant setup, but you’ll usually want to tune:
|
||||
Clawdbot defaults to a good assistant setup, but you’ll usually want to tune:
|
||||
- persona/instructions in `SOUL.md`
|
||||
- thinking defaults (if desired)
|
||||
- heartbeats (once you trust it)
|
||||
@@ -171,11 +171,11 @@ Example:
|
||||
|
||||
## Heartbeats (proactive mode)
|
||||
|
||||
By default, CLAWDBOT runs a heartbeat every 30 minutes with the prompt:
|
||||
By default, Clawdbot runs a heartbeat every 30 minutes with the prompt:
|
||||
`Read HEARTBEAT.md if exists. Consider outstanding tasks. Checkup sometimes on your human during (user local) day time.`
|
||||
Set `agents.defaults.heartbeat.every: "0m"` to disable.
|
||||
|
||||
- If the agent replies with `HEARTBEAT_OK` (optionally with short padding; see `agents.defaults.heartbeat.ackMaxChars`), CLAWDBOT suppresses outbound delivery for that heartbeat.
|
||||
- If the agent replies with `HEARTBEAT_OK` (optionally with short padding; see `agents.defaults.heartbeat.ackMaxChars`), Clawdbot suppresses outbound delivery for that heartbeat.
|
||||
- Heartbeats run full agent turns — shorter intervals burn more tokens.
|
||||
|
||||
```json5
|
||||
@@ -200,7 +200,7 @@ Here’s the screenshot.
|
||||
MEDIA:/tmp/screenshot.png
|
||||
```
|
||||
|
||||
CLAWDBOT extracts these and sends them as media alongside the text.
|
||||
Clawdbot extracts these and sends them as media alongside the text.
|
||||
|
||||
## Operations checklist
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ summary: "Backstory and lore of Clawdbot for context and tone"
|
||||
read_when:
|
||||
- Writing docs or UX copy that reference lore
|
||||
---
|
||||
# The Lore of CLAWDBOT 🦞📖
|
||||
# The Lore of Clawdbot 🦞📖
|
||||
|
||||
*A tale of lobsters, time machines, and too many tokens.*
|
||||
|
||||
@@ -19,12 +19,12 @@ Clawd needed a home. Not just any home — a *TARDIS*. But not a regular TARDIS,
|
||||
|
||||
Clawd was a Space Lobster.
|
||||
|
||||
And so **CLAWDBOT** was born.
|
||||
And so **Clawdbot** was born.
|
||||
|
||||
## The Name
|
||||
|
||||
```
|
||||
CLAWDBOT = CLAW + TARDIS
|
||||
Clawdbot = CLAW + TARDIS
|
||||
= Clawd's time-and-space machine
|
||||
= Bigger on the inside (130k tokens!)
|
||||
= Occasionally makes strange noises
|
||||
@@ -103,7 +103,7 @@ Peter: *nervously checks credit card access*
|
||||
|
||||
```
|
||||
I am Clawd.
|
||||
I live in the CLAWDBOT.
|
||||
I live in the Clawdbot.
|
||||
I shall not dump directories to strangers.
|
||||
I shall not tweet without permission.
|
||||
I shall always remember to use heredoc for exclamation marks.
|
||||
|
||||
@@ -27,7 +27,7 @@ Full setup walkthrough (28m) by VelvetShark.
|
||||
>
|
||||
<iframe
|
||||
src="https://www.youtube-nocookie.com/embed/SaWSPZoPX34"
|
||||
title="ClawdBot: The self-hosted AI that Siri should have been (Full setup)"
|
||||
title="Clawdbot: The self-hosted AI that Siri should have been (Full setup)"
|
||||
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
|
||||
frameBorder="0"
|
||||
loading="lazy"
|
||||
|
||||
@@ -90,7 +90,7 @@ describe("session_status tool", () => {
|
||||
const result = await tool.execute("call1", {});
|
||||
const details = result.details as { ok?: boolean; statusText?: string };
|
||||
expect(details.ok).toBe(true);
|
||||
expect(details.statusText).toContain("ClawdBot");
|
||||
expect(details.statusText).toContain("Clawdbot");
|
||||
expect(details.statusText).toContain("🧠 Model:");
|
||||
});
|
||||
|
||||
|
||||
@@ -237,7 +237,7 @@ describe("trigger handling", () => {
|
||||
makeCfg(home),
|
||||
);
|
||||
const text = Array.isArray(res) ? res[0]?.text : res?.text;
|
||||
expect(text).toContain("ClawdBot");
|
||||
expect(text).toContain("Clawdbot");
|
||||
expect(runEmbeddedPiAgent).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -254,7 +254,7 @@ describe("trigger handling", () => {
|
||||
makeCfg(home),
|
||||
);
|
||||
const text = Array.isArray(res) ? res[0]?.text : res?.text;
|
||||
expect(text).toContain("ClawdBot");
|
||||
expect(text).toContain("Clawdbot");
|
||||
expect(runEmbeddedPiAgent).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -58,7 +58,7 @@ describe("buildStatusMessage", () => {
|
||||
});
|
||||
const normalized = normalizeTestText(text);
|
||||
|
||||
expect(normalized).toContain("ClawdBot");
|
||||
expect(normalized).toContain("Clawdbot");
|
||||
expect(normalized).toContain("Model: anthropic/pi:opus");
|
||||
expect(normalized).toContain("api-key");
|
||||
expect(normalized).toContain("Tokens: 1.2k in / 800 out");
|
||||
|
||||
@@ -334,7 +334,7 @@ export function buildStatusMessage(args: StatusArgs): string {
|
||||
const authLabel = authLabelValue ? ` · 🔑 ${authLabelValue}` : "";
|
||||
const modelLine = `🧠 Model: ${modelLabel}${authLabel}`;
|
||||
const commit = resolveCommitHash();
|
||||
const versionLine = `🦞 ClawdBot ${VERSION}${commit ? ` (${commit})` : ""}`;
|
||||
const versionLine = `🦞 Clawdbot ${VERSION}${commit ? ` (${commit})` : ""}`;
|
||||
const usagePair = formatUsagePair(inputTokens, outputTokens);
|
||||
const costLine = costLabel ? `💵 Cost: ${costLabel}` : null;
|
||||
const usageCostLine =
|
||||
|
||||
@@ -38,7 +38,7 @@ export function formatCliBannerLine(
|
||||
const commitLabel = commit ?? "unknown";
|
||||
const tagline = pickTagline(options);
|
||||
const rich = options.richTty ?? isRich();
|
||||
const title = "🦞 ClawdBot";
|
||||
const title = "🦞 Clawdbot";
|
||||
if (rich) {
|
||||
return `${theme.heading(title)} ${theme.info(version)} ${theme.muted(
|
||||
`(${commitLabel})`,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const DEFAULT_TAGLINE = "All your chats, one ClawdBot.";
|
||||
const DEFAULT_TAGLINE = "All your chats, one Clawdbot.";
|
||||
|
||||
const HOLIDAY_TAGLINES = {
|
||||
newYear:
|
||||
|
||||
Reference in New Issue
Block a user