Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Scope

This repository contains the offline macOS Community App, its loopback-only
This repository contains the offline macOS App, its loopback-only
theme engine, three original starter themes, and tests. Do not add production
backend, deployment, Firebase, analytics, remote-device, account, or update
infrastructure.
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## 0.1.0 — 2026-08-11

- Added a native, offline macOS Community App for applying and restoring Codex
- Added a native, offline macOS App for applying and restoring Codex
themes.
- Included three original starter themes and an open local theme format.
- Added loopback-only injection, signature validation, transactional theme
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Contributing

Thank you for helping improve AI ThemeStore Community.
Thank you for helping improve AI ThemeStore.

1. Fork the repository and create a focused branch.
2. Keep changes within the offline Community scope.
2. Keep changes within the offline, local-only project scope.
3. Run `./tests/run-tests.sh` on macOS.
4. Describe the user impact and actual checks in the pull request.
5. Include screenshots for visual changes.
Expand Down
4 changes: 2 additions & 2 deletions NOTICE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Notices

AI ThemeStore Community is an unofficial customization project. It is not
AI ThemeStore is an unofficial customization project. It is not
affiliated with, endorsed by, or sponsored by OpenAI.

The MIT License applies to the source code and the three original starter
Expand All @@ -14,7 +14,7 @@ UI, text, or watermarks.

Screenshots under `docs/images/` are sanitized, high-fidelity previews rendered
with project-owned themes. Some showcase themes come from the wider ThemeStore
catalog and are not bundled with this Community app. The previews contain a
catalog and are not bundled with this app. The previews contain a
simulated Codex interface for demonstration only and no real account, project,
or conversation data. No third-party character fan artwork is included. OpenAI
and Codex names and interface elements remain the property of their respective
Expand Down
10 changes: 5 additions & 5 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@
import PackageDescription

let package = Package(
name: "AIThemeStoreCommunity",
name: "AIThemeStore",
platforms: [.macOS(.v13)],
products: [
.executable(
name: "ai-themestore-community",
targets: ["AIThemeStoreCommunity"]
name: "ai-themestore",
targets: ["AIThemeStore"]
),
],
targets: [
.executableTarget(
name: "AIThemeStoreCommunity",
path: "Sources/AIThemeStoreCommunity"
name: "AIThemeStore",
path: "Sources/AIThemeStore"
),
]
)
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
<strong>English</strong> · <a href="./README.zh-CN.md">简体中文</a>
</p>

# AI ThemeStore Community
# AI ThemeStore

An open-source, offline theme app for **Codex Desktop on macOS**. It gives the
Codex workspace a visual identity while keeping the official app intact and
making every change reversible.

[![macOS 13+](https://img.shields.io/badge/macOS-13%2B-111827?logo=apple)](https://github.com/hackergene/AI-ThemeStore-Community/releases/latest)
[![macOS 13+](https://img.shields.io/badge/macOS-13%2B-111827?logo=apple)](https://github.com/hackergene/AI-ThemeStore/releases/latest)
[![SwiftUI App](https://img.shields.io/badge/app-SwiftUI-F05138?logo=swift&logoColor=white)](#technology-stack)
[![JavaScript Engine](https://img.shields.io/badge/engine-JavaScript-F7DF1E?logo=javascript&logoColor=111827)](#technology-stack)
[![MIT License](https://img.shields.io/badge/license-MIT-25D9FF.svg)](./LICENSE)
[![Offline](https://img.shields.io/badge/runtime-offline-8A6CFF.svg)](#privacy-and-safety)

> AI ThemeStore Community is an independent, unofficial project. It is not
> AI ThemeStore is an independent, unofficial project. It is not
> affiliated with, endorsed by, or sponsored by OpenAI.

## Codex, themed
Expand All @@ -41,7 +41,7 @@ No third-party character fan art is included in this repository.

## Technology stack

AI ThemeStore Community is a hybrid native macOS app: **Swift and SwiftUI**
AI ThemeStore is a hybrid native macOS app: **Swift and SwiftUI**
provide the application interface, while a local **JavaScript and CSS theme
engine** handles Codex theming, verification, and recovery.

Expand All @@ -58,7 +58,7 @@ JavaScript even though the user-facing application is native SwiftUI.
## What we learned from theming Codex

Codex is a living product, so a durable theme cannot be just a wallpaper or a
collection of fragile selectors. The Community engine is built around a few
collection of fragile selectors. The theme engine is built around a few
practical lessons:

1. **Theme the complete workflow.** New Chat and active tasks must share the
Expand All @@ -80,26 +80,26 @@ customization boundary understandable and recoverable.

### Download

Download the latest build from [GitHub Releases](https://github.com/hackergene/AI-ThemeStore-Community/releases/latest).
Download the latest build from [GitHub Releases](https://github.com/hackergene/AI-ThemeStore/releases/latest).

### Build from source

Requirements: macOS 13 or newer, the official Codex Desktop app, and Xcode
Command Line Tools.

```bash
git clone https://github.com/hackergene/AI-ThemeStore-Community.git
cd AI-ThemeStore-Community
git clone https://github.com/hackergene/AI-ThemeStore.git
cd AI-ThemeStore
./scripts/build-app.sh
open "dist/AI ThemeStore Community.app"
open "dist/AI ThemeStore.app"
```

The build script creates the Community app locally. It does not modify or
The build script creates the app locally. It does not modify or
re-sign the official Codex app.

### Use the app

1. Open AI ThemeStore Community.
1. Open AI ThemeStore.
2. Select a local theme and choose **Apply Theme**.
3. The app restarts Codex and verifies the themed New Chat and task surfaces.
4. Choose **Restore Codex Appearance** whenever you want the native look back.
Expand All @@ -122,12 +122,12 @@ a minimal example.

## Privacy and safety

The Community edition works offline and contains no telemetry or account code.
AI ThemeStore works offline and contains no telemetry or account code.
Its debugging connection is bound to `127.0.0.1` only. Because a local debugging
port is sensitive while a theme is active, avoid running untrusted local
software at the same time. Read the full boundary in [SECURITY.md](./SECURITY.md).

## Community and full edition
## Project scope

This repository is intentionally focused on a small, auditable, offline Codex
theme experience. The broader theme catalog and hosted browsing experience are
Expand Down
26 changes: 13 additions & 13 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
<a href="./README.md">English</a> · <strong>简体中文</strong>
</p>

# AI ThemeStore Community
# AI ThemeStore

一套面向 **macOS Codex Desktop** 的开源离线主题 App。它可以为 Codex
工作区加入完整的视觉主题,同时保持官方 App 完整,所有改动均可恢复。

[![macOS 13+](https://img.shields.io/badge/macOS-13%2B-111827?logo=apple)](https://github.com/hackergene/AI-ThemeStore-Community/releases/latest)
[![macOS 13+](https://img.shields.io/badge/macOS-13%2B-111827?logo=apple)](https://github.com/hackergene/AI-ThemeStore/releases/latest)
[![SwiftUI App](https://img.shields.io/badge/app-SwiftUI-F05138?logo=swift&logoColor=white)](#技术栈)
[![JavaScript Engine](https://img.shields.io/badge/engine-JavaScript-F7DF1E?logo=javascript&logoColor=111827)](#技术栈)
[![MIT License](https://img.shields.io/badge/license-MIT-25D9FF.svg)](./LICENSE)
[![Offline](https://img.shields.io/badge/runtime-offline-8A6CFF.svg)](#隐私与安全)

> AI ThemeStore Community 是独立的非官方项目,与 OpenAI 无隶属、背书或赞助关系。
> AI ThemeStore 是独立的非官方项目,与 OpenAI 无隶属、背书或赞助关系。

## Codex 主题效果

Expand All @@ -37,7 +37,7 @@

## 技术栈

AI ThemeStore Community 是一套混合架构的原生 macOS App:**Swift 与
AI ThemeStore 是一套混合架构的原生 macOS App:**Swift 与
SwiftUI** 提供应用界面,本地 **JavaScript 与 CSS 主题引擎**负责 Codex
主题应用、验证和恢复。

Expand All @@ -54,7 +54,7 @@ GitHub 的语言标签依据源码字节数计算,因此即使用户看到的
## 适配 Codex 的实践经验

Codex 是持续演进的产品,因此稳定主题不能只是一张壁纸,也不能依赖一组脆弱的
选择器。Community 引擎基于以下实践构建
选择器。主题引擎基于以下实践构建

1. **覆盖完整工作流。** New Chat 与运行中任务应使用统一视觉语言,包括任务卡、
输入区、侧边栏和分层面板。
Expand All @@ -74,25 +74,25 @@ Codex 是持续演进的产品,因此稳定主题不能只是一张壁纸,

### 下载

从 [GitHub Releases](https://github.com/hackergene/AI-ThemeStore-Community/releases/latest)
从 [GitHub Releases](https://github.com/hackergene/AI-ThemeStore/releases/latest)
下载最新版本。

### 从源码构建

需要 macOS 13 或更高版本、官方 Codex Desktop App,以及 Xcode Command Line Tools。

```bash
git clone https://github.com/hackergene/AI-ThemeStore-Community.git
cd AI-ThemeStore-Community
git clone https://github.com/hackergene/AI-ThemeStore.git
cd AI-ThemeStore
./scripts/build-app.sh
open "dist/AI ThemeStore Community.app"
open "dist/AI ThemeStore.app"
```

构建脚本只生成本地 Community App,不会修改或重新签名官方 Codex App。
构建脚本只生成本地 App,不会修改或重新签名官方 Codex App。

### 使用 App

1. 打开 AI ThemeStore Community
1. 打开 AI ThemeStore。
2. 选择本地主题并点击“应用主题”。
3. App 会重启 Codex,并验证 New Chat 与任务页的主题状态。
4. 随时点击“恢复 Codex 外观”即可回到原生界面。
Expand All @@ -114,11 +114,11 @@ open "dist/AI ThemeStore Community.app"

## 隐私与安全

Community 版离线运行,不包含遥测或账号代码。调试连接仅绑定 `127.0.0.1`。
AI ThemeStore 离线运行,不包含遥测或账号代码。调试连接仅绑定 `127.0.0.1`。
主题启用期间,本地调试端口属于敏感能力,请勿同时运行不可信的本机软件。完整边界
见 [SECURITY.md](./SECURITY.md)。

## Community 与完整版
## 项目边界

本仓库有意保持为一套小型、可审计、离线的 Codex 主题体验。更多主题及在线浏览
体验请访问 [themestore.ai](https://themestore.ai)。
Expand Down
8 changes: 4 additions & 4 deletions Resources/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleDisplayName</key>
<string>AI ThemeStore Community</string>
<string>AI ThemeStore</string>
<key>CFBundleExecutable</key>
<string>ai-themestore-community</string>
<string>ai-themestore</string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIdentifier</key>
<string>ai.themestore.community</string>
<string>ai.themestore.opensource</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>AI ThemeStore Community</string>
<string>AI ThemeStore</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

## Supported version

Security fixes are provided for the latest Community release.
Security fixes are provided for the latest release.

## Runtime boundary

AI ThemeStore Community does not modify the official Codex application. It
AI ThemeStore does not modify the official Codex application. It
launches Codex with a Chromium DevTools endpoint bound to `127.0.0.1`, validates
the official app and bundled Node.js signatures, and injects only into verified
Codex renderer targets.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import SwiftUI

@main
struct AIThemeStoreCommunityApp: App {
struct AIThemeStoreApp: App {
@StateObject private var model = AppModel()

var body: some Scene {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Foundation

@MainActor
final class AppModel: ObservableObject {
@Published private(set) var themes: [CommunityTheme] = []
@Published private(set) var themes: [ThemeModel] = []
@Published private(set) var runtime = RuntimeStatus.unavailable
@Published private(set) var busy = false
@Published private(set) var activity = "正在读取本地主题…"
Expand Down Expand Up @@ -54,7 +54,7 @@ final class AppModel: ObservableObject {
}
}

func apply(_ theme: CommunityTheme) async {
func apply(_ theme: ThemeModel) async {
guard !busy else { return }
busy = true
activity = "正在应用 \(theme.name)…"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ struct BridgeClient: Sendable {

func apply(themeID: String) async throws -> RuntimeStatus {
guard ThemeLibrary.isSafeThemeID(themeID) else {
throw CommunityError.invalidTheme("主题 ID 不安全。")
throw ThemeStoreError.invalidTheme("主题 ID 不安全。")
}
return try await run(action: "apply", themeID: themeID)
}
Expand All @@ -30,7 +30,7 @@ struct BridgeClient: Sendable {
return bundled
}
}
if let root = ProcessInfo.processInfo.environment["THEMESTORE_COMMUNITY_ROOT"] {
if let root = ProcessInfo.processInfo.environment["THEMESTORE_PROJECT_ROOT"] {
let development = URL(fileURLWithPath: root, isDirectory: true)
.appendingPathComponent("engine/scripts/app-bridge-macos.sh", isDirectory: false)
if FileManager.default.isExecutableFile(atPath: development.path) {
Expand All @@ -41,7 +41,7 @@ struct BridgeClient: Sendable {
}

private func run(action: String, themeID: String? = nil) async throws -> RuntimeStatus {
guard let executable = executableURL() else { throw CommunityError.bridgeUnavailable }
guard let executable = executableURL() else { throw ThemeStoreError.bridgeUnavailable }
let arguments = [action, themeID ?? "", "codex"]
let home = FileManager.default.homeDirectoryForCurrentUser.path

Expand All @@ -66,12 +66,12 @@ struct BridgeClient: Sendable {
guard process.terminationStatus == 0 else {
let message = String(data: errorData, encoding: .utf8)?
.trimmingCharacters(in: .whitespacesAndNewlines)
throw CommunityError.bridgeFailed(
throw ThemeStoreError.bridgeFailed(
message?.isEmpty == false ? message! : "本地主题操作失败。"
)
}
guard let status = try? JSONDecoder().decode(RuntimeStatus.self, from: outputData) else {
throw CommunityError.invalidBridgeResponse
throw ThemeStoreError.invalidBridgeResponse
}
return status
}.value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct ContentView: View {
.frame(minWidth: 940, minHeight: 680)
.task { await model.bootstrap() }
.alert(
"AI ThemeStore Community",
"AI ThemeStore",
isPresented: Binding(
get: { !model.alertMessage.isEmpty },
set: { if !$0 { model.alertMessage = "" } }
Expand All @@ -49,7 +49,7 @@ struct ContentView: View {
VStack(alignment: .leading, spacing: 8) {
Text("AI ThemeStore")
.font(.system(size: 34, weight: .bold, design: .rounded))
Text("COMMUNITY · OFFLINE MAC APP")
Text("OPEN SOURCE · OFFLINE MAC APP")
.font(.system(size: 12, weight: .semibold, design: .monospaced))
.foregroundStyle(.secondary)
Text("选择一套本地主题,为 Codex 换一张会呼吸的脸。")
Expand Down Expand Up @@ -134,7 +134,7 @@ struct ContentView: View {
}

private struct ThemeCard: View {
let theme: CommunityTheme
let theme: ThemeModel
let active: Bool
let disabled: Bool
let apply: () -> Void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ struct ThemeMetadata: Decodable, Sendable {
let assets: Assets
}

struct CommunityTheme: Identifiable, Sendable {
struct ThemeModel: Identifiable, Sendable {
let id: String
let metadata: ThemeMetadata
let directoryURL: URL
Expand All @@ -39,7 +39,7 @@ struct RuntimeStatus: Decodable, Sendable {
)
}

enum CommunityError: LocalizedError {
enum ThemeStoreError: LocalizedError {
case invalidTheme(String)
case bridgeUnavailable
case bridgeFailed(String)
Expand Down
Loading
Loading