Interactive CLI Business Card
A fast, interactive CLI business card implemented in Rust.
🚀 Quick Start
Cargo (direct Rust install)
cargo install carlosferreyra
carlosferreyra
uvx (wrapper entrypoint)
uvx carlosferreyra
bunx (wrapper entrypoint)
bunx carlosferreyra
Features
- ⚡ Fast Rust CLI
- 📧 Direct email contact
- 🌐 Portfolio and social links
- 🖥️ Interactive menu
- 🔧 Non-interactive mode via
--open - 🎯 Resume-driven behavior from
resume.jsonwith runtime refresh from GitHub
Project Structure
business-card/
├── src/ # Rust source code
│ └── main.rs
├── Cargo.toml # Rust package manifest
├── Cargo.lock
├── resume.json # Embedded fallback resume snapshot
└── README.md
Configuration
The CLI fetches resume metadata at startup from:
https://raw.githubusercontent.com/carlosferreyra/carlosferreyra/main/resume.json
If the fetch fails, times out, or returns invalid data, the CLI falls back to the embedded root
resume.json in this repository.
- Personal information (name, title, company, location, skills)
- Links (email, portfolio, GitHub, LinkedIn, Twitter, LeetCode)
- Business-card-labeled portfolio projects
The CLI renders the profiles.business-card profile plus links, skills, and projects whose labels
include business-card.
To refresh the embedded fallback snapshot before a future release, run:
uv run scripts/sync_resume.py
Distribution Model
- Source code in this repo: Rust only
uvx carlosferreyra: Python ecosystem entrypoint wrapper (generated/published in release pipeline)bunx carlosferreyra: Node ecosystem entrypoint wrapper (generated/published in release pipeline)
The uvx and bunx packages are distribution entrypoints, not source implementations in this
repository.
Release Pipeline
-
Before cutting any patch/minor/major release, refresh the embedded offline fallback:
uv run scripts/sync_resume.py
-
Releaseworkflow (.github/workflows/release.yml) is the source of truth. -
It runs on version-tag pushes and pull requests; pull requests run distribution planning only.
-
Version-tag pushes build binaries and installers with
dist, then publish a GitHub release. -
Version bumps, tag creation, and crates.io publication are separate maintainer steps.
-
After a successful release push,
release_pypi.ymlandrelease_npm.ymlverify that the matching GitHub release and installer exist and that its tag points to the checked-out commit, then publish the wrappers. -
Those workflows generate Python/npm wrapper package metadata from
Cargo.tomlon the fly (no dedicatedpython/ortypescript/source folders).
Development
cargo run
cargo run -- --open portfolio
cargo check
cargo build --release
cargo test --locked
cargo clippy --locked --all-targets -- -D warnings
uv run --with httpx python -m unittest discover -s tests -v
node --test tests/npm_wrapper.test.cjs
Connect with Carlos
- GitHub: github.com/carlosferreyra
- LinkedIn: linkedin.com/in/eduferreyraok
- Website: carlosferreyra.com.ar
- Email: eduferreyraok@gmail.com
License
MIT
Appendix: Package Index Wrappers
The packages published to PyPI and npm are entrypoint wrappers around the Rust CLI binary.
pipx/uvxpackage: invokes the Rustcarlosferreyraexecutable.npx/bunxpackage: invokes the Rustcarlosferreyraexecutable.
If the binary is not available, wrappers attempt to bootstrap it from release artifacts generated by
cargo dist; if that fails, install directly with:
cargo install carlosferreyra
Automatic wrapper installation supports macOS and Linux. Windows users must provide a separately built Rust executable; published releases currently contain no Windows binaries.
Metadata
Release files for carlosferreyra 1.2.16
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| carlosferreyra-1.2.16.tar.gz | 3.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| carlosferreyra-1.2.16-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.6 kB
Release files / carlosferreyra-1.2.16.tar.gz
| Download URL | carlosferreyra-1.2.16.tar.gz |
|---|---|
| Size | 3.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
683f925965f7d781cdb9bf4ecfc23cf8c34d1533de706b0102447dd62033e7f8
|
|
BLAKE2b-256 checksum How to use checksums |
cfb489da1e1842d2df1b58217b48aad4a10854bf59e914422c10214654338318
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / carlosferreyra-1.2.16-py3-none-any.whl
| Download URL | carlosferreyra-1.2.16-py3-none-any.whl |
|---|---|
| Size | 4.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e4eabd87b76257d5d3f9d77b6ae893db529a7c468057406595bce30edc6dd0ca
|
|
BLAKE2b-256 checksum How to use checksums |
c2d722414794f930c745c13be1c67ae0aacf84044add98d33bd76c6b2f23ef9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|