@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.
- package/AGENT_SETUP.md +4 -0
- package/ARTICLE_COPY.md +12 -6
- package/README.md +20 -2
- package/dist/{chunk-nwpcjm48.js → chunk-6bfr0g23.js} +1115 -441
- package/dist/{chunk-h4k7yv6x.js → chunk-6ts4955n.js} +36 -36
- package/dist/chunk-gmea6p0d.js +13 -0
- package/dist/{chunk-mr1vdcjq.js → chunk-tzd7177a.js} +142 -82
- package/dist/index.js +5 -1
- package/dist/mockups/client.js +50 -15
- package/dist/portfolio.js +586 -85
- package/dist/react/index.js +169 -105
- package/dist/react/platform-install.js +3 -2
- package/dist/react/server.js +17 -3
- package/dist/stylex-manifest.json +1 -1
- package/dist/stylex.css +376 -58
- package/package.json +16 -3
- package/portfolio-inventory.json +1 -1
- package/src/diagrams.ts +11 -0
- package/src/index.ts +2 -0
- package/src/marketing-comparison.css +162 -0
- package/src/marketing-diagram.css +24 -0
- package/src/mockups/client.tsx +25 -17
- package/src/mockups.css +19 -0
- package/src/plain-publication.css +9 -6
- package/src/portfolio.generated.json +578 -86
- package/src/portfolio.generated.ts +578 -86
- package/src/portfolio.ts +73 -0
- package/src/product-marketing-foundation.css +29 -0
- package/src/product-marketing.css +133 -38
- package/src/react/agent-setup-prompt.stylex.ts +5 -25
- package/src/react/agent-setup-prompt.tsx +9 -18
- package/src/react/article.tsx +2 -2
- package/src/react/design-gallery.tsx +34 -6
- package/src/react/index.ts +3 -0
- package/src/react/marketing-account.stylex.ts +74 -0
- package/src/react/marketing-account.tsx +69 -0
- package/src/react/marketing-comparison.stylex.ts +24 -0
- package/src/react/marketing-comparison.tsx +73 -0
- package/src/react/marketing-diagram.stylex.ts +8 -0
- package/src/react/marketing-diagram.tsx +33 -0
- package/src/react/platform-install.stylex.ts +9 -37
- package/src/react/platform-install.tsx +17 -24
- package/src/react/product-marketing.stylex.ts +138 -109
- package/src/react/product-marketing.tsx +69 -43
- package/src/react/server.ts +3 -0
- package/src/react/setup-copy-button.stylex.ts +39 -0
- package/src/react/setup-copy-button.tsx +20 -0
- package/src/styles.css +2 -0
- package/src/typography.css +32 -0
- /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: "
|
|
10
|
-
committedOn: "2026-09-
|
|
9
|
+
commit: "d75ebaa21ae0576c1d6c71e1bea23c93b866601c",
|
|
10
|
+
committedOn: "2026-09-30",
|
|
11
11
|
upstreamContract: "hraness.portfolio-public/v1",
|
|
12
|
-
upstreamDigest: "sha256:
|
|
12
|
+
upstreamDigest: "sha256:ba365e481a8b15c4a19503b1628e1b7ae9399e47055dde02bae124183a3e1447",
|
|
13
13
|
files: [{
|
|
14
14
|
path: "portfolio.public.generated.json",
|
|
15
|
-
sha256: "
|
|
15
|
+
sha256: "4c9e41dd1cb711d21a2da086de6b7d4adac2990ccda3909fa1cacf3b0ff44369"
|
|
16
16
|
}, {
|
|
17
17
|
path: "packages/brand-catalog/brands.yaml",
|
|
18
|
-
sha256: "
|
|
18
|
+
sha256: "10f20e9d7b8ad0f108b56344c5d1b60cf3c54e6cec5e7024004b7b4f608f282c"
|
|
19
19
|
}, {
|
|
20
20
|
path: "brand-artwork.json",
|
|
21
|
-
sha256: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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:
|
|
301
|
-
canonicalUrl: "https://
|
|
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
|
|
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: "
|
|
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
|
-
|
|
398
|
-
|
|
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: "
|
|
435
|
-
brandDescription: "
|
|
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: "
|
|
449
|
-
tagline: "
|
|
450
|
-
short: "
|
|
451
|
-
meta: "
|
|
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: "
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
595
|
-
medium: "icon.place is a library of editable vector icons and illustrations
|
|
596
|
-
long: "icon.place is a library of editable vector icons and illustrations.
|
|
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-
|
|
816
|
+
reviewedOn: "2026-09-30"
|
|
601
817
|
}
|
|
602
818
|
},
|
|
603
819
|
slopcamera: {
|
|
604
820
|
id: "slopcamera",
|
|
605
821
|
name: "SlopCamera",
|
|
606
|
-
oneLiner: "
|
|
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: "
|
|
623
|
-
short: "
|
|
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: "
|
|
629
|
-
summary: "
|
|
630
|
-
primaryAction: "Install
|
|
631
|
-
secondaryAction: "
|
|
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-
|
|
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: "
|
|
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: "
|
|
692
|
-
tagline: "
|
|
693
|
-
short: "
|
|
694
|
-
meta: "Sys1
|
|
695
|
-
medium: "Sys1 keeps
|
|
696
|
-
long: "Sys1 keeps
|
|
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: "
|
|
699
|
-
summary: "
|
|
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: "
|
|
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-
|
|
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: "
|
|
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
|
|
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: "
|
|
942
|
-
summary: "Estimate
|
|
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: "
|
|
979
|
-
secondaryAction: "
|
|
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:
|
|
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,
|