Versions
Corky is alpha software. Expect breaking changes between minor versions.
Use BREAKING CHANGE: prefix in version entries to flag incompatible changes.
0.7.0
BREAKING CHANGE: Rust rewrite. Complete port from Python to Rust.
- Rust rewrite: All ~3,750 LOC of Python replaced with ~6,700 LOC of Rust. Single crate, no workspace. All 25 CLI commands ported with identical behavior and file formats.
- BREAKING CHANGE: Python removal:
pyproject.toml,uv.lock, and all.pyfiles removed. Install viacargo install corkyinstead ofpip install corky. - Dependencies: clap (CLI), serde/toml/toml_edit (config), imap/native-tls (IMAP), mailparse (email parsing), lettre (SMTP), chrono (dates), directories (platform dirs), tokio (watch daemon), anyhow/thiserror (errors).
- Format-preserving TOML:
add-labelnow usestoml_editcrate (cleaner than Python's regex approach). - Gmail OAuth: Stub that prints instructions to use Python
corky sync-authfor one-time setup. Full OAuth port deferred. - No behavioral changes: All file formats, sync algorithms, collaborator workflows, and CLI interfaces are identical to 0.6.1. Existing
mail/data repos are fully compatible.
Migration from 0.6.x: Uninstall Python corky (pip uninstall corky), install Rust binary (cargo install corky or download from releases). No data migration needed — all file formats are unchanged.
0.6.1
Lower Python requirement to 3.11+, app config with multi-space support.
- Python 3.11+: Lowered minimum from 3.12. No 3.12-specific features were used;
tomllibanddatetime.UTC(3.11+) are the actual floor. - App config (
src/app_config.py): New module for persistent configuration viaplatformdirs. Stores named spaces in~/.config/corky/config.toml(Linux),~/Library/Application Support/corky/config.toml(macOS),%APPDATA%/corky/config.toml(Windows). - Spaces:
corky spaceslists configured spaces.corky initregisters a space automatically.corky --space NAME <cmd>selects a specific space for any command. - Data dir resolution updated: New 4-step order:
mail/in cwd →CORKY_DATAenv → app config space →~/Documents/mailfallback.
0.6.0
Path resolution, corky init, and functional specification.
corky init: New command to initialize a data directory for general users.corky init --user you@gmail.comcreates~/Documents/mailwith directory structure,accounts.toml, and empty config files. Supports--provider,--password-cmd,--labels,--github-user,--name,--sync,--force,--data-dirflags.- Path resolution (
src/resolve.py): New module centralizes all path resolution. Data directory resolves in order:mail/in cwd (developer),CORKY_DATAenv,~/Documents/mail(general user). Config directory:.if localmail/exists, otherwise same as data dir. - BREAKING CHANGE: Removed module-level path constants:
CONFIG_PATHremoved fromaccounts.py,collab/__init__.py,contact/__init__.py.CONTACTS_DIRremoved fromcontact/add.py.STATE_FILEandCONVERSATIONS_DIRremoved fromsync/imap.py.CREDENTIALS_FILEremoved fromsync/auth.py.VOICE_FILEremoved fromcollab/add.py,collab/sync.py,collab/reset.py._DIR_PREFIXESremoved fromcollab/rename.py. All replaced byresolve.*()function calls. Tests that monkeypatched these constants must now patchresolve.<function>instead. SPEC.md: Language-independent functional specification for an eventual Rust port. Covers file formats, algorithms (slugify, thread key, dedup, label routing), all 18 commands, sync algorithm, collaborator lifecycle, provider presets.
Migration from 0.5.x: If your code or tests monkeypatch CONFIG_PATH, CONTACTS_DIR, STATE_FILE, CONVERSATIONS_DIR, CREDENTIALS_FILE, VOICE_FILE, or _DIR_PREFIXES, switch to patching resolve.accounts_toml, resolve.contacts_dir, resolve.sync_state_file, resolve.conversations_dir, resolve.credentials_json, resolve.voice_md, or resolve.data_dir respectively.
0.5.0
Directional collaborator repos, nested CLI, owner identity, GitHub username keys.
- Rename
shared/tofor/{gh-user}/: Collaborator submodules now live underfor/{github_user}/instead ofshared/{name}/. Repo naming:{owner}/to-{collab-gh}. This supports multi-user corky setups where each party has directional directories (for/outgoing,by/incoming). - BREAKING CHANGE:
collab-*→for */by *: Flatcollab-add,collab-sync,collab-remove,collab-rename,collab-reset,collab-statusreplaced with nestedfor add,for sync,for remove,for rename,for reset,for status.find-unansweredandvalidate-draftmoved toby find-unansweredandby validate-draft. Standalonefind-unansweredandvalidate-draftentry points kept foruvxuse. - Owner identity: New
[owner]section inaccounts.tomlwithgithub_userand optionalname. Required for collaborator features. - GitHub username as collaborator key:
collaborators.tomlsection keys are now GitHub usernames (was display names).github_useris derived from the key. Optionalnamefield stores display name. - Auto-derived repo:
repofield incollaborators.tomlis auto-derived as{owner_gh}/to-{collab_gh}if omitted. for addCLI change (wascollab-add): Positional arg is nowGITHUB_USER(wasNAME).--github-userflag removed (redundant). Added--nameflag for display name.- Parameterized templates: AGENTS.md and README.md templates use owner name from config instead of hardcoded "Brian".
- Help output now groups commands into sections: corky commands, collaborator commands (for/by), dev commands.
.gitignore:shared/replaced withfor/andby/.
Migration from 0.4.x: Remove existing shared/ submodules (git submodule deinit -f shared/{name} && git rm -f shared/{name}), update collaborators.toml keys to GitHub usernames, add [owner] section to accounts.toml, re-add collaborators with corky for add. Replace collab-* with for * and find-unanswered / validate-draft with by find-unanswered / by validate-draft in scripts and aliases. Run for reset to update shared repo templates.
0.4.1
Add-label command and audit-docs fixes.
corky add-label LABEL --account NAME: Add a label to an account's sync config via text-level TOML edit (preserves comments).contact-addintegration:--label+--accountautomatically adds label to account sync config.- audit-docs: Fix tree parser for symlink-to-directory entries.
- SKILL.md: Updated to reflect flat conversation directory, contacts, manifest.
0.4.0
Flat conversation directory, contacts, manifest.
- Flat conversations: All threads in
mail/conversations/as[slug].md. No account or label subdirectories. Consolidates correspondence across multiple email accounts into one directory. - Immutable filenames: Slug derived from subject on first write, never changes. Thread identity tracked by
**Thread ID**metadata. - File mtime: Set to last message date via
os.utime().ls -tsorts by thread activity. - Multi-source accumulation: Threads fetched from multiple labels or accounts accumulate all sources in
**Labels**and**Accounts**metadata. - Orphan cleanup:
--fullsync deletes files not touched during the run. - manifest.toml: Generated after sync. Indexes threads by labels, accounts, contacts, and last-updated date.
- Contacts:
contacts.tomlmaps contacts to email addresses. Per-contactAGENTS.mdinmail/contacts/{name}/provides drafting context.corky contact-addscaffolds new contacts. - tomli-w: Added as dependency for TOML writing.
- Backward-compatible parsing of legacy
**Label**format.
0.3.0
IMAP polling daemon.
corky watchpolls IMAP on an interval and syncs automatically.- Configurable poll interval and desktop notifications via
accounts.toml[watch]section. - systemd and launchd service templates.
0.2.1
Maintenance release.
- CI workflow: ty, ruff, pytest on push and PR.
0.2.0
Collaborator tooling and multi-account support.
collab-resetcommand (nowfor reset): pull, regenerate templates, commit and push.- Reframed docs as human-and-agent friendly.
account:labelscoped routing for collaborators.list-folderscommand and self-signed cert support.- Multi-account IMAP support via
accounts.tomlwith provider presets. - Collaborator tooling:
collab-add(nowfor add),collab-sync(nowfor sync),collab-remove(nowfor remove),find-unanswered(nowby find-unanswered),validate-draft(nowby validate-draft). - Multi-collaborator architecture with submodule-based sharing.
0.1.0
Renamed to corky. Unified CLI dispatcher.
corkyCLI with subcommands.push-draftcommand to create drafts or send emails from markdown.- Incremental IMAP sync with
--fulloption. - Gmail sync workspace with drafting support.