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
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and

## [Unreleased]

### Added

- Added a local address book with searchable contacts, multiple labeled email addresses, favorites, notes, and quick create/edit actions from message participants (#81).
- Added recipient suggestions that prioritize saved contacts while retaining recent correspondents, with controls to suppress unwanted recent addresses (#81).
- Added standards-compatible vCard import and export with duplicate merging, partial-error reporting, UTF-8/folded-line support, and safe file/card limits (#81).
- Added contacts to local file and WebDAV settings backups using the backward-compatible v2 backup schema (#81).

## [0.1.4] - 2026-08-08

### Added
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,15 @@ Pebble currently supports Gmail, IMAP, POP3, and experimental Outlook accounts.

### Productivity tools

- Local address book with search, favorites, notes, multiple labeled email addresses, and one-click contact actions from message participants.
- Recipient autocomplete that prioritizes saved contacts and falls back to recent correspondents.
- vCard (`.vcf`) import and export for moving contacts between Pebble and other address books. Re-imports merge by normalized email; existing non-empty local names and notes take precedence over imported values.
- Kanban board with Todo, Waiting, and Done columns.
- Command palette and keyboard-first navigation.
- Built-in translation providers with bilingual reading and customizable shortcuts (`T` to translate selection, `Ctrl+Shift+T` to toggle bilingual view).
- Dark and light themes with wallpaper background support.
- English and Chinese UI.
- Optional local file export/import and WebDAV backup for settings, rules, Kanban cards, Kanban notes, and separately encrypted account secrets.
- Optional local file export/import and WebDAV backup for contacts, settings, rules, Kanban cards, Kanban notes, and separately encrypted account secrets.
- Automatic scheduled WebDAV backup with configurable interval.

### Platform integration
Expand Down
5 changes: 4 additions & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,15 @@ Pebble 目前支持 Gmail、IMAP、POP3,以及实验性的 Outlook 账户。

### 效率工具

- 本地通讯录,支持搜索、收藏、备注、多个带标签的邮箱地址,并可从邮件参与者一键创建或查看联系人。
- 收件人自动补全会优先显示已保存联系人,并保留最近联系过的地址。
- 支持导入和导出 vCard(`.vcf`),方便与其他通讯录迁移联系人。重新导入时按规范化邮箱合并;若本地姓名或备注非空,则优先保留本地内容。
- 看板视图,包含 Todo、Waiting、Done 三列。
- 命令面板和键盘优先导航。
- 内置翻译能力,支持双语阅读和自定义快捷键(`T` 翻译选中文字,`Ctrl+Shift+T` 切换双语对照)。
- 深色和浅色主题,支持壁纸背景。
- 内置英文和中文界面。
- 可选的 WebDAV 备份,用于同步设置、规则、看板卡片和看板备注。
- 可选的本地文件导入/导出和 WebDAV 备份,用于同步联系人、设置、规则、看板卡片和看板备注。
- 支持自动定时 WebDAV 备份,间隔可配置。

### 平台集成
Expand Down
70 changes: 70 additions & 0 deletions crates/pebble-core/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,76 @@ pub struct KnownContact {
pub address: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ContactEmailLabel {
Work,
Personal,
Other,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ContactEmail {
pub id: String,
pub address: String,
pub label: ContactEmailLabel,
pub is_primary: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Contact {
pub id: String,
pub display_name: String,
pub notes: String,
pub is_favorite: bool,
pub emails: Vec<ContactEmail>,
pub created_at: i64,
pub updated_at: i64,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ContactEmailInput {
pub id: Option<String>,
pub address: String,
pub label: ContactEmailLabel,
pub is_primary: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ContactInput {
pub id: Option<String>,
pub display_name: String,
pub notes: String,
pub is_favorite: bool,
pub emails: Vec<ContactEmailInput>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ContactSuggestionSource {
Saved,
Recent,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ContactSuggestion {
pub contact_id: Option<String>,
pub name: Option<String>,
pub address: String,
pub source: ContactSuggestionSource,
pub is_favorite: bool,
pub last_interaction_at: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct VcardImportResult {
pub created: usize,
pub merged: usize,
pub skipped: usize,
pub invalid: usize,
pub errors: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Category {
pub id: String,
Expand Down
Loading
Loading