diff --git a/src/components/sidebar/view/Sidebar.tsx b/src/components/sidebar/view/Sidebar.tsx
index cba08749..fefb6dca 100644
--- a/src/components/sidebar/view/Sidebar.tsx
+++ b/src/components/sidebar/view/Sidebar.tsx
@@ -266,6 +266,7 @@ function Sidebar({
updateAvailable={updateAvailable}
releaseInfo={releaseInfo}
latestVersion={latestVersion}
+ currentVersion={currentVersion}
onShowVersionModal={() => setShowVersionModal(true)}
onShowSettings={onShowSettings}
projectListProps={projectListProps}
diff --git a/src/components/sidebar/view/subcomponents/GitHubStarBadge.tsx b/src/components/sidebar/view/subcomponents/GitHubStarBadge.tsx
new file mode 100644
index 00000000..539710c4
--- /dev/null
+++ b/src/components/sidebar/view/subcomponents/GitHubStarBadge.tsx
@@ -0,0 +1,48 @@
+import { Star, X } from 'lucide-react';
+import { useGitHubStars } from '../../../../hooks/useGitHubStars';
+import { IS_PLATFORM } from '../../../../constants/config';
+
+const GITHUB_REPO_URL = 'https://github.com/siteboon/claudecodeui';
+
+function GitHubIcon({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+export default function GitHubStarBadge() {
+ const { formattedCount, isDismissed, dismiss } = useGitHubStars('siteboon', 'claudecodeui');
+
+ if (IS_PLATFORM || isDismissed) return null;
+
+ return (
+
+ );
+}
diff --git a/src/components/sidebar/view/subcomponents/SidebarCollapsed.tsx b/src/components/sidebar/view/subcomponents/SidebarCollapsed.tsx
index e09ceb87..90a6338f 100644
--- a/src/components/sidebar/view/subcomponents/SidebarCollapsed.tsx
+++ b/src/components/sidebar/view/subcomponents/SidebarCollapsed.tsx
@@ -1,7 +1,8 @@
-import { Settings, Sparkles, PanelLeftOpen } from 'lucide-react';
+import { Settings, Sparkles, PanelLeftOpen, Bug } from 'lucide-react';
import type { TFunction } from 'i18next';
const DISCORD_INVITE_URL = 'https://discord.gg/buxwujPNRE';
+const GITHUB_ISSUES_URL = 'https://github.com/siteboon/claudecodeui/issues/new';
function DiscordIcon({ className }: { className?: string }) {
return (
@@ -50,6 +51,18 @@ export default function SidebarCollapsed({
void;
onShowSettings: () => void;
projectListProps: SidebarProjectListProps;
@@ -83,6 +84,7 @@ export default function SidebarContent({
updateAvailable,
releaseInfo,
latestVersion,
+ currentVersion,
onShowVersionModal,
onShowSettings,
projectListProps,
@@ -217,6 +219,7 @@ export default function SidebarContent({
updateAvailable={updateAvailable}
releaseInfo={releaseInfo}
latestVersion={latestVersion}
+ currentVersion={currentVersion}
onShowVersionModal={onShowVersionModal}
onShowSettings={onShowSettings}
t={t}
diff --git a/src/components/sidebar/view/subcomponents/SidebarFooter.tsx b/src/components/sidebar/view/subcomponents/SidebarFooter.tsx
index afa0c6a1..b024be30 100644
--- a/src/components/sidebar/view/subcomponents/SidebarFooter.tsx
+++ b/src/components/sidebar/view/subcomponents/SidebarFooter.tsx
@@ -1,7 +1,11 @@
-import { Settings, ArrowUpCircle } from 'lucide-react';
+import { Settings, ArrowUpCircle, Bug } from 'lucide-react';
import type { TFunction } from 'i18next';
+import { IS_PLATFORM } from '../../../../constants/config';
import type { ReleaseInfo } from '../../../../types/sharedTypes';
+const GITHUB_ISSUES_URL = 'https://github.com/siteboon/claudecodeui/issues/new';
+const GITHUB_REPO_URL = 'https://github.com/siteboon/claudecodeui';
+
const DISCORD_INVITE_URL = 'https://discord.gg/buxwujPNRE';
function DiscordIcon({ className }: { className?: string }) {
@@ -16,6 +20,7 @@ type SidebarFooterProps = {
updateAvailable: boolean;
releaseInfo: ReleaseInfo | null;
latestVersion: string | null;
+ currentVersion: string;
onShowVersionModal: () => void;
onShowSettings: () => void;
t: TFunction;
@@ -25,6 +30,7 @@ export default function SidebarFooter({
updateAvailable,
releaseInfo,
latestVersion,
+ currentVersion,
onShowVersionModal,
onShowSettings,
t,
@@ -79,11 +85,24 @@ export default function SidebarFooter({
>
)}
- {/* Discord + Settings */}
+ {/* Community + Settings */}
- {/* Desktop Discord */}
+ {/* Desktop Report Issue */}
+
+ {/* Desktop Discord */}
+
- {/* Mobile Discord */}
+ {/* Desktop version brand line (OSS mode only) */}
+ {!IS_PLATFORM && (
+
+ )}
+
+ {/* Mobile Report Issue */}
+
+ {/* Mobile Discord */}
+
+
+
{/* Search bar */}
{projectsCount > 0 && !isLoading && (
diff --git a/src/hooks/useGitHubStars.ts b/src/hooks/useGitHubStars.ts
new file mode 100644
index 00000000..2e731817
--- /dev/null
+++ b/src/hooks/useGitHubStars.ts
@@ -0,0 +1,77 @@
+import { useState, useEffect, useCallback } from 'react';
+
+const CACHE_KEY = 'CLOUDCLI_GITHUB_STARS';
+const DISMISS_KEY = 'CLOUDCLI_HIDE_GITHUB_STAR';
+const CACHE_TTL = 60 * 60 * 1000; // 1 hour
+
+type CachedStars = {
+ count: number;
+ timestamp: number;
+};
+
+export const useGitHubStars = (owner: string, repo: string) => {
+ const [starCount, setStarCount] = useState(null);
+ const [isDismissed, setIsDismissed] = useState(() => {
+ try {
+ return localStorage.getItem(DISMISS_KEY) === 'true';
+ } catch {
+ return false;
+ }
+ });
+
+ useEffect(() => {
+ if (isDismissed) return;
+
+ // Check cache first
+ try {
+ const cached = localStorage.getItem(CACHE_KEY);
+ if (cached) {
+ const parsed: CachedStars = JSON.parse(cached);
+ if (Date.now() - parsed.timestamp < CACHE_TTL) {
+ setStarCount(parsed.count);
+ return;
+ }
+ }
+ } catch {
+ // ignore
+ }
+
+ const fetchStars = async () => {
+ try {
+ const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`);
+ if (!response.ok) return;
+ const data = await response.json();
+ const count = data.stargazers_count;
+ if (typeof count === 'number') {
+ setStarCount(count);
+ try {
+ localStorage.setItem(CACHE_KEY, JSON.stringify({ count, timestamp: Date.now() }));
+ } catch {
+ // ignore
+ }
+ }
+ } catch {
+ // silent fail
+ }
+ };
+
+ void fetchStars();
+ }, [owner, repo, isDismissed]);
+
+ const dismiss = useCallback(() => {
+ setIsDismissed(true);
+ try {
+ localStorage.setItem(DISMISS_KEY, 'true');
+ } catch {
+ // ignore
+ }
+ }, []);
+
+ const formattedCount = starCount !== null
+ ? starCount >= 1000
+ ? `${(starCount / 1000).toFixed(1)}k`
+ : `${starCount}`
+ : null;
+
+ return { starCount, formattedCount, isDismissed, dismiss };
+};
diff --git a/src/i18n/locales/de/auth.json b/src/i18n/locales/de/auth.json
index 9b8327cb..0a1d5226 100644
--- a/src/i18n/locales/de/auth.json
+++ b/src/i18n/locales/de/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "Willkommen zurück",
- "description": "Meld dich bei deinem Claude Code UI-Konto an",
+ "description": "Meld dich bei deinem CloudCLI-Konto an",
"username": "Benutzername",
"password": "Passwort",
"submit": "Anmelden",
diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json
index 1b1d4c7d..bc4c7473 100644
--- a/src/i18n/locales/de/common.json
+++ b/src/i18n/locales/de/common.json
@@ -84,7 +84,7 @@
"openInEditor": "Im Editor öffnen"
},
"mainContent": {
- "loading": "Claude Code UI wird geladen",
+ "loading": "CloudCLI wird geladen",
"settingUpWorkspace": "Arbeitsbereich wird eingerichtet...",
"chooseProject": "Projekt auswählen",
"selectProjectDescription": "Wähl ein Projekt aus der Seitenleiste, um mit Claude zu programmieren. Jedes Projekt enthält deine Chat-Sitzungen und den Dateiverlauf.",
diff --git a/src/i18n/locales/de/settings.json b/src/i18n/locales/de/settings.json
index 25c289dd..84f5e2db 100644
--- a/src/i18n/locales/de/settings.json
+++ b/src/i18n/locales/de/settings.json
@@ -105,7 +105,8 @@
"git": "Git",
"apiTokens": "API & Token",
"tasks": "Aufgaben",
- "plugins": "Plugins"
+ "plugins": "Plugins",
+ "about": "Info"
},
"appearanceSettings": {
"darkMode": {
diff --git a/src/i18n/locales/de/sidebar.json b/src/i18n/locales/de/sidebar.json
index 8727f103..8b26756c 100644
--- a/src/i18n/locales/de/sidebar.json
+++ b/src/i18n/locales/de/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "Führ Claude CLI in einem Projektverzeichnis aus, um zu beginnen"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "KI-Programmierassistent-Oberfläche"
},
"sessions": {
@@ -65,7 +65,12 @@
"save": "Speichern",
"delete": "Löschen",
"rename": "Umbenennen",
- "joinCommunity": "Community beitreten"
+ "joinCommunity": "Community beitreten",
+ "reportIssue": "Problem melden",
+ "starOnGithub": "Stern auf GitHub"
+ },
+ "branding": {
+ "openSource": "Open Source"
},
"status": {
"active": "Aktiv",
diff --git a/src/i18n/locales/en/auth.json b/src/i18n/locales/en/auth.json
index 2788855f..5ca25fd2 100644
--- a/src/i18n/locales/en/auth.json
+++ b/src/i18n/locales/en/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "Welcome Back",
- "description": "Sign in to your Claude Code UI account",
+ "description": "Sign in to your CloudCLI self-hosted account",
"username": "Username",
"password": "Password",
"submit": "Sign In",
diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json
index 928bdaf1..0d25fedf 100644
--- a/src/i18n/locales/en/common.json
+++ b/src/i18n/locales/en/common.json
@@ -84,7 +84,7 @@
"openInEditor": "Open in Editor"
},
"mainContent": {
- "loading": "Loading Claude Code UI",
+ "loading": "Loading CloudCLI",
"settingUpWorkspace": "Setting up your workspace...",
"chooseProject": "Choose Your Project",
"selectProjectDescription": "Select a project from the sidebar to start coding with Claude. Each project contains your chat sessions and file history.",
diff --git a/src/i18n/locales/en/settings.json b/src/i18n/locales/en/settings.json
index 8596e045..ce3de906 100644
--- a/src/i18n/locales/en/settings.json
+++ b/src/i18n/locales/en/settings.json
@@ -106,8 +106,8 @@
"apiTokens": "API & Tokens",
"tasks": "Tasks",
"notifications": "Notifications",
- "plugins": "Plugins"
-
+ "plugins": "Plugins",
+ "about": "About"
},
"notifications": {
"title": "Notifications",
diff --git a/src/i18n/locales/en/sidebar.json b/src/i18n/locales/en/sidebar.json
index a56c1b84..eab0a3f3 100644
--- a/src/i18n/locales/en/sidebar.json
+++ b/src/i18n/locales/en/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "Run Claude CLI in a project directory to get started"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "AI coding assistant interface"
},
"sessions": {
@@ -65,7 +65,12 @@
"save": "Save",
"delete": "Delete",
"rename": "Rename",
- "joinCommunity": "Join Community"
+ "joinCommunity": "Join Community",
+ "reportIssue": "Report Issue",
+ "starOnGithub": "Star on GitHub"
+ },
+ "branding": {
+ "openSource": "Open Source"
},
"status": {
"active": "Active",
diff --git a/src/i18n/locales/ja/auth.json b/src/i18n/locales/ja/auth.json
index ce946497..d1ba9fd8 100644
--- a/src/i18n/locales/ja/auth.json
+++ b/src/i18n/locales/ja/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "おかえりなさい",
- "description": "Claude Code UIアカウントにサインイン",
+ "description": "CloudCLIアカウントにサインイン",
"username": "ユーザー名",
"password": "パスワード",
"submit": "サインイン",
diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json
index 59c33c98..097eb057 100644
--- a/src/i18n/locales/ja/common.json
+++ b/src/i18n/locales/ja/common.json
@@ -84,7 +84,7 @@
"openInEditor": "エディタで開く"
},
"mainContent": {
- "loading": "Claude Code UI を読み込んでいます",
+ "loading": "CloudCLI を読み込んでいます",
"settingUpWorkspace": "ワークスペースを準備しています...",
"chooseProject": "プロジェクトを選択",
"selectProjectDescription": "サイドバーからプロジェクトを選択して、Claudeとコーディングを始めましょう。各プロジェクトにはチャットセッションとファイル履歴が含まれています。",
diff --git a/src/i18n/locales/ja/settings.json b/src/i18n/locales/ja/settings.json
index 60b454ca..c9cc282d 100644
--- a/src/i18n/locales/ja/settings.json
+++ b/src/i18n/locales/ja/settings.json
@@ -106,8 +106,8 @@
"apiTokens": "API & トークン",
"tasks": "タスク",
"notifications": "通知",
- "plugins": "プラグイン"
-
+ "plugins": "プラグイン",
+ "about": "概要"
},
"notifications": {
"title": "通知",
diff --git a/src/i18n/locales/ja/sidebar.json b/src/i18n/locales/ja/sidebar.json
index 17813411..4590c752 100644
--- a/src/i18n/locales/ja/sidebar.json
+++ b/src/i18n/locales/ja/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "プロジェクトディレクトリでClaude CLIを実行して始めましょう"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "AIコーディングアシスタント"
},
"sessions": {
@@ -64,7 +64,12 @@
"save": "保存",
"delete": "削除",
"rename": "名前の変更",
- "joinCommunity": "コミュニティに参加"
+ "joinCommunity": "コミュニティに参加",
+ "reportIssue": "問題を報告",
+ "starOnGithub": "GitHubでスター"
+ },
+ "branding": {
+ "openSource": "オープンソース"
},
"status": {
"active": "アクティブ",
diff --git a/src/i18n/locales/ko/auth.json b/src/i18n/locales/ko/auth.json
index ebfef608..08f09e74 100644
--- a/src/i18n/locales/ko/auth.json
+++ b/src/i18n/locales/ko/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "다시 오신 것을 환영합니다",
- "description": "Claude Code UI 계정에 로그인하세요",
+ "description": "CloudCLI 계정에 로그인하세요",
"username": "사용자명",
"password": "비밀번호",
"submit": "로그인",
diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json
index 95004280..b3554401 100644
--- a/src/i18n/locales/ko/common.json
+++ b/src/i18n/locales/ko/common.json
@@ -84,7 +84,7 @@
"openInEditor": "에디터에서 열기"
},
"mainContent": {
- "loading": "Claude Code UI 로딩 중",
+ "loading": "CloudCLI 로딩 중",
"settingUpWorkspace": "워크스페이스 설정 중...",
"chooseProject": "프로젝트 선택",
"selectProjectDescription": "사이드바에서 프로젝트를 선택하여 Claude와 코딩을 시작하세요. 각 프로젝트에는 채팅 세션과 파일 히스토리가 포함됩니다.",
diff --git a/src/i18n/locales/ko/settings.json b/src/i18n/locales/ko/settings.json
index b8a1f450..1071cc37 100644
--- a/src/i18n/locales/ko/settings.json
+++ b/src/i18n/locales/ko/settings.json
@@ -106,8 +106,8 @@
"apiTokens": "API & 토큰",
"tasks": "작업",
"notifications": "알림",
- "plugins": "플러그인"
-
+ "plugins": "플러그인",
+ "about": "정보"
},
"notifications": {
"title": "알림",
diff --git a/src/i18n/locales/ko/sidebar.json b/src/i18n/locales/ko/sidebar.json
index 2eaca911..cda7eab2 100644
--- a/src/i18n/locales/ko/sidebar.json
+++ b/src/i18n/locales/ko/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "프로젝트 디렉토리에서 Claude CLI를 실행하여 시작하세요"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "AI 코딩 어시스턴트 UI"
},
"sessions": {
@@ -64,7 +64,12 @@
"save": "저장",
"delete": "삭제",
"rename": "이름 변경",
- "joinCommunity": "커뮤니티 참여"
+ "joinCommunity": "커뮤니티 참여",
+ "reportIssue": "문제 신고",
+ "starOnGithub": "GitHub에서 스타"
+ },
+ "branding": {
+ "openSource": "오픈 소스"
},
"status": {
"active": "활성",
diff --git a/src/i18n/locales/ru/auth.json b/src/i18n/locales/ru/auth.json
index b81fd562..919a4a30 100644
--- a/src/i18n/locales/ru/auth.json
+++ b/src/i18n/locales/ru/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "Добро пожаловать",
- "description": "Войдите в свой аккаунт Claude Code UI",
+ "description": "Войдите в свой аккаунт CloudCLI",
"username": "Имя пользователя",
"password": "Пароль",
"submit": "Войти",
diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json
index 665ab6f8..906b78eb 100644
--- a/src/i18n/locales/ru/common.json
+++ b/src/i18n/locales/ru/common.json
@@ -84,7 +84,7 @@
"openInEditor": "Открыть в редакторе"
},
"mainContent": {
- "loading": "Загрузка Claude Code UI",
+ "loading": "Загрузка CloudCLI",
"settingUpWorkspace": "Настройка рабочего пространства...",
"chooseProject": "Выберите проект",
"selectProjectDescription": "Выберите проект на боковой панели, чтобы начать работу с Claude. Каждый проект содержит ваши сеансы чата и историю файлов.",
diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json
index f8991ab0..da287733 100644
--- a/src/i18n/locales/ru/settings.json
+++ b/src/i18n/locales/ru/settings.json
@@ -105,7 +105,8 @@
"git": "Git",
"apiTokens": "API и токены",
"tasks": "Задачи",
- "plugins": "Плагины"
+ "plugins": "Плагины",
+ "about": "О программе"
},
"appearanceSettings": {
"darkMode": {
diff --git a/src/i18n/locales/ru/sidebar.json b/src/i18n/locales/ru/sidebar.json
index d79a9d3d..71250d2f 100644
--- a/src/i18n/locales/ru/sidebar.json
+++ b/src/i18n/locales/ru/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "Запустите Claude CLI в каталоге проекта для начала работы"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "Интерфейс AI помощника для программирования"
},
"sessions": {
@@ -65,7 +65,12 @@
"save": "Сохранить",
"delete": "Удалить",
"rename": "Переименовать",
- "joinCommunity": "Присоединиться к сообществу"
+ "joinCommunity": "Присоединиться к сообществу",
+ "reportIssue": "Сообщить о проблеме",
+ "starOnGithub": "Звезда на GitHub"
+ },
+ "branding": {
+ "openSource": "Открытый исходный код"
},
"status": {
"active": "Активен",
diff --git a/src/i18n/locales/zh-CN/auth.json b/src/i18n/locales/zh-CN/auth.json
index 3905c2bd..3d790f37 100644
--- a/src/i18n/locales/zh-CN/auth.json
+++ b/src/i18n/locales/zh-CN/auth.json
@@ -1,7 +1,7 @@
{
"login": {
"title": "欢迎回来",
- "description": "登录您的 Claude Code UI 账户",
+ "description": "登录您的 CloudCLI 账户",
"username": "用户名",
"password": "密码",
"submit": "登录",
diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json
index 710daf5e..936fe5b2 100644
--- a/src/i18n/locales/zh-CN/common.json
+++ b/src/i18n/locales/zh-CN/common.json
@@ -84,7 +84,7 @@
"openInEditor": "在编辑器中打开"
},
"mainContent": {
- "loading": "正在加载 Claude Code UI",
+ "loading": "正在加载 CloudCLI",
"settingUpWorkspace": "正在设置您的工作空间...",
"chooseProject": "选择您的项目",
"selectProjectDescription": "从侧边栏选择一个项目以开始使用 Claude 进行编程。每个项目包含您的聊天会话和文件历史。",
diff --git a/src/i18n/locales/zh-CN/settings.json b/src/i18n/locales/zh-CN/settings.json
index d9f2b2cd..789eb612 100644
--- a/src/i18n/locales/zh-CN/settings.json
+++ b/src/i18n/locales/zh-CN/settings.json
@@ -106,8 +106,8 @@
"apiTokens": "API 和令牌",
"tasks": "任务",
"notifications": "通知",
- "plugins": "插件"
-
+ "plugins": "插件",
+ "about": "关于"
},
"notifications": {
"title": "通知",
diff --git a/src/i18n/locales/zh-CN/sidebar.json b/src/i18n/locales/zh-CN/sidebar.json
index 27cacec5..3a28778c 100644
--- a/src/i18n/locales/zh-CN/sidebar.json
+++ b/src/i18n/locales/zh-CN/sidebar.json
@@ -20,7 +20,7 @@
"runClaudeCli": "在项目目录中运行 Claude CLI 以开始使用"
},
"app": {
- "title": "Claude Code UI",
+ "title": "CloudCLI",
"subtitle": "AI 编程助手"
},
"sessions": {
@@ -65,7 +65,12 @@
"save": "保存",
"delete": "删除",
"rename": "重命名",
- "joinCommunity": "加入社区"
+ "joinCommunity": "加入社区",
+ "reportIssue": "报告问题",
+ "starOnGithub": "在GitHub上加星"
+ },
+ "branding": {
+ "openSource": "开源"
},
"status": {
"active": "活动",