# vCard QR Code Generator

Turn contact details into a vCard (.vcf) and a scannable QR code. Scanning it saves the contact on iOS and Android. Static, free, and generated in your browser.

## Run it

- **CLI:** `gizza tool vcard-qr 'first_name=Ada'`
- **Web:** https://gizza.ai/tools/vcard-qr/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/vcard-qr/tool.json

## Inputs

- `first_name` — First name _(field)_
- `last_name` — Last name _(field)_
- `organization` — Company _(field)_
- `job_title` — Job title _(field)_
- `mobile` — Mobile number _(field)_
- `phone` — Work phone _(field)_
- `email` — Email _(field)_
- `website` — Website _(field)_
- `street` — Street _(field)_
- `city` — City _(field)_
- `region` — State / region _(field)_
- `postal_code` — Postal code _(field)_
- `country` — Country _(field)_
- `note` — Note _(field)_
- `birthday` — Birthday _(field)_
- `version` — vCard version _(field)_
- `error_correction` — Error correction _(field)_
- `size` — SVG display size (px) _(field)_
- `foreground` — Foreground color _(field)_
- `background` — Background color _(field)_
- `show_details` — Print contact details under the code _(field)_

## Output

- Contact QR code (svg)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `first_name` — First name
- `last_name` — Last name
- `organization` — Company
- `job_title` — Job title
- `mobile` — Mobile number
- `phone` — Work phone
- `email` — Email
- `website` — Website
- `street` — Street
- `city` — City
- `region` — State / region
- `postal_code` — Postal code
- `country` — Country
- `note` — Note
- `birthday` — Birthday
- `version` — vCard version
- `error_correction` — Error correction
- `size` — SVG display size (px)
- `foreground` — Foreground color
- `background` — Background color
- `show_details` — Print contact details under the code

Example: `https://gizza.ai/tools/vcard-qr/?first_name=Ada&last_name=Lovelace&organization=Analytical%20Engines&job_title=Chief%20Analyst&mobile=%2B44%207700%20900123&phone=%2B44%2020%207946%200000&email=ada%40example.com&website=example.com%2Fada&street=12%20Baker%20Street&city=London&region=Greater%20London&postal_code=NW1%206XE&country=United%20Kingdom&note=Met%20at%20the%202026%20expo&birthday=1987-04-23&version=3.0&error_correction=M&size=512&foreground=%23000000&background=%23ffffff&show_details=true`

---

## About this tool

A vCard QR code is a QR code whose payload is a whole contact card rather than a link. Point a
phone camera at it and the operating system recognises the `BEGIN:VCARD` payload and offers to save
the person — name, job title, company, phone numbers, email, website, postal address, birthday and
note — straight into the address book. No app, no account, no typing.

This generator builds the vCard itself and encodes it in one step. The card is written as a real
RFC 6350 / RFC 2426 vCard: values are escaped (commas, semicolons and backslashes), long lines are
folded at 75 octets with CRLF continuations, and phone numbers and emails carry the `TYPE` labels
phones use to tell a mobile from a landline. You pick vCard 3.0 (the dialect scanners handle best)
or 4.0.

The result is an SVG, so it stays sharp whether it ends up on a slide, a badge or a printed banner.
The exact vCard source is embedded in the SVG's `<desc>` element and returned by the CLI, so you can
copy it into a `.vcf` file if you want the contact card as a file too.

### Worked example

Fill in:

- First name `Ada`, last name `Lovelace`
- Company `Analytical Engines`, job title `Chief Analyst`
- Mobile `+44 7700 900123`, email `ada@example.com`, website `example.com/ada`

The encoded vCard is:

```
BEGIN:VCARD
VERSION:3.0
N:Lovelace;Ada;;;
FN:Ada Lovelace
ORG:Analytical Engines
TITLE:Chief Analyst
TEL;TYPE=CELL:+44 7700 900123
EMAIL;TYPE=INTERNET:ada@example.com
URL:https://example.com/ada
END:VCARD
```

Scanning the generated code on a phone brings up "Add contact" pre-filled with those fields. With
**Print contact details under the code** left on, the same details are also typeset in monospace
under the QR, which is what makes it usable as a conference badge or the back of a business card.

### Notes on the fields

- At least one of first name, last name or company is required — a vCard with no display name
  cannot be saved.
- `example.com/ada` becomes `https://example.com/ada`; a bare host is what people type, but a
  scanner needs a scheme to open it.
- Email addresses are checked for a single `@` and a dotted domain. Birthdays must be real dates in
  `YYYY-MM-DD` form, so `2023-02-29` is rejected rather than silently encoded.
- The five address fields (street, city, state/region, postal code, country) are combined into one
  `ADR` property. Fill in only the ones you have.

### Limits and edge cases

- **Capacity.** A QR code holds roughly 2,900 bytes at error correction L and about 1,270 at H.
  A long note or address plus a high error-correction level can exceed that; the tool then fails
  with the vCard's byte count instead of producing an unscannable code. Shorten the note or drop to
  L or M.
- **Density vs. print size.** More contact detail means more modules, and more modules need a bigger
  printed code. As a rule of thumb, print at least 20 mm square for a short card and more for a
  detailed one, and always leave the light quiet-zone margin that is already part of the SVG.
- **No photo.** A `PHOTO` property carrying an image makes the payload far too large to scan
  reliably, so contact photos are not supported.
- **Static by design.** The contact data lives inside the code. That means it works offline and
  forever, and it also means the code cannot be edited after printing and cannot count scans — if
  the details change, generate a new code.
- **Output format.** This page renders SVG (vector). Colours accept hex values (`#000`, `#000000`,
  `#000000ff`) or CSS colour names, and `transparent` is allowed for the background.
- **Privacy.** The whole thing runs in your browser as WebAssembly. Contact details are never
  uploaded, and there is no redirect service in the middle.

## FAQ

<details>
<summary>Will scanning this actually save the contact on an iPhone or Android phone?</summary>

Yes. Both stock camera apps recognise a `BEGIN:VCARD` payload and offer to create a contact from
it — the same mechanism that handles a Wi-Fi or URL QR code. vCard 3.0 is the safest choice for
scanning because every address book has supported it for years; 4.0 is the newer RFC and is better
suited to cards consumed by software rather than a phone camera.

</details>

<details>
<summary>How do I get a .vcf file, not just the image?</summary>

The exact vCard source is embedded in the generated SVG's `<desc>` element, and the CLI prints it
alongside the image. Copy those lines — from `BEGIN:VCARD` to `END:VCARD` — into a text file, save
it with a `.vcf` extension, and any address book will import it. The worked example above shows
what those lines look like.

</details>

<details>
<summary>My contact is "too long to encode" — what should I change?</summary>

The error names the vCard's size in bytes. The cheapest wins are shortening the note, dropping the
postal address to the fields you actually need, and lowering the error-correction level from H or Q
to M or L. Level L holds roughly twice as much data as H. Long URLs are also a common culprit — link
to a short profile URL rather than a deep one.

</details>

<details>
<summary>Why do I need to pick between mobile and work phone?</summary>

They are stored as different vCard properties — `TEL;TYPE=CELL` and `TEL;TYPE=WORK,VOICE` — so the
phone that scans the code labels them correctly in the saved contact, and knows which one to text.
Fill in either or both; empty fields are simply left out of the card.

</details>

<details>
<summary>Can I add a logo, custom shapes, or track how many people scan it?</summary>

Not here. Logos and styled modules change the symbol's appearance and belong to a dedicated styling
tool; scan tracking requires the code to point at a redirect service that logs every scan, which
would mean the contact data leaves your device. This tool generates a plain static code that carries
the contact itself, works offline, and reports nothing to anyone.

</details>

<details>
<summary>What happens to names with accents, commas or semicolons?</summary>

They are handled. Text is encoded as UTF-8, and the characters that are structural in a vCard —
comma, semicolon and backslash — are escaped so a company like `Smith, Jones & Co` survives intact
instead of splitting into two values. Long values are folded onto continuation lines exactly as the
vCard spec requires, which every address book unfolds on import.

</details>

## Related tools

- [CSV to vCard Converter](https://gizza.ai/tools/csv-to-vcard/): Convert CSV or JSON contact lists into a single .vcf vCard file for iPhone, Android, Google Contacts, Outlook, and CRM imports.
- [Absolute value, sign, or negation for a whole column](https://gizza.ai/tools/absolute-value-transformer/): Paste a column of numbers and apply absolute value, sign extraction (-1/0/1), sign flipping, or force-negative to every value at once, with rounding and an audit table.
- [Adjacency Matrix Converter](https://gizza.ai/tools/adjacency-matrix-converter/): Convert a graph between edge list, adjacency matrix, and incidence matrix — directed or undirected, weighted or not. Free, private, runs in your browser.
- [Amazon Order Analyzer](https://gizza.ai/tools/amazon-order-analyzer/): Paste an Amazon order-history CSV export to summarize total spend by month, top items, and category breakdowns. Browser-only, private, with Markdown or JSON output.
- [ARFF Converter](https://gizza.ai/tools/arff-converter/): Convert Weka ARFF datasets to CSV and CSV tables back to ARFF locally — nominal attributes, numeric types, dates, sparse rows, missing values, and type rows.
