diff --git a/src/components/islands/Tools.tsx b/src/components/islands/Tools.tsx
index 2286c9f..60dd9a4 100644
--- a/src/components/islands/Tools.tsx
+++ b/src/components/islands/Tools.tsx
@@ -132,7 +132,7 @@ export default function Tools() {
>
@@ -168,19 +168,19 @@ export default function Tools() {
}
.tools-job:hover { border-color: var(--turq); color: var(--navy); }
.tools-job.is-active {
- background: var(--navy);
+ background: var(--navy-surface);
color: #fff;
- border-color: var(--navy);
+ border-color: var(--navy-surface);
}
- .tools-job-label { font-size: 14px; font-weight: 500; }
+ .tools-job-label { font-size: var(--text-ui); font-weight: 500; }
.tools-job-hint {
- font-size: 11px;
+ font-size: var(--text-2xs);
color: var(--ink-3);
letter-spacing: .02em;
}
.tools-job.is-active .tools-job-hint { color: rgba(255,255,255,0.65); }
.tools-job-count {
- font-size: 11px;
+ font-size: var(--text-2xs);
color: var(--ink-3);
background: var(--pearl);
padding: 1px 7px;
@@ -232,15 +232,15 @@ export default function Tools() {
}
.tool-name {
margin: 0;
- font-size: 20px;
+ font-size: var(--text-xl);
font-weight: 600;
color: var(--navy);
letter-spacing: -0.01em;
}
.tool-badge {
- font-size: 10px;
- letter-spacing: .12em;
- text-transform: uppercase;
+ font-family: var(--font-retro);
+ font-style: italic;
+ font-size: var(--text-xs);
color: var(--turq);
background: var(--pearl);
padding: 3px 8px;
@@ -249,7 +249,7 @@ export default function Tools() {
}
.tool-blurb {
margin: 0;
- font-size: 14px;
+ font-size: var(--text-ui);
color: var(--ink-2);
line-height: 1.55;
flex: 1;
@@ -260,11 +260,11 @@ export default function Tools() {
gap: 14px;
padding-top: 12px;
border-top: 1px dashed var(--line);
- font-size: 12px;
+ font-size: var(--text-xs);
}
.tool-pillar { font-weight: 600; }
.tool-lang { color: var(--ink-3); }
- .tool-link { margin-left: auto; color: var(--turq); font-size: 14px; }
+ .tool-link { margin-left: auto; color: var(--turq); font-size: var(--text-ui); }
@media (prefers-reduced-motion: reduce) {
.tool-card { animation: none; }
diff --git a/src/components/islands/ToolsProblems.tsx b/src/components/islands/ToolsProblems.tsx
index 1a90a65..1e16b2b 100644
--- a/src/components/islands/ToolsProblems.tsx
+++ b/src/components/islands/ToolsProblems.tsx
@@ -80,15 +80,23 @@ const PROBLEMS: Problem[] = [
],
},
{
- label: 'Ship a content-addressed static website',
+ label: 'Publish a content-addressed static website',
guidance:
'Drop ipfs-deploy-action into your CI pipeline to get a CID per build and pin it automatically. Omnipin offers one-click pinning via MetaMask.',
tools: [
{ name: 'ipfs-deploy-action', link: 'https://github.com/ipshipyard/ipfs-deploy-action', lang: 'other' },
- { name: 'Omnipin', link: 'https://omnipin.eth.link/', lang: 'cli' },
+ { name: 'Omnipin', link: 'https://omnipin.eth.limo/', lang: 'cli' },
{ name: 'SimplePage', link: 'https://github.com/stigmergic-org/simplepage', lang: 'other' },
],
},
+ {
+ label: 'Distribute signed release artifacts',
+ guidance:
+ 'Publish binaries, model weights, or data sets as signed CIDs bound to their source git commit, seedable over iroh-blobs, HTTP, IPFS, and BitTorrent.',
+ tools: [
+ { name: 'radicle-artifact', link: 'https://crates.io/crates/radicle-artifact', lang: 'rust' },
+ ],
+ },
{
label: 'Verified retrieval in browsers',
guidance:
@@ -107,6 +115,56 @@ const PROBLEMS: Problem[] = [
{ name: '@dasl/rasl', link: 'https://github.com/darobin/rasl', lang: 'typescript' },
],
},
+ {
+ label: 'Archive & transfer with CAR files',
+ guidance:
+ 'Pack content-addressed blocks into a single CAR (Content Addressable aRchive) file for storage or transfer; verifiable and self-describing.',
+ tools: [
+ { name: '@ipld/car', link: 'https://github.com/ipld/js-car', lang: 'typescript' },
+ { name: 'go-car', link: 'https://github.com/ipld/go-car', lang: 'go' },
+ { name: 'py-ipld-car', link: 'https://github.com/storacha/py-ipld-car', lang: 'python' },
+ // No standalone maintained Rust CAR crate; rust-ipfs handles CAR internally.
+ { name: 'rust-ipfs', link: 'https://github.com/dariusc93/rust-ipfs', lang: 'rust' },
+ ],
+ },
+ {
+ label: 'Encode IPLD data (DAG-CBOR / DAG-JSON)',
+ guidance:
+ 'Serialize linked data with the DAG-CBOR and DAG-JSON codecs, the IPLD formats that give you deterministic encoding and CID links between blocks.',
+ tools: [
+ { name: 'js-dag-cbor', link: 'https://github.com/ipld/js-dag-cbor', lang: 'typescript' },
+ { name: 'js-dag-json', link: 'https://github.com/ipld/js-dag-json', lang: 'typescript' },
+ { name: 'serde_ipld_dagcbor', link: 'https://github.com/ipld/serde_ipld_dagcbor', lang: 'rust' },
+ { name: 'serde_ipld_dagjson', link: 'https://github.com/ipld/serde_ipld_dagjson', lang: 'rust' },
+ { name: 'rust-ipld-core', link: 'https://github.com/ipld/rust-ipld-core', lang: 'rust' },
+ { name: 'go-ipld-prime', link: 'https://github.com/ipld/go-ipld-prime', lang: 'go' },
+ { name: 'py-ipld-dag', link: 'https://github.com/ipld/py-ipld-dag', lang: 'python' },
+ // dag-cbor only; no maintained Java dag-json codec found.
+ { name: 'dag-cbor', link: 'https://github.com/Peergos/dag-cbor', lang: 'java' },
+ ],
+ },
+ {
+ label: 'Build UnixFS file trees',
+ guidance:
+ 'Represent files and directories as IPLD with UnixFS, the data model behind chunked files and folders on IPFS.',
+ tools: [
+ { name: 'js-ipfs-unixfs', link: 'https://github.com/ipfs/js-ipfs-unixfs', lang: 'typescript' },
+ { name: 'boxo/unixfs', link: 'https://github.com/ipfs/boxo/tree/main/ipld/unixfs', lang: 'go' },
+ // Only actively maintained Rust UnixFS implementation; older repos are archived.
+ { name: 'rust-ipfs', link: 'https://github.com/dariusc93/rust-ipfs/tree/libp2p-next/unixfs', lang: 'rust' },
+ ],
+ },
+ {
+ label: 'Debug & inspect retrieval',
+ guidance:
+ 'Check whether a CID is retrievable, inspect its DAG, and test gateways and IPNS records when content is not resolving as expected.',
+ tools: [
+ { name: 'IPFS Check', link: 'https://check.ipfs.network/', lang: 'http' },
+ { name: 'DAG inspector', link: 'https://dag.ipfs.tech/', lang: 'http' },
+ { name: 'Gateway Checker', link: 'https://ipfs.github.io/public-gateway-checker/', lang: 'http' },
+ { name: 'IPNS inspector', link: 'https://ipns.ipfs.network/', lang: 'http' },
+ ],
+ },
]
function chipOpacity(chipLang: Lang, active: Lang): number {
@@ -199,15 +257,15 @@ export default function ToolsProblems() {
border-radius: 999px;
cursor: pointer;
font: inherit;
- font-size: 13px;
+ font-size: var(--text-sm);
font-weight: 500;
color: var(--ink-2);
transition: border-color .15s, background .15s, color .15s;
}
.lf-btn:hover { border-color: var(--lc, var(--turq)); color: var(--navy); }
.lf-btn.is-active {
- background: var(--lc, var(--navy));
- border-color: var(--lc, var(--navy));
+ background: var(--lc, var(--navy-surface));
+ border-color: var(--lc, var(--navy-surface));
color: #fff;
}
@@ -236,7 +294,7 @@ export default function ToolsProblems() {
}
.tp-label {
- font-size: 18px;
+ font-size: var(--text-lg);
font-weight: 600;
color: var(--navy);
letter-spacing: -0.01em;
@@ -248,7 +306,7 @@ export default function ToolsProblems() {
.tp-guidance {
margin: 0;
- font-size: 15px;
+ font-size: var(--text-base);
color: var(--ink-2);
line-height: 1.6;
}
@@ -263,7 +321,7 @@ export default function ToolsProblems() {
border: 1px solid var(--line);
border-radius: 6px;
font-family: var(--font-mono);
- font-size: 12px;
+ font-size: var(--text-xs);
font-weight: 600;
color: var(--cc, var(--turq));
text-decoration: none;
diff --git a/src/components/islands/TransportRoutes.tsx b/src/components/islands/TransportRoutes.tsx
index 5537510..58ef0e2 100644
--- a/src/components/islands/TransportRoutes.tsx
+++ b/src/components/islands/TransportRoutes.tsx
@@ -21,8 +21,8 @@ export default function TransportRoutes() {
- cid
-
+ cid
+
{CID}
@@ -34,15 +34,15 @@ export default function TransportRoutes() {
borderBottom: '1px solid var(--line)', padding: '10px 0',
borderLeft: `3px solid ${l.color}`, paddingLeft: 12,
}}>
-
{l.icon}
-
{l.name}
-
{l.hint}
+
{l.icon}
+
{l.name}
+
{l.hint}
))}