Release Contact Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 11:45:06 +02:00
parent 991bebd0d9
commit eb7ff7ae8f
27 changed files with 1356 additions and 110 deletions
+7
View File
@@ -1,5 +1,12 @@
# Changelog
## 0.2.0 - 2026-09-02
- Added vCard 2.1, grouped-property, quoted-printable and Base64 support while
preserving unmapped properties and parameters.
- Added loss-preserving jCard and focused JSContact import/export with explicit
mapping evidence.
## 0.1.0 - 2026-09-01
- Added the initial local-first Contact Tools workbench.
+3 -3
View File
@@ -1,5 +1,5 @@
==============================================================================
@add-ideas/toolbox-contract@0.2.3
@add-ideas/toolbox-contract@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
@@ -198,7 +198,7 @@ Declared licence: Apache-2.0
==============================================================================
@add-ideas/toolbox-helpers@0.1.0
@add-ideas/toolbox-helpers@0.2.0
Declared licence: GPL-3.0-or-later
==============================================================================
--- LICENSE ---
@@ -879,7 +879,7 @@ Public License instead of this License. But first, please read
==============================================================================
@add-ideas/toolbox-shell-react@0.2.3
@add-ideas/toolbox-shell-react@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
+7 -4
View File
@@ -6,15 +6,18 @@ Contact Tools is a standalone local-first application in the [add·ideas Toolbox
## Version 0.1 scope
- Unfolding and bounded parsing of vCard 3.0 and 4.0 contact sets
- Unfolding and bounded parsing of vCard 2.1, 3.0 and 4.0 contact sets
- Editable core names, organizations, titles, emails, phones, addresses, URLs, birthdays, notes, UIDs and categories
- Canonical vCard 3.0/4.0 export with UTF-8-aware 75-octet line folding
- Canonical vCard 2.1/3.0/4.0 export with UTF-8-aware 75-octet line folding
- Quoted-printable and bounded Base64 decoding, grouped-property support, and loss-preserving retention of unmapped IANA/X properties and parameters
- Loss-preserving RFC 7095 jCard import/export and a focused JSContact
import/export adapter with unmapped-field evidence
- RFC 4180-style CSV import with inferred, reviewable column mapping and spreadsheet-formula-safe CSV export
- Explainable exact duplicate candidates and a conflict-reporting, left-biased merge preview
- Explicit, local vCard QR generation with a conservative payload bound and SVG download
- Masked overview fields, one-click memory clearing, and no persistence or telemetry
Text input is limited to 2 MiB, 50,000 physical lines and 2,000 contacts. Binary and quoted-printable properties are diagnosed but not decoded, and unsupported properties are reported rather than silently round-tripped. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
Text input is limited to 2 MiB, 50,000 physical lines and 2,000 contacts. Encoded values are limited to 64 KiB per property; malformed encodings are diagnosed while their raw values remain preserved. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
## Development
@@ -28,7 +31,7 @@ npm run test:browser
## Release
`npm run release:artifact` creates a deterministic `release/contact-tools-0.1.0.zip` and checksum sidecar.
`npm run release:artifact` creates a deterministic `release/contact-tools-0.2.0.zip` and checksum sidecar.
## Licence
+2 -2
View File
@@ -1,7 +1,7 @@
# Corresponding source
The corresponding source for Contact Tools 0.1.0 is available at:
The corresponding source for Contact Tools 0.2.0 is available at:
https://git.add-ideas.de/lotobo/contact-tools/src/tag/v0.1.0
https://git.add-ideas.de/lotobo/contact-tools/src/tag/v0.2.0
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
+4 -4
View File
@@ -1,12 +1,12 @@
# Third-party notices
Contact Tools 0.1.0 directly depends on these runtime packages:
Contact Tools 0.2.0 directly depends on these runtime packages:
| Package | Pinned version | Declared licence |
| -------------------------------- | -------------: | ---------------- |
| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.1.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-contract` | 0.3.0 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.2.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.3.0 | Apache-2.0 |
| `qrcode-generator` | 2.0.4 | MIT |
| `react` | 19.2.8 | MIT |
| `react-dom` | 19.2.8 | MIT |
+1 -1
View File
@@ -2,7 +2,7 @@
Contact Tools is a static React/Vite application wrapped in the shared Toolbox shell. `contact/model.ts` owns bounded vCard unfolding/parsing, canonical serialization, RFC 4180-style CSV conversion, exact duplicate indexing and deterministic merge previews. The workbench only replaces its active records after a complete successful parse.
Imported properties are projected into a typed contact model and rendered through React text nodes and native controls. Unknown properties are diagnosed and omitted from canonical output instead of being injected back into markup. QR SVG is generated from UTF-8 bytes of the canonical vCard by the pinned `qrcode-generator` runtime, checked for active SVG constructs, then displayed as an encoded image URL rather than inserted as markup.
Imported properties are projected into a typed contact model and rendered through React text nodes and native controls. Quoted-printable and bounded Base64 values are decoded locally. Unmapped properties retain their group, name, parameters, raw value and optional decoded bytes, are diagnosed as non-editable, and are serialized back as inert vCard content. QR SVG is generated from UTF-8 bytes of the canonical vCard by the pinned `qrcode-generator` runtime, checked for active SVG constructs, then displayed as an encoded image URL rather than inserted as markup.
Version 0.1 operations are synchronous and bounded, so the app creates no worker and has no persistence or server API. Relative entry and asset URLs keep the build relocatable below a nested portal path.
+1 -1
View File
@@ -1,5 +1,5 @@
const CACHE_PREFIX = "contact-tools-shell-";
const CACHE_NAME = CACHE_PREFIX + "0.1.0";
const CACHE_NAME = CACHE_PREFIX + "0.2.0";
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
self.addEventListener("install", (event) => {
event.waitUntil(
+14 -1
View File
@@ -3,7 +3,7 @@
"schemaVersion": 1,
"id": "de.add-ideas.contact-tools",
"name": "Contact Tools",
"version": "0.1.0",
"version": "0.2.0",
"description": "Inspect, convert, and reconcile contacts locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",
@@ -21,6 +21,19 @@
"crossOriginIsolated": false,
"topLevelContext": false
},
"io": {
"accepts": [
{ "mediaType": "text/vcard", "extensions": [".vcf", ".vcard"] },
{ "mediaType": "application/vcard+json", "extensions": [".json"] },
{ "mediaType": "application/jscontact+json", "extensions": [".json"] }
],
"produces": [
{ "mediaType": "text/vcard", "extensions": [".vcf"] },
{ "mediaType": "application/vcard+json", "extensions": [".json"] },
{ "mediaType": "application/jscontact+json", "extensions": [".json"] }
]
},
"capabilities": { "required": [], "optional": [] },
"privacy": {
"processing": "local",
"fileUploads": true,