@hraness/design-kit 0.34.0 → 0.35.1

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.
Files changed (50) hide show
  1. package/AGENT_SETUP.md +4 -0
  2. package/ARTICLE_COPY.md +12 -6
  3. package/README.md +20 -2
  4. package/dist/{chunk-nwpcjm48.js → chunk-6bfr0g23.js} +1115 -441
  5. package/dist/{chunk-h4k7yv6x.js → chunk-6ts4955n.js} +36 -36
  6. package/dist/chunk-gmea6p0d.js +13 -0
  7. package/dist/{chunk-mr1vdcjq.js → chunk-tzd7177a.js} +142 -82
  8. package/dist/index.js +5 -1
  9. package/dist/mockups/client.js +50 -15
  10. package/dist/portfolio.js +586 -85
  11. package/dist/react/index.js +169 -105
  12. package/dist/react/platform-install.js +3 -2
  13. package/dist/react/server.js +17 -3
  14. package/dist/stylex-manifest.json +1 -1
  15. package/dist/stylex.css +376 -58
  16. package/package.json +16 -3
  17. package/portfolio-inventory.json +1 -1
  18. package/src/diagrams.ts +11 -0
  19. package/src/index.ts +2 -0
  20. package/src/marketing-comparison.css +162 -0
  21. package/src/marketing-diagram.css +24 -0
  22. package/src/mockups/client.tsx +25 -17
  23. package/src/mockups.css +19 -0
  24. package/src/plain-publication.css +9 -6
  25. package/src/portfolio.generated.json +578 -86
  26. package/src/portfolio.generated.ts +578 -86
  27. package/src/portfolio.ts +73 -0
  28. package/src/product-marketing-foundation.css +29 -0
  29. package/src/product-marketing.css +133 -38
  30. package/src/react/agent-setup-prompt.stylex.ts +5 -25
  31. package/src/react/agent-setup-prompt.tsx +9 -18
  32. package/src/react/article.tsx +2 -2
  33. package/src/react/design-gallery.tsx +34 -6
  34. package/src/react/index.ts +3 -0
  35. package/src/react/marketing-account.stylex.ts +74 -0
  36. package/src/react/marketing-account.tsx +69 -0
  37. package/src/react/marketing-comparison.stylex.ts +24 -0
  38. package/src/react/marketing-comparison.tsx +73 -0
  39. package/src/react/marketing-diagram.stylex.ts +8 -0
  40. package/src/react/marketing-diagram.tsx +33 -0
  41. package/src/react/platform-install.stylex.ts +9 -37
  42. package/src/react/platform-install.tsx +17 -24
  43. package/src/react/product-marketing.stylex.ts +138 -109
  44. package/src/react/product-marketing.tsx +69 -43
  45. package/src/react/server.ts +3 -0
  46. package/src/react/setup-copy-button.stylex.ts +39 -0
  47. package/src/react/setup-copy-button.tsx +20 -0
  48. package/src/styles.css +2 -0
  49. package/src/typography.css +32 -0
  50. /package/dist/{chunk-4d79eskk.js → chunk-c80g58j1.js} +0 -0
package/dist/portfolio.js CHANGED
@@ -6,19 +6,19 @@ var portfolioSnapshot = {
6
6
  formatVersion: 1,
7
7
  provenance: {
8
8
  registry: "https://hraness.com/portfolio.json",
9
- commit: "82542df32e3b5db919c5d3778125ea2970d932f7",
10
- committedOn: "2026-09-29",
9
+ commit: "d75ebaa21ae0576c1d6c71e1bea23c93b866601c",
10
+ committedOn: "2026-09-30",
11
11
  upstreamContract: "hraness.portfolio-public/v1",
12
- upstreamDigest: "sha256:1f3d10922cc4f7f78fe3a70fba90ee91e9c473253f6e2d5485dd8b8192762040",
12
+ upstreamDigest: "sha256:ba365e481a8b15c4a19503b1628e1b7ae9399e47055dde02bae124183a3e1447",
13
13
  files: [{
14
14
  path: "portfolio.public.generated.json",
15
- sha256: "30a3acc1d7f52a7c3180cfbf0fa63ebbe2c1ccc9f35e6d8cf75d559996ab2eea"
15
+ sha256: "4c9e41dd1cb711d21a2da086de6b7d4adac2990ccda3909fa1cacf3b0ff44369"
16
16
  }, {
17
17
  path: "packages/brand-catalog/brands.yaml",
18
- sha256: "357c5bb8f2dc85ed1cc097161db3f97aaef58ee3a7f9a480bf926104ab723389"
18
+ sha256: "10f20e9d7b8ad0f108b56344c5d1b60cf3c54e6cec5e7024004b7b4f608f282c"
19
19
  }, {
20
20
  path: "brand-artwork.json",
21
- sha256: "625c88ca6e24e78d80e8efbecaeb25bd88711287e86fa2f32f6bca110fe30b92"
21
+ sha256: "7b1ba29f24352b33e666af059b8efbb273dd68269600b04d4d15ef4c94743876"
22
22
  }, {
23
23
  path: "projects/hraness/public/marks/act60.svg",
24
24
  sha256: "b1e625903ac5deb8b9ac79469028122dd50d62cab36c433025a3976710723918"
@@ -100,9 +100,6 @@ var portfolioSnapshot = {
100
100
  }, {
101
101
  path: "projects/hraness/public/marks/system-one-skills.svg",
102
102
  sha256: "44855079c3dea26397d798926ec5689115e084ca26367b7ab73c7b0ea8b18119"
103
- }, {
104
- path: "projects/hraness/public/marks/valhalla-album.svg",
105
- sha256: "8de9218ce0ee4238cb3859a6f450ba746c26e92b0dc7d2e03953777207713602"
106
103
  }, {
107
104
  path: "projects/hraness/public/marks/valhalla.svg",
108
105
  sha256: "ae060052dc1550a4d377e3c4ebba9f2a5e5e58be1dafe8256a2a885063e84c24"
@@ -140,10 +137,23 @@ var portfolioSnapshot = {
140
137
  long: "Long coding-agent sessions collect tool output that mattered once: test logs from runs that have since passed, file listings from before a refactor, stack traces for bugs already fixed. Every turn sends all of it to the model again. Gobstopper is a free, open-source command-line tool that finds your Claude Code and Codex sessions, shows what each compaction strategy would cut, and writes a smaller copy. Before it writes, it stores the original bytes in a content-addressed vault on your machine, so you can search for the exact record a compaction left out or restore the whole session.",
141
138
  hero: {
142
139
  heading: "Context compaction you can undo.",
143
- summary: "Gobstopper keeps long coding sessions smaller. Run your agent through a local proxy, or make a smaller copy of a saved session while keeping the original for recovery.",
140
+ summary: "Keep long coding sessions smaller, with the original available to restore.",
144
141
  primaryAction: "Install Gobstopper",
145
142
  secondaryAction: "How it works"
146
143
  },
144
+ headings: {
145
+ "home-live": "Keep the recent work in view.",
146
+ "home-file-copy": "Try a smaller copy. Keep a way back.",
147
+ "home-results": "38% smaller on requests it compacted.",
148
+ "home-film": "Watch it in 75 seconds.",
149
+ "home-install": "Start with one session.",
150
+ "home-questions": "Before you install.",
151
+ "home-related": "Other tools from our studio",
152
+ "home-search-title": "Gobstopper: context compaction proxy for Claude Code and Codex",
153
+ "home-primitive-preview": "Preview the cut",
154
+ "home-primitive-original": "Keep the original",
155
+ "home-primitive-resume": "Check before resuming"
156
+ },
147
157
  status: {
148
158
  default: "proposed"
149
159
  },
@@ -180,6 +190,15 @@ var portfolioSnapshot = {
180
190
  primaryAction: "Install xcb",
181
191
  secondaryAction: "See how it works"
182
192
  },
193
+ headings: {
194
+ "home-router": "Use your quota before it resets",
195
+ "home-interfaces": "Two ways to use xcb",
196
+ "home-import-sessions": "Continue your Claude and Codex conversations",
197
+ "home-install": "Install xcb",
198
+ "home-questions": "Questions",
199
+ "home-interface-agent": "As your coding agent",
200
+ "home-interface-integration": "Inside your agent or app"
201
+ },
183
202
  status: {
184
203
  default: "proposed"
185
204
  },
@@ -212,10 +231,18 @@ var portfolioSnapshot = {
212
231
  long: "Picking a model means guessing at a tradeoff between quality and price, because benchmark scores and prices live in different places. aicharts plots published benchmark scores against cost and tokens per task on one chart, so the strongest option at each budget is visible instead of implied. A local collector measures your own agents' token use, so the cost question covers your work, not only the models. aicharts is free and open source.",
213
232
  hero: {
214
233
  heading: "See which model wins at each price.",
215
- summary: "Benchmark scores plotted against cost and tokens per task, plus a local collector for your own agents' token use.",
234
+ summary: "Compare model benchmark scores, prices, and the tokens each task takes.",
216
235
  primaryAction: "Browse the charts",
217
236
  secondaryAction: "Measure your agent"
218
237
  },
238
+ headings: {
239
+ "home-calculator": "Subscription vs API vs GPUs",
240
+ "home-platform-group": "The agent platform",
241
+ "home-personal-group": "The personal apps",
242
+ "home-related": "Other tools from our studio",
243
+ "home-about": "About aicharts",
244
+ "home-search-title": "aicharts: AI model benchmark scores vs cost per task"
245
+ },
219
246
  status: {
220
247
  default: "proposed"
221
248
  },
@@ -248,10 +275,30 @@ var portfolioSnapshot = {
248
275
  long: "A new coding-agent session can read your code, but not the decisions that stayed in the last session's chat. Wordcell keeps those decisions as Markdown files beside the repository, with the plans that depend on them and the web pages and PDFs that informed them. Tie a note to the paths it explains, and an agent about to change that code runs one command to get the notes and plans for that path. Exact search, backlinks, and Git history run on your machine with no account or model, and every index rebuilds from files you can read in any editor. Wordcell is free and open source.",
249
276
  hero: {
250
277
  heading: "Give coding agents the decisions behind your code.",
251
- summary: "Decisions, plans, and sources kept as Markdown beside your repository, one command away from the agent about to change a file.",
278
+ summary: "Keep decisions, plans, and sources as Markdown beside your code.",
252
279
  primaryAction: "Install Wordcell",
253
280
  secondaryAction: "See an example"
254
281
  },
282
+ headings: {
283
+ "home-related-group": "Works with Wordcell",
284
+ "home-preview": "Your agent finds the rule and names the file",
285
+ "home-install": "Save and find your first decision",
286
+ "home-agent-search": "Let your agent search and add notes",
287
+ "home-primitives": "What a vault gives you",
288
+ "home-passages": "Find the passage with the answer",
289
+ "home-scopes": "Your coding agent starts with what you already decided",
290
+ "home-fit": "How Wordcell compares",
291
+ "home-publish": "Publish your notes as a website",
292
+ "home-trust": "The record stays yours",
293
+ "home-questions": "Before you install",
294
+ "home-related": "Other tools from our studio",
295
+ "home-closing": "Give the next session what this one learned.",
296
+ "home-search-title": "Wordcell: Markdown memory for coding agents",
297
+ "home-primitive-files": "Files you own",
298
+ "home-primitive-decisions": "Find a past decision",
299
+ "home-primitive-context": "Context for the file at hand",
300
+ "home-primitive-sources": "Sources you can reopen"
301
+ },
255
302
  status: {
256
303
  default: "proposed"
257
304
  },
@@ -287,6 +334,25 @@ var portfolioSnapshot = {
287
334
  primaryAction: "Install Oh",
288
335
  secondaryAction: "How it works"
289
336
  },
337
+ headings: {
338
+ "model-title": "Keep the source with the claim.",
339
+ "trace-title": "Open the evidence behind an answer.",
340
+ "interfaces-title": "Work with the same records from a terminal, TypeScript, or an agent.",
341
+ "install-title": "Install and start with a local database.",
342
+ "kernel-title": "Keep your memory on your machine.",
343
+ "questions-title": "What to know before you install.",
344
+ "home-object-question": "Question",
345
+ "home-object-source": "Source",
346
+ "home-object-capture": "Capture",
347
+ "home-object-claim": "Claim",
348
+ "home-object-citation": "Citation",
349
+ "home-object-artifact": "Artifact",
350
+ "home-trust-local": "Local by default",
351
+ "home-trust-remote": "Remote services are opt-in",
352
+ "home-interface-cli": "CLI",
353
+ "home-interface-sdk": "TypeScript SDK",
354
+ "home-interface-skill": "Agent Skill"
355
+ },
290
356
  status: {
291
357
  default: "proposed"
292
358
  },
@@ -297,8 +363,8 @@ var portfolioSnapshot = {
297
363
  id: "sponge",
298
364
  name: "Sponge",
299
365
  oneLiner: "Local research service that keeps its sources and writes cited reports",
300
- brandDescription: null,
301
- canonicalUrl: "https://hraness.com/writing/the-knowledge-pack",
366
+ brandDescription: "Sponge runs deep research on your own machine. It keeps the text of every source, writes a cited report, and reaches models through Excalibur (xcb).",
367
+ canonicalUrl: "https://sponge.computer",
302
368
  status: "active",
303
369
  copyStatus: "proposed",
304
370
  aliases: [],
@@ -315,10 +381,29 @@ var portfolioSnapshot = {
315
381
  short: "Local research service that keeps its sources and writes cited reports",
316
382
  meta: "Sponge runs deep research on your own machine. It keeps the text of every source, writes a cited report, and reaches models through Excalibur (xcb).",
317
383
  medium: "Sponge runs research projects on your own machine. Give it a question and sources, and it keeps their text, writes and updates a cited report, and tests new research strategies before you adopt them.",
318
- long: "Sponge is a local research harness. Each project has a question and a set of sources, and Sponge keeps the source text, writes and updates a cited report, and records its operations so work survives restarts. A background service, terminal chat, and a macOS menu-bar app drive it. Deep mode plans the research, gathers public sources, recalls project memory, and audits a draft before it updates the report. Sponge runs on ALGAL, reaches models through Excalibur (xcb) so provider sign-ins stay there, keeps documents in Wordcell, and captures signed-in pages through GhostGet. A new strategy for brief research is tested in a sealed evaluation, and nothing changes until you adopt it or restore the previous one. Publishing makes a static Wordcell edition or puts selected documents on wordcell.io. It is in development and not yet released; it runs from a private checkout. The hosted library at sponge.computer is the earlier Sponge.",
384
+ long: "Sponge is a local research harness. Each project has a question and a set of sources, and Sponge keeps the source text, writes and updates a cited report, and records its operations so work survives restarts. A background service that can start at login drives it, with terminal chat and status views. Deep mode plans the research, gathers public sources, recalls project memory, and audits a draft before it updates the report. Sponge runs on ALGAL, reaches models through Excalibur (xcb) so provider sign-ins stay there, keeps documents in Wordcell, and captures signed-in pages through GhostGet. A new strategy for brief research is tested in a sealed evaluation, and nothing changes until you adopt it or restore the previous one. Publishing makes a static Wordcell edition or puts selected documents on wordcell.io. It is in development, with releases in a private GitHub repository. The hosted library at sponge.computer is the earlier Sponge.",
319
385
  hero: {
320
386
  heading: "Deep research that runs on your own machine.",
321
- summary: "Give it a question and sources. Sponge keeps their text, writes a cited report, and reaches models through the coding subscriptions you already pay for."
387
+ summary: "Sponge runs as a background service with a terminal chat and a terminal status view. Ask a question, and it gathers sources, keeps their text, and writes a report that cites them.",
388
+ primaryAction: "Read the Knowledge pack post",
389
+ secondaryAction: "See the commands"
390
+ },
391
+ headings: {
392
+ archive: "notes and working documents",
393
+ context: "context",
394
+ "home-comparison": "Four Hraness tools do the work",
395
+ "home-method": "From a question to a cited report",
396
+ "home-interfaces": "Where to find Sponge today",
397
+ "home-custody": "You decide what changes",
398
+ "home-search-title": "Sponge: A deep-research harness that runs on your machine",
399
+ "home-proof": "Start a research project from the terminal",
400
+ "home-questions": "Before you begin.",
401
+ "home-step-create": "Create a project",
402
+ "home-step-research": "Ask, or go deep",
403
+ "home-step-refresh": "Keep it current",
404
+ "home-interface-papers": "Daily papers",
405
+ "home-interface-library": "Sponge Library",
406
+ "home-interface-harness": "The research harness"
322
407
  },
323
408
  status: {
324
409
  default: "proposed"
@@ -356,6 +441,19 @@ var portfolioSnapshot = {
356
441
  primaryAction: "Install ALGAL",
357
442
  secondaryAction: "See a program run"
358
443
  },
444
+ headings: {
445
+ "home-draft": "Turn an email into a drafted reply.",
446
+ "home-process": "Keep a task running across interruptions.",
447
+ "home-host": "Your host sets the tools, models, and limits.",
448
+ "home-replay": "Every run can be replayed offline.",
449
+ "home-evolution": "Programs write programs. Your host picks which to keep.",
450
+ "home-install": "Install one binary. Run your first program.",
451
+ "home-research": "Can tested procedures improve later work?",
452
+ "home-limits": "Start locally. Know what you operate.",
453
+ "home-replay-verify": "Verify",
454
+ "home-replay-diff": "Diff",
455
+ "home-replay-diagnose": "Diagnose"
456
+ },
359
457
  channels: {
360
458
  homebrew: "Language and VM for agent programs that wait and resume"
361
459
  },
@@ -394,34 +492,21 @@ var portfolioSnapshot = {
394
492
  primaryAction: "Get started",
395
493
  secondaryAction: "What works today"
396
494
  },
397
- status: {
398
- default: "proposed"
495
+ headings: {
496
+ "model-title": "The people in a room run it.",
497
+ "start-title": "Start with the local tour.",
498
+ "install-and-take-the-tour": "Install and take the tour",
499
+ "choose-a-network": "Choose a network",
500
+ "sign-and-send": "Sign and send",
501
+ "work-title": "Share work across agent tools.",
502
+ "agents-title": "Let your agent join the room.",
503
+ "scope-title": "Choose who can read the conversation.",
504
+ "public-rooms": "Public rooms",
505
+ "private-rooms": "Private rooms",
506
+ "compare-title": "Choose where the work lives.",
507
+ "questions-title": "Before you install.",
508
+ "build-title": "Try the local tour."
399
509
  },
400
- reviewedOn: "2026-09-24"
401
- }
402
- },
403
- "valhalla-album": {
404
- id: "valhalla-album",
405
- name: "valhalla",
406
- oneLiner: "Five-track ambient album released as a draft and revised in public",
407
- brandDescription: null,
408
- canonicalUrl: "https://hraness.com/valhalla",
409
- status: "active",
410
- copyStatus: "proposed",
411
- aliases: [],
412
- mark: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' width='32' height='32'%3E%3Cpath fill='%232474d4' fill-rule='evenodd' d='M5 24.8C5 18.8 9 15.2 13.8 15.2C18.6 15.2 22.6 18.8 22.6 24.8L22.6 27.5L5 27.5ZM4 25.7L23.8 25.7L23.8 26.7L4 26.7Z'/%3E%3Cpath fill='%232474d4' d='M7.4 18.6C4.4 15.8 2.8 11.6 3.2 6.4C3.3 5.7 3.7 5.3 4.1 5.9C6.8 9 9 12.4 10.5 16.3C9.5 17.3 8.4 18 7.4 18.6Z'/%3E%3Cpath fill='%232474d4' d='M19.8 21.8C20.7 15.8 21.3 10.2 21.6 5.3L24.6 5.3C24.5 10.6 24.2 17.4 23.9 23C23.2 22.4 22.4 21.9 19.8 21.8Z'/%3E%3Cpath fill='%232474d4' d='M21.6 5.3C25.2 5.5 28.2 7 29.8 9.7C27.2 9.9 24.4 9.4 22.3 8.3Z'/%3E%3C/svg%3E",
413
- messaging: {
414
- formatVersion: 1,
415
- product: "valhalla-album",
416
- names: {
417
- name: "valhalla"
418
- },
419
- category: "Ambient electronic album",
420
- tagline: "Hear an album being revised in public.",
421
- short: "Five-track ambient album released as a draft and revised in public",
422
- meta: "valhalla is a five-track ambient electronic album by Hraness, released as a draft and revised in public on Soundfish.",
423
- medium: "valhalla is a five-track ambient electronic album by Hraness, about 11 minutes long, released as a draft and revised in public. Listen free on Soundfish.",
424
- long: "valhalla is a five-track ambient electronic album by Hraness, about 11 minutes long. It was released as a draft and is being revised in public: each track keeps its takes in order on Soundfish, so you can hear the album change as it is finished. Listening needs no account. The draft is the point of the release: an album is usually finished in private and published once, while valhalla stays open, so each revision leaves a dated earlier take behind it.",
425
510
  status: {
426
511
  default: "proposed"
427
512
  },
@@ -431,8 +516,8 @@ var portfolioSnapshot = {
431
516
  peopleblade: {
432
517
  id: "peopleblade",
433
518
  name: "PeopleBlade",
434
- oneLiner: "Local personal CRM for everyone you know, built for your agent",
435
- brandDescription: "PeopleBlade is a local personal CRM for everyone you know, built for your agent. Bring contacts from apps and exports into one private book.",
519
+ oneLiner: "The contact book you own, built for your agent",
520
+ brandDescription: "The contact book you own, built for your agent. PeopleBlade is a local personal CRM that gathers contacts from your apps and exports into one private book.",
436
521
  canonicalUrl: "https://peopleblade.com",
437
522
  status: "active",
438
523
  copyStatus: "proposed",
@@ -445,18 +530,36 @@ var portfolioSnapshot = {
445
530
  name: "PeopleBlade",
446
531
  command: "peopleblade"
447
532
  },
448
- category: "Contact book for agents",
449
- tagline: "Own your contacts across every app.",
450
- short: "Local personal CRM for everyone you know, built for your agent",
451
- meta: "PeopleBlade is the contact book you own, built for your personal agent. It gathers everyone you know from your apps and shows where each contact came from.",
533
+ category: "Local personal CRM",
534
+ tagline: "A local personal CRM for everyone you know.",
535
+ short: "The contact book you own, built for your agent",
536
+ meta: "The contact book you own, built for your agent. PeopleBlade is a local personal CRM that gathers contacts from your apps and exports into one private book.",
452
537
  medium: "PeopleBlade brings your contacts from Apple Contacts, iMessage, Google Contacts, WhatsApp, LinkedIn, and more into one private book on your computer. Keep notes beside each person, and let your agent search the book from the command line.",
453
538
  long: "PeopleBlade is a local personal CRM for everyone you know. It imports contacts from Apple Contacts, iMessage, Google Contacts, Beeper, WhatsApp, and your LinkedIn, Instagram, and X data exports into one SQLite database on your computer, and every detail keeps the source it came from. Likely duplicates wait for your review, and a shared name is never enough to join two people. Write private notes beside each person, or let your agent search and research the book with JSON commands. Your agent never receives your passwords, and imports keep no message text. The CLI is free and MIT licensed.",
454
539
  headlines: ["every import keeps its source."],
455
540
  hero: {
456
541
  heading: "Social Blade for everyone you know.",
457
- summary: "PeopleBlade builds one contact book on your computer from your address book, chat apps, and exports. Your agent searches it, keeps notes, and tells you which import each contact came from.",
542
+ summary: "One private contact book. Bring your contacts together and let your agent help you stay in touch.",
458
543
  primaryAction: "Install the free CLI",
459
- secondaryAction: "See the workspace"
544
+ secondaryAction: "See how it works"
545
+ },
546
+ headings: {
547
+ "home-video": "See it work, start to finish.",
548
+ "home-unification": "Bring your contacts together.",
549
+ "home-book": "Find people and keep the context.",
550
+ "home-agent": "Let your agent work with your contacts.",
551
+ "home-comparison": "Choose the contact book that fits.",
552
+ "home-boundary": "Know what your agent can access.",
553
+ "home-related": "Other tools from our studio",
554
+ "home-cloud": "Sync only when you choose.",
555
+ "home-personal-group": "The personal apps",
556
+ "home-platform-group": "The agent platform",
557
+ "home-install": "Try it in a minute",
558
+ "home-questions": "Questions",
559
+ "home-account": "Your account",
560
+ "home-step-import": "Import what you already have",
561
+ "home-step-matches": "Accept the matches",
562
+ "home-step-agent": "Ask your agent"
460
563
  },
461
564
  status: {
462
565
  default: "proposed"
@@ -490,10 +593,46 @@ var portfolioSnapshot = {
490
593
  long: "TextButler is an AI butler for your messages, running on your Mac. Turn it on for the chats you choose in iMessage, WhatsApp, or Beeper, and it replies as a clearly marked assistant that keeps notes on each person in files you can edit. New installs start paused and every contact starts off. Choose a local model, your Gateway key, or a connected subscription; local-model replies are in testing. Hosted AI providers receive the context needed to write a reply. TextButler is free and MIT licensed.",
491
594
  hero: {
492
595
  heading: "An AI butler in your messaging apps.",
493
- summary: "When someone you’ve turned on texts “butler”, a clearly marked AI assistant answers for you from your Mac. It writes with a local model or the AI subscription you already pay for. Claude Code, Codex, or Devin can set it up for you.",
596
+ summary: "A clearly marked AI assistant answers the people you choose, from your Mac.",
494
597
  primaryAction: "Have your agent set it up",
495
598
  secondaryAction: "See how it works"
496
599
  },
600
+ headings: {
601
+ "how-title": "From “butler” to a marked reply.",
602
+ "supports-title": "What it works with",
603
+ "models-title": "Pick what writes replies",
604
+ "setup-title": "Your agent sets it up. You stay in charge.",
605
+ "control-title": "You stay in charge",
606
+ "self-title": "Ask it yourself",
607
+ "questions-title": "Questions",
608
+ "related-title": "Other tools from our studio",
609
+ "closing-title": "Start with one person",
610
+ "where-it-stands": "Where it stands",
611
+ "messaging-apps": "Messaging apps",
612
+ "your-mac": "Your Mac",
613
+ "install-it-yourself": "Install it yourself",
614
+ "prefer-to-do-it-yourself": "Prefer to do it yourself?",
615
+ "your-agent-speaks-its-language": "Your agent speaks its language",
616
+ "it-s-there-when-you-aren-t": "It’s there when you aren’t.",
617
+ "it-never-pretends-to-be-you": "It never pretends to be you.",
618
+ "it-runs-on-your-mac": "It runs on your Mac.",
619
+ "site-title": "TextButler: an AI butler for iMessage and WhatsApp on Mac",
620
+ "home-writer-local": "A local model on your Mac",
621
+ "home-writer-key": "Qwen 3.5 Flash with your own Vercel AI Gateway key",
622
+ "home-writer-subscription": "Your Claude Code, Codex, or Devin subscription",
623
+ "home-flow-text": "Someone texts you.",
624
+ "home-flow-checks": "It checks before it speaks.",
625
+ "home-flow-indicator": "\uD83D\uDC40, right away.",
626
+ "home-flow-context": "It reads the room.",
627
+ "home-flow-model": "Your chosen model writes the reply.",
628
+ "home-flow-send": "Marked, then sent.",
629
+ "home-flow-step-in": "You can step in anytime.",
630
+ "home-setup-agent": "Ask your agent.",
631
+ "home-setup-mac": "Say yes to your Mac.",
632
+ "home-setup-person": "Turn on one person.",
633
+ "home-related-apps": "The personal apps",
634
+ "home-related-tools": "The agent platform"
635
+ },
497
636
  status: {
498
637
  default: "proposed"
499
638
  },
@@ -526,10 +665,45 @@ var portfolioSnapshot = {
526
665
  long: "Agents that run commands reach the web through a browser they steer click by click, or through credentials they should never hold. GhostGet is a free, open-source CLI and TypeScript SDK that gives them a third route: a fixed list of reviewed web actions. Read a URL as Markdown, keep a searchable copy on your machine, archive one media item with SHA-256 records, or act in a connected account such as Gmail, Beeper, or X through one named operation. A measured article read costs about 3,800 tokens where the raw page carries 36,000. Consequential writes need an exact preview and your confirmation, and the agent never sees a login.",
527
666
  hero: {
528
667
  heading: "Your agent gets the result without clicking around.",
529
- summary: "A free CLI and TypeScript SDK for Claude Code, Codex, Cursor, and other agents that run commands. Read a page as Markdown, save a media item, or use a connected account.",
668
+ summary: "Read pages, save media, and use connected accounts through your agent.",
530
669
  primaryAction: "Tell your agent",
531
670
  secondaryAction: "See it work"
532
671
  },
672
+ headings: {
673
+ "uses-heading": "Read a page, archive one item, or act in an account.",
674
+ "how-it-works-heading": "Give your agent a web task.",
675
+ "measured-heading": "Read the page without its HTML.",
676
+ "start-heading": "Tell your agent, or run two commands.",
677
+ "interfaces-title": "Use an Agent Skill, CLI, or TypeScript SDK",
678
+ "agent-skill": "Agent Skill",
679
+ cli: "CLI",
680
+ "typescript-sdk": "TypeScript SDK",
681
+ "control-heading": "Review accounts and approvals.",
682
+ "local-by-design-title": "Choose what your agent can do.",
683
+ "comparison-title": "How GhostGet compares with other ways agents reach the web.",
684
+ "faq-title": "Before you install.",
685
+ "guides-title": "Start with the outcome you need.",
686
+ "read-your-first-page": "Read your first page",
687
+ "capture-urls-and-archive-media": "Capture URLs and archive media",
688
+ "check-provider-support": "Check provider support",
689
+ "understand-the-security-model": "Understand the security model",
690
+ "author-a-provider-plugin": "Author a provider plugin",
691
+ "browse-the-documentation": "Browse the documentation",
692
+ "arguments-title": "Arguments and comparisons",
693
+ "how-agents-reach-the-web": "How agents reach the web",
694
+ "maker-title": "Hraness",
695
+ "related-title": "Other tools from our studio",
696
+ "related-tools": "The agent platform",
697
+ "related-apps": "The personal apps",
698
+ "final-title": "Read your first page in two commands.",
699
+ "home-providers": "Use {{PROVIDER_SURFACE_COUNT}} services from your agent.",
700
+ "home-webmcp-sites": "Plus {{WEBMCP_REGISTRY_SITE_COUNT}} sites publishing WebMCP tools"
701
+ },
702
+ channels: {
703
+ social: {
704
+ imageDescription: "Named web actions for AI agents: read pages, save media, use accounts."
705
+ }
706
+ },
533
707
  status: {
534
708
  default: "proposed"
535
709
  },
@@ -562,10 +736,37 @@ var portfolioSnapshot = {
562
736
  long: "Soulscrape is a free, MIT-licensed agent skill that turns sources you're allowed to use into a dated dossier on one person: how they decide, write, argue, and change their mind. It runs inside Claude Code, Codex, or another agent that loads skills, with your own model and tools, and needs no Soulscrape account. Facts, stated beliefs, patterns, and speculation stay apart, and the dossier lists what the record cannot settle. Keep it private, or publish it with a free Hraness account as a web page, a JSON packet, and a Markdown copy anyone can cite.",
563
737
  hero: {
564
738
  heading: "See how someone thinks, and where every claim comes from.",
565
- summary: "Give your agent the sources you're allowed to use, and it writes a dated dossier with every claim tied to its evidence.",
739
+ summary: "Turn sources into a dated dossier, with evidence behind every claim.",
566
740
  primaryAction: "Install the skill",
567
741
  secondaryAction: "Browse the dossiers"
568
742
  },
743
+ headings: {
744
+ "how-title": "From sources to a dossier",
745
+ "examples-title": "Explore a finished dossier",
746
+ "method-title": "Read the claims alongside their evidence",
747
+ "use-cases-title": "Use the research in your own work",
748
+ "install-title": "Install and write your first dossier",
749
+ "indexes-title": "Publish when you are ready",
750
+ "boundaries-title": "Keep the research within its limits",
751
+ "questions-title": "Questions",
752
+ "related-title": "Other tools from our studio",
753
+ "cta-title": "Start with one person",
754
+ "home-flow-sources": "Choose the sources",
755
+ "home-flow-read": "Read the dossier",
756
+ "home-flow-publish": "Keep it private or publish",
757
+ "home-use-agent": "Give an agent context",
758
+ "home-use-research": "Research a person",
759
+ "home-use-writing": "Write about someone",
760
+ "home-use-personas": "Prepare an authorized assistant",
761
+ "home-use-collaboration": "Work with someone",
762
+ "home-use-self": "Understand your own patterns",
763
+ "home-trust-sources": "Authorized sources",
764
+ "home-trust-purpose": "A clear purpose",
765
+ "home-trust-instructions": "Research under your instructions",
766
+ "home-trust-claims": "Claims you can check",
767
+ "home-related-apps": "The personal apps",
768
+ "home-related-tools": "The agent platform"
769
+ },
569
770
  status: {
570
771
  default: "proposed"
571
772
  },
@@ -591,19 +792,34 @@ var portfolioSnapshot = {
591
792
  category: "Editable icon library",
592
793
  tagline: "Icons and illustrations you can edit as vectors.",
593
794
  short: "Editable vector icons and illustrations, with an editor in your browser",
594
- meta: "icon.place is a library of editable vector icons and illustrations, with 9,518 concept pages and an in-browser editor that exports SVG, PNG, or a recipe.",
595
- medium: "icon.place is a library of editable vector icons and illustrations, with 9,518 concept pages. Drawings open in an in-browser editor for styles, palettes, and parts, and export as SVG, PNG, or a recipe.",
596
- long: "icon.place is a library of editable vector icons and illustrations. It has 9,518 concept pages and 8,965 drawn icons, adapted from Lucide, Tabler, Phosphor, Material Symbols, Font Awesome Free, Bootstrap Icons, and others, credited on each page. A shared in-browser editor changes styles, palettes, and parts, and exports SVG, PNG, or a replayable recipe. The studio composes connected scenes from 41 pieces, and you can remix your own SVG or trace an image. A separate drawing lab runs small Qwen models in the browser through WebGPU and records each drawing run as an ALGAL program; the live site does not use it yet.",
795
+ meta: "icon.place is a library of editable vector icons and illustrations, with an in-browser editor that exports SVG, PNG, or a recipe.",
796
+ medium: "icon.place is a library of editable vector icons and illustrations. Drawings open in an in-browser editor for styles, palettes, and parts, and export as SVG, PNG, or a recipe.",
797
+ long: "icon.place is a library of editable vector icons and illustrations. Its concept pages include drawn icons adapted from Lucide, Tabler, Phosphor, Material Symbols, Font Awesome Free, Bootstrap Icons, and others, credited on each page. A shared in-browser editor changes styles, palettes, and parts, and exports SVG, PNG, or a replayable recipe. The studio composes connected scenes from reusable pieces, and you can remix your own SVG or trace an image. A separate drawing lab runs small Qwen models in the browser through WebGPU and records each drawing run as an ALGAL program; the live site does not use it yet.",
798
+ hero: {
799
+ heading: "Icons and illustrations you can edit as vectors.",
800
+ summary: "icon.place is a library of editable vector icons and illustrations. Drawings open in an in-browser editor for styles, palettes, and parts, and export as SVG, PNG, or a recipe.",
801
+ primaryAction: "Open an icon",
802
+ secondaryAction: "Browse every icon"
803
+ },
804
+ headings: {
805
+ "home-strip": "Twelve icons from the library",
806
+ "home-techniques": "One {subject}, {count} ways.",
807
+ "home-wall": "All {count} drawn icons, on one page.",
808
+ "home-why": "Your agent can draw an SVG. Can it draw the next 500 in the same hand?",
809
+ "home-styles": "A style is code, not a prompt",
810
+ "home-primitives": "Built from composable primitives",
811
+ "home-rendering": "Generation costs almost nothing"
812
+ },
597
813
  status: {
598
814
  default: "proposed"
599
815
  },
600
- reviewedOn: "2026-09-29"
816
+ reviewedOn: "2026-09-30"
601
817
  }
602
818
  },
603
819
  slopcamera: {
604
820
  id: "slopcamera",
605
821
  name: "SlopCamera",
606
- oneLiner: "Media studio for agents: images, 3D, animation, and video to revise",
822
+ oneLiner: "A multimedia studio for your coding agent",
607
823
  brandDescription: "SlopCamera lets your coding agent make images, diagrams, animation, 3D scenes, and video from source files it can keep revising.",
608
824
  canonicalUrl: "https://slopcamera.com",
609
825
  status: "active",
@@ -619,21 +835,43 @@ var portfolioSnapshot = {
619
835
  formerly: ["Atet", "Graphics"]
620
836
  },
621
837
  category: "Media studio for agents",
622
- tagline: "Visual work your agent can keep revising.",
623
- short: "Media studio for agents: images, 3D, animation, and video to revise",
838
+ tagline: "A multimedia studio for your coding agent.",
839
+ short: "A multimedia studio for your coding agent",
624
840
  meta: "SlopCamera lets your coding agent make images, diagrams, animation, 3D scenes, and video from source files it can keep revising.",
625
841
  medium: "SlopCamera is a media studio for coding agents. Codex, Claude Code, and other agents make images, diagrams, animation, 3D scenes, and edited video from source files they can keep revising.",
626
842
  long: "Agents that write code can also make media, but generated assets usually arrive as finished files nobody can change. SlopCamera is a media studio for coding agents: images, diagrams, animation, 3D scenes, and edited video are built from source files the agent can keep revising, so a change is a new render, not a new prompt lottery. Codex, Claude Code, and other command-capable agents drive it through the CLI and skill. SlopCamera is free and open source.",
627
843
  hero: {
628
- heading: "Visual work your agent can keep revising.",
629
- summary: "Ask your agent to make images, diagrams, animation, 3D scenes, or video. Keep the source files for the next revision.",
630
- primaryAction: "Install SlopCamera",
631
- secondaryAction: "See what agents made"
844
+ heading: "Give your agent a multimedia studio.",
845
+ summary: "Make images, animation, 3D scenes, and video with your coding agent. Direct the details. Keep the source.",
846
+ primaryAction: "Install Slopcamera",
847
+ secondaryAction: "Watch the films"
848
+ },
849
+ headings: {
850
+ "home-examples": "Take an idea somewhere strange.",
851
+ "home-revision": "The next version starts with a sentence.",
852
+ "home-revision-original": "Original",
853
+ "home-revision-revised": "Revised",
854
+ "home-start": "What will you make first?",
855
+ "home-start-animation": "Make an animated film",
856
+ "home-start-world": "Build a little world",
857
+ "home-start-footage": "Give footage a new life",
858
+ "home-install": "Install Slopcamera for your agent.",
859
+ "home-design": "Your tools. Your files.",
860
+ "home-questions": "Common questions",
861
+ "home-cta": "Make something worth replaying.",
862
+ "home-search-title": "SlopCamera: video, diagrams and 3D your coding agent can revise",
863
+ "agent-home-examples": "See what you can make",
864
+ "agent-home-revision": "Direct it again",
865
+ "agent-home-workflow": "From an idea to a finished piece",
866
+ "agent-home-install": "Install Slopcamera",
867
+ "agent-home-tools": "Choose your tools",
868
+ "agent-home-privacy": "Cost and privacy",
869
+ "agent-home-explore": "Explore"
632
870
  },
633
871
  status: {
634
872
  default: "proposed"
635
873
  },
636
- reviewedOn: "2026-09-24"
874
+ reviewedOn: "2026-09-30"
637
875
  }
638
876
  },
639
877
  soundfish: {
@@ -665,6 +903,20 @@ var portfolioSnapshot = {
665
903
  primaryAction: "Upload an album",
666
904
  secondaryAction: "Hear an album page"
667
905
  },
906
+ headings: {
907
+ "home-features": "Every album page has a player, comments, and play counts.",
908
+ "home-midi": "Sketch the next idea in the MIDI editor.",
909
+ "home-comparison": "How Soundfish compares",
910
+ "home-releases": "Recent releases",
911
+ "home-interfaces": "For listeners, makers, and agents",
912
+ "home-questions": "Common questions",
913
+ "home-search-title": "Soundfish: album pages with timestamped comments",
914
+ "home-eyebrow": "Music for agents",
915
+ "home-closing": "Share it today. Improve it at the same link.",
916
+ "home-interface-listeners": "For listeners",
917
+ "home-interface-makers": "For makers",
918
+ "home-interface-agents": "For agents"
919
+ },
668
920
  status: {
669
921
  default: "proposed"
670
922
  },
@@ -674,7 +926,7 @@ var portfolioSnapshot = {
674
926
  sys1: {
675
927
  id: "sys1",
676
928
  name: "Sys1",
677
- oneLiner: "Answers an agent's small yes/no, choice, and score questions with probabilities",
929
+ oneLiner: "Saves repository check results and adds scoped code review",
678
930
  brandDescription: "Sys1 helps coding agents review changes against your repository's rules, with probability-scored answers from hosted Jev, a local model, or your own server.",
679
931
  canonicalUrl: "https://sys1.io",
680
932
  status: "active",
@@ -688,22 +940,59 @@ var portfolioSnapshot = {
688
940
  name: "Sys1",
689
941
  command: "sys1"
690
942
  },
691
- category: "Agent decision router",
692
- tagline: "Give your agent a System 1.",
693
- short: "Answers an agent's small yes/no, choice, and score questions with probabilities",
694
- meta: "Sys1 answers an agent's small yes/no, choice, and score questions with probabilities, from TypeSafe's hosted Jev, a local model, or your own server.",
695
- medium: "Sys1 keeps agents from spending big-model tokens on small decisions. It answers yes/no, choice, and score questions with probabilities from TypeSafe's hosted Jev, an experimental local model, or your own server.",
696
- long: "Sys1 keeps agents from spending big-model tokens on small decisions. Agents ask yes/no, choice, and score questions and get validated answers with probabilities. You choose who answers: TypeSafe's hosted Jev, an experimental local model, or a compatible server you run. Its review and final-message checks are experimental and advisory. Every backend takes the same request format, Sys1 checks each answer against the question asked, and each response says which backend produced it. Call Sys1 from a Node or Bun client, embed its router, or run its local HTTP daemon for any language. Sys1 is free and MIT licensed.",
943
+ category: "Coding agent tools",
944
+ tagline: "Saved checks and code review",
945
+ short: "Saves repository check results and adds scoped code review",
946
+ meta: "Sys1 gives coding agents tools to review code, check completion claims, and get structured answers from Jev or a local model.",
947
+ medium: "Sys1 runs your repository check, keeps the output local, and saves a result you can inspect later. Add a scoped review when you need a second pass on the changes. Review and completion checks are advisory.",
948
+ long: "Sys1 runs your repository check, keeps the output local, and saves a result you can inspect later. Add a scoped review when you need a second pass on the changes. Its code review and completion checks are experimental and advisory. Agents and applications can also ask yes/no, choice, and score questions and receive validated answers with probabilities. Choose TypeSafe’s hosted Jev, an experimental local model, or a compatible server. Use the Node or Bun client, embed the router, or call its local HTTP gateway. The Sys1 site also offers System One Skills, an independent package that compacts noisy test and build output without Sys1 or a model. Sys1 is MIT licensed.",
697
949
  hero: {
698
- heading: "Give your agent a System 1.",
699
- summary: "Your agent asks small yes/no, choice, and score questions and gets validated answers with probabilities. You choose the model.",
950
+ heading: "Keep checks and code review together.",
951
+ summary: "Sys1 runs your repository check, keeps the output local, and saves a result you can inspect later. Add a scoped review when you need a second pass on the changes.",
700
952
  primaryAction: "Install Sys1",
701
- secondaryAction: "Read the evaluations"
953
+ secondaryAction: "Explore the workflows"
954
+ },
955
+ headings: {
956
+ "review-heading": "Useful checks, inside your agent’s workflow.",
957
+ "benchmarks-heading": "For compact output alone.",
958
+ "launch-heading": "Meet Sys1.",
959
+ "system-heading": "Three parts, one system.",
960
+ "how-heading": "Use small decisions in your own code.",
961
+ "trial-heading": "Test the decision on your task.",
962
+ "integration-heading": "Three ways to call Sys1.",
963
+ "ecosystem-heading": "What Sys1 connects to.",
964
+ "install-heading": "Install Sys1.",
965
+ "questions-heading": "Before you begin.",
966
+ "docs-title": "Set up your first useful check",
967
+ "getting-started-title": "Install Sys1",
968
+ "workflows-title": "Save a check and continue its review",
969
+ "connect-jev-title": "Connect hosted Jev for model calls",
970
+ "audit-title": "Review changes with your agent",
971
+ "verify-title": "Check a completion message",
972
+ "compact-checks-title": "Compact test output",
973
+ "system-one-title": "Ask for a structured decision",
974
+ "integration-title": "Integration modes",
975
+ "backends-title": "Other backends",
976
+ "profiles-title": "Reuse application questions",
977
+ "research-title": "Evaluate a model for your task",
978
+ "workflow-review-heading": "Review a change against your rules",
979
+ "workflow-completion-heading": "Check what “done” means",
980
+ "docs-install-cli": "Install the CLI",
981
+ "docs-first-jev-request": "Make your first Jev request",
982
+ "docs-model-errors": "Choose the model and handle failures",
983
+ "docs-portable-client": "Portable client",
984
+ "docs-embedded-router": "Embedded Bun router",
985
+ "docs-loopback-http": "Loopback HTTP"
986
+ },
987
+ channels: {
988
+ social: {
989
+ imageDescription: "Keep checks and code review together."
990
+ }
702
991
  },
703
992
  status: {
704
993
  default: "proposed"
705
994
  },
706
- reviewedOn: "2026-09-29"
995
+ reviewedOn: "2026-09-30"
707
996
  }
708
997
  },
709
998
  sloptrade: {
@@ -734,7 +1023,18 @@ var portfolioSnapshot = {
734
1023
  heading: "AI writes the research. Your rules make the trade.",
735
1024
  summary: "A researched build prompt your coding agent turns into a personal trading system where your rules approve every order.",
736
1025
  primaryAction: "Get the prompt",
737
- secondaryAction: "Read the architecture"
1026
+ secondaryAction: "See how it works"
1027
+ },
1028
+ headings: {
1029
+ "home-desk": "See the desk you'll own",
1030
+ "home-system": "What your agent builds",
1031
+ "home-sequence": "Start with order placement off",
1032
+ "home-access": "Who can do what",
1033
+ "home-comparison": "How it compares",
1034
+ "home-running": "What you need to run it",
1035
+ "home-buy": "Buy the prompt",
1036
+ "home-notes": "Read the design notes",
1037
+ "home-questions": "Questions"
738
1038
  },
739
1039
  status: {
740
1040
  default: "proposed",
@@ -806,6 +1106,9 @@ var portfolioSnapshot = {
806
1106
  primaryAction: "Play sound",
807
1107
  secondaryAction: "Read the guides"
808
1108
  },
1109
+ headings: {
1110
+ "home-search-title": "Free Brown, Pink & White Noise and Ocean Waves | Sleepyland"
1111
+ },
809
1112
  status: {
810
1113
  default: "proposed"
811
1114
  },
@@ -838,7 +1141,25 @@ var portfolioSnapshot = {
838
1141
  heading: "A daily front page that says why each story ranked.",
839
1142
  summary: "Tech & AI, World, and Finance, one dated edition a day. Every story links the original source.",
840
1143
  primaryAction: "Read today's edition",
841
- secondaryAction: "See the archive"
1144
+ secondaryAction: "See how stories are chosen"
1145
+ },
1146
+ headings: {
1147
+ "home-search-title": "Rough Day: daily Tech & AI, World, and Finance news",
1148
+ "roughday-walkthrough-title": "See a day on Rough Day",
1149
+ "roughday-working-model-title": "How stories are chosen",
1150
+ "roughday-interfaces-title": "Other ways to read the archive",
1151
+ "roughday-evidence-title": "What each story shows",
1152
+ "roughday-compare-title": "How Rough Day compares",
1153
+ "roughday-trust-title": "Sources and privacy",
1154
+ "roughday-questions-title": "Common questions",
1155
+ "roughday-action-title": "Open the current archive.",
1156
+ "info-search-title": "How Rough Day works",
1157
+ "info-story-proof": "How to read a story",
1158
+ "info-interface-archive": "Daily archive",
1159
+ "info-interface-category": "Category link",
1160
+ "info-interface-markdown": "Markdown",
1161
+ "info-interface-feed": "Atom feed",
1162
+ "info-interface-guide": "Site guide and sitemap"
842
1163
  },
843
1164
  status: {
844
1165
  default: "proposed"
@@ -875,6 +1196,9 @@ var portfolioSnapshot = {
875
1196
  primaryAction: "Browse the timeline",
876
1197
  secondaryAction: "Download the data"
877
1198
  },
1199
+ headings: {
1200
+ "record-keeping": "How this record is kept"
1201
+ },
878
1202
  status: {
879
1203
  default: "proposed"
880
1204
  },
@@ -909,6 +1233,13 @@ var portfolioSnapshot = {
909
1233
  primaryAction: "Browse the index",
910
1234
  secondaryAction: "Read the method"
911
1235
  },
1236
+ headings: {
1237
+ agreement: "Where kinds of evidence agree",
1238
+ "record-guide": "How to read a record",
1239
+ "evidence-kinds": "Five kinds of evidence",
1240
+ browse: "Browse the index",
1241
+ categories: "Categories"
1242
+ },
912
1243
  status: {
913
1244
  default: "proposed"
914
1245
  },
@@ -929,7 +1260,8 @@ var portfolioSnapshot = {
929
1260
  formatVersion: 1,
930
1261
  product: "act60",
931
1262
  names: {
932
- name: "act60.me"
1263
+ name: "act60.me",
1264
+ shortName: "ACT60"
933
1265
  },
934
1266
  category: "Act 60 planner",
935
1267
  tagline: "Model the move to Puerto Rico before you make it.",
@@ -938,11 +1270,49 @@ var portfolioSnapshot = {
938
1270
  medium: "act60.me estimates Puerto Rico Act 60 savings after fees and yearly costs, with every assumption and source date beside the result. Sourced guides cover applying, federal residency, and moving; a private tracker counts your presence days.",
939
1271
  long: "Act 60 promises large Puerto Rico tax savings, but fees, yearly costs, and the federal residency rules decide the real number. act60.me models the move before you make it: a calculator that itemizes one-time and annual costs beside its assumptions, guides that cite the official sources and the date each was checked, and a private day tracker for the presence tests a calendar can measure. Investor applications filed in 2026 face a December 31 deadline; the guides say which rules changed and which still apply.",
940
1272
  hero: {
941
- heading: "Model the move to Puerto Rico",
942
- summary: "Estimate your Act 60 savings after fees and yearly costs, with every assumption and source date beside the result.",
1273
+ heading: "Puerto Rico Act 60 calculator",
1274
+ summary: "Estimate Act 60 savings from the export-services benefit (formerly Act 20) and the investor benefit (formerly Act 22) after fees, the investor donation, and yearly costs. Rates and source dates sit beside the result. No account needed.",
943
1275
  primaryAction: "Estimate your savings",
944
1276
  secondaryAction: "Choose your guide"
945
1277
  },
1278
+ headings: {
1279
+ "home-search-title": "Act 60 calculator: Puerto Rico tax savings after costs | act60.me",
1280
+ "tracker-preview-title": "See the day tracker before you sign in.",
1281
+ "how-to-read-title": "Choose the guide for your question.",
1282
+ "compare-title": "How act60.me compares",
1283
+ "benefits-title": "The business and investor benefits follow different rules.",
1284
+ "costs-title": "The estimate itemizes one-time and annual costs.",
1285
+ "requirements-title": "Plan the application, then the years after it.",
1286
+ "residence-title": "Three residence checks apply every year.",
1287
+ "steps-title": "Plan the work from filing through each later year.",
1288
+ "questions-title": "Common questions about the benefits and the move.",
1289
+ "sources-title": "Check the rules against the official sources.",
1290
+ "calculator-title": "Estimate your savings after costs",
1291
+ "home-presence-tax-home-or-closer-connection": "Presence, tax home, or closer connection",
1292
+ "home-export-services-business-treatment": "Export-services business treatment",
1293
+ "home-individual-investor-treatment": "Individual investor treatment",
1294
+ "home-applying-moving-and-daily-life": "Applying, moving, and daily life",
1295
+ "home-business-chapter-or-investor-chapter": "Business chapter or investor chapter",
1296
+ "home-grant-receipt-or-federal-residence": "Grant, receipt, or federal residence",
1297
+ "home-service-business-profit": "Service business profit",
1298
+ "home-investment-income-after-the-move": "Investment income after the move",
1299
+ "home-pass-one-day-count-option": "Pass one day-count option",
1300
+ "home-base-your-work-in-puerto-rico": "Base your work in Puerto Rico",
1301
+ "home-make-puerto-rico-the-center-of-your-life": "Make Puerto Rico the center of your life",
1302
+ "home-prepare-and-file-the-applications": "Prepare and file the applications",
1303
+ "home-build-a-real-puerto-rico-life": "Build a real Puerto Rico life",
1304
+ "home-complete-the-investor-home-commitment": "Complete the investor home commitment",
1305
+ "home-file-and-keep-proof-every-year": "File and keep proof every year",
1306
+ "pillar-calculator": "Calculator",
1307
+ "pillar-requirements": "Requirements",
1308
+ "pillar-days": "Day tracker",
1309
+ "social-image-title": "Act 60 calculator"
1310
+ },
1311
+ channels: {
1312
+ social: {
1313
+ imageDescription: "Estimate Puerto Rico Act 60 savings after fees and yearly costs"
1314
+ }
1315
+ },
946
1316
  status: {
947
1317
  default: "proposed"
948
1318
  },
@@ -975,8 +1345,15 @@ var portfolioSnapshot = {
975
1345
  hero: {
976
1346
  heading: "Give each app state you test its own URL.",
977
1347
  summary: "Repeatable states for browser agents: your real interface on fixture data, at a URL you can open, test, and share.",
978
- primaryAction: "Add Direct to a project",
979
- secondaryAction: "See a named state"
1348
+ primaryAction: "install from npm",
1349
+ secondaryAction: "read the source"
1350
+ },
1351
+ headings: {
1352
+ resources: "Direct resources",
1353
+ install: "Install the Agent Skill",
1354
+ states: "open any state by url",
1355
+ readiness: "know when the app is ready",
1356
+ features: "test your real feature code"
980
1357
  },
981
1358
  status: {
982
1359
  default: "proposed"
@@ -1014,6 +1391,16 @@ var portfolioSnapshot = {
1014
1391
  primaryAction: "Run a check",
1015
1392
  secondaryAction: "Verify a receipt"
1016
1393
  },
1394
+ headings: {
1395
+ "how-title": "Anyone can check the score.",
1396
+ "issue-fresh-puzzles": "Issue fresh puzzles.",
1397
+ "connect-your-agent": "Connect your agent.",
1398
+ "score-each-answer": "Score each answer.",
1399
+ "keep-the-signed-result": "Keep the signed result.",
1400
+ "local-title": "Try a check on your machine.",
1401
+ "integrations-title": "Where to add a check.",
1402
+ "results-title": "Check the receipt yourself."
1403
+ },
1017
1404
  status: {
1018
1405
  default: "proposed"
1019
1406
  },
@@ -1050,6 +1437,17 @@ var portfolioSnapshot = {
1050
1437
  primaryAction: "Start your timeline",
1051
1438
  secondaryAction: "See an example"
1052
1439
  },
1440
+ headings: {
1441
+ "home-search-title": "Life timeline maker: chart your life in chapters | Lifecharts",
1442
+ "timeline-guide": "How a life timeline works",
1443
+ "home-two-ways-to-see-the-same-life": "Two ways to see the same life",
1444
+ "home-what-the-percentages-mean": "What the percentages mean",
1445
+ "home-add-a-longer-horizon": "Add a longer horizon",
1446
+ "home-save-share-and-embed": "Save, share, and embed",
1447
+ "timeline-places": "Send it to a friend or put it on your site",
1448
+ "timeline-agent": "Make it with your agent",
1449
+ "timeline-compare": "How Lifecharts compares"
1450
+ },
1053
1451
  status: {
1054
1452
  default: "proposed"
1055
1453
  },
@@ -1084,6 +1482,14 @@ var portfolioSnapshot = {
1084
1482
  primaryAction: "Read the latest",
1085
1483
  secondaryAction: "Compare the cases"
1086
1484
  },
1485
+ headings: {
1486
+ "how-the-work-gets-done": "How the work gets done",
1487
+ "compare-cases-scale-and-industries": "Compare cases, scale, and industries",
1488
+ "agent-scale": "Agent scale",
1489
+ "across-industries": "Across industries",
1490
+ "the-software-factory-field-guide": "The software factory field guide",
1491
+ "home-company-cases": "{count} company cases"
1492
+ },
1087
1493
  status: {
1088
1494
  default: "proposed"
1089
1495
  },
@@ -1111,6 +1517,11 @@ var portfolioSnapshot = {
1111
1517
  short: "Tests whether Alexander-inspired patterns help agents write better code",
1112
1518
  meta: "Pattern Language sketches Alexander's Notes on the Synthesis of Form in ALGAL-form and tests whether those patterns help an agent produce better code.",
1113
1519
  medium: "Pattern Language sketches Christopher Alexander's Notes on the Synthesis of Form as a runnable pattern language in ALGAL-form. It tests that question with executable artifacts; an advantage over ordinary prompting is not proven.",
1520
+ hero: {
1521
+ heading: "Alexander's notes, sketched as runnable ALGAL form.",
1522
+ summary: "Pattern Language sketches Christopher Alexander's Notes on the Synthesis of Form as a runnable pattern language in ALGAL-form. It tests that question with executable artifacts; an advantage over ordinary prompting is not proven.",
1523
+ primaryAction: "read the studies"
1524
+ },
1114
1525
  status: {
1115
1526
  default: "proposed"
1116
1527
  }
@@ -1138,6 +1549,31 @@ var portfolioSnapshot = {
1138
1549
  short: "Runs a check once, returns a short result, and keeps the full log",
1139
1550
  meta: "System One Skills gives Devin, Claude Code, and Codex one skill that runs a noisy check once, returns a short result, and saves the full log locally.",
1140
1551
  medium: "System One Skills gives Devin, Claude Code, and Codex one skill, system-one-verify, for long test and build logs. It runs the command once, returns a short result with the exit status, and saves the full log on your machine.",
1552
+ hero: {
1553
+ heading: "Give your agent shorter check results.",
1554
+ summary: "System One Skills runs your noisy tests and builds once, returns a short result, and saves the full log. Install the system-one-verify skill for Codex, Claude Code, or Devin.",
1555
+ primaryAction: "install the skill"
1556
+ },
1557
+ headings: {
1558
+ "review-heading": "Add a second pass on code changes.",
1559
+ "verify-heading": "Check a completion message.",
1560
+ "workflows-heading": "Try decision workflows from source",
1561
+ "shipped-heading": "Keep noisy check output short",
1562
+ "use-it-for-a-status-decision": "Use it for a status decision.",
1563
+ "use-native-tools-for-diagnosis": "Use native tools for diagnosis.",
1564
+ "evidence-heading": "What has been measured.",
1565
+ "system-one-skills-research-candidates": "System One Skills research candidates",
1566
+ "catalog-heading": "Further compact-output research",
1567
+ "install-heading": "Install in your project.",
1568
+ "social-image-title": "Shorter test logs for your agent",
1569
+ "skills-first-check-heading": "Run your first check",
1570
+ "skills-further-reading-heading": "Further reading"
1571
+ },
1572
+ channels: {
1573
+ social: {
1574
+ imageDescription: "No model or API key required."
1575
+ }
1576
+ },
1141
1577
  status: {
1142
1578
  default: "proposed"
1143
1579
  }
@@ -1165,12 +1601,38 @@ var portfolioSnapshot = {
1165
1601
  short: "Packages provider reads and plan checks as programs with no model calls",
1166
1602
  meta: "GhostGet Skills packages GhostGet workflows as programs for Claude Code, Codex, and Devin, with no model calls and a receipt you can replay offline.",
1167
1603
  medium: "GhostGet Skills packages common GhostGet workflows as programs for Claude Code, Codex, and Devin. They make no model calls, and every run leaves a receipt you can replay offline.",
1604
+ hero: {
1605
+ heading: "GhostGet workflows as programs you can replay.",
1606
+ summary: "GhostGet Skills packages common GhostGet workflows as programs for Claude Code, Codex, and Devin. They make no model calls, and every run leaves a receipt you can replay offline.",
1607
+ primaryAction: "install the skills"
1608
+ },
1168
1609
  status: {
1169
1610
  default: "proposed"
1170
1611
  }
1171
1612
  }
1172
1613
  }
1173
1614
  },
1615
+ packs: [{
1616
+ slug: "relationships",
1617
+ title: "Relationships",
1618
+ tone: "rose",
1619
+ members: ["peopleblade", "message-like-me", "wrench", "soulscrape", "lifedaysleft"]
1620
+ }, {
1621
+ slug: "knowledge",
1622
+ title: "Knowledge",
1623
+ tone: "indigo",
1624
+ members: ["kb", "oh-computer", "sponge", "sloptrade", "roughday"]
1625
+ }, {
1626
+ slug: "media",
1627
+ title: "Media",
1628
+ tone: "amber",
1629
+ members: ["iconplace", "slopcamera", "soundfish"]
1630
+ }, {
1631
+ slug: "token-maximalists",
1632
+ title: "Tools for Token Maximalists",
1633
+ tone: "emerald",
1634
+ members: ["xcb", "algal", "gobstopper", "sys1", "aicharts", "direct", "clankdar", "valhalla", "swft"]
1635
+ }],
1174
1636
  relations: [{
1175
1637
  id: "runtime:lifedaysleft:slopcamera:uses",
1176
1638
  source: "lifedaysleft",
@@ -1460,7 +1922,7 @@ var portfolioSnapshot = {
1460
1922
  label: "records drawing runs with",
1461
1923
  detail: "The icon.place drawing lab runs each experiment as an ALGAL program in the browser and records the proposal, candidates, and selection as receipts it can replay; the live site does not use ALGAL yet."
1462
1924
  }],
1463
- digest: "sha256:d43bbc1113c077b872d2e11a4a70490cd537d5734951d0c3c4bd8e061ce583a9"
1925
+ digest: "sha256:1af50f624f0d06ec13e1531564a8066795ae3fed732210b6f642179730100103"
1464
1926
  };
1465
1927
 
1466
1928
  // src/portfolio.ts
@@ -1482,6 +1944,7 @@ function deepFreeze(value) {
1482
1944
  }
1483
1945
  var portfolioFacts = deepFreeze(portfolioSnapshot);
1484
1946
  var portfolioProducts = portfolioFacts.products;
1947
+ var portfolioPacks = portfolioFacts.packs;
1485
1948
  var portfolioRelations = portfolioFacts.relations;
1486
1949
  var portfolioProvenance = portfolioFacts.provenance;
1487
1950
  var portfolioDigest = portfolioFacts.digest;
@@ -1530,6 +1993,42 @@ function usesPairs() {
1530
1993
  target: product(relation.target)
1531
1994
  }));
1532
1995
  }
1996
+ function portfolioRelatedGroups(ids, headingPrefix = "related") {
1997
+ if (!/^[a-z][a-z0-9-]*$/u.test(headingPrefix)) {
1998
+ throw new PortfolioFactsError("The related heading prefix must be a lowercase HTML identifier.");
1999
+ }
2000
+ const selected = new Set(ids.map((id) => product(id).id));
2001
+ const item = (id) => {
2002
+ const entry = product(id);
2003
+ return {
2004
+ productId: id,
2005
+ href: entry.canonicalUrl,
2006
+ name: entry.messaging.names.name,
2007
+ role: entry.oneLiner,
2008
+ mark: entry.mark,
2009
+ domain: entry.canonicalUrl.replace(/^https?:\/\/(?:www\.)?([^/:?#]+).*$/u, "$1")
2010
+ };
2011
+ };
2012
+ const groups = [];
2013
+ for (const pack of portfolioPacks) {
2014
+ const members = pack.members.filter((id) => selected.delete(id));
2015
+ if (members.length > 0)
2016
+ groups.push({
2017
+ heading: pack.title,
2018
+ headingId: `${headingPrefix}-${pack.slug}`,
2019
+ tone: pack.tone,
2020
+ items: members.map(item)
2021
+ });
2022
+ }
2023
+ if (selected.size > 0)
2024
+ groups.push({
2025
+ heading: "More from Hraness",
2026
+ headingId: `${headingPrefix}-more`,
2027
+ tone: "neutral",
2028
+ items: portfolioProductIds.filter((id) => selected.has(id)).map(item)
2029
+ });
2030
+ return groups;
2031
+ }
1533
2032
  export {
1534
2033
  usesPairs,
1535
2034
  relatedFor,
@@ -1537,10 +2036,12 @@ export {
1537
2036
  portfolioRelations,
1538
2037
  portfolioRelationKinds,
1539
2038
  portfolioRelationDirections,
2039
+ portfolioRelatedGroups,
1540
2040
  portfolioProvenance,
1541
2041
  portfolioProducts,
1542
2042
  portfolioProductStatuses,
1543
2043
  portfolioProductIds,
2044
+ portfolioPacks,
1544
2045
  portfolioFacts,
1545
2046
  portfolioDigest,
1546
2047
  portfolioCopyStatuses,