Jodie
A command line tool to quickly save new contacts to Contacts.app on macOS.
Named for Jodie Foster for her stellar performance in Contact.
Installation
pip install jodie
Or install from source:
git clone git@github.com:austinogilvie/jodie.git
cd jodie
pip install .
After installation, both jodie and jodie-cli commands are available.
Quick Start
# Smart parsing (default) - jodie figures out what's what
jodie new "John Doe" john@acme.com "Acme Inc" "CEO"
# Preview before saving
jodie new "John Doe" john@acme.com --dry-run
# Parse from clipboard (copy an email signature first)
jodie new --paste
# Parse from stdin
echo "John Doe <john@acme.com>" | jodie new --stdin
Usage
jodie - Manage macOS Contacts.app from command line!
Usage:
jodie new TEXT... [options]
jodie new [options]
jodie new --paste [options]
jodie new --stdin [options]
jodie new --explicit EMAIL NAME [COMPANY] [TITLE] [options]
Arguments:
TEXT Contact text to parse automatically.
EMAIL Email address for explicit positional mode.
NAME Full name for explicit positional mode.
COMPANY Company name for explicit positional mode.
TITLE Job title for explicit positional mode.
Input Modes:
--paste Read contact text from clipboard.
--stdin Read contact text from stdin.
--explicit Use positional fields: EMAIL NAME [COMPANY] [TITLE].
-A --auto Force automatic parsing. Default for TEXT input.
Contact Fields:
-E EMAIL --email=EMAIL Email address.
-F FIRST --first=FIRST First name.
--first-name=FIRST First name (alias for --first).
--firstname=FIRST First name (alias for --first).
-L LAST --last=LAST Last name.
--last-name=LAST Last name (alias for --last).
--lastname=LAST Last name (alias for --last).
-U NAME --full-name=NAME Full name.
--name=NAME Full name (alias for --full-name).
-P PHONE --phone=PHONE Phone number.
-T TITLE --title=TITLE Job title.
-C COMPANY --company=COMPANY Company name.
-W WEBSITES --websites=WEBSITES Comma-separated list of websites/URLs.
--website=WEBSITES Website URLs (alias for --websites).
--linkedin=URL LinkedIn profile URL (auto-labeled as LinkedIn).
Output:
-D --dry-run Preview parsed fields without saving.
General:
-H --help Show this screen.
-V --version Show version.
Examples
Smart Parsing (Default)
Just pass the information in any order - jodie figures it out:
jodie new "John Doe" john@acme.com "Acme Inc" "CEO" "https://linkedin.com/in/johndoe"
Preview with --dry-run
See what jodie parsed before saving:
jodie new "John Doe" john@acme.com "Acme Inc" --dry-run
Output:
┌─────────────────────────────────────────────────────────┐
│ Contact Preview │
├──────────────┬──────────────────────┬───────────────────┤
│ Field │ Value │ Source │
├──────────────┼──────────────────────┼───────────────────┤
│ First Name │ John │ parsed (100%) │
│ Last Name │ Doe │ parsed (100%) │
│ Email │ john@acme.com │ parsed (100%) │
│ Company │ Acme Inc │ parsed (100%) │
└──────────────┴──────────────────────┴───────────────────┘
Run without --dry-run to save this contact.
Parse Email Signatures from Clipboard
Copy an email signature to your clipboard, then:
jodie new --paste --dry-run
Jodie handles common signature formats:
- Strips pronouns (he/him, she/her, they/them)
- Splits on bullet separators (•, |, —)
- Filters out reply headers and forwarded message noise
- Infers company from email domain
Parse from Stdin
Pipe text directly:
echo "Jane Smith <jane@startup.io> | CEO | Startup Inc" | jodie new --stdin
Or use a heredoc:
jodie new --stdin << 'EOF'
Jane Smith
CEO, Startup Inc
jane@startup.io
415-555-1234
https://linkedin.com/in/janesmith
EOF
Explicit Flags
For full control, use explicit flags:
jodie new \
--first "John" \
--last "Doe" \
--email "john@acme.com" \
--phone "+1 555 555 5555" \
--title "CEO" \
--company "Acme Inc" \
--linkedin "https://linkedin.com/in/johndoe" \
--websites "https://acme.com,https://github.com/johndoe"
Strict Positional Mode
If you prefer explicit ordering (email first, then name, company, title):
jodie new --explicit john@acme.com "John Doe" "Acme Inc" "CEO"
Use --dry-run with explicit mode to preview before saving.
Flag Aliases
For convenience, these aliases are supported:
| Primary | Aliases |
|---|---|
--first |
--first-name, --firstname |
--last |
--last-name, --lastname |
--full-name |
--name |
--websites |
--website |
Known Limitations
- Notes field: Currently disabled due to macOS entitlement requirements. Will be re-enabled in a future update.
License
MIT
Metadata
Release files for jodie 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jodie-0.1.3.tar.gz | 25.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jodie-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 52.1 kB
Release files / jodie-0.1.3.tar.gz
| Download URL | jodie-0.1.3.tar.gz |
|---|---|
| Size | 25.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b800e9f28d2fd9adf9ab984a76dc30f422de5eb8cfa696b9a4ae11c92a935bb6
|
|
BLAKE2b-256 checksum How to use checksums |
7ef8518c79cee3687fe58ea2cf0403cc2b68b15c7135c21d5772026060d58b49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.14
|
Release files / jodie-0.1.3-py3-none-any.whl
| Download URL | jodie-0.1.3-py3-none-any.whl |
|---|---|
| Size | 26.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d96eb230bc6f72bc6d0eb50a463fa8889232a9be3e6a444d4b622cd49190500f
|
|
BLAKE2b-256 checksum How to use checksums |
9d5c0324fc8be0d1e48e642e348fcd57c407b9d61d4718a640d2c69de26c3183
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.14
|