@hypercerts-org/lexicon
1.4.0#
This release adds first-class records for non-agent subjects, together with shared tags for describing features and collections.
Represent non-agent subjects#
The new org.hypercerts.entity.feature record represents a subject that is not a person or organization. Examples include a managed land zone, ecological stratum, participant cohort, or campaign.
A feature can include:
- a title, description, and general type
- tags describing the feature
- optional location records when the subject is spatial
- external identifiers through
sameAs
Collections can now include features alongside activities and nested collections. Existing activity claims continue to reference app.certified.location directly and do not need to change.
Add shared tags to features and collections#
The new org.hypercerts.vocab.tag record lets publishers define tags that features and collections can share.
For example, a land feature could have both a "project site" tag and a "mangrove land cover" tag. Because each tag is published as a record, different features and collections can use the same definition instead of relying on inconsistent free-text values.
A tag can also record:
- alternative names
- a link to the equivalent term in another standard
- whether it has been retired and replaced
- the more general tags it belongs under
When a feature or collection has several tags, they are all treated as facts about that record. Tags do not express OR, NOT, weighting, or other logic.
Compatibility#
These changes are additive. Existing records remain valid.
Thanks @DjimoSerodio for contributing these changes in #242.
1.3.1#
Patch Changes#
1.3.0#
Updates the bundled Leaflet lexicons to match their published schemas.
New Leaflet schemas#
- Blocks:
html,imageGallery,membersOnlyDelimiter,postsList,signup,standardSitePost, andstandardSitePublication - Theme colors:
pub.leaflet.theme.color
Schema updates#
- Iframes no longer require a URL. They can also specify an aspect ratio or use the deprecated inline HTML field.
- Images can specify their display width.
- Linear documents accept the new block types.
- Rich-text links can use
href, and highlighted text can specify an RGB or RGBA color.
Released in #239 by @Kzoeps (d772554).
1.2.0#
Minor Changes#
#236
5439b36Thanks @Ashex! - Addapp.certified.graph.entityFollow, a follow record for non-account entities.subjectis an open union currently offering onlyapp.certified.defs#recordSubject(a record referenced by AT-URI without a CID, so the follow survives updates to the referenced record); account follows remain inapp.certified.graph.follow. The new collection is also added to theapp.certified.authWritepermission set so it is grantable alongside the other Certified records.#222
fa1c29aThanks @aspiers! - Add three permission-set lexicons —org.hypercerts.authWrite,org.hyperboards.authWrite, andapp.certified.authWrite— each granting create/update/delete over every record collection in its namespace.A permission set lets any AT Protocol app request a whole bundle of
repo:scopes with a singleinclude:<nsid>OAuth scope, instead of enumerating each collection by hand. The user's PDS resolves and expands the set during the OAuth grant; the same published set can also be consumed by services (e.g. the Certified group service) when expanding API-key scopes.There are three sets rather than one because the spec requires it: a permission set "is limited to expressing permissions that reference resources under the same NSID namespace as the set itself" and "can not address 'sibling groups' or 'parents'".
org.hypercerts,org.hyperboards, andapp.certifiedare separate namespace authorities, so they cannot be combined in a single set — an app needing more than one requests eachinclude:scope.Permission sets are published as-is (they are the source of truth for what gets published to AT Protocol) but have no TypeScript shape —
lex gen-apicannot generate code forpermission-setdefs. They are therefore excluded from the codegen globs (gen-api/gen-md/gen-ts) and fromgenerated/exports.ts, while still shipping as raw lexicon JSON.Collection lists are enumerated explicitly because the spec forbids wildcards inside a permission set; they must be kept in sync as record types are added. See
docs/design/permission-sets.md.The generated
SCHEMAS.mdreference now renders permission-set entries (title, detail, and the resource/collections/actions each set grants) instead of leaving them as empty sections.
1.1.0#
Minor Changes#
#219
39d7547Thanks @aspiers! - Add optional cryptographic signature support to all 21 record lexicons.Non-breaking: signatures are optional on every record.
- New
app.certified.signature.defswith#list(open union of inline signatures andcom.atproto.repo.strongRefreferences) and#inline(raw ECDSA(r,s)bytes plus a DID verification method reference; signing curve derived from the verification method's multicodec prefix). - New
app.certified.signature.proofrecord for remote attestations. - Every record lexicon gains an optional
signaturesproperty referencing#list. README.md,SCHEMAS.md, and thebuilding-with-hypercerts-lexiconsagent skill all gain a "Cryptographic Signatures" section with a worked end-to-end signing example.
On-the-wire shape, signing procedure, and verification procedure all conform to Nick Gerakines' ATProtocol Attestation Specification (see also the accompanying blog post).
On
app.certified.link.evmthe existing EIP-712prooffield (wallet consent) and the newsignaturesarray (record provenance) are complementary and do not conflict.- New
1.0.0#
Major Changes#
#220
dd78ed4Thanks @s-adamantine! - Promote@hypercerts-org/lexiconto v1.0.0 — first stable release.This changeset contributes no schema or type changes of its own; it exists solely to force a major version bump so the package crosses the 0.x → 1.0 line. From v1.0.0 onward, the lexicons, TypeScript types, and generated exports are considered stable for downstream consumers, and the package follows standard SemVer semantics: breaking changes bump the major version, non-breaking additions the minor version, and fixes the patch version. (Prior to v1.0.0, breaking changes were allowed under
minorper the SemVer 0.x convention — see.claude/skills/writing-changesets/SKILL.md.)Any other changesets pending at the time this one is consumed are folded into the same v1.0.0 release; see the other entries below for those contributions.
Minor Changes#
#212
871608fThanks @Kzoeps! - Increase the free-form activity work scope string limit from 100 to 1,000 graphemes, with a 10,000-byte cap.The previous 100-grapheme limit was too tight for simple work scope descriptions: if the relevant terms are around 10–15 characters each, the field only fits roughly 5–6 words. Gainforest hit this limit while implementing the work scope string field and had to move to the CEL-based work scope form earlier than intended.
Most invalid work scope records were caused by the newer typed shape requiring
$type; the length cap only affects two known accounts at the time, so raising it fixes those without changing currently valid claims.The string form is the simplest option for producers that do not need CEL's structured, machine-evaluable semantics. Raising the grapheme and byte limits keeps that simple path viable for concise natural-language scopes while CEL remains available for more complex tagging and query logic.
0.13.0#
Minor Changes#
- #209
8ec051fThanks @s-adamantine! - Addapp.certified.graph.followlexicon — a social-graph follow record schema-compatible withapp.bsky.graph.follow(sametidkey, samesubject/createdAt/ optionalviastrongRef fields). Exports newGRAPH_FOLLOW_NSID,GRAPH_FOLLOW_LEXICON_JSON,GRAPH_FOLLOW_LEXICON_DOC, andAppCertifiedGraphFollowtype namespace.
Patch Changes#
- #213
80e5b42Thanks @s-adamantine! - Clarify thatknownValuesis an open vocabulary, not a closed enum. Adds a "Schema Conventions" section to README.md explaining that custom string values are permitted on anyknownValuesfield (and contrasting withenum, which is closed and validator-enforced). Updates inline descriptions onapp.certified.location#locationType,org.hypercerts.workscope.tag#category, andorg.hypercerts.workscope.tag#statusto explicitly note that values beyond the listed set are permitted — bringing them in line with the existing wording onorg.hypercerts.collection#type,org.hypercerts.context.attachment#contentType, andapp.certified.badge.definition#badgeType. ThelocationTypedescription now also explicitly calls out that polygons / multipolygons / featurecollections use the catch-allgeojsonentry rather than a typed variant. Fixes a misleading line in STRING_CONSTRAINTS.md that conflatedknownValueswithenum. Documentation-only — no schema or type changes.
0.12.0#
Minor Changes#
- #174
b1c2096Thanks @satyam-mishra-pce! - Add optionallongDescriptionandvisibilityfields toapp.certified.actor.organizationlexicon.longDescriptionuses the description union pattern — an inline string for plain text or markdown, an embedded Leaflet linear document for rich-text content, or a strong reference to an existing description record — matching the pattern used on activity, collection, and attachment.
Patch Changes#
- #208
18abe86Thanks @s-adamantine! - SyncSKILL.mdOrganization row withREADME.md: listfoundedDate,longDescription, andvisibilityin the Certified lexicons overview table so AI agents building on top ofapp.certified.actor.organizationsee the full set of documented fields.
0.11.2#
Patch Changes#
- #205
4af4e8bThanks @s-adamantine! - Sync vendoredpub.leaflet.blocks.imagelexicon with upstream, adding the optionalfullBleedboolean property
0.11.1#
Patch Changes#
#196
e66a459Thanks @aspiers! - Fix incorrect NSID reference inorg.hyperboards.boardsubject field description (org.hypercerts.claim.collection→org.hypercerts.collection).Documentation fixes in
README.mdandSCHEMAS.md:- Correct
validate()call signature examples (parameter order and result shape) - Fix relationship diagram arrow directions and missing entries (
link/evm,CERTIFIEDsection) - Fix contributor field name (
avatar→image) - Fix context target descriptions (generalized to
any recordsince subjects use genericstrongRef) - Add missing
$typediscriminators to union member examples
- Correct
0.11.0#
The v0.11.0 release introduces EVM identity linking, stronger type safety across badge and funding schemas, vendored Leaflet lexicons for runtime validation, and a set of schema refinements based on real-world usage from the first month of v0.10.0 adoption. All changes listed below are merged to main and will ship together as a single coordinated release.
npm install @hypercerts-org/lexicon@0.11.0
New lexicons#
EVM identity linking
app.certified.link.evm
A new record type for creating verifiable links between ATProto identities and EVM wallet addresses. Each record contains a cryptographic proof — currently EIP-712 typed data signatures for EOA wallets — that binds a DID to an Ethereum address onchain.
The proof field is an open union, so future signature methods (ERC-1271, ERC-6492) can be added without breaking existing records.
{
"address": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"proof": {
"$type": "app.certified.link.evm#eip712Proof",
"signature": "0x...",
"message": {
"did": "did:plc:abc123",
"evmAddress": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"chainId": "1",
"timestamp": "1711929600",
"nonce": "0",
},
},
"createdAt": "2026-04-03T00:00:00.000Z",
}
Vendored Leaflet and richtext lexicons
pub.leaflet.* · pub.leaflet.richtext.facet
The package now ships the full set of Leaflet block and richtext facet lexicon JSON files (17 files). Previously, these external schemas were shimmed at the TypeScript type level via @atcute packages, which caused LexiconDefNotFoundError at runtime when validating records with description or facet fields. Vendoring them fixes runtime validation and removes the @atcute/leaflet and @atcute/bluesky dependencies.
This is a packaging change, not a schema change. No record structures are affected.
Breaking changes#
This release includes three breaking schema changes. All were identified early enough in adoption that the team decided the long-term gains outweigh the migration cost.
Evaluation scores are now strings
org.hypercerts.context.evaluation
The min, max, and value fields on evaluation scores changed from integer to string. ATProto has no native decimal type, and integer-only scores made use cases like "3.7 out of 5" impossible.
// Before
- { "min": 0, "max": 10, "value": 7 }
+ // After
+ { "min": "0", "max": "10", "value": "7.5" }
Who needs to update:
| Consumer | Action |
|---|---|
| Indexers | Change column type from INTEGER to TEXT. Backfill existing records. Update any numeric sorting or filtering logic. |
| AppViews | Parse scores as strings. Use parseFloat() for numeric display where appropriate. |
| Frontend | Handle both numeric strings ("3.7") and potentially non-numeric strings ("A+") in display components. |
Badge references are now strong refs
app.certified.badge.award · app.certified.badge.response
Badge awards and responses now reference their parent records via com.atproto.repo.strongRef instead of plain lexicon refs. Strong references include both a URI and a content hash (CID), pinning the reference to a specific version of the badge definition. This prevents the meaning of an award from drifting if the underlying badge definition is later modified.
// Before
- "badge": "at://did:plc:abc/app.certified.badge.definition/123"
// After
+ "badge": {
+ "uri": "at://did:plc:abc/app.certified.badge.definition/123",
+ "cid": "bafyrei..."
+ }
Who needs to update:
| Consumer | Action |
|---|---|
| Indexers | Update parsing to expect { uri, cid } objects instead of plain URI strings for badge and badgeAward fields. |
| AppViews | Update resolution logic. Dereference using both uri and cid for content verification. |
| SDK consumers | Regenerate types. Any code constructing badge awards or responses must supply the full strong ref. |
Funding receipt fields normalized
org.hypercerts.funding.receipt
The from, to, and for fields have been reworked for consistency and stronger type safety.
| Field | Before (v0.10.0) | After |
|---|---|---|
from | Required, DID ref | Optional, union of #text | app.certified.defs#did | com.atproto.repo.strongRef |
to | Plain string | Union of #text | app.certified.defs#did | com.atproto.repo.strongRef |
for | AT-URI string | com.atproto.repo.strongRef (pins to a specific record version) |
The from and to fields were asymmetric — from required an AT Protocol identity while to accepted any string. Now both are three-way unions that accept a free-text string (#text — for display names, wallet addresses, or other identifiers), a DID, or a strong reference. This treats senders and recipients uniformly while preserving the ability to reference non-ATProto participants. from is also optional, properly supporting anonymous funding. for is now a strong ref, ensuring the receipt always points to the exact version of the activity it funded.
// Before
- "from": { "$type": "app.certified.defs#did", "did": "did:plc:sender" },
- "to": "did:plc:recipient",
- "for": "at://did:plc:abc/org.hypercerts.claim.activity/123"
// After — with a DID
+ "from": { "$type": "app.certified.defs#did", "did": "did:plc:sender" },
+ "to": { "$type": "app.certified.defs#did", "did": "did:plc:recipient" },
// After — with a free-text identifier
+ "to": { "$type": "org.hypercerts.funding.receipt#text", "value": "0xAb58...eC9B" },
// After — for field
+ "for": {
+ "uri": "at://did:plc:abc/org.hypercerts.claim.activity/123",
+ "cid": "bafyrei..."
+ }
Who needs to update:
| Consumer | Action |
|---|---|
| Indexers | Update parsing for from, to (now unions with $type discriminator — handle all three variants), and for (now { uri, cid }). Allow NULL for from. |
| AppViews | Update resolution logic for all three fields. for requires dereferencing via both URI and CID. Handle #text variants for display. |
| SDK consumers | Regenerate types. Code constructing receipts must supply union-typed to and strong ref for. |
| Frontend | Update forms to construct proper union objects for sender/recipient. Handle #text for non-ATProto participants. Handle missing from for anonymous display. |
Schema changes#
A note on "optional" fields: Even new optional fields require attention from indexers and AppViews. If an indexer doesn't store a new field, that data is silently lost for every downstream consumer. The changes below are non-breaking in the strict sense — existing records remain valid — but ignoring them means incomplete data.
Known values
Several free-text string fields now declare knownValues — a set of canonical values that establish interoperability conventions across the ecosystem. Custom values are still permitted. Think of these as Schelling points, not constraints.
| Lexicon | Field | Known values |
|---|---|---|
org.hypercerts.collection | type | favorites · project · portfolio · program |
org.hypercerts.context.attachment | contentType | report · audit · evidence · testimonial · methodology |
app.certified.badge.definition | badgeType | endorsement · verification · participation · certification · affiliation · recognition |
Action: Indexers should index these values for filtering and categorization. AppViews and frontends can use them for dropdowns, search facets, and display grouping. No schema migration required — the underlying field type is still a string.
Badge icon is now optional
app.certified.badge.definition
The icon field moved from required to optional. Not all badges have a visual representation — endorsements, participation records, and text-based certifications can now omit the icon entirely.
Action: Indexers should allow NULL in the icon column. Frontend developers must add a fallback or placeholder when rendering badges without an icon — apps that assume icon is always present will crash or render broken UI.
Contributors array is uncapped
org.hypercerts.claim.activity
Removed the maxLength: 1000 constraint on the contributors array. ATProto records have a natural 1 MB size limit (~2,000–4,000 contributors), making the artificial cap unnecessary.
Action: Indexers and AppViews with hardcoded length limits matching the old max should remove them. Frontends should implement pagination or lazy loading for large contributor lists to avoid performance issues.
Rich text on collection short descriptions
org.hypercerts.collection
Added shortDescriptionFacets — an optional array of rich text facets (mentions, URLs, hashtags) that annotate the shortDescription field. This brings collections in line with activity claims, which already supported facets.
Action: Indexers must store the new field when present — without it, rich text annotations (links, mentions) are permanently lost. AppViews should include facets in API responses. Frontends can render rich text using the standard ATProto facet model.
Documentation improvements#
- Contributor and item defs now have descriptions, improving TypeScript IntelliSense and AI code generation.
occurredAtvscreatedAtsemantics clarified on funding receipts.occurredAtis when the funding happened in the real world;createdAtis when the record was written to the PDS.- Stale references in board and measurement lexicon descriptions have been corrected.
- README rewritten with an ASCII namespace map and structured reference tables.
- AI agent skill added for downstream developers. Install via
npx skills add hypercerts-org/hypercerts-lexicon.
Upgrading#
npm install @hypercerts-org/lexicon@0.11.0
The source of truth for lexicon definitions is the NPM package and the published ATProto repository. The main branch on GitHub is a development branch — do not build production applications against it.
After upgrading, regenerate your TypeScript types and run your validation suite against the updated schemas. The package includes all lexicon JSON files and pre-built type definitions.
0.10.0#
Minor Changes#
#76
3044e22Thanks @s-adamantine! - Add org.hypercerts.acknowledgement lexicon for bidirectional inclusion links between records across PDS repos#141
06fb6b5Thanks @holkexyz! - Add CEL expression support for structured work scopes (org.hypercerts.workscope.cel,org.hypercerts.workscope.tag)#106
b03a1f7Thanks @copilot-swe-agent! - Add avatar and banner fields to collection lexicon for visual representation#113
c3f9ca2Thanks @holkexyz! - Refactor collection items structure to support optional weights and remove activityWeight from activity schemaBreaking Changes:
- Activity lexicon (
org.hypercerts.claim.activity):- Removed
org.hypercerts.claim.activity#activityWeightdef - Activity records no longer include activity weight information
- Removed
- Collection lexicon (
org.hypercerts.claim.collection):- Changed
org.hypercerts.claim.collection#itemsfrom array of strongRefs to array of item objects - Added
org.hypercerts.claim.collection#itemdef with:itemIdentifier(required): strongRef to an item (activity or collection)itemWeight(optional): positive numeric value stored as string
- Supports recursive collection nesting (items can reference activities or other collections)
- Changed
Migration:
Collection items: Convert from array of strongRefs to array of item objects:
JSON// Before "items": [strongRef1, strongRef2] // After "items": [ { "itemIdentifier": strongRef1, "itemWeight": "1.5" }, { "itemIdentifier": strongRef2 } ]Activity weights: Migrate existing
org.hypercerts.claim.activity#activityWeightdata to collectionorg.hypercerts.claim.collection#item.itemWeight:JSON// Old (removed from activity) { "activity": { "uri": "...", "cid": "..." }, "weight": "1.5" } // New (in collection items) { "itemIdentifier": { "uri": "...", "cid": "..." }, "itemWeight": "1.5" }Update collections that reference activities to include weights in
org.hypercerts.claim.collection#item.itemWeight. Weights can be dropped if not needed.- Activity lexicon (
#149
9f124ebThanks @daviddao! - Addorg.hyperboards.boardandorg.hyperboards.displayProfilelexicons for hyperboard visual presentation records.#123
c623d32Thanks @aspiers! - Addlocationproperty to collections. Collections can now reference a location record directly via strongRef. This replaces the sidecar pattern which was impractical since location records cannot be reused across multiple collections.#140
20eb414Thanks @holkexyz! - Add app.certified.actor.organization sidecar record for organization actor profiles with fields for organization type, labeled URLs, location (strongRef), and founded date#133
6752cadThanks @Kzoeps! - Add profile lexicon for Hypercert account profiles with support for display name, description, pronouns, website, avatar, banner.#78
c55d8a7Thanks @bitbeckers! - Remove org.hypercerts.claim.project lexicon and replace with org.hypercerts.claim.collection.project sidecar. Projects are now represented as collections with an optional project sidecar (same TID) that provides rich-text descriptions, avatars, and cover photos. Avatar and coverPhoto fields moved from base collection to project sidecar. Collections without the project sidecar are simple groupings; collections with it are "projects" with rich documentation.#91
0c6da09Thanks @holkexyz! - Add rich text facet support to activity claim descriptionsAdd
shortDescriptionFacetsanddescriptionFacetsfields to the activity lexicon to support rich text annotations (mentions, URLs, hashtags, etc.) in activity claim descriptions.#144
fb90134Thanks @holkexyz! - Make items optional in collection schema to allow creating empty collections#151
4d5f42fThanks @holkexyz! - Add optionalurlfield toapp.certified.badge.awardfor linking to an external page associated with the badge#122
3e3da41Thanks @aspiers! - Drop HELPER_ prefix from workScopeTag constants.HELPER_WORK_SCOPE_TAG_NSID,HELPER_WORK_SCOPE_TAG_LEXICON_JSON, andHELPER_WORK_SCOPE_TAG_LEXICON_DOCare nowWORK_SCOPE_TAG_NSID,WORK_SCOPE_TAG_LEXICON_JSON, andWORK_SCOPE_TAG_LEXICON_DOC.#136
062fbdeThanks @copilot-swe-agent! - Expand locationType knownValues to include geojson, h3, geohash, wkt, address, and scaledCoordinates from the Location Protocol spec#131
7f42fadThanks @aspiers! - Add inline string format to app.certified.location schema with documentation and examples#121
5c33b79Thanks @aspiers! - Fix camelCase export names to use underscores. Generated constants likeCONTRIBUTIONDETAILS_LEXICON_*are nowCONTRIBUTION_DETAILS_LEXICON_*for consistency.Affected exports:
CONTRIBUTION_DETAILS_NSID,CONTRIBUTION_DETAILS_LEXICON_JSON,CONTRIBUTION_DETAILS_LEXICON_DOC(wasCONTRIBUTIONDETAILS_*)CONTRIBUTOR_INFORMATION_NSID,CONTRIBUTOR_INFORMATION_LEXICON_JSON,CONTRIBUTOR_INFORMATION_LEXICON_DOC(wasCONTRIBUTORINFORMATION_*)STRONG_REF_NSID,STRONG_REF_LEXICON_JSON,STRONG_REF_LEXICON_DOC(wasSTRONGREF_*)HELPER_WORK_SCOPE_TAG_NSID,HELPER_WORK_SCOPE_TAG_LEXICON_JSON,HELPER_WORK_SCOPE_TAG_LEXICON_DOC(wasHELPER_WORKSCOPETAG_*)
#132
da481e0Thanks @aspiers! - Convert app.certified.defs#did to object typeThe did definition in app.certified.defs has been converted from a primitive string type to an object type to comply with the ATProto specification requirement that all union variants must be object or record types.
This change was necessary because app.certified.badge.award uses this definition in a union for the subject property.
Breaking changes:
app.certified.defs#did: Now an object withdidstring property (maxLength 256)- Code using this type must now access the
.didproperty instead of using the value directly
#132
e134b26Thanks @aspiers! - Convert union string definitions to object types in activity lexiconThe contributorIdentity, contributorRole, and workScopeString definitions in org.hypercerts.claim.activity have been converted from primitive string types to object types to comply with the ATProto specification requirement that all union variants must be object or record types.
Additionally, maximum length constraints have been reduced to more reasonable values:
contributorIdentity.identity: maxLength 1000, maxGraphemes 100 (previously no limits)contributorRole.role: maxLength 1000, maxGraphemes 100 (previously maxLength 10000, maxGraphemes 1000)workScopeString.scope: maxLength 1000, maxGraphemes 100 (previously maxLength 10000, maxGraphemes 1000)
Breaking changes:
contributorIdentity: Now an object withidentitystring propertycontributorRole: Now an object withrolestring propertyworkScopeString: Now an object withscopestring property- Reduced maximum lengths may affect existing records with longer values
This requires updating code that uses these union types to access the nested property instead of using the value directly.
#152
2afb6edThanks @holkexyz! - Use Leaflet linear documents for rich-text descriptions in activity and attachment lexicons, and make attachment content optional.#161
96bdb6cThanks @aspiers! - Improved exports structure with semantic collection mappings for extra syntactic sugar.Breaking Changes:
- Renamed
idsexport toHYPERCERTS_NSIDS_BY_TYPE(maps type namespaces to NSIDs)
New Features:
- Added
HYPERCERTS_NSIDSobject with semantic keys (e.g.,ACTIVITY,RIGHTS,CONTRIBUTION) - Added
HYPERCERTS_LEXICON_JSONobject with semantic keys mapping to raw JSON lexicons - Added
HYPERCERTS_LEXICON_DOCobject with semantic keys mapping to typed lexicon documents - All three new objects share the same key structure for consistency
Migration Guide:
If you were using the
idsexport (rare):TypeScript// Before import { ids } from "@hypercerts-org/lexicon"; const nsid = ids.OrgHypercertsClaimActivity; // After import { HYPERCERTS_NSIDS_BY_TYPE } from "@hypercerts-org/lexicon"; const nsid = HYPERCERTS_NSIDS_BY_TYPE.OrgHypercertsClaimActivity;Most users should use individual NSID constants (unchanged):
TypeScriptimport { ACTIVITY_NSID, RIGHTS_NSID } from "@hypercerts-org/lexicon";Or the new semantic mapping:
TypeScriptimport { HYPERCERTS_NSIDS } from "@hypercerts-org/lexicon"; const nsid = HYPERCERTS_NSIDS.ACTIVITY; // Same as ACTIVITY_NSID- Renamed
#161
6a62c04Thanks @aspiers! - This release represents the migration of the lexicon package from the SDK monorepo (hypercerts-sdk/packages/lexicon) to a dedicated standalone repository (hypercerts-lexicon). This separation allows for independent versioning and development of the lexicon definitions.Major architectural and feature updates compared to the SDK lexicon package include but are not limited to the following:
New Lexicons:
- Activity model:
org.hypercerts.claim.activity- activity-based hypercert records (replaces single claim model) - Project records:
org.hypercerts.claim.project- projects that group multiple activities - Shared definitions:
org.hypercerts.defs- common types (uri, smallBlob, largeBlob, smallImage, largeImage) - Badge system:
app.certified.badge.definition,app.certified.badge.award,app.certified.badge.responsefor badge-based endorsements - Funding receipts:
org.hypercerts.funding.receipt- payment and funding tracking
Architectural Changes:
- Claim model: Replaced single
org.hypercerts.claimrecord with activity-basedorg.hypercerts.claim.activitymodel - Collection model: Collections now reference activities (via
activityWeight) instead of claims (viaclaimItem) - Work scope: Activity model uses structured
workScopeobject with label-based conditions (withinAllOf,withinAnyOf,withinNoneOf) - Time fields: Activity uses
startDate/endDateinstead ofworkTimeFrameFrom/workTimeFrameTo - Image references: Activity model references
org.hypercerts.defs#smallImageinstead ofapp.certified.defs#uri/smallBlob
Definition Updates:
app.certified.defsnow includesdidtype definition- Added
org.hypercerts.defswith image and blob type definitions - Activity model references project via AT-URI instead of strongRef
Removed/Replaced:
org.hypercerts.claim(replaced byorg.hypercerts.claim.activity)- Top-level
org.hypercerts.collection(replaced byorg.hypercerts.claim.collectionusing activities)
- Activity model:
#153
57dc44cThanks @holkexyz! - Improve acknowledgement schema: move to org.hypercerts.context.acknowledgement, generalize descriptions, make context optional, add maxGraphemes to comment.#158
7743aa6Thanks @holkexyz! - Move collection lexicon fromorg.hypercerts.claim.collectiontoorg.hypercerts.collectionto reflect that collections can contain more than just claims.#154
4c52b2cThanks @holkexyz! - Move evaluation and attachment lexicons to org.hypercerts.context namespace.#135
806cfbcThanks @Kzoeps! - Move profile lexicon from app.certified.profile to app.certified.actor.profile namespace, requiring migration of existing profile records#97
ceddab9Thanks @aspiers! - Move schema documentation tables from README.md to auto-generated SCHEMAS.md to reduce git merge conflicts. The SCHEMAS.md file is now auto-generated from lexicon definitions and included in the distributed package.#102
68011aeThanks @holkexyz! - Refactor contributions structure in activity lexiconBreaking Changes:
- Activity lexicon (
org.hypercerts.claim.activity):- Renamed
contributionsfield tocontributors - Replaced
contributionsarray (array of strongRefs) with newcontributorsarray containing contributor objects - Each contributor object (
org.hypercerts.claim.activity#contributor) has three fields:contributorIdentity(required): string (DID/identifier) or strongRef to a contributor information recordcontributionWeight(optional): positive numeric value stored as stringcontributionDetails(optional): string or strongRef to a contribution details record
- Added internal defs:
#contributor: object type for contributor entries#contributorIdentity: string type for DID/identifier values#contributorRole: string type for contribution details (maxLength 10000, maxGraphemes 1000)
- Renamed
Migration:
Convert from array of strongRefs to array of contributor objects:
JSON// Before "contributions": [strongRef1, strongRef2] // After "contributors": [ { "contributorIdentity": "did:example:123", "contributionWeight": "1.5", "contributionDetails": "Lead developer" }, { "contributorIdentity": strongRefToContributorInfo, "contributionDetails": strongRefToContributionDetails } ]- Activity lexicon (
#120
b2f7b68Thanks @holkexyz! - Refactor measurement lexicon schema: convert subject to subjects array, add unit field, date ranges, and locations arrayBreaking Changes:
- Measurement lexicon (
org.hypercerts.context.measurement):- Changed
subject(single strongRef) tosubjects(array of strongRefs, maxLength: 100) - Changed required fields: removed
measurersfrom required, addedunitas required - Added
unitfield (required, string, maxLength: 50): The unit of the measured value (e.g. kg CO₂e, hectares, %, index score) - Added
startDatefield (optional, datetime): The start date and time when the measurement began - Added
endDatefield (optional, datetime): The end date and time when the measurement ended - Changed
location(single strongRef) tolocations(array of strongRefs, maxLength: 100) - Moved
measurersfrom required to optional field - Added
commentfield (optional, string): Short comment suitable for previews and list views - Added
commentFacetsfield (optional, array): Rich text annotations forcomment(mentions, URLs, hashtags, etc.) - Updated field descriptions for
metricandvaluewith more detailed examples
- Changed
- Measurement lexicon (
#67
b51dd76Thanks @bitbeckers! - Remove bidirectional project-activity link. Activities no longer include aprojectfield reference. Projects continue to reference activities via theactivitiesarray, making the relationship unidirectional (project → activities only).#98
43b0431Thanks @aspiers! - Remove org.hypercerts.claim.collection.project lexicon#155
a59e541Thanks @holkexyz! - Rename contributionDetails to contribution (org.hypercerts.claim.contribution).#118
8427780Thanks @holkexyz! - Rename evidence lexicon to attachment and refactor schema structureBreaking Changes:
- Lexicon ID change:
org.hypercerts.claim.evidence→org.hypercerts.claim.attachment- All existing evidence records must be migrated to use the new lexicon ID
- Schema structure changes (
org.hypercerts.claim.attachment):- Changed
subject(single strongRef) tosubjects(array of strongRefs, maxLength: 100) - Changed
contentfrom single union (uri/blob) to array of unions (maxLength: 100) - Added
contentTypefield (string, maxLength: 64) to specify attachment type - Removed
relationTypefield (previously used to indicate supports/challenges/clarifies) - Removed
contributorsfield - Removed
locationsfield - Added rich text support:
shortDescriptionFacetsanddescriptionFacets(arrays ofapp.bsky.richtext.facet) - Updated required fields:
["title", "content", "createdAt"](content is now required)
- Changed
- Common definitions (
org.hypercerts.defs):- Added
weightedContributordef for contributor references with optional weights - Added
contributorIdentitydef for string-based contributor identification
- Added
Migration:
Lexicon ID: Update all references from
org.hypercerts.claim.evidencetoorg.hypercerts.claim.attachment.Schema migration:
JSON// Before (org.hypercerts.claim.evidence) { "$type": "org.hypercerts.claim.evidence", "subject": { "uri": "...", "cid": "..." }, "content": { "uri": "https://..." }, "title": "Evidence Title", "relationType": "supports", "createdAt": "..." } // After (org.hypercerts.claim.attachment) { "$type": "org.hypercerts.claim.attachment", "subjects": [{ "uri": "...", "cid": "..." }], "content": [{ "uri": "https://..." }], "contentType": "evidence", "title": "Evidence Title", "createdAt": "..." }Field mapping:
subject→subjects(wrap in array)content(single) →content(array, wrap existing value)relationType→ remove (no direct replacement)contributors→ remove (no direct replacement)locations→ remove (no direct replacement)
- Lexicon ID change:
#156
86f252dThanks @holkexyz! - Require createdAt in app.certified.actor.profile schema#161
ec91289Thanks @aspiers! - chore: switch to build via rollupMajor build system improvements:
- Build System: Migrated from direct TypeScript to Rollup-based builds
- Generates proper ESM (
dist/index.mjs) and CommonJS (dist/index.cjs) bundles - Generates TypeScript declarations (
dist/index.d.ts) - Includes source maps for debugging
- Adds
/lexiconsexport for lighter bundle (validation only)
- Generates proper ESM (
- Code Generation:
- Auto-generates
generated/exports.tswith clean, organized exports - Creates type shims for external lexicons (@atcute/leaflet)
- All generated code now in
generated/directory (gitignored)
- Auto-generates
- Package Exports:
- Main export:
@hypercerts-org/lexicon(full package with types) - Lexicons export:
@hypercerts-org/lexicon/lexicons(schemas only, smaller bundle) - Proper dual package support (ESM + CommonJS)
- Main export:
- Code Quality:
- Added ESLint configuration
- Added TypeScript type-checking to CI
- Improved build validation workflow
- Dependencies:
- Added
@atcute/leafletfor external lexicon references - Added
multiformatsas runtime dependency - Moved
@atproto/lex-clito devDependencies (build-time only)
- Added
Migration: No breaking changes for existing users. Package structure is improved but import paths remain compatible.
- Build System: Migrated from direct TypeScript to Rollup-based builds
#125
771d142Thanks @s-adamantine! - Simplify workScope to union of strongRef and stringBreaking Changes:
- The
workScopefield inorg.hypercerts.claim.activityis now a union of:com.atproto.repo.strongRef: A reference to a work-scope logic record for structured, nested work scope definitionsorg.hypercerts.claim.activity#workScopeString: A free-form string for simple or legacy scopes
- Removed from
org.hypercerts.defs:workScopeAll(logical AND operator)workScopeAny(logical OR operator)workScopeNot(logical NOT operator)workScopeAtom(atomic scope reference)
This simplification allows work scope complexity to be managed via referenced records while still supporting simple string-based scopes for straightforward use cases.
- The
#47
6a66e4bThanks @satyam-mishra-pce! - Add support for multiple locations in an activity claim.#103
b5d79daThanks @s-adamantine! - Align all lexicons with the ATProto Lexicon Style Guide: change badge responseenumtoknownValues, addmaxLength/maxGraphemesto unconstrained string and array fields, fix style checker to skip format-typed fields.#75
95e2ba1Thanks @s-adamantine! - Unify project and collection schemas into a singleorg.hypercerts.claim.collectionlexicon withtypediscriminator field to allow collections to be designated as projects. Custom strings are also allowed intype.Also make
shortDescriptionfield optional inorg.hypercerts.claim.collectionto matchorg.hypercerts.claim.project.This unification removes
org.hypercerts.claim.project, so existing projects should be migrated to collections withtypeset toproject.#80
e8d5a7cThanks @s-adamantine! - Updatedorg.hypercerts.claim.collectionlexicon:- Added optional
typefield to specify collection type (e.g., 'favorites', 'project') - Renamed fields for consistency:
collectionTitle→titleshortCollectionDescription→shortDescriptioncollectionDescription→description
- Changed
descriptionfrom string to Leaflet linear document reference (pub.leaflet.pages.linearDocument#main) to support rich-text descriptions
Breaking changes:
- Field names have been renamed (e.g.,
collectionTitle→title) - The
descriptionfield now expects a reference object instead of a plain string
- Added optional
#92
bec8e63Thanks @s-adamantine! - Updateorg.hypercerts.claim.contributorlexicon to support individual contributor profiles and roles.Breaking Changes:
- Removed
contributorsarray. - Added
identifier,displayName, andimagefields for individual profiles. - Renamed
descriptiontocontributionDescription. - Updated
requiredfields to only includecreatedAt.
Also corrected incorrect references to
org.hypercerts.claim.contributionacross the codebase to use the correct IDorg.hypercerts.claim.contributor.- Removed
Patch Changes#
#118
8427780Thanks @holkexyz! - Add location property to attachment schemaNew Feature:
locationfield (org.hypercerts.claim.attachment):- Added optional
locationproperty as a strong reference (com.atproto.repo.strongRef) - Allows attachments to associate location metadata directly without using the sidecar pattern
- The referenced record must conform to the
app.certified.locationlexicon
- Added optional
Usage:
JSON{ "$type": "org.hypercerts.claim.attachment", "subjects": [ { "uri": "at://did:plc:.../org.hypercerts.claim.activity/...", "cid": "..." } ], "content": [{ "uri": "https://..." }], "title": "Field Report", "location": { "uri": "at://did:plc:.../app.certified.location/abc123", "cid": "..." }, "createdAt": "..." }This change aligns with the location property addition to collections (PR #123), providing a consistent pattern for associating location metadata across record types.
#161
5a490bfThanks @aspiers! - Add basic test suite using vitest 4.#77
0d61ff7Thanks @bitbeckers! - Document ATProto sidecar pattern for collections using app.certified.location. Collections can now have location metadata by creating a location record with the same TID, allowing location updates without changing the collection CID. Updated README with usage example and ERD with sidecar relationship.#161
ece7629Thanks @aspiers! - Include CHANGELOG.md in package distribution for better user documentation.#74
f845f92Thanks @aspiers! - Make startDate and endDate optional in activity lexicon#161
913eb06Thanks @aspiers! - Switch from bundled to individual type declaration filesChanges:
- Removed
rollup-plugin-dtsdependency - Switched to native TypeScript declaration generation
- Type declarations now mirror source structure in
dist/types/ - Individual type files are small (1-3KB each) and lazy-loaded by TypeScript
- Improves IDE performance by avoiding single 39MB bundled declaration file
Technical Details:
The package now generates individual
.d.tsfiles alongside the bundled JavaScript output. This provides better IDE performance as TypeScript can lazy-load type files on demand rather than parsing a massive bundled declaration file upfront.- Removed
0.10.0-beta.16#
Minor Changes#
#141
06fb6b5Thanks @holkexyz! - Add CEL expression support for structured work scopes (org.hypercerts.workscope.cel,org.hypercerts.workscope.tag)#149
9f124ebThanks @daviddao! - Addorg.hyperboards.boardandorg.hyperboards.displayProfilelexicons for hyperboard visual presentation records.#140
20eb414Thanks @holkexyz! - Add app.certified.actor.organization sidecar record for organization actor profiles with fields for organization type, labeled URLs, location (strongRef), and founded date#144
fb90134Thanks @holkexyz! - Make items optional in collection schema to allow creating empty collections#151
4d5f42fThanks @holkexyz! - Add optionalurlfield toapp.certified.badge.awardfor linking to an external page associated with the badge#152
2afb6edThanks @holkexyz! - Use Leaflet linear documents for rich-text descriptions in activity and attachment lexicons, and make attachment content optional.#153
57dc44cThanks @holkexyz! - Improve acknowledgement schema: move to org.hypercerts.context.acknowledgement, generalize descriptions, make context optional, add maxGraphemes to comment.#158
7743aa6Thanks @holkexyz! - Move collection lexicon fromorg.hypercerts.claim.collectiontoorg.hypercerts.collectionto reflect that collections can contain more than just claims.#154
4c52b2cThanks @holkexyz! - Move evaluation and attachment lexicons to org.hypercerts.context namespace.#155
a59e541Thanks @holkexyz! - Rename contributionDetails to contribution (org.hypercerts.claim.contribution).#156
86f252dThanks @holkexyz! - Require createdAt in app.certified.actor.profile schema#103
b5d79daThanks @s-adamantine! - Align all lexicons with the ATProto Lexicon Style Guide: change badge responseenumtoknownValues, addmaxLength/maxGraphemesto unconstrained string and array fields, fix style checker to skip format-typed fields.
0.10.0-beta.15#
Minor Changes#
#76
3044e22Thanks @s-adamantine! - Add org.hypercerts.acknowledgement lexicon for bidirectional inclusion links between records across PDS repos#136
062fbdeThanks @copilot-swe-agent! - Expand locationType knownValues to include geojson, h3, geohash, wkt, address, and scaledCoordinates from the Location Protocol spec
0.10.0-beta.14#
Minor Changes#
#133
6752cadThanks @Kzoeps! - Add profile lexicon for Hypercert account profiles with support for display name, description, pronouns, website, avatar, banner.#132
da481e0Thanks @aspiers! - Convert app.certified.defs#did to object typeThe did definition in app.certified.defs has been converted from a primitive string type to an object type to comply with the ATProto specification requirement that all union variants must be object or record types.
This change was necessary because app.certified.badge.award uses this definition in a union for the subject property.
Breaking changes:
app.certified.defs#did: Now an object withdidstring property (maxLength 256)- Code using this type must now access the
.didproperty instead of using the value directly
#132
e134b26Thanks @aspiers! - Convert union string definitions to object types in activity lexiconThe contributorIdentity, contributorRole, and workScopeString definitions in org.hypercerts.claim.activity have been converted from primitive string types to object types to comply with the ATProto specification requirement that all union variants must be object or record types.
Additionally, maximum length constraints have been reduced to more reasonable values:
contributorIdentity.identity: maxLength 1000, maxGraphemes 100 (previously no limits)contributorRole.role: maxLength 1000, maxGraphemes 100 (previously maxLength 10000, maxGraphemes 1000)workScopeString.scope: maxLength 1000, maxGraphemes 100 (previously maxLength 10000, maxGraphemes 1000)
Breaking changes:
contributorIdentity: Now an object withidentitystring propertycontributorRole: Now an object withrolestring propertyworkScopeString: Now an object withscopestring property- Reduced maximum lengths may affect existing records with longer values
This requires updating code that uses these union types to access the nested property instead of using the value directly.
#135
806cfbcThanks @Kzoeps! - Move profile lexicon from app.certified.profile to app.certified.actor.profile namespace, requiring migration of existing profile records
0.10.0-beta.13#
Minor Changes#
#131
7f42fadThanks @aspiers! - Add inline string format to app.certified.location schema with documentation and examples#118
8427780Thanks @holkexyz! - Rename evidence lexicon to attachment and refactor schema structureBreaking Changes:
- Lexicon ID change:
org.hypercerts.claim.evidence→org.hypercerts.claim.attachment- All existing evidence records must be migrated to use the new lexicon ID
- Schema structure changes (
org.hypercerts.claim.attachment):- Changed
subject(single strongRef) tosubjects(array of strongRefs, maxLength: 100) - Changed
contentfrom single union (uri/blob) to array of unions (maxLength: 100) - Added
contentTypefield (string, maxLength: 64) to specify attachment type - Removed
relationTypefield (previously used to indicate supports/challenges/clarifies) - Removed
contributorsfield - Removed
locationsfield - Added rich text support:
shortDescriptionFacetsanddescriptionFacets(arrays ofapp.bsky.richtext.facet) - Updated required fields:
["title", "content", "createdAt"](content is now required)
- Changed
- Common definitions (
org.hypercerts.defs):- Added
weightedContributordef for contributor references with optional weights - Added
contributorIdentitydef for string-based contributor identification
- Added
Migration:
Lexicon ID: Update all references from
org.hypercerts.claim.evidencetoorg.hypercerts.claim.attachment.Schema migration:
JSON// Before (org.hypercerts.claim.evidence) { "$type": "org.hypercerts.claim.evidence", "subject": { "uri": "...", "cid": "..." }, "content": { "uri": "https://..." }, "title": "Evidence Title", "relationType": "supports", "createdAt": "..." } // After (org.hypercerts.claim.attachment) { "$type": "org.hypercerts.claim.attachment", "subjects": [{ "uri": "...", "cid": "..." }], "content": [{ "uri": "https://..." }], "contentType": "evidence", "title": "Evidence Title", "createdAt": "..." }Field mapping:
subject→subjects(wrap in array)content(single) →content(array, wrap existing value)relationType→ remove (no direct replacement)contributors→ remove (no direct replacement)locations→ remove (no direct replacement)
- Lexicon ID change:
Patch Changes#
#118
8427780Thanks @holkexyz! - Add location property to attachment schemaNew Feature:
locationfield (org.hypercerts.claim.attachment):- Added optional
locationproperty as a strong reference (com.atproto.repo.strongRef) - Allows attachments to associate location metadata directly without using the sidecar pattern
- The referenced record must conform to the
app.certified.locationlexicon
- Added optional
Usage:
JSON{ "$type": "org.hypercerts.claim.attachment", "subjects": [ { "uri": "at://did:plc:.../org.hypercerts.claim.activity/...", "cid": "..." } ], "content": [{ "uri": "https://..." }], "title": "Field Report", "location": { "uri": "at://did:plc:.../app.certified.location/abc123", "cid": "..." }, "createdAt": "..." }This change aligns with the location property addition to collections (PR #123), providing a consistent pattern for associating location metadata across record types.
0.10.0-beta.12#
Minor Changes#
#120
b2f7b68Thanks @holkexyz! - Refactor measurement lexicon schema: add unit field, date ranges, and locations arrayBreaking Changes:
- Measurement lexicon (
org.hypercerts.claim.measurement):- Changed required fields: removed
measurersfrom required, addedunitas required - Added
unitfield (required, string, maxLength: 50): The unit of the measured value (e.g. kg CO₂e, hectares, %, index score) - Added
startDatefield (optional, datetime): The start date and time when the measurement began - Added
endDatefield (optional, datetime): The end date and time when the measurement ended - Changed
location(single strongRef) tolocations(array of strongRefs, maxLength: 100) - Moved
measurersfrom required to optional field - Added
commentfield (optional, string): Short comment suitable for previews and list views - Added
commentFacetsfield (optional, array): Rich text annotations forcomment(mentions, URLs, hashtags, etc.) - Updated field descriptions for
metricandvaluewith more detailed examples
- Changed required fields: removed
Migration:
Required fields: Update measurement records to include the new required
unitfield:JSON// Before { "$type": "org.hypercerts.claim.measurement", "measurers": [...], "metric": "CO₂ sequestered", "value": "1000", "createdAt": "..." } // After { "$type": "org.hypercerts.claim.measurement", "metric": "CO₂ sequestered", "unit": "kg CO₂e", "value": "1000", "measurers": [...], // Now optional "createdAt": "..." }Location field: Convert from single location to locations array:
JSON// Before { "location": { "uri": "...", "cid": "..." } } // After { "locations": [{ "uri": "...", "cid": "..." }] }Date ranges: Optionally add
startDateandendDateto specify when measurements were taken.- Measurement lexicon (
#125
771d142Thanks @s-adamantine! - Simplify workScope to union of strongRef and stringBreaking Changes:
- The
workScopefield inorg.hypercerts.claim.activityis now a union of:com.atproto.repo.strongRef: A reference to a work-scope logic record for structured, nested work scope definitionsorg.hypercerts.claim.activity#workScopeString: A free-form string for simple or legacy scopes
- Removed from
org.hypercerts.defs:workScopeAll(logical AND operator)workScopeAny(logical OR operator)workScopeNot(logical NOT operator)workScopeAtom(atomic scope reference)
This simplification allows work scope complexity to be managed via referenced records while still supporting simple string-based scopes for straightforward use cases.
- The
0.10.0-beta.11#
Minor Changes#
- #123
c623d32Thanks @aspiers! - Addlocationproperty to collections. Collections can now reference a location record directly via strongRef. This replaces the sidecar pattern which was impractical since location records cannot be reused across multiple collections.
0.10.0-beta.10#
Minor Changes#
- #122
3e3da41Thanks @aspiers! - Drop HELPER_ prefix from workScopeTag constants.HELPER_WORK_SCOPE_TAG_NSID,HELPER_WORK_SCOPE_TAG_LEXICON_JSON, andHELPER_WORK_SCOPE_TAG_LEXICON_DOCare nowWORK_SCOPE_TAG_NSID,WORK_SCOPE_TAG_LEXICON_JSON, andWORK_SCOPE_TAG_LEXICON_DOC.
0.10.0-beta.9#
Minor Changes#
#121
5c33b79Thanks @aspiers! - Fix camelCase export names to use underscores. Generated constants likeCONTRIBUTIONDETAILS_LEXICON_*are nowCONTRIBUTION_DETAILS_LEXICON_*for consistency.Affected exports:
CONTRIBUTION_DETAILS_NSID,CONTRIBUTION_DETAILS_LEXICON_JSON,CONTRIBUTION_DETAILS_LEXICON_DOC(wasCONTRIBUTIONDETAILS_*)CONTRIBUTOR_INFORMATION_NSID,CONTRIBUTOR_INFORMATION_LEXICON_JSON,CONTRIBUTOR_INFORMATION_LEXICON_DOC(wasCONTRIBUTORINFORMATION_*)STRONG_REF_NSID,STRONG_REF_LEXICON_JSON,STRONG_REF_LEXICON_DOC(wasSTRONGREF_*)HELPER_WORK_SCOPE_TAG_NSID,HELPER_WORK_SCOPE_TAG_LEXICON_JSON,HELPER_WORK_SCOPE_TAG_LEXICON_DOC(wasHELPER_WORKSCOPETAG_*)
0.10.0-beta.8#
Minor Changes#
#107
678de97Thanks @holkexyz! - Add work scope logic expression system with boolean operatorsNew Features:
- Work scope logic AST (
org.hypercerts.defs):- Added
org.hypercerts.defs#workScopeAll(logical AND): requires all arguments to be satisfied, with recursive union support for nested expressions - Added
org.hypercerts.defs#workScopeAny(logical OR): requires at least one argument to be satisfied, with recursive union support for nested expressions - Added
org.hypercerts.defs#workScopeNot(logical NOT): negates an expression, with recursive union support for nested expressions - Added
org.hypercerts.defs#workScopeAtom: atomic reference to a scope tag record via strongRef - All operators support recursive boolean logic expressions through union types in their
args/argproperties, allowing nested combinations ofworkScopeAll,workScopeAny,workScopeNot, andworkScopeAtom
- Added
- Work scope tag lexicon (
org.hypercerts.helper.workScopeTag):- New record type for reusable scope atoms
- Fields:
createdAt,key,label(required),kind,description,parent,aliases,externalReference(optional) - Supports taxonomy/hierarchy via
parentstrongRef - Supports external references via URI or blob
- Activity lexicon (
org.hypercerts.claim.activity):- Added
org.hypercerts.claim.activity#workScopefield using a union type that referencesorg.hypercerts.defs#workScopeAll,org.hypercerts.defs#workScopeAny,org.hypercerts.defs#workScopeNot, andorg.hypercerts.defs#workScopeAtom - Enables complex boolean logic expressions for work scope definitions with recursive nesting support
- Replaces simple strongRef approach with expressive AST-based system
- Added
Breaking Changes:
- The
workScopefield inorg.hypercerts.claim.activitynow expects a work scope logic expression instead of a simple strongRef. Existing records using the old format will need to be migrated to use the new AST structure.
- Work scope logic AST (
0.10.0-beta.7#
Minor Changes#
#106
b03a1f7Thanks @copilot-swe-agent! - Add avatar and banner fields to collection lexicon for visual representation#113
c3f9ca2Thanks @holkexyz! - Refactor collection items structure to support optional weights and remove activityWeight from activity schemaBreaking Changes:
- Activity lexicon (
org.hypercerts.claim.activity):- Removed
org.hypercerts.claim.activity#activityWeightdef - Activity records no longer include activity weight information
- Removed
- Collection lexicon (
org.hypercerts.claim.collection):- Changed
org.hypercerts.claim.collection#itemsfrom array of strongRefs to array of item objects - Added
org.hypercerts.claim.collection#itemdef with:itemIdentifier(required): strongRef to an item (activity or collection)itemWeight(optional): positive numeric value stored as string
- Supports recursive collection nesting (items can reference activities or other collections)
- Changed
Migration:
Collection items: Convert from array of strongRefs to array of item objects:
JSON// Before "items": [strongRef1, strongRef2] // After "items": [ { "itemIdentifier": strongRef1, "itemWeight": "1.5" }, { "itemIdentifier": strongRef2 } ]Activity weights: Migrate existing
org.hypercerts.claim.activity#activityWeightdata to collectionorg.hypercerts.claim.collection#item.itemWeight:JSON// Old (removed from activity) { "activity": { "uri": "...", "cid": "..." }, "weight": "1.5" } // New (in collection items) { "itemIdentifier": { "uri": "...", "cid": "..." }, "itemWeight": "1.5" }Update collections that reference activities to include weights in
org.hypercerts.claim.collection#item.itemWeight. Weights can be dropped if not needed.- Activity lexicon (
#91
0c6da09Thanks @holkexyz! - Add rich text facet support to activity claim descriptionsAdd
shortDescriptionFacetsanddescriptionFacetsfields to the activity lexicon to support rich text annotations (mentions, URLs, hashtags, etc.) in activity claim descriptions.
0.10.0-beta.6#
Minor Changes#
#102
68011aeThanks @holkexyz! - Refactor contributions structure and split contributor lexiconBreaking Changes:
- Activity lexicon (
org.hypercerts.claim.activity):- Renamed
contributionsfield tocontributors - Replaced
contributionsarray (array of strongRefs) with newcontributorsarray containing contributor objects - Each contributor object has three fields:
contributorInformation(required): string (DID/identifier) or strongRef toorg.hypercerts.claim.contributorInformation#mainweight(optional): positive number (stored as string)contributionDetails(optional): string or strongRef toorg.hypercerts.claim.contributionDetails#main
- Renamed internal
contributionobject type tocontributor - Renamed string wrapper defs:
contributorInformationString→contributorIdentity,contributionDetailsString→contributorRole - Updated
contributorRolestring limits: maxLength 10000, maxGraphemes 1000
- Renamed
- Contributor lexicon (
org.hypercerts.claim.contributor):- Split into two separate lexicon files:
org.hypercerts.claim.contributorInformation: new lexicon file containingidentifier,displayName,image(contributor profile information)org.hypercerts.claim.contributionDetails: new lexicon file containingrole,contributionDescription,startDate,endDate(contribution-specific details)
- The original
org.hypercerts.claim.contributorlexicon has been removed
- Split into two separate lexicon files:
Existing contributions using the old structure will need to be migrated to the new format.
- Activity lexicon (
0.10.0-beta.5#
Minor Changes#
#78
c55d8a7Thanks @bitbeckers! - Remove org.hypercerts.claim.project lexicon and replace with org.hypercerts.claim.collection.project sidecar. Projects are now represented as collections with an optional project sidecar (same TID) that provides rich-text descriptions, avatars, and cover photos. Avatar and coverPhoto fields moved from base collection to project sidecar. Collections without the project sidecar are simple groupings; collections with it are "projects" with rich documentation.#93
3276d6eThanks @bitbeckers! - Change workScope from inline object definition to strongRef in activity lexicon. This breaking change removes the workScope definition (withinAllOf, withinAnyOf, withinNoneOf properties) and changes the workScope property to reference an external record via strongRef, allowing for more flexible work scope definitions.#97
ceddab9Thanks @aspiers! - Move schema documentation tables from README.md to auto-generated SCHEMAS.md to reduce git merge conflicts. The SCHEMAS.md file is now auto-generated from lexicon definitions and included in the distributed package.#78
cc9d7bfThanks @bitbeckers! - Refactor collection lexicon to use items array instead of activities. The items array contains plain strongRefs (com.atproto.repo.strongRef) that can reference activities (org.hypercerts.claim.activity) and/or other collections (org.hypercerts.claim.collection), enabling recursive collection nesting. This change removes the activityWeight object structure from the base collection lexicon.#67
b51dd76Thanks @bitbeckers! - Remove bidirectional project-activity link. Activities no longer include aprojectfield reference. Projects continue to reference activities via theactivitiesarray, making the relationship unidirectional (project → activities only).#98
43b0431Thanks @aspiers! - Remove org.hypercerts.claim.collection.project lexicon#75
95e2ba1Thanks @s-adamantine! - Unify project and collection schemas into a singleorg.hypercerts.claim.collectionlexicon withtypediscriminator field to allow collections to be designated as projects. Custom strings are also allowed intype.Also make
shortDescriptionfield optional inorg.hypercerts.claim.collectionto matchorg.hypercerts.claim.project.This unification removes
org.hypercerts.claim.project, so existing projects should be migrated to collections withtypeset toproject.#80
e8d5a7cThanks @s-adamantine! - Updatedorg.hypercerts.claim.collectionlexicon:- Added optional
typefield to specify collection type (e.g., 'favorites', 'project') - Renamed fields for consistency:
collectionTitle→titleshortCollectionDescription→shortDescriptioncollectionDescription→description
- Changed
descriptionfrom string to Leaflet linear document reference (pub.leaflet.pages.linearDocument#main) to support rich-text descriptions
Breaking changes:
- Field names have been renamed (e.g.,
collectionTitle→title) - The
descriptionfield now expects a reference object instead of a plain string
- Added optional
#92
bec8e63Thanks @s-adamantine! - Updateorg.hypercerts.claim.contributorlexicon to support individual contributor profiles and roles.Breaking Changes:
- Removed
contributorsarray. - Added
identifier,displayName, andimagefields for individual profiles. - Renamed
descriptiontocontributionDescription. - Updated
requiredfields to only includecreatedAt.
Also corrected incorrect references to
org.hypercerts.claim.contributionacross the codebase to use the correct IDorg.hypercerts.claim.contributor.- Removed
Patch Changes#
#77
0d61ff7Thanks @bitbeckers! - Document ATProto sidecar pattern for collections using app.certified.location. Collections can now have location metadata by creating a location record with the same TID, allowing location updates without changing the collection CID. Updated README with usage example and ERD with sidecar relationship.#74
f845f92Thanks @aspiers! - Make startDate and endDate optional in activity lexicon
0.10.0-beta.4#
Minor Changes#
- #47
6a66e4bThanks @satyam-mishra-pce! - Add support for multiple locations in an activity claim.
0.10.0-beta.3#
Patch Changes#
ece7629Thanks @aspiers! - Include CHANGELOG.md in package distribution for better user documentation.
0.10.0-beta.2#
Patch Changes#
0.10.0-beta.1#
Minor Changes#
96bdb6cThanks @aspiers! - Improved exports structure with semantic collection mappings for extra syntactic sugar.Breaking Changes:
- Renamed
idsexport toHYPERCERTS_NSIDS_BY_TYPE(maps type namespaces to NSIDs)
New Features:
- Added
HYPERCERTS_NSIDSobject with semantic keys (e.g.,ACTIVITY,RIGHTS,CONTRIBUTION) - Added
HYPERCERTS_LEXICON_JSONobject with semantic keys mapping to raw JSON lexicons - Added
HYPERCERTS_LEXICON_DOCobject with semantic keys mapping to typed lexicon documents - All three new objects share the same key structure for consistency
Migration Guide:
If you were using the
idsexport (rare):TypeScript// Before import { ids } from "@hypercerts-org/lexicon"; const nsid = ids.OrgHypercertsClaimActivity; // After import { HYPERCERTS_NSIDS_BY_TYPE } from "@hypercerts-org/lexicon"; const nsid = HYPERCERTS_NSIDS_BY_TYPE.OrgHypercertsClaimActivity;Most users should use individual NSID constants (unchanged):
TypeScriptimport { ACTIVITY_NSID, RIGHTS_NSID } from "@hypercerts-org/lexicon";Or the new semantic mapping:
TypeScriptimport { HYPERCERTS_NSIDS } from "@hypercerts-org/lexicon"; const nsid = HYPERCERTS_NSIDS.ACTIVITY; // Same as ACTIVITY_NSID- Renamed
ec91289Thanks @aspiers! - chore: switch to build via rollupMajor build system improvements:
- Build System: Migrated from direct TypeScript to Rollup-based builds
- Generates proper ESM (
dist/index.mjs) and CommonJS (dist/index.cjs) bundles - Generates TypeScript declarations (
dist/index.d.ts) - Includes source maps for debugging
- Adds
/lexiconsexport for lighter bundle (validation only)
- Generates proper ESM (
- Code Generation:
- Auto-generates
generated/exports.tswith clean, organized exports - Creates type shims for external lexicons (@atcute/leaflet)
- All generated code now in
generated/directory (gitignored)
- Auto-generates
- Package Exports:
- Main export:
@hypercerts-org/lexicon(full package with types) - Lexicons export:
@hypercerts-org/lexicon/lexicons(schemas only, smaller bundle) - Proper dual package support (ESM + CommonJS)
- Main export:
- Code Quality:
- Added ESLint configuration
- Added TypeScript type-checking to CI
- Improved build validation workflow
- Dependencies:
- Added
@atcute/leafletfor external lexicon references - Added
multiformatsas runtime dependency - Moved
@atproto/lex-clito devDependencies (build-time only)
- Added
Migration: No breaking changes for existing users. Package structure is improved but import paths remain compatible.
- Build System: Migrated from direct TypeScript to Rollup-based builds
Patch Changes#
913eb06Thanks @aspiers! - Switch from bundled to individual type declaration filesChanges:
- Removed
rollup-plugin-dtsdependency - Switched to native TypeScript declaration generation
- Type declarations now mirror source structure in
dist/types/ - Individual type files are small (1-3KB each) and lazy-loaded by TypeScript
- Improves IDE performance by avoiding single 39MB bundled declaration file
Technical Details:
The package now generates individual
.d.tsfiles alongside the bundled JavaScript output. This provides better IDE performance as TypeScript can lazy-load type files on demand rather than parsing a massive bundled declaration file upfront.- Removed
0.10.0-beta.0#
Minor Changes#
6a62c04Thanks @aspiers! - This release represents the migration of the lexicon package from the SDK monorepo (hypercerts-sdk/packages/lexicon) to a dedicated standalone repository (hypercerts-lexicon). This separation allows for independent versioning and development of the lexicon definitions.Major architectural and feature updates compared to the SDK lexicon package include but are not limited to the following:
New Lexicons:
- Activity model:
org.hypercerts.claim.activity- activity-based hypercert records (replaces single claim model) - Project records:
org.hypercerts.claim.project- projects that group multiple activities - Shared definitions:
org.hypercerts.defs- common types (uri, smallBlob, largeBlob, smallImage, largeImage) - Badge system:
app.certified.badge.definition,app.certified.badge.award,app.certified.badge.responsefor badge-based endorsements - Funding receipts:
org.hypercerts.funding.receipt- payment and funding tracking
Architectural Changes:
- Claim model: Replaced single
org.hypercerts.claimrecord with activity-basedorg.hypercerts.claim.activitymodel - Collection model: Collections now reference activities (via
activityWeight) instead of claims (viaclaimItem) - Work scope: Activity model uses structured
workScopeobject with label-based conditions (withinAllOf,withinAnyOf,withinNoneOf) - Time fields: Activity uses
startDate/endDateinstead ofworkTimeFrameFrom/workTimeFrameTo - Image references: Activity model references
org.hypercerts.defs#smallImageinstead ofapp.certified.defs#uri/smallBlob
Definition Updates:
app.certified.defsnow includesdidtype definition- Added
org.hypercerts.defswith image and blob type definitions - Activity model references project via AT-URI instead of strongRef
Removed/Replaced:
org.hypercerts.claim(replaced byorg.hypercerts.claim.activity)- Top-level
org.hypercerts.collection(replaced byorg.hypercerts.claim.collectionusing activities)
- Activity model: