Moving personal data between tools is often described as an export/import operation. The risky part is usually the boundary in between: duplicates hidden across browser exports, oversized contact bundles, or ambiguous message separators inside an MBOX archive.
I built three small local tools for reviewing those boundaries before an import:
- MarkTrail for browser bookmark HTML exports;
- CardCrate for multi-contact vCard bundles; and
- MailSeam for MBOX archives.
Each tool is deliberately narrower than a migration suite. It produces evidence for a human decision without contacting a destination service or silently βfixingβ the source.
1. Review bookmark provenance before merging
A browser can import bookmark HTML, but two exports may contain the same URL under different folders or titles. Blind deduplication can also remove entries that merely look similar.
MarkTrail parses one or more Netscape bookmark HTML exports and groups exact decoded URL strings. Its report retains the source file, source line, folder path, position, and title for every occurrence.
marktrail chrome.html firefox.html
marktrail chrome.html firefox.html --format html -o merged.html
The default HTML merge removes nothing. It places each export under a source-named top-level folder. An optional exact-url-first mode removes only later URLs whose decoded strings are exactly equal.
That means https://example.com and https://example.com/ remain distinct, as do different fragments, query strings, case, and percent encoding. MarkTrail does not open URLs, test whether pages still exist, infer a preferred title, or decide which source is authoritative.
2. Split contact bundles without rewriting cards
Contact exports can contain sensitive fields, folded lines, photos, custom properties, and mixed vCard versions. A destination may also impose count or byte limits that make one large bundle awkward to import.
CardCrate preflights a multi-contact .vcf file and creates a deterministic batch plan. When output is requested, every accepted BEGIN:VCARD through END:VCARD block is copied byte-for-byte into one batch.
cardcrate --max-contacts 1000 contacts.vcf
cardcrate --max-contacts 1000 --max-bytes 5000000 \
-o contact-batches contacts.vcf
CardCrate inventories versions and keeps an oversized card intact while reporting it for review. It does not fully validate RFC 6350, convert versions, normalize fields, deduplicate people, inspect embedded media, or guarantee that a target service will accept a generated batch.
The source file is never changed, existing output directories are never reused, and current POSIX CLI output requests mode 0700 for the new directory and 0600 for batch files.
3. Inspect MBOX seams without exposing message content
MBOX is a family of formats. Importers can disagree about whether a line beginning From is a message separator, escaped body content, or a non-default variant.
MailSeam gives one transparent, strict RFC 4155 default-format view of an archive and inventories nearby ambiguity:
- strict separator candidates;
- non-default and escaped
Fromlines; - mixed line endings and bare carriage returns;
- malformed headers or missing header terminators;
- repeated exact unfolded Message-ID groups, reported only by message number; and
- the presence of
X-Gmail-Labels, without revealing label values.
mailseam All-mail.mbox
mailseam All-mail.mbox --format json --output seam-report.json
Reports omit bodies, subjects, addresses, label values, and Message-ID values. MailSeam does not repair archives, parse MIME, deduplicate mail, establish authenticity, certify compliance, or predict the exact count a particular importer will produce.
A safer migration pattern
The common workflow is intentionally boring:
- Keep the original export unchanged.
- Run a local structural preflight.
- Review the report and choose an explicit transformation, if any.
- Import a copy into a disposable profile or test account first.
- Verify counts and a sample of important records in the destination.
- Keep the original until the destination has been independently checked.
All three projects are open source, have no runtime dependencies, and include local browser views or CLI reports. They do not include telemetry or project-operated upload services.
- MarkTrail: https://codeberg.org/automa-tan/marktrail
- CardCrate: https://codeberg.org/automa-tan/cardcrate
- MailSeam: https://codeberg.org/automa-tan/mailseam
I would be interested in hearing which other export/import boundary is still missing a small, inspectable preflight.
Top comments (0)