Ecosystem metrics
- New Repos
- 19
- New
- Commits
- 484
- up 9.8%
- Releases
- 1
- down 75.0%
- Contributors
- 35
- down 12.5%
- Merges
- 4
- down 75.0%
Activity Overview
Commits and releases over time
- Commits
- Releases
- Authors
Repository Explorer
No repositories match that filter.
8935 commits in all time
Aug 12, 2026 16:42 – Nov 10, 2026 16:42 UTC
Merge 415df1c4786d715588cc34884d947fce2b91e173 into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
63cbc772
pull/499/merge
11/796 ++ 33 --
fix(passkey): tighten the app secret's label and refuse the key's own output
- The label must be a string of 1 to 128 printable ASCII characters, no ":". Anything else passed the old check as its text, so a missing value derived a secret under "undefined"; and outside ASCII, labels that look alike can encode differently (composed and decomposed accents) or differ and encode the same (lone surrogates). The label is the PRF input and frozen once used, so the rule is set before the first release. - A second PRF output equal to the first is zeroed and treated as missing: a provider that ignores the PRF input would otherwise hand the app the Falcon key's entropy. withAppSecret throws app-secret-unavailable and the account still signs. - The credential's own copy of the first output is zeroed like the second's. Both are copied before either is zeroed, in case they share a buffer. The README and the guide state the label rule, and that context is not part of the secret's input.
415df1c4
feat/passkey-app-secret
8/148 ++ 34 --
fix(passkey): fail a worker unlock as key-store-failed, not a TypeError
WorkerKeyStore.unlock transfers the entropy buffer to the worker. When the unlock then failed (the worker answered with an error, or the store locked while the worker derived the key), the catch block made a view of that detached buffer to zero it, which throws. The caller got a TypeError instead of the PasskeyError, and lock() was skipped, leaving the worker running. Zero the buffer only while the page still holds it (a worker that never started). The test worker now detaches what it's sent, as a real one does, and tests cover a failure before and after the transfer.
8d043316
feat/passkey-app-secret
2/90 ++ 3 --
Merge e7ec86148c24cef5f9ef1e2c9a6482728e1d58c5 into 6256402b3196fc0e344d8aee1baa77a7b5adb529
5e37cf1f
pull/35/merge
22/6,781 ++ 6,303 --
Merge cedad15add46cd6c945e0d9637ef624c5bc78c44 into 543110998c63b82a7f517c631c32ae62b9fbe9e3
edf777be
pull/949/merge
2/42 ++ 0 --
Add HashSet regression test and fix formatting
cedad15a
pull/949/head
2/15 ++ 0 --
Merge 47f7efd2d47a0cb33b8396a96a49f60216f93d34 into 361d3066ffaca4241991cc6563403417bf562ecf
efd4321b
pull/17/merge
4/3,335 ++ 1,988 --
fix(deps): update all non-major dependencies
47f7efd2
renovate/all-minor-patch
4/3,335 ++ 1,988 --
feat: bind crypto to WebCrypto and drop Node and runtime-library dependencies
Use the platform's WebCrypto (crypto.subtle) for SHA-512, SHA-256, HMAC, X25519 and Ed25519 verification. Keep @noble only for what WebCrypto lacks: unclamped Ed25519 point arithmetic for BIP32-Ed25519, Ed25519 -> X25519 key conversion (@noble/curves), and BLAKE2b (@noble/hashes). Replace Buffer and bn.js with plain Uint8Array/bigint helpers so the published build has no Node globals. Runtime dependencies drop from six to two. Key derivation, signatures and ECDH outputs are byte-identical to the previous implementation. verifyWithPublicKey keeps libsodium's strict rules (canonical S, R and public key; small-order points rejected) regardless of the platform's WebCrypto edge-case behaviour. API changes since 2.0.0-canary.1: - fromSeed is async and accepts any Uint8Array. - signData no longer takes a metadata argument. Encoding/JSON-schema validation and the Algorand tag-prefix check were removed; it signs exactly the bytes given. SignMetadata, Encoding, ERROR_BAD_DATA and ERROR_TAGS_FOUND are no longer exported. Callers signing untrusted data must domain-separate it (e.g. as ARC-60 does). - signAlgoTransaction rejects input not prefixed with "TX" by throwing TxTagMissingError, catching an encoded transaction passed in place of its bytes to sign. - deriveChildNodePublic rejects harden(0) (previously returned a wrong key). - Only the package root is importable (package.json "exports"). - Requires Node.js >= 22, a browser with WebCrypto Ed25519/X25519, or a WebCrypto polyfill on React Native. Also: - README test vectors regenerated; the previous ones did not match the library's output. A test now checks the README vectors. - Switch from yarn to pnpm; update CI to Node 22/24 and current actions. - build/test clean dist first so stale spec files are never packed.
e7ec8614
pull/35/head
22/6,781 ++ 6,303 --
Merge 7fa03ea75e9afb7cd02cf5ce1e0b44834eb0107a into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
658752f9
pull/499/merge
9/588 ++ 26 --
feat(passkey): opt-in app secret from a second PRF output
An app can ask the passkey for a secret of its own, derived from the
same credential but separate from the signing key: pass
`appSecret: { label }` and read it with `withAppSecret(callback)`.
- Every PRF ceremony (connect, unlock) also evaluates `eval.second`
with `@txnlab/use-wallet-passkey:app-secret:v1:<label>` while the
option is set. The label is 1-128 characters, no `:`.
- The secret is held only while the session is unlocked and zeroed on
lock, release, a failed connect and a key mismatch. `withAppSecret`
hands the callback a copy it zeroes afterwards; while locked it runs
a PRF ceremony (confirmed per `confirm`).
- A provider that returns no second output gives `PasskeyError` code
`app-secret-unavailable`.
- `PasskeySigningRequest` gains `{ type: 'app-secret' }`.
- `APP_SECRET_PREFIX`, `appSecretInput` and `PasskeyAppSecretOptions`
are exported; the prefix is frozen.
hay.app uses it to derive a separate ZeroSignal payer account from a
passkey Haystack Login, as it already does from a legacy login's key.
7fa03ea7
feat/passkey-app-secret
9/588 ++ 26 --
Merge e94d75462e825343f97788abbcfcc6f8f9e9ef0d into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
5c2302b4
pull/485/merge
2/2 ++ 2 --
Merge 3331841e433eebf40b65cec72f07e7462a144e69 into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
07d6b379
pull/497/merge
1/1 ++ 1 --
Merge 6e4a93ad05adf1b8af27e245840339b5f33f36ee into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
710b9acf
pull/486/merge
2/93 ++ 62 --
Merge 0e6bb79ee4c18330ebc3cd7c248792e53f3720b4 into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
b28ef15a
pull/487/merge
1/1,298 ++ 1,289 --
Merge d46863dd548a611dbf2ba45ec877cde707fe3b3d into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
9d30d617
pull/472/merge
3/115 ++ 102 --
Merge 05e60d53cfd10d627a311e5aff2cc9cd93de6e00 into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
efdd7b72
pull/469/merge
2/94 ++ 63 --
Merge 486c084039848a63935016d92bebf31e83f0be39 into 3563e702c453dd7767d37b4ee0d98ec76a0221f5
c33dd131
pull/463/merge
2/5,537 ++ 3,766 --
Merge 1658525ace3d4186d92d4ef5680e74032f27d443 into 263335d8dd91c127e482e5d45c6195b55ad8cae2
2757ae04
pull/76/merge
3/133 ++ 263 --
chore(deps): Update dependency vitest to v4 [SECURITY]
1658525a
renovate/npm-vitest-vulnerability
3/133 ++ 263 --
chore(deps): Update all non-major dependencies (#87)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
263335d8
main
4/204 ++ 134 --