Select the types of activity you want to include in your feed.
feat(registry): add project update history
Add project-owned What's New records with local indexing and owner/public UI so update history can live on the project PDS while rendering quickly in Explore.
···499499 missingProfile: "We couldn't find a profile for that handle.",
500500 backToExplore: "Back to Explore",
501501 categoryLabel: "Category",
502502+ whatsNew: {
503503+ heading: "What's New",
504504+ empty: "No updates yet.",
505505+ versionHistory: "Version History",
506506+ viewCommit: "View commit",
507507+ },
502508 notFoundTitle: "404",
503509 notFoundBody: "We couldn't find a profile for that handle.",
504510 },
505511 create: {
506512 eyebrow: "Add to Explore",
507507- headline: "Sign in with your project's Atmosphere account",
513513+ headline: "Sign in with your Atmosphere account",
508514 body:
509509- "Anyone can list a project. Sign in with the account that controls the project — anyone with that account can publish or update the entry. Nothing else is written to your PDS.",
515515+ "Use this page to sign in, write reviews, or submit a project. If you're submitting a project, sign in with that project's Atmosphere account so the right account can publish and update it.",
510516 signInLabel: "Sign in with your Atmosphere handle",
511511- handlePlaceholder: "yourproject.com",
517517+ handlePlaceholder: "yourhandle.com",
512518 signIn: "Sign in",
513519 configError:
514520 "OAuth isn't configured on this deployment yet. Try again shortly.",
···684690 /** Generic failure surface — server text appended after. */
685691 errorPrefix: "Couldn't submit request",
686692 },
693693+ },
694694+ profileUpdates: {
695695+ eyebrow: "What's New",
696696+ title: "Project updates",
697697+ body:
698698+ "Post release notes for your public profile. Each update is saved as its own record on your project account.",
699699+ titleLabel: "Update title",
700700+ titlePlaceholder: "e.g. New beta release",
701701+ versionLabel: "Version (optional)",
702702+ versionPlaceholder: "e.g. 1.2.0",
703703+ notesLabel: "Update notes",
704704+ notesPlaceholder: "What's changed?",
705705+ commitLabel: "Tangled commit link (optional)",
706706+ commitPlaceholder: "https://tangled.org/…",
707707+ publishButton: "Publish update",
708708+ updateButton: "Update note",
709709+ saving: "Saving…",
710710+ saved: "Update saved.",
711711+ saveError: "Could not save update.",
712712+ delete: "Delete",
713713+ deleting: "Deleting…",
714714+ deleted: "Update deleted.",
715715+ deleteError: "Could not delete update.",
716716+ edit: "Edit",
717717+ cancelEdit: "Cancel edit",
718718+ confirmDelete: "Delete this update?",
687719 },
688720 },
689721 },
···11+{
22+ "lexicon": 1,
33+ "id": "com.atmosphereaccount.registry.update",
44+ "defs": {
55+ "main": {
66+ "type": "record",
77+ "description": "A project-owned What's New update for an Atmosphere registry profile. Each record represents one release/update note and may optionally link to Tangled commit metadata.",
88+ "key": "any",
99+ "record": {
1010+ "type": "object",
1111+ "required": ["title", "body", "createdAt"],
1212+ "properties": {
1313+ "title": {
1414+ "type": "string",
1515+ "minLength": 1,
1616+ "maxLength": 80,
1717+ "maxGraphemes": 80,
1818+ "description": "Short update title."
1919+ },
2020+ "body": {
2121+ "type": "string",
2222+ "minLength": 1,
2323+ "maxLength": 1000,
2424+ "maxGraphemes": 1000,
2525+ "description": "Update notes shown in What's New and version history."
2626+ },
2727+ "version": {
2828+ "type": "string",
2929+ "maxLength": 32,
3030+ "maxGraphemes": 32,
3131+ "description": "Optional version or release label."
3232+ },
3333+ "tangledCommitUrl": {
3434+ "type": "string",
3535+ "format": "uri",
3636+ "maxLength": 512,
3737+ "description": "Optional Tangled commit URL related to this update."
3838+ },
3939+ "tangledRepoUrl": {
4040+ "type": "string",
4141+ "format": "uri",
4242+ "maxLength": 512,
4343+ "description": "Optional Tangled repository URL used for future sync provenance."
4444+ },
4545+ "source": {
4646+ "type": "string",
4747+ "maxLength": 32,
4848+ "knownValues": ["manual", "tangled"],
4949+ "description": "Where the update came from. Omitted means manual."
5050+ },
5151+ "createdAt": {
5252+ "type": "string",
5353+ "format": "datetime",
5454+ "maxLength": 64
5555+ },
5656+ "updatedAt": {
5757+ "type": "string",
5858+ "format": "datetime",
5959+ "maxLength": 64
6060+ }
6161+ }
6262+ }
6363+ }
6464+ }
6565+}
+22
lib/db.ts
···272272 created_at INTEGER NOT NULL,
273273 updated_at INTEGER NOT NULL
274274 )`,
275275+ /**
276276+ * Project-owned update history ("What's New"). Records live on the
277277+ * project account's PDS and this table is the local AppView projection.
278278+ */
279279+ `CREATE TABLE IF NOT EXISTS profile_update (
280280+ uri TEXT PRIMARY KEY,
281281+ cid TEXT NOT NULL,
282282+ rkey TEXT NOT NULL,
283283+ project_did TEXT NOT NULL,
284284+ title TEXT NOT NULL,
285285+ body TEXT NOT NULL,
286286+ version TEXT,
287287+ tangled_commit_url TEXT,
288288+ tangled_repo_url TEXT,
289289+ source TEXT NOT NULL DEFAULT 'manual',
290290+ status TEXT NOT NULL DEFAULT 'visible',
291291+ created_at INTEGER NOT NULL,
292292+ updated_at INTEGER NOT NULL,
293293+ indexed_at INTEGER NOT NULL
294294+ )`,
275295];
276296277297/**
···295315 `CREATE INDEX IF NOT EXISTS profile_icon_access ON profile(icon_access_status)`,
296316 `CREATE INDEX IF NOT EXISTS profile_type_takedown ON profile(profile_type, takedown_status)`,
297317 `CREATE UNIQUE INDEX IF NOT EXISTS review_uri_unique ON review(review_uri) WHERE review_uri IS NOT NULL`,
318318+ `CREATE INDEX IF NOT EXISTS profile_update_project_status_created ON profile_update(project_did, status, created_at)`,
319319+ `CREATE UNIQUE INDEX IF NOT EXISTS profile_update_project_rkey ON profile_update(project_did, rkey)`,
298320];
299321300322/**