From e652dece9ba0e447c55baa11448fa3c3565c2f5e Mon Sep 17 00:00:00 2001
From: Bryan Van Deusen
Date: Sat, 25 Apr 2026 16:28:25 -0400
Subject: [PATCH] refactor: rename Fabled Assistant to Fabled Scribe
Updates user-visible branding across frontend (PWA manifest, page title,
Settings, push fallback), backend (email templates and subjects, LLM
system prompt, CalDAV displayname, SMTP from-name default), README,
quickstart compose, and MCP server description.
Also updates the CI image path and quickstart image reference to
git.fabledsword.com/bvandeusen/fabledscribe in preparation for the
Forgejo repo rename. Internal Python package, env vars, and database
schema unchanged.
Co-Authored-By: Claude Opus 4.7
---
.forgejo/workflows/ci.yml | 2 +-
README.md | 2 +-
docker-compose.quickstart.yml | 4 ++--
fable-mcp/pyproject.toml | 2 +-
frontend/index.html | 4 ++--
frontend/public/manifest.json | 4 ++--
frontend/public/sw.js | 2 +-
frontend/src/views/SettingsView.vue | 6 +++---
src/fabledassistant/config.py | 2 +-
src/fabledassistant/services/calendar_sync.py | 2 +-
src/fabledassistant/services/email.py | 12 ++++++------
src/fabledassistant/services/llm.py | 2 +-
src/fabledassistant/services/notifications.py | 12 ++++++------
13 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml
index f657f3e..4ff4ecb 100644
--- a/.forgejo/workflows/ci.yml
+++ b/.forgejo/workflows/ci.yml
@@ -57,7 +57,7 @@ permissions:
env:
REGISTRY: git.fabledsword.com
- IMAGE: git.fabledsword.com/bvandeusen/fabledassistant
+ IMAGE: git.fabledsword.com/bvandeusen/fabledscribe
jobs:
typecheck:
diff --git a/README.md b/README.md
index a329927..5af628f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Fabled Assistant
+# Fabled Scribe
A self-hosted second brain and project management application with integrated LLM capabilities. Write, organise, and act on your notes and tasks with the help of a local AI assistant — all running on your own hardware.
diff --git a/docker-compose.quickstart.yml b/docker-compose.quickstart.yml
index a5a294f..e2a9ee5 100644
--- a/docker-compose.quickstart.yml
+++ b/docker-compose.quickstart.yml
@@ -1,4 +1,4 @@
-# Fabled Assistant — Quick Start
+# Fabled Scribe — Quick Start
#
# No build required. Pulls the latest pre-built image from the registry.
#
@@ -13,7 +13,7 @@
services:
app:
- image: git.fabledsword.com/bvandeusen/fabledassistant:latest
+ image: git.fabledsword.com/bvandeusen/fabledscribe:latest
ports:
- "5000:5000"
environment:
diff --git a/fable-mcp/pyproject.toml b/fable-mcp/pyproject.toml
index ba6f5a3..d3212e8 100644
--- a/fable-mcp/pyproject.toml
+++ b/fable-mcp/pyproject.toml
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
[project]
name = "fable-mcp"
version = "0.2.6"
-description = "MCP server for Fabled Assistant"
+description = "MCP server for Fabled Scribe"
requires-python = ">=3.12"
dependencies = [
"mcp[cli]>=1.0",
diff --git a/frontend/index.html b/frontend/index.html
index 3cde003..6fdfe7a 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -9,8 +9,8 @@
-
- Fabled Assistant
+
+ Fabled Scribe
diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json
index 463e6d0..d374868 100644
--- a/frontend/public/manifest.json
+++ b/frontend/public/manifest.json
@@ -1,6 +1,6 @@
{
- "name": "Fabled Assistant",
- "short_name": "Fabled",
+ "name": "Fabled Scribe",
+ "short_name": "Scribe",
"description": "Your self-hosted second brain with AI assistance",
"start_url": "/",
"display": "standalone",
diff --git a/frontend/public/sw.js b/frontend/public/sw.js
index 246a13b..5ce54d6 100644
--- a/frontend/public/sw.js
+++ b/frontend/public/sw.js
@@ -12,7 +12,7 @@ self.addEventListener('push', event => {
return;
}
}
- return self.registration.showNotification(data.title || 'Fabled Assistant', {
+ return self.registration.showNotification(data.title || 'Scribe', {
body: data.body || '',
icon: '/favicon.ico',
badge: '/favicon.ico',
diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue
index 5bdcff1..6ce18c7 100644
--- a/frontend/src/views/SettingsView.vue
+++ b/frontend/src/views/SettingsView.vue
@@ -501,7 +501,7 @@ const smtp = ref({
smtp_username: "",
smtp_password: "",
smtp_from_address: "",
- smtp_from_name: "Fabled Assistant",
+ smtp_from_name: "Fabled Scribe",
smtp_use_tls: "true",
});
const savingSmtp = ref(false);
@@ -1981,7 +1981,7 @@ function formatUserDate(iso: string): string {
About
- Fabled Assistant {{ appVersion }}
+ Fabled Scribe {{ appVersion }}
@@ -2741,7 +2741,7 @@ FABLE_API_KEY={{ effectiveApiKey }}
From Name
-
+
diff --git a/src/fabledassistant/config.py b/src/fabledassistant/config.py
index 7c447d0..09740e9 100644
--- a/src/fabledassistant/config.py
+++ b/src/fabledassistant/config.py
@@ -52,7 +52,7 @@ class Config:
SMTP_USERNAME: str = os.environ.get("SMTP_USERNAME", "")
SMTP_PASSWORD: str = _read_secret("SMTP_PASSWORD", "SMTP_PASSWORD_FILE", "")
SMTP_FROM_ADDRESS: str = os.environ.get("SMTP_FROM_ADDRESS", "")
- SMTP_FROM_NAME: str = os.environ.get("SMTP_FROM_NAME", "Fabled Assistant")
+ SMTP_FROM_NAME: str = os.environ.get("SMTP_FROM_NAME", "Fabled Scribe")
SMTP_USE_TLS: bool = os.environ.get("SMTP_USE_TLS", "true").lower() in ("1", "true", "yes")
BASE_URL: str = os.environ.get("BASE_URL", "http://localhost:5000").rstrip("/")
TRUST_PROXY_HEADERS: bool = os.environ.get("TRUST_PROXY_HEADERS", "").lower() in ("1", "true", "yes")
diff --git a/src/fabledassistant/services/calendar_sync.py b/src/fabledassistant/services/calendar_sync.py
index 2b7c781..fc64685 100644
--- a/src/fabledassistant/services/calendar_sync.py
+++ b/src/fabledassistant/services/calendar_sync.py
@@ -66,7 +66,7 @@ async def setup_user_calendar(user_id: int) -> bool:
- Fabled Assistant
+ Fabled Scribe
""",
diff --git a/src/fabledassistant/services/email.py b/src/fabledassistant/services/email.py
index 946d76d..53d6362 100644
--- a/src/fabledassistant/services/email.py
+++ b/src/fabledassistant/services/email.py
@@ -38,7 +38,7 @@ _EMAIL_LOGO_SVG = (
def _email_html(title: str, body: str) -> str:
- """Wrap email body content in the standard Fabled Assistant template."""
+ """Wrap email body content in the standard Fabled Scribe template."""
return f"""
@@ -56,7 +56,7 @@ def _email_html(title: str, body: str) -> str:
- {_EMAIL_LOGO_SVG}Fabled Assistant
+ {_EMAIL_LOGO_SVG}Fabled Scribe
{title}
@@ -68,7 +68,7 @@ def _email_html(title: str, body: str) -> str:
-
Sent by your Fabled Assistant instance.
+
Sent by your Fabled Scribe instance.
@@ -146,7 +146,7 @@ async def send_email(to: str, subject: str, html_body: str) -> None:
username = config.get("smtp_username", "")
password = config.get("smtp_password", "")
from_address = config.get("smtp_from_address", "")
- from_name = config.get("smtp_from_name", "Fabled Assistant")
+ from_name = config.get("smtp_from_name", "Fabled Scribe")
use_tls = config.get("smtp_use_tls", "true") == "true"
msg = EmailMessage()
@@ -176,6 +176,6 @@ async def send_test_email(to: str) -> None:
"""Send a branded test email."""
body = """
SMTP is configured correctly
- Your Fabled Assistant instance can send email notifications.
+ Your Fabled Scribe instance can send email notifications.
"""
- await send_email(to, "Fabled Assistant - Test Email", _email_html("Test Email", body))
+ await send_email(to, "Fabled Scribe - Test Email", _email_html("Test Email", body))
diff --git a/src/fabledassistant/services/llm.py b/src/fabledassistant/services/llm.py
index 676aab0..ba8060a 100644
--- a/src/fabledassistant/services/llm.py
+++ b/src/fabledassistant/services/llm.py
@@ -632,7 +632,7 @@ async def build_context(
tool_guidance = "\n".join(tool_lines)
static_block = (
- f"You are a helpful assistant named {assistant_name}, integrated into a note-taking and task-tracking app called Fabled Assistant. "
+ f"You are a helpful assistant named {assistant_name}, integrated into a note-taking and task-tracking app called Fabled Scribe. "
"Help users with their notes, tasks, and general questions. "
"When note context is provided, use it to give relevant answers.\n\n"
f"{tool_guidance}"
diff --git a/src/fabledassistant/services/notifications.py b/src/fabledassistant/services/notifications.py
index a6c4b71..2ec1cb6 100644
--- a/src/fabledassistant/services/notifications.py
+++ b/src/fabledassistant/services/notifications.py
@@ -91,7 +91,7 @@ async def notify_security_event(
If this wasn't you, change your password immediately.
"""
- await send_email(email, f"Fabled Assistant - {label}", _email_html("Security Alert", body))
+ await send_email(email, f"Fabled Scribe - {label}", _email_html("Security Alert", body))
except Exception:
logger.exception("Failed to send security notification for user %d", user_id)
@@ -113,7 +113,7 @@ async def send_password_reset_email(email: str, reset_url: str) -> None:
If the button doesn't work, copy and paste this link:
{reset_url}
"""
- await send_email(email, "Fabled Assistant - Password Reset", _email_html("Password Reset", body))
+ await send_email(email, "Fabled Scribe - Password Reset", _email_html("Password Reset", body))
async def send_password_reset_success_email(email: str) -> None:
@@ -125,14 +125,14 @@ async def send_password_reset_success_email(email: str) -> None:
If you didn't make this change, please contact your administrator immediately.
"""
- await send_email(email, "Fabled Assistant - Password Changed", _email_html("Password Changed", body))
+ await send_email(email, "Fabled Scribe - Password Changed", _email_html("Password Changed", body))
async def send_invitation_email(email: str, invite_url: str, invited_by_username: str) -> None:
"""Send a branded invitation email with a registration link."""
body = f"""
- {invited_by_username} has invited you to join Fabled Assistant.
+ {invited_by_username} has invited you to join Fabled Scribe.
Click the button below to create your account.
@@ -146,7 +146,7 @@ async def send_invitation_email(email: str, invite_url: str, invited_by_username
If the button doesn't work, copy and paste this link:
{invite_url}
"""
- await send_email(email, "Fabled Assistant - You're Invited!", _email_html("You're Invited!", body))
+ await send_email(email, "Fabled Scribe - You're Invited!", _email_html("You're Invited!", body))
async def check_due_tasks() -> None:
@@ -225,7 +225,7 @@ async def check_due_tasks() -> None:
{task_rows}
"""
- await send_email(email, f"Fabled Assistant - {len(user_tasks)} Task(s) Due", _email_html("Task Reminders", body))
+ await send_email(email, f"Fabled Scribe - {len(user_tasks)} Task(s) Due", _email_html("Task Reminders", body))
await log_audit(
"task_reminder",
user_id=user_id,