Skip to content

v0.2.0

Choose a tag to compare

@luongnv89 luongnv89 released this 10 Oct 20:54
· 9 commits to main since this release

cmail v0.2.0 makes receiving the default: cmail setup forwards mail for a domain at any registrar to any inbox you own, with no Google or GoDaddy account required, while Gmail "Send mail as" and GoDaddy automation become opt-in. It also adds the read-only cmail list command, a reworked CLI with full setup previews, cmail config commands, JSON output, shell completions and elapsed setup timing, an autonomous cmail-setup agent skill, a user-local installer, and a landing page with checkable setup guides.

Upgrading from v0.1.0

  • Installing 0.2.0. The installer's default still pins the v0.1.0 runtime, so a plain bash install.sh installs v0.1.0. To install 0.2.0, check out this release (git clone --branch v0.2.0 https://github.com/luongnv89/cmail.git && cd cmail) and run bash install.sh --local there.
  • GoDaddy automation is opt-in. cmail setup now defaults to REGISTRAR=manual: it works with a domain at any registrar and never runs gddy, changes nameservers or offers a purchase. Domains whose Cloudflare zone is already active need no change. To keep the v0.1.0 GoDaddy flow (domain picker, nameserver replacement, purchase), run cmail config set REGISTRAR godaddy once or use cmail setup --registrar godaddy.
  • Setup ends once receiving works. The Gmail "Send mail as" guide moved from cmail setup to the optional cmail send-as command; run it after setup only if you want to send from your custom address.
  • cmail no longer installs tools for you. Setup checks for curl and jq (plus gddy only with REGISTRAR=godaddy) and stops with installation instructions when one is missing. cmail doctor and cmail status are read-only and no longer create or repair the config file; cmail setup or cmail config init creates it.
  • Guided commands need an interactive terminal. cmail setup and cmail send-as stop before making changes when stdin is closed or piped, so automation must use a pseudo-terminal. A domain purchase can only be approved by typing the exact domain at an interactive terminal.
  • Stricter arguments and configuration. Unknown flags and extra arguments are errors. The config file must be a user-owned regular file (not a symlink) with mode 600 containing only literal KEY=value lines for known keys; shell commands, expansions, export prefixes, duplicate keys and unquoted spaces (including inline comments) are rejected. Files written by v0.1.0 setup load unchanged. Environment variables now take precedence over the config file.
  • DRY_RUN=1 previews the whole setup. Like cmail setup --dry-run, it makes no provider changes, purchases, configuration writes or installations and needs valid Cloudflare credentials; v0.1.0 previewed only the nameserver change.

Features

  • Receiving no longer requires Gmail or a Google account. cmail setup now forwards to any inbox you own and ends after the forwarding rules with a Receiving is set up summary (exit 0, no final Enter prompt). Gmail "Send mail as" moved to the optional cmail send-as command, which is not run by default. The DEST_EMAIL prompt, .env.example, destination-verification hints, README, site guides and the cmail-setup skill (2.1.0) now describe receiving as the default and sending as opt-in. The skill's pass 2 pipes only y, and it runs send-as only when the user asks to send. (Superseded in #18: guided setup now requires terminal stdin, and the skill no longer pipes answers to the 0.2.0 CLI.) The README, landing page and setup guides lead with "custom-domain email in a few simple steps" (review source, ./cmail setup, send a test), and the CLI help and setup banner state that sending is optional and only on request. The landing page adds a "Do I need Gmail or a Google account?" FAQ. (#16) @luongnv89
  • Make GoDaddy automation optional (#20). Behavior change: setup now defaults to REGISTRAR=manual and no longer requires gddy or GoDaddy authentication. It accepts an existing domain at any registrar. An already-active Cloudflare zone skips nameserver steps; a pending zone gets the exact assigned nameservers, DNS-record/DNSSEC migration warnings, and bounded activation polling. cmail never changes delegation in this mode. GoDaddy automation (domain picker, nameserver replacement, and the only path to a domain purchase) now requires REGISTRAR=godaddy or cmail setup --registrar godaddy. doctor checks gddy and GoDaddy authentication only in that mode, and setup --dry-run reports registrar and skips GoDaddy reads and blockers in manual mode. New REGISTRAR config key, --registrar option, completions, recovery guidance, and offline regressions. (#18) @luongnv89
  • Add read-only cmail list [--domain DOMAIN]: every address on a domain, sorted, with its forward destinations (marked verified, unverified or unregistered), drop/worker actions, disabled rules, and the catch-all rule. Text and --format json output, completions, and offline regressions. --domain is now accepted by setup and list only. (#21) @luongnv89
  • Add the 0.2.0 CLI: strict arguments, command-level help/version, text/JSON reports, read-only doctor/status, full setup previews, literal configuration with environment precedence, private atomic config commands, secret stdin input, bash/zsh/fish completions, and complete local-checkout installation. (#18) @luongnv89
  • Show actual elapsed setup time on success/failure and in preview JSON; include user input and provider verification waits. Bound provider requests/polling, require terminal stdin for guided commands, preserve provider confirmations, paginate rule inspection/reuse, and use GoDaddy's quote-token purchase flow with displayed prices, fees, and agreement titles/links before confirmation. Any charge requires the domain typed at an interactive terminal; piped input, flags, and environment variables can never approve a purchase. (#18) @luongnv89
  • Add a user-local one-command installer for the complete pinned runtime with a generated launcher, private external config, staged validation and offline installer regressions. Installation does not run setup/doctor or provider calls. (#7) @luongnv89
  • Add a portable cmail-setup agent skill with fail-closed verification gates, local-only credential guidance, consented staged provider setup and targeted failure/recheck instructions. Include a non-executing private config checker, offline tests and realistic evaluation cases; no live setup or skill publication. (#8) @luongnv89
  • cmail-setup skill 1.1.0 opens with read-only context discovery (OS, source checkout, installed launcher, config presence, tools, request cues) instead of asking about setup mode, OS/access or installation status. Undetectable facts, such as browser access, stay unknown until a gate needs them. Discovery never executes cmail, reads .env or changes anything; consent and secret rules are unchanged. (#13) @luongnv89
  • cmail-setup skill 2.0.0 runs setup autonomously. The agent installs cmail and missing tools, writes non-secret config with a new set_config.py helper, reads config through check_config.py --summary (non-secret values only), runs a read-only preflight and then executes cmail setup itself with stdin closed. Stops are classified from setup's Setup stopped at: line and repaired from a step-keyed troubleshooting table. The agent asks only for missing values, hands-on steps (token entry, browser approvals, Gmail), nameserver replacement, existing MX/DNSSEC records, purchases, sudo or repeated failure; approval input is piped only for the nameserver confirmation after a closed-stdin pass. (Superseded in #18: guided setup now requires terminal stdin, and the skill no longer pipes answers to the 0.2.0 CLI.) (#14) @luongnv89
  • Add a framework-free cmail landing page and ordered first-time setup guides, with enabled native checkboxes, boolean-only browser progress, reset and resilient storage/no-JS handling. Document actual installer/skill paths, Cloudflare scopes, GoDaddy authentication/environment behavior, DNS safeguards, Gmail restrictions/confirmation and independent inbound/outbound checks. Flag Google's announced January 2027 third-party Send as removal. Include offline checklist/docs tests and optional real-browser regressions; no hosting, provider writes or live delivery verification is claimed. (#9) @luongnv89

Bug Fixes

  • Fix plain-text cmail status failing with "could not format routing state" when a rule has no forward destinations (drop, worker, catch-all, or no action). Rules now show drop, worker NAME, no action, and catch-all; JSON output is unchanged. Adds an offline regression. (#23) @luongnv89
  • Fix the runtime mismatch in receive-only/optional-send quickstarts (#17). README, landing page and both setup guides now select the immutable reviewed development source snapshot cda65f0554a870ed8079e93741a331918118acec, check ./cmail help for send-as before setup, and consistently use source ./cmail and checkout .env. The unchanged installer still pins legacy v0.1.0, whose setup includes the Gmail guide and has no send-as. The mirrored setup skill accepts either current receiving summary + exit 0 or the trusted legacy post-receiving Gmail pause at gate 8; both require every requested rule enabled exactly once to the intended destination. Add offline prose-contract regressions; no new release, installer pin change or live verification is claimed. (#16) @luongnv89

Documentation

  • Document installation/verification/upgrades and the chosen upstream GitHub route, Homebrew prerequisites and actual distribution status. Homebrew submission remains pending; no license is selected. (#7) @luongnv89

Other Changes

  • Add subprocess, configuration, terminal, timing, and installation regressions, make test/make lint, and macOS/Linux CLI CI. Document the current CLI and distinguish it from historical snapshot/legacy automation recipes. No live DNS/email verification is included. (#18) @luongnv89
  • Add a GitHub Pages workflow that validates the documentation, checklist and staged site artifact, then deploys the six allowlisted site files after relevant changes land on main; pull requests validate without deploying. (#10) @luongnv89
  • Mirror the cmail-setup skill under .agents/skills for local agent discovery, link .claude/skills/cmail-setup to it, and mark install.sh executable. (#12) @luongnv89

Full Changelog: v0.1.0...v0.2.0