@orangecheck/legal 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -471,7 +471,7 @@ var terms = {
471
471
  metaTitle: "Terms of Service \u2014 OrangeCheck",
472
472
  metaDescription: "The terms and conditions for using OrangeCheck. Non-custodial service provided as-is. You are responsible for your wallet and private keys.",
473
473
  effective: "2025-09-30",
474
- updated: "2026-05-15",
474
+ updated: "2026-10-08",
475
475
  preamble: [
476
476
  {
477
477
  kind: "callout",
@@ -550,7 +550,7 @@ var terms = {
550
550
  blocks: [
551
551
  {
552
552
  kind: "para",
553
- text: "Most of the Service works without registration. An optional **Sign in with Bitcoin** flow opens a session keyed to a Bitcoin address you prove control of via BIP-322 \u2014 no password, no email. A session is a server-side row plus an `httpOnly + Secure + SameSite=Lax` cookie, revoked when you sign out or the cookie expires."
553
+ text: "Most of the Service works without registration. Optional sign-in proves one of: a Bitcoin address (a BIP-322 signature), an email inbox (a one-time code), or a Google or GitHub account. No password is ever created. A session is a server-side row plus an `HttpOnly; Secure; SameSite=None` cookie on `.ochk.io`, revoked when you sign out or the cookie expires."
554
554
  },
555
555
  {
556
556
  kind: "para",
@@ -656,7 +656,7 @@ var privacy = {
656
656
  metaTitle: "Privacy Policy \u2014 OrangeCheck",
657
657
  metaDescription: "How OrangeCheck handles data and privacy. Non-custodial by design, minimal data collection, no account required, privacy-preserving analytics only.",
658
658
  effective: "2025-09-30",
659
- updated: "2026-05-15",
659
+ updated: "2026-10-08",
660
660
  preamble: [
661
661
  {
662
662
  kind: "callout",
@@ -682,7 +682,7 @@ var privacy = {
682
682
  },
683
683
  {
684
684
  k: "optional account",
685
- v: "most of the Service needs no sign-in; the optional Sign in with Bitcoin flow is keyed to a public address \u2014 no email, no password"
685
+ v: "most of the Service needs no sign-in; optional sign-in uses a Bitcoin signature, an email code, or Google/GitHub \u2014 never a password"
686
686
  },
687
687
  {
688
688
  k: "transparency",
@@ -716,7 +716,34 @@ var privacy = {
716
716
  { kind: "subhead", text: "information you provide" },
717
717
  {
718
718
  kind: "para",
719
- text: "**Bitcoin addresses and signatures** are processed client-side to generate a cryptographic proof; this data is public by design. **Identity bindings** you add are included in the signed message and are public. **Contact information** is collected only if you email us for support, solely to respond. **Sign-in sessions** store a minimal account row keyed by your verified Bitcoin address plus session rows with a random id, source IP, a user-agent hash, and timestamps \u2014 no password, no email."
719
+ text: "**Bitcoin addresses and signatures** are processed client-side to generate a cryptographic proof; this data is public by design. **Identity bindings** you add are included in the signed message and are public. **Messages you send us** \u2014 through the contact form or by email \u2014 reach our inbox through our email provider (Resend) and are kept only as long as we need them to reply."
720
+ },
721
+ { kind: "subhead", text: "if you sign in" },
722
+ {
723
+ kind: "bullets",
724
+ items: [
725
+ {
726
+ k: "account",
727
+ v: "an opaque `did:oc` identifier, an optional display name and Nostr npub, and when the account was created and last signed in"
728
+ },
729
+ {
730
+ k: "how you sign in",
731
+ v: "a Bitcoin address you prove with a signature (stored as is \u2014 it is public on-chain anyway); or, for an email code, Google or GitHub, the verified email address \u2014 encrypted at rest, plus a one-way hash of it so we can find your account"
732
+ },
733
+ {
734
+ k: "passkeys",
735
+ v: "for each passkey you register: its public key, a label, the transports it reported, and when it was added and last used"
736
+ },
737
+ {
738
+ k: "each session",
739
+ v: "a hash of the session token, the IP address and full user-agent string of the device that opened it, and timestamps"
740
+ },
741
+ {
742
+ k: "sign-in log",
743
+ v: "each sign-in and each identity you link or remove, with the IP address and user-agent at the time \u2014 kept for security"
744
+ },
745
+ { k: "never", v: "a password, a private key, or a seed phrase" }
746
+ ]
720
747
  },
721
748
  { kind: "subhead", text: "automatically collected" },
722
749
  {
@@ -728,9 +755,26 @@ var privacy = {
728
755
  ]
729
756
  },
730
757
  { kind: "subhead", text: "cookies & analytics" },
758
+ {
759
+ kind: "bullets",
760
+ items: [
761
+ {
762
+ k: "oc_session",
763
+ v: "your sign-in, set by ochk.io for every `*.ochk.io` site: HttpOnly; Secure; SameSite=None; Domain=.ochk.io; 30 days"
764
+ },
765
+ {
766
+ k: "oc_oauth_state",
767
+ v: "only during a Google or GitHub sign-in: HttpOnly; SameSite=Lax; 10 minutes; deleted when the sign-in completes"
768
+ },
769
+ {
770
+ k: "oc_theme \xB7 oc_skin \xB7 oc_motion",
771
+ v: "your light/dark, appearance and reduced-motion choices (Domain=.ochk.io); not used to identify you"
772
+ }
773
+ ]
774
+ },
731
775
  {
732
776
  kind: "para",
733
- text: "Essential cookies are required for the Service to function; a preference cookie stores your theme. We use [Plausible Analytics](https://plausible.io/privacy) \u2014 cookie-free, no personal data, aggregate statistics only \u2014 alongside our own first-party, cookieless analytics (oc insights): no cookies, no cross-site identity, your IP address is hashed and immediately discarded (never stored), and Do-Not-Track / Global Privacy Control signals are honored. No advertising or tracking cookies."
777
+ text: "A browser tab may also keep its own copy of a sign-in token in session storage, cleared when the tab closes. We use [Plausible Analytics](https://plausible.io/privacy) \u2014 cookie-free, no personal data, aggregate statistics only \u2014 alongside our own first-party, cookieless analytics (oc insights): no cookies, no cross-site identity, your IP address is hashed and immediately discarded (never stored), and Do-Not-Track / Global Privacy Control signals are honored. No advertising or tracking cookies."
734
778
  }
735
779
  ]
736
780
  },
@@ -752,7 +796,7 @@ var privacy = {
752
796
  {
753
797
  id: "retention",
754
798
  heading: "data retention",
755
- hint: "90d logs \xB7 permanent public artifacts",
799
+ hint: "no automatic deletion yet \xB7 permanent public artifacts",
756
800
  blocks: [
757
801
  {
758
802
  kind: "bullets",
@@ -762,12 +806,16 @@ var privacy = {
762
806
  v: "permanent and publicly shareable; data published to Nostr cannot be deleted by OrangeCheck"
763
807
  },
764
808
  {
765
- k: "technical logs",
766
- v: "server logs retained 90 days for security and debugging, then auto-deleted"
809
+ k: "request logs",
810
+ v: "held by our hosting provider (Vercel) for its own short retention window; we keep no separate copy"
767
811
  },
768
812
  {
769
- k: "session rows",
770
- v: "live up to 30 days (cookie max-age) or until revoked; idle accounts with no session activity for 24 months are deleted automatically"
813
+ k: "sessions",
814
+ v: "deleted when you sign out. A session that simply expires after 30 days is not yet deleted automatically."
815
+ },
816
+ {
817
+ k: "account, sign-in identities, passkeys and sign-in log",
818
+ v: "kept until you ask us to delete them at [[PRIVACY_CONTACT]]; there is no automatic deletion yet"
771
819
  },
772
820
  {
773
821
  k: "support emails",
@@ -816,7 +864,7 @@ var terms2 = {
816
864
  metaTitle: "Terms of Service \u2014 me.ochk.io",
817
865
  metaDescription: "Terms of service for me.ochk.io: a Bitcoin-backed identity that pays users in sats. OrangeCheck custody during bring-up, federation custody and self-custody graduation as the destination, no KYC.",
818
866
  effective: "2026-05-15",
819
- updated: "2026-05-15",
867
+ updated: "2026-10-08",
820
868
  preamble: [
821
869
  {
822
870
  kind: "callout",
@@ -981,7 +1029,7 @@ var privacy2 = {
981
1029
  metaTitle: "Privacy Policy \u2014 me.ochk.io",
982
1030
  metaDescription: "me.ochk.io privacy policy. No KYC, no PII required, per-integrator scoped identity, and a full account of what OrangeCheck stores.",
983
1031
  effective: "2026-05-15",
984
- updated: "2026-05-15",
1032
+ updated: "2026-10-08",
985
1033
  preamble: [
986
1034
  {
987
1035
  kind: "callout",
@@ -1002,8 +1050,8 @@ var privacy2 = {
1002
1050
  v: "me.ochk.io never collects your legal name, government ID, or physical address"
1003
1051
  },
1004
1052
  {
1005
- k: "no pii at signup",
1006
- v: "you sign up with a Bitcoin signature or an email/phone one-time code \u2014 your choice"
1053
+ k: "little pii at signup",
1054
+ v: "a Bitcoin signature needs no personal data; an email code, Google or GitHub sign-in stores your email address, encrypted"
1007
1055
  },
1008
1056
  {
1009
1057
  k: "scoped identity",
@@ -1039,7 +1087,7 @@ var privacy2 = {
1039
1087
  },
1040
1088
  {
1041
1089
  k: "session record",
1042
- v: "the session JWT id, account id, and issue/revoke timestamps. The session token itself lives only as a cookie in your browser."
1090
+ v: "a hash of the session token, the account id, the IP address and user-agent of the device that opened it, and timestamps. The token itself lives only in your browser."
1043
1091
  },
1044
1092
  {
1045
1093
  k: "event envelopes",
@@ -1088,7 +1136,7 @@ var privacy2 = {
1088
1136
  blocks: [
1089
1137
  {
1090
1138
  kind: "para",
1091
- text: "Two cookies. `oc_session` \u2014 the Ed25519-signed session token issued by ochk.io (HttpOnly, Secure, SameSite=Lax, Domain=.ochk.io). `oc_theme` \u2014 your dark/light preference, not auth-bearing. No tracking cookies, no advertising IDs, no third-party pixels. Page analytics use [Plausible](https://plausible.io/privacy) \u2014 cookie-free, no PII, aggregate only."
1139
+ text: "Four cookies. `oc_session` \u2014 the Ed25519-signed session token issued by ochk.io (HttpOnly, Secure, SameSite=None, Domain=.ochk.io). `oc_theme`, `oc_skin` and `oc_motion` \u2014 your dark/light, appearance and reduced-motion preferences (Domain=.ochk.io), not auth-bearing. No tracking cookies, no advertising IDs, no third-party pixels. Page analytics use [Plausible](https://plausible.io/privacy) \u2014 cookie-free, no PII, aggregate only."
1092
1140
  }
1093
1141
  ]
1094
1142
  },
@@ -1119,8 +1167,8 @@ var privacy2 = {
1119
1167
  v: "retained as the canonical earnings and custody-state record; anchored copies on Bitcoin and Nostr are immutable"
1120
1168
  },
1121
1169
  {
1122
- k: "technical logs",
1123
- v: "retained 90 days for security and debugging, then auto-deleted"
1170
+ k: "request logs",
1171
+ v: "held by our hosting provider (Vercel) for its own short retention window; we keep no separate copy"
1124
1172
  },
1125
1173
  {
1126
1174
  k: "session records",
@@ -1174,7 +1222,7 @@ var terms3 = {
1174
1222
  metaTitle: "Terms of Service \u2014 OC Vault",
1175
1223
  metaDescription: "Terms of service for OC Vault (vault.ochk.io): an end-to-end-encrypted secrets vault. Client-side encryption, on-chain Bitcoin payment, no fund custody.",
1176
1224
  effective: "2026-05-15",
1177
- updated: "2026-05-15",
1225
+ updated: "2026-10-08",
1178
1226
  preamble: [
1179
1227
  {
1180
1228
  kind: "callout",
@@ -1191,7 +1239,7 @@ var terms3 = {
1191
1239
  blocks: [
1192
1240
  {
1193
1241
  kind: "para",
1194
- text: "OC Vault stores passwords, one-time-password seeds, API keys, notes, and small files. Every item is **encrypted client-side** in your browser under a vault key that never leaves your control. When you sync to the cloud, OrangeCheck stores an opaque encrypted blob \u2014 **OrangeCheck cannot read your vault contents, item names, or item types.**"
1242
+ text: "OC Vault stores passwords, one-time-password seeds, API keys, notes, and small files. Every item is **encrypted client-side** in your browser under a vault key that only your passphrase or recovery code unlocks; we store that key only in sealed form. When you sync to the cloud, OrangeCheck stores an opaque encrypted blob \u2014 **OrangeCheck cannot read your vault contents, item names, or item types.**"
1195
1243
  },
1196
1244
  {
1197
1245
  kind: "para",
@@ -1205,7 +1253,7 @@ var terms3 = {
1205
1253
  blocks: [
1206
1254
  {
1207
1255
  kind: "para",
1208
- text: "Your identity is a Bitcoin address you prove control of via BIP-322. No email or password is required. You are responsible for the security of the wallet you sign with and of the vault key that encrypts your data."
1256
+ text: "You sign in with your OrangeCheck account: a Bitcoin address you prove via BIP-322, an email one-time code, or Google/GitHub. Your entries are encrypted under a vault key that your vault passphrase (or recovery code) unlocks; signing in does not decrypt anything. You are responsible for keeping that passphrase and recovery code safe."
1209
1257
  }
1210
1258
  ]
1211
1259
  },
@@ -1277,7 +1325,7 @@ var terms3 = {
1277
1325
  blocks: [
1278
1326
  {
1279
1327
  kind: "para",
1280
- text: "The portable export feature is always free and works offline with [`@orangecheck/vault-core`](https://www.npmjs.com/package/@orangecheck/vault-core) \u2014 even if OC Vault is discontinued, you retain a self-decryptable copy of your data. That guarantee does not depend on any paid tier."
1328
+ text: "The encrypted backup (settings \u2192 encrypted backup) is free on every tier. It writes one file holding your vault key and every entry, sealed under a passphrase you choose (scrypt, then AES-256-GCM), so it restores on any device and stays decryptable with standard, open primitives if OC Vault is discontinued. The plain export holds entries without the key and is readable only where your vault key already is."
1281
1329
  },
1282
1330
  {
1283
1331
  kind: "stub",
@@ -1355,7 +1403,7 @@ var privacy3 = {
1355
1403
  metaTitle: "Privacy Policy \u2014 OC Vault",
1356
1404
  metaDescription: "OC Vault privacy policy. End-to-end encrypted; OrangeCheck stores ciphertext only and cannot read your vault contents.",
1357
1405
  effective: "2026-05-15",
1358
- updated: "2026-05-15",
1406
+ updated: "2026-10-08",
1359
1407
  sections: [
1360
1408
  {
1361
1409
  id: "principles",
@@ -1376,8 +1424,16 @@ var privacy3 = {
1376
1424
  kind: "bullets",
1377
1425
  items: [
1378
1426
  {
1379
- k: "identity address",
1380
- v: "the Bitcoin address you sign in with \u2014 public on-chain already; no email, no name"
1427
+ k: "account id",
1428
+ v: "the opaque did:oc of the OrangeCheck account you sign in with; your vault is filed under it"
1429
+ },
1430
+ {
1431
+ k: "sealed vault key",
1432
+ v: "your vault key, encrypted under your passphrase and under your recovery code, so a new device can unlock; OrangeCheck cannot open it without one of them"
1433
+ },
1434
+ {
1435
+ k: "team email (optional)",
1436
+ v: "if you choose to show teammates an email address in a team vault, that address"
1381
1437
  },
1382
1438
  {
1383
1439
  k: "payment records",
@@ -1385,7 +1441,7 @@ var privacy3 = {
1385
1441
  },
1386
1442
  {
1387
1443
  k: "encrypted blobs",
1388
- v: "opaque ciphertext keyed to your identity address \u2014 OrangeCheck cannot decrypt it"
1444
+ v: "opaque ciphertext filed under your account id \u2014 OrangeCheck cannot decrypt it"
1389
1445
  },
1390
1446
  {
1391
1447
  k: "per-item metadata",
@@ -1412,9 +1468,8 @@ var privacy3 = {
1412
1468
  items: [
1413
1469
  "The contents of any vault item",
1414
1470
  "The names, titles, or types of your items",
1415
- "Your vault key or any recovery material",
1416
- "Your access tokens (only the SHA-256 hash is stored)",
1417
- "Which sites the browser extension autofilled on \u2014 origin matching happens locally in your browser"
1471
+ "Your vault key in usable form, your passphrase, or your recovery code \u2014 we hold the key only sealed under them",
1472
+ "Your access tokens (only the SHA-256 hash is stored)"
1418
1473
  ]
1419
1474
  }
1420
1475
  ]
@@ -1426,12 +1481,12 @@ var privacy3 = {
1426
1481
  blocks: [
1427
1482
  {
1428
1483
  kind: "para",
1429
- text: "The same encrypted vault is reachable from three surfaces. The zero-knowledge guarantee \u2014 that OrangeCheck only ever holds ciphertext \u2014 applies to all of them."
1484
+ text: "The same encrypted vault is reachable from the web app and from the CLI and SDK; a browser extension is planned. The zero-knowledge guarantee \u2014 that OrangeCheck only ever holds ciphertext \u2014 applies to all of them."
1430
1485
  },
1431
- { kind: "subhead", text: "browser extension (OC Vault for Chromium / Firefox)" },
1486
+ { kind: "subhead", text: "browser extension (not released yet)" },
1432
1487
  {
1433
1488
  kind: "para",
1434
- text: "The extension fetches the same encrypted blobs the web app does, caches them **as ciphertext** in browser-extension storage, and decrypts in the service worker only after you enter your passphrase. The vault key lives in memory and a RAM-only `storage.session` slot \u2014 it is never written to disk. The content script that offers autofill receives **one entry's field values at fill time** and nothing else; it never receives the vault key or the entry index. The extension talks only to your own `vault.ochk.io` account: no analytics, no telemetry, no remote code."
1489
+ text: "There is no OC Vault browser extension yet. When one ships, it is designed to work this way: the extension fetches the same encrypted blobs the web app does, caches them **as ciphertext** in browser-extension storage, and decrypts in the service worker only after you enter your passphrase. The vault key lives in memory and a RAM-only `storage.session` slot \u2014 it is never written to disk. The content script that offers autofill receives **one entry's field values at fill time** and nothing else; it never receives the vault key or the entry index. The extension talks only to your own `vault.ochk.io` account: no analytics, no telemetry, no remote code."
1435
1490
  },
1436
1491
  { kind: "subhead", text: "developer platform \u2014 access tokens, CLI, SDK, GitHub Action" },
1437
1492
  {
@@ -1446,7 +1501,7 @@ var privacy3 = {
1446
1501
  blocks: [
1447
1502
  {
1448
1503
  kind: "para",
1449
- text: "Essential cookies only, plus a theme preference. Page analytics use [Plausible](https://plausible.io/privacy) \u2014 cookie-free, no PII, aggregate only. No advertising or tracking cookies."
1504
+ text: "No cookies of vault.ochk.io's own. The family sign-in cookie `oc_session` (set by ochk.io: HttpOnly; Secure; SameSite=None; Domain=.ochk.io; 30 days) and the appearance cookies `oc_theme`, `oc_skin` and `oc_motion` apply here. Your vault data lives in your browser's IndexedDB, under your account. Page analytics use [Plausible](https://plausible.io/privacy) \u2014 cookie-free, no PII, aggregate only. No advertising or tracking cookies."
1450
1505
  }
1451
1506
  ]
1452
1507
  },
@@ -1459,15 +1514,19 @@ var privacy3 = {
1459
1514
  items: [
1460
1515
  {
1461
1516
  k: "encrypted blobs",
1462
- v: "retained while your account is active; deleted on account deletion"
1517
+ v: "kept while your account is active; you can delete the whole cloud copy at any time from settings"
1518
+ },
1519
+ {
1520
+ k: "sealed vault key",
1521
+ v: "kept so a new device can unlock; deleting the cloud copy does not remove it \u2014 ask us at [[PRIVACY_CONTACT]] and we will"
1463
1522
  },
1464
1523
  {
1465
1524
  k: "payment records",
1466
1525
  v: "retained as required for accounting and entitlement verification"
1467
1526
  },
1468
1527
  {
1469
- k: "technical logs",
1470
- v: "retained 90 days, then auto-deleted"
1528
+ k: "request logs",
1529
+ v: "held by our hosting provider (Vercel) for its own short retention window; rate-limit counters keyed by IP expire with their window"
1471
1530
  }
1472
1531
  ]
1473
1532
  }