docs: add Changelog and Blog tabs powered by Mintlify Update component#296
docs: add Changelog and Blog tabs powered by Mintlify Update component#296prasanna-anchorage wants to merge 5 commits into
Conversation
Adds two new top-level Mintlify tabs: - /changelog with stacked <Update> blocks for curated release notes, backfilled with three entries covering the Solana preset wave, HTTP-gateway chain_metadata + digests, and surfpool mainnet-fork tests. - /blog with one Update stub linking to the launch essay "Composable by design: how Solana presets stack" — a concept piece anchored in the build-time preset registry and the InstructionVisualizer composition seams. Both surfaces ship subscribable RSS at /changelog/rss.xml and /blog/rss.xml using Mintlify's built-in <Update>-driven feed generation — no custom generator script or CI diff check. Adds docs/changelog/_drafts/ with a README documenting the in-PR fragment workflow: contributors drop draft fragments here, maintainers batch them into Update blocks at curation time. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
|
Adds a minimal Containerfile that installs the `mint` CLI (npm package `mint`, the official Mintlify CLI) on top of node:20-alpine. The docs directory is bind-mounted at runtime so edits show up live in the dev server — the image only carries the CLI. Adds docs/Makefile with `make dev`, `make broken-links`, `make shell`, and `make rss` targets. ENGINE defaults to docker; set ENGINE=podman to swap. PORT defaults to 3000. Updates docs/CLAUDE.md to point at `make -C docs dev` as the simplest way to start the dev server, with a fallback note for host-installed CLI users. Verified locally: image builds in ~50s, `mint --version` returns 4.2.560. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds Mintlify-powered Changelog and Blog sections to the docs site, using <Update> entries for release notes, blog stubs, and RSS feed generation.
Changes:
- Adds Changelog and Blog tabs to
docs.json. - Adds a changelog page with three release entries.
- Adds a blog index, full Solana presets essay, and changelog draft workflow docs.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
docs/docs.json |
Adds top-level Changelog and Blog navigation tabs. |
docs/changelog/_drafts/README.md |
Documents the draft fragment workflow for changelog entries. |
docs/changelog.mdx |
Adds the new Update-based changelog page. |
docs/blog.mdx |
Adds the new Update-based blog landing page. |
docs/blog/2026-05-13-composable-solana-presets.mdx |
Adds the full Solana presets composability essay. |
Comments suppressed due to low confidence (12)
docs/blog/2026-05-13-composable-solana-presets.mdx:49
- This overstates the current Ethereum behavior. The only production call path I found for
LayeredRegistry<ContractRegistry>ignores request options and returnsLayeredRegistry::new(...), with wallet-provided token overrides left as a TODO insrc/chain_parsers/visualsign-ethereum/src/lib.rs:191-208;with_requestis only used in examples/tests. Please rephrase this as a planned capability or document the behavior that exists today.
If you're **integrating VisualSign into a wallet**, composability shows up at the data layer too. The Ethereum side uses `LayeredRegistry<T>` to compose wallet-provided overrides on top of compiled-in defaults — wallets can ship their own opinions about token metadata without forking VisualSign. The Solana side currently composes through fixed IDL + preset layers; wallet-side overlays are the natural next step.
docs/blog/2026-05-13-composable-solana-presets.mdx:53
- This overstates the Surfpool setup as not needing a live cluster. The current test utility always configures an upstream mainnet RPC URL by default and the Surfpool tests are documented as requiring network access, so this should say the tests avoid executing directly on a live cluster while still needing live RPC access for the fork.
If you're **writing tests**, surfpool (PR #202) composes real Solana mainnet state into the local harness. Tests run against forked chain data, which catches drift between IDL assumptions and on-chain reality without a live cluster.
docs/blog.mdx:9
- The stub names
layered registriesas one of the three composition primitives, but the full essay's "three pieces" are the built-in IDL parser, protocol-specific preset overlays, and the build-time registry. This mismatch makes the teaser inaccurate; it should refer to the build-time registry unless the essay is reorganized.
Adding a new protocol to VisualSign rarely touches existing code. The recent Solana preset wave is a useful proof point: 14 protocols shipped without changes to existing decoders or the core parser. This post walks through the three composition primitives — the built-in IDL parser, protocol-specific preset overlays, and layered registries — and why each preset is a pure addition rather than a modification. [Read the full post](/blog/2026-05-13-composable-solana-presets).
docs/blog/2026-05-13-composable-solana-presets.mdx:34
available_visualizers()is described as a generated slice, but the generated function currently returns aVec<Box<dyn InstructionVisualizer>>(build.rsformatspub fn available_visualizers() -> Vec<...>). Please useVec,list, orcollectionhere to avoid misleading readers who look for a slice API.
`available_visualizers()` is the generated slice. `unknown_program` always sorts last, so it catches anything no specific preset claimed. A preset registered for Jupiter's program id has zero knowledge of MetaDAO's preset, and vice versa. The dispatch lookup is the only coupling.
docs/blog/2026-05-13-composable-solana-presets.mdx:18
- This is not quite accurate for new preset contributors: adding a preset directory is not the only registration step because
src/chain_parsers/visualsign-solana/src/presets/mod.rsmust also get apub mod {snake_name};entry (thesolana-add-idlskill documents this as Step 4).build.rsdiscovers the visualizer for the generated registry, but Rust still needs the module declared.
3. **A build-time registry.** `build.rs` scans `src/presets/` and emits a generated `available_visualizers()` function — one `Box::new(<Dir>::<Pascal>Visualizer)` per directory. The build comment in the script puts the design intent plainly: "this should allow us to functionally compose instructions at the time of display." There is no central registration site to edit. Adding a directory is the registration.
docs/blog/2026-05-13-composable-solana-presets.mdx:43
- This repeats the same registration inaccuracy: preset PRs do need to touch the shared
src/chain_parsers/visualsign-solana/src/presets/mod.rsmodule list so the new directory is compiled, even thoughbuild.rshandles the generated visualizer registry. Please avoid saying nothing outside the preset directory changes.
Nothing else moved. Reviewers read each preset PR in isolation. CI sees no ripple.
docs/blog/2026-05-13-composable-solana-presets.mdx:57
- The claim that there is "no list to drift out of sync" is contradicted by the required
pub mod ...list insrc/chain_parsers/visualsign-solana/src/presets/mod.rs, which must be updated for each new preset. The generated visualizer registry reduces one source of drift, but the module list still exists.
"Composable by design" is a phrase. The work is in keeping the seams clean as surface area grows. Build-time discovery of presets means there's no list to drift out of sync. Field builders mean two contributors emitting the same content produce identical bytes. A typed IDL view between the raw instruction and the preset means presets only see well-shaped input.
docs/blog/2026-05-13-composable-solana-presets.mdx:47
- This contributor-facing checklist omits the shared module registration step. The
solana-add-idlskill's Step 4 requires addingpub mod {snake_name};tosrc/chain_parsers/visualsign-solana/src/presets/mod.rs, so describing the change as only one new directory will leave readers with an incomplete process.
If you're **adding a new Solana protocol**, the design pushes you toward a particular shape: one IDL, one visualizer, one config, a handful of fixtures, one new directory. The same shape your reviewer expects, the same shape we expect from ourselves. The `solana-add-idl` skill scaffolds this for you when the protocol exposes an on-chain IDL.
docs/blog.mdx:9
- Calling each preset a "pure addition rather than a modification" is misleading because adding a Solana preset currently also modifies the shared
src/chain_parsers/visualsign-solana/src/presets/mod.rsmodule list. The statement should distinguish generated registry discovery from the still-manual Rust module declaration.
Adding a new protocol to VisualSign rarely touches existing code. The recent Solana preset wave is a useful proof point: 14 protocols shipped without changes to existing decoders or the core parser. This post walks through the three composition primitives — the built-in IDL parser, protocol-specific preset overlays, and layered registries — and why each preset is a pure addition rather than a modification. [Read the full post](/blog/2026-05-13-composable-solana-presets).
docs/blog/2026-05-13-composable-solana-presets.mdx:16
- This does not match the current Solana preset interface.
VisualizerContextpasses rawInstructiondata plus the IDL registry, and presets such asjupiter_borrowcallparse_instruction_with_idl(&instruction.data, ...)and inspect discriminators themselves before building fields; they are not handed a precomputed typed IDL view by the core layer. Please rephrase the architecture so contributors do not expect a typed view to be provided automatically.
1. **A built-in IDL parser.** Any Anchor-style program with an IDL gets a typed view of each instruction — discriminator, account list, argument values — produced generically from the IDL alone. This is the `src/idl/` module. It does not know about Jupiter or Kamino.
2. **Protocol-specific preset overlays.** A preset is a small unit that says "for *this* program id, take the typed view and produce these human-readable fields." Presets implement `InstructionVisualizer` and declare which program id they handle via `SolanaIntegrationConfig`. They never parse bytes; they consume the IDL view and call field builders (`create_text_field`, `create_amount_field`, `create_raw_data_field`) to shape output. Each preset lives in its own directory.
docs/blog/2026-05-13-composable-solana-presets.mdx:57
- The final sentence is inaccurate with the current API: presets receive
VisualizerContextwith raw SolanaInstructiondata and are responsible for invoking the IDL parser/fallback handling, so they do not "only see well-shaped input." This should be softened or updated to describe the actual raw-instruction-plus-IDL-registry boundary.
"Composable by design" is a phrase. The work is in keeping the seams clean as surface area grows. Build-time discovery of presets means there's no list to drift out of sync. Field builders mean two contributors emitting the same content produce identical bytes. A typed IDL view between the raw instruction and the preset means presets only see well-shaped input.
docs/blog/2026-05-13-composable-solana-presets.mdx:18
- This is presented as a direct quote from
build.rs, but the current comment does not match it exactly (allow use ... at the time of display too). Either quote the source verbatim or paraphrase without quotation marks.
3. **A build-time registry.** `build.rs` scans `src/presets/` and emits a generated `available_visualizers()` function — one `Box::new(<Dir>::<Pascal>Visualizer)` per directory. The build comment in the script puts the design intent plainly: "this should allow us to functionally compose instructions at the time of display." There is no central registration site to edit. Adding a directory is the registration.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| Subscribe via RSS at [`/changelog/rss.xml`](/changelog/rss.xml). Entries are tagged so you can filter by audience (`Wallet API`, `Contributors`, `Security`, `Ecosystem`), chain, or theme. | ||
|
|
||
| <Update label="2026-05-12 — Solana preset wave" description="14 new protocols decoded" tags={["Wallet API", "Contributors", "Solana"]}> |
| description: "Adding a new protocol to VisualSign rarely touches existing code. Here's how the IDL parser, preset overlays, and a build-time registry compose into one signable payload." | ||
| --- | ||
|
|
||
| In the last few weeks, VisualSign gained decoding for Jupiter (Borrow, Earn, Perpetuals, v6 route_v2), Kamino (Borrow, Vault, Farms, Limit Orders), Meteora (DLMM, DAMM V2), MetaDAO (Futarchy, Conditional Vault), Orca Whirlpool, Onre App, Neutral Trade, DFlow Aggregator, and Exponent Finance. Fourteen protocols. Each PR added a single directory under `src/chain_parsers/visualsign-solana/src/presets/` and a handful of fixtures. None of them changed how any of the other presets decode, and none of them touched the core parser. |
| Subscribe via RSS at [`/blog/rss.xml`](/blog/rss.xml). Posts are tagged by chain and theme. Each entry below is a stub — click through for the full essay. | ||
|
|
||
| <Update label="2026-05-13 — Composable by design: how Solana presets stack" tags={["Solana", "Architecture", "Contributors"]}> | ||
| Adding a new protocol to VisualSign rarely touches existing code. The recent Solana preset wave is a useful proof point: 14 protocols shipped without changes to existing decoders or the core parser. This post walks through the three composition primitives — the built-in IDL parser, protocol-specific preset overlays, and layered registries — and why each preset is a pure addition rather than a modification. [Read the full post](/blog/2026-05-13-composable-solana-presets). |
| @@ -0,0 +1,49 @@ | |||
| # Changelog drafts | |||
|
|
|||
| PR authors of user-facing changes drop a fragment here. A maintainer batches drafts into one or more `<Update>` blocks on `../changelog.mdx` when a meaningful release ships, then deletes the consumed drafts. | |||
| </Update> | ||
|
|
||
| <Update label="2026-05-12 — Surfpool mainnet-fork integration for IDL fuzz testing" description="PR #202" tags={["Contributors", "Solana"]}> | ||
| The built-in Solana IDL parser path is now fuzz-tested against real mainnet state via Surfpool. Composing live chain state into the local test harness catches drift between IDL assumptions and on-chain reality, without requiring a live cluster. |
| description: "Concept exploration, design pieces, and deeper dives from the VisualSign team." | ||
| --- | ||
|
|
||
| Subscribe via RSS at [`/blog/rss.xml`](/blog/rss.xml). Posts are tagged by chain and theme. Each entry below is a stub — click through for the full essay. |
Breaks the single changelog page into: - /changelog -- landing/index with CardGroup linking to both streams and a short orientation (release tagging, authoring workflow, tag vocabulary). - /changelog/chain-parsers -- Solana preset wave (v0.646.0 -- v0.649.0) and Surfpool fuzz integration (v0.647.0). - /changelog/fundamentals -- HTTP gateway chain_metadata + content digests (v0.648.0). Each `<Update>` block now carries `description="v0.X.Y"` pointing to the first release tag that contains the change (looked up via `git tag --contains <sha> --sort=v:refname | head -1`). Two separate RSS feeds: - /changelog/chain-parsers/rss.xml - /changelog/fundamentals/rss.xml Subscribers pick the stream they care about: wallet integrators may follow fundamentals only; preset authors follow chain-parsers. Updates the _drafts/README.md fragment format to require a `category` field (chain-parsers | fundamentals) and explains how the maintainer fills `description` with the release tag at curation time. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`chain_parsers` is the repo directory; readers care about the chain.
Replaces /changelog/chain-parsers with one page per supported chain,
each with its own RSS feed:
- /changelog/solana (Solana preset wave + Surfpool moved here)
- /changelog/ethereum (stub; populates with next meaningful release)
- /changelog/sui (stub)
- /changelog/tron (stub)
- /changelog/fundamentals (unchanged)
The landing /changelog now shows a CardGroup with all five streams.
docs.json groups the Changelog tab into Overview, Chain streams, and
Fundamentals so each surface is discoverable in the sidebar.
Drops the chain name from `tags={...}` on per-chain Update blocks since
the page already conveys the chain. Updates _drafts/README.md so the
fragment `category` field is one of solana | ethereum | sui | tron |
fundamentals.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`core` is clearer than `fundamentals` and matches the language already used to describe `src/visualsign/` elsewhere in the docs (Core types, core library, etc.). Avoids the branding overload that "VisualSign" would have, since the entire repo is VisualSign. - /changelog/fundamentals -> /changelog/core - Card label "Fundamentals" -> "Core" - nav group "Fundamentals" -> "Core" - _drafts/README.md category vocabulary updated Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
<Update>primitive so we get subscribable RSS without any custom tooling./changelog) — curated, per-meaningful-release timeline. Backfilled with three entries covering the Solana preset wave, HTTP-gatewaychain_metadata+ content digests (PR feat: forward chain_metadata and expose digests in HTTP gateway #287), and surfpool mainnet-fork fuzz integration (PR test: surfpool mainnet-fork integration for built-in IDL fuzz path #202)./blog) — stub list linking to full essay pages. Launches with Composable by design: how Solana presets stack — a concept piece that ties the recent preset wave to the build-time preset registry (visualsign-solana/build.rs) and theInstructionVisualizer/SolanaIntegrationConfigcomposition seams. Composability is the through-line./changelog/rss.xmland/blog/rss.xml, courtesy of Mintlify's built-in<Update>-driven feed generation. No custom generator script, no CI diff check.docs/changelog/_drafts/with a README documenting the in-PR fragment workflow: contributors drop drafts close to the change, maintainers batch them into<Update>blocks at curation time.Composability emphasis
The blog essay walks through how 14+ recent Solana protocols shipped without touching any existing decoder or the core parser: each new directory under
src/chain_parsers/visualsign-solana/src/presets/is auto-registered bybuild.rs, dispatch is viavisualize_with_any()matching on program id, andunknown_programalways sorts last as the catch-all. The seams are the product — that's the headline.Test plan
/changelogwith three<Update>blocks stacked, tag chips visible./blogwith one<Update>stub linking to the full essay page./blog/2026-05-13-composable-solana-presetsrenders the full essay with frontmatter title and description applied./changelog/rss.xmlreturns valid RSS 2.0 with three items and<category>elements per tag./blog/rss.xmlreturns valid RSS 2.0 with one item./chains/solana,/changelog,/blog/...cross-links).Anchoragestandalone, no≥/→— all confirmed via grep at authoring time.🤖 Generated with Claude Code