Skip to content

Proposal: Canton devkit (dpm component) - a unified toolkit for Canton app development (LocalNet, dar helpers, etc)#18

Merged
hythloda merged 27 commits into
canton-foundation:mainfrom
zheli:canton-devkit
May 13, 2026
Merged

Proposal: Canton devkit (dpm component) - a unified toolkit for Canton app development (LocalNet, dar helpers, etc)#18
hythloda merged 27 commits into
canton-foundation:mainfrom
zheli:canton-devkit

Conversation

@zheli
Copy link
Copy Markdown
Contributor

@zheli zheli commented Feb 23, 2026

Development Fund Proposal Submission

Proposal file:
/proposals/devkit.md


Summary

Canton DevKit is a unified, open-source local developer environment tool for the Canton Network that leverages the existing LocalNet stack. It delivers one-command LocalNet lifecycle management, integrated observability dashboards, and CIP-0112 token faucets and tooling — lowering onboarding time for new developers, workshop participants, and hackathon teams. The project is structured across 4 milestones over 12 months and requests 1,900,000 CC in milestone-based funding, with an optional 600,000 CC Maintenance & Compatibility Extension covering 12 months of post-grant support (2,500,000 CC combined if both are approved).


Checklist

  • Proposal file added under /proposals/
  • Milestones and funding amounts defined
  • Acceptance criteria included
  • Alignment with Canton priorities described

@zheli zheli requested a review from a team as a code owner February 23, 2026 09:41
@zheli zheli changed the title Add Canton devkit proposal Proposal: Canton devkit - an unified local dev environment management Feb 25, 2026
@zheli zheli changed the title Proposal: Canton devkit - an unified local dev environment management Proposal: Canton devkit - an unified local dev environment management toolkit Feb 25, 2026
@zheli zheli force-pushed the canton-devkit branch 2 times, most recently from 243b4c9 to 2613465 Compare March 20, 2026 08:21
@hythloda hythloda moved this from Incoming to Needs Champion in Dev Fund Incoming Mar 25, 2026
@srikanth-bitdynamics srikanth-bitdynamics moved this from Needs Champion to In Review (Champion Assigned) in Dev Fund Incoming Apr 5, 2026
Comment thread proposals/devkit.md Outdated
All features covered by CLI commands but with a user-friendly interface.

###### AI Coding Agent Integration
AI skill and command to work with the LocalNet using canton-devkit that supports Claude, Codex.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this part should not be part of DevKit. Each person typically has their own editor with their own setup. DevKit should concern about building primitive (the infra, the local setup) and not be the how one write code.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am thinking of something like this https://github.com/ClickHouse/agent-skills/blob/main/skills/clickhousectl-cloud-deploy/SKILL.md actually.

So you could just write "compile and test the new daml code and deployt to localnet 1" in your ai coding agent and it will call the correct command to upload to the corresponding localnet deployment.

Comment thread proposals/devkit.md Outdated
The existing LocalNet setup requires manually downloading Splice bundles, exporting environment variables, composing multi-flag Docker commands, and understanding Docker Compose profiles. DevKit collapses this into:

###### CLI Commands
* `canton-devkit localnet up` / `down` / `restart` / `clean` / `status` / `logs` — a single installable CLI that downloads the latest Splice LocalNet bundle, generates configs, keys, and identities, starts the Docker stack, runs health checks, and prints ready-to-use endpoints (Ledger API, Admin API, JSON API, wallet UIs) and token credentials.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a few question about this canton-devkit

  • How does canton-devkit binary get distribute? is it pre-build binary across platform (Window/Linux/Mac arm64/amd64) .
  • Does user need to setup any programming language for this to run (nodejs/python) or this is executeable binary
  • How does docker setup is handle

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the questions!

I have a few question about this canton-devkit

* How does `canton-devkit` binary get distribute? is it pre-build binary across platform (Window/Linux/Mac arm64/amd64) .

I am more leaning towards Golang or rust where I can have static linked library and a single binary for each platform.

* Does user need to setup any programming language for this to run (nodejs/python) or this is executeable binary

Yeah. I am trying to avoid that so I think a single binary cli file should be the cleanest. Althought i might need to store some settings locally in user's home folder.

* How does docker setup is handle

Do you mean how user should install their docker in their environment? That's a good question, I haven't thought about it. It will probably require user to install docker runtime themselves. (Docker desktop on macos, docker on linux)

@zheli
Copy link
Copy Markdown
Contributor Author

zheli commented Apr 26, 2026

@v9n updated proposal based on your feedback

@hythloda hythloda moved this from In Review (Champion Assigned) to Ready for Vote in Dev Fund Incoming Apr 27, 2026
@hythloda hythloda moved this from Ready for Vote to Voting Live in Dev Fund Incoming Apr 30, 2026
Copy link
Copy Markdown

@leonidr-c7 leonidr-c7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is an exciting project:

  1. Will there be any open-source artifacts as a result of the project? Perhaps some of the CLI elements will call library code that could be externally?
  2. Furthermore, what will be the long term governance of this tool?
  3. I wish that the funding had more weight towards Milestone 4; focusing on external adoption of the tool, so that this proposal demonstrates developing for the broader ecosystem.

Comment thread proposals/devkit.md Outdated

The solution is delivered as a **standalone CLI application** (`canton-devkit`) with web UI. It will be implemented in **Go** and distributed as standalone native binaries for macOS and Linux on arm64 and amd64. End users will not need Go, Node.js, Python, Rust, or a source checkout to run it. DevKit uses Docker containers and runs LocalNet using Splice nodes, but packages the developer experience into a single binary that requires no git clone, no Makefile knowledge, and no manual environment variable setup. It will also include other optional helper services that developers can enable or disable as needed.

Windows native support is out of scope for the initial grant. Windows users may be documented later through WSL2 if there is demand, but it is not part of the committed deliverables.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

@zheli zheli May 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point — Windows is definitely a meaningful segment.

The main constraint for us right now is practical: we don’t currently have any Windows environments, which makes it hard to properly test, validate, and reliably estimate the effort required for native support. Rather than overcommitting early, we’re prioritizing macOS and Linux where we can deliver with high confidence.

This is not a long-term exclusion. If we see demand or traction from the tool or Windows users, we’ll revisit it — likely starting with a WSL2-based path before considering native support.

Appreciate you raising it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not need amd64 for macOS. However Windows support is mandatory IMO. Commitment to a Windows implementation should be included in one of the planned grant phases (even if it is a late one). If it were not the case, it would create a gap that may never be closed as contributors come and go.

Comment thread proposals/devkit.md Outdated
* **Milestone 1:** **3 voting member companies** have installed a binary release and successfully run `localnet up/status/down` on macOS or Linux, with at least one tester validating named-instance isolation using explicit non-conflicting ports.
* **Milestone 2:** **5 voting member companies or representative Canton deployments** have used the Web UI, DAR workflow, contract explorer, transaction explorer, or observability workflow against their own DAR/application and provided feedback artifacts.
* **Milestone 3:** At least **5 external projects/teams** demonstrate a LocalNet CIP-56 workflow such as `create -> mint -> transfer` or `mint -> transfer -> burn` and provide feedback or demo artifacts.
* **Milestone 4:** Sustained external adoption is demonstrated through at least **2 public workshops** and **1 case study/blog post**, plus compatibility updates across newer Splice releases and public issue or release-note evidence that feedback was incorporated.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sustained external adaption would be better measured via a clear metric that is perhaps not too game-able; github-stars or unique downloads?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@leonidr-c7 I think below would be fine?

Unique binary downloads (per release, deduplicated by installer fingerprint where possible) — primary metric
GitHub stars and unique cloners — secondary, directional signal
External projects publicly demonstrating CIP-56 workflows built on DevKit — kept from Milestone 3 since it's the strongest signal of real adoption

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sustained external adaption would be better measured via a clear metric that is perhaps not too game-able; github-stars or unique downloads?

Good points 👍 GitHub stars are useful for visibility, but they don’t necessarily indicate real usage.
I’ll track adoption using a combined set of indicators: stars, download counts, and privacy-preserving telemetry (with user opt-out).

However, given telemetry opt-out, I won’t rely on one metric alone; instead I’ll use a composite view and focus on sustained trends over time. Would that be better?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of those are great, and I like your approach of melding the metrics. As long as there is transparency about what you are measuring, how and the goal then I am in support.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! I have updated the proposal based on your feedback.

@Akibalogh
Copy link
Copy Markdown

Hi — BitSafe here. We're an active Canton LocalNet operator currently implementing CIP-56, so a unified DevKit that streamlines local development and testing lands directly in our workflow. We've been navigating the current tooling friction firsthand, which is why this proposal caught our attention.

A few exploratory questions:

  1. With Prometheus, Grafana, Loki, and Tempo all enabled by default, what are the minimum system requirements for running the full stack? Curious whether this is realistic for the average contributor machine or if a lightweight mode is the intended entry point.

  2. On Splice version compatibility — when Splice cuts a breaking release, who owns the patch and what's the expected turnaround? Knowing whether there's an SLA or a best-effort model would help teams like ours plan around upgrade cycles.

  3. The CIP-56 V2 ratification is expected around May 2026, and the token tooling wizard lands around Month 9 (~November 2026) — will the wizard target V1, V2, or both? We're mid-implementation on CIP-56 at BitSafe and want to know if we should plan for a wizard upgrade cycle.

  4. How does this differentiate from Denex PR Proposal: Denex Developer SDK #238, which also addresses a LocalNet CLI? Is the intent to eventually consolidate, or are these solving different layers of the problem?

  5. After Month 12 the funding drops to zero — is the plan to hand maintenance to the DA, open-source it to the community, or is there a commercial sustainability model in mind?

Happy to share more about our LocalNet setup and testing patterns if it would help inform the DevKit design — feel free to loop us in.

@zheli
Copy link
Copy Markdown
Contributor Author

zheli commented May 4, 2026

@leonidr-c7 thanks for the comments!

I think this is an exciting project:

  1. Will there be any open-source artifacts as a result of the project? Perhaps some of the CLI elements will call library code that could be externally?

The project will be fully open-sourced. The primary artifact is a CLI binary (canton-devkit) that can be invoked directly from the command line, and it also can launch a web server to serve the web UI locally. Binaries will be distributed for macOS and Linux (arm64/amd64), with Windows support planned for the future.

  1. Furthermore, what will be the long term governance of this tool?

Initially, governance will be guided by the Canton Dev Fund committee as the primary funder of the project. Long-term governance beyond that is still to be determined. Good question.

  1. I wish that the funding had more weight towards Milestone 4; focusing on external adoption of the tool, so that this proposal demonstrates developing for the broader ecosystem.

Thanks for the feedback. This is a valid point, and I'd like to wait for the committee's input before considering any structural changes to the milestones.

@zheli
Copy link
Copy Markdown
Contributor Author

zheli commented May 4, 2026

Thanks for the comments @Akibalogh !

  1. With Prometheus, Grafana, Loki, and Tempo all enabled by default, what are the minimum system requirements for running the full stack? Curious whether this is realistic for the average contributor machine or if a lightweight mode is the intended entry point.

That's a valid concern. We're planning to optimize the monitoring stack to minimize resource usage, and the monitoring components (Prometheus, Grafana, Tempo) will have on/off switches so developers can enable only what they need. We're also considering removing Loki from the default setup. Since the monitoring stack can be shared across multiple LocalNet instances, the overhead per instance should be manageable.
That said, LocalNet itself is inherently resource-heavy, so this could be a challenge on machines with limited memory. One idea we're exploring is support for remote LocalNet provisioning via a low-cost cloud provider (e.g. Hetzner), which would offload the resource burden.

  1. On Splice version compatibility — when Splice cuts a breaking release, who owns the patch and what's the expected turnaround? Knowing whether there's an SLA or a best-effort model would help teams like ours plan around upgrade cycles.

Our default support model is best-effort, with a clearly defined support window/cutoff timeline for each breaking Splice release. We will own compatibility patches within that window and communicate expected timelines early so teams can plan upgrades. If there is broader demand for stricter guarantees, we are open to introducing an SLA-based support tier with defined turnaround commitments.
Will answer the rest of the questions later today.

  1. The CIP-56 V2 ratification is expected around May 2026, and the token tooling wizard lands around Month 9 (~November 2026) — will the wizard target V1, V2, or both? We're mid-implementation on CIP-56 at BitSafe and want to know if we should plan for a wizard upgrade cycle.

By "CIP-56 V2" do you mean CIP-0112? That's a good point. We plan to deliver a V2-first wizard in the early milestones to align with the expected direction of the standard and provide immediate value for new projects.
V1 compatibility and V1 migration support will be scoped as an optional later-milestone item, to be prioritized based on ecosystem feedback and observed demand during implementation.

  1. How does this differentiate from Denex PR Proposal: Denex Developer SDK #238, which also addresses a LocalNet CLI? Is the intent to eventually consolidate, or are these solving different layers of the problem?

Thanks for raising this. Our view is that the two efforts are related but operate at different layers.
Denex appears to address a broader developer workflow (including TypeScript SDK and ADZ/Zod-based codegen), while our DevKit proposal is intentionally narrower: we focus on LocalNet infrastructure lifecycle pain points and making that layer reliable and easy to operate.

To avoid duplication, we will proactively coordinate with the Denex team on the LocalNet surface area. The goal is to ensure the ecosystem does not end up funding two overlapping lifecycle CLIs, and to converge where practical (or clearly separate responsibilities where not).

  1. After Month 12 the funding drops to zero — is the plan to hand maintenance to the DA, open-source it to the community, or is there a commercial sustainability model in mind?

The 12-month window is intended to validate adoption and community interest. Depending on uptake, the path forward is either a follow-on maintenance grant or a handover to DA — whichever the Committee judges best. We'll surface adoption metrics through the milestones so the decision has data behind it.

Comment thread proposals/devkit.md

###### LocalNet Configuration Model

DevKit will make the important LocalNet inputs explicit: instance name, Splice version, port settings, enabled optional services, observability settings, startup DAR uploads, and LocalNet-only token test setup. The initial scope does not require a full topology language; the priority is a predictable, documented configuration surface for common local development, workshop, and CI workflows.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When you say "The initial scope does not require a full topology language" what do you mean?

By default which topology would be picked by the canton-devkit, will it be identical to cn-quickstart?
Could canton-devkit provide an alternate minimal topology along with the default one, which could allow saving system resources.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When you say "The initial scope does not require a full topology language" what do you mean?

By default which topology would be picked by the canton-devkit, will it be identical to cn-quickstart? Could canton-devkit provide an alternate minimal topology along with the default one, which could allow saving system resources.

Honestly, I'm not sure why I phrased it that way 😂 — I think I was thinking about a more programmable config feature down the road. By default, canton-devkit uses the splice repo topology (2 validator/participant + 1 super validator).

Good idea on a minimal topology though — I'll add that as an option in the proposal 👍

Comment thread proposals/devkit.md Outdated
* `canton-devkit dar diff <package-a> <package-b>` — human-readable diff of templates/choices/fields between two package versions, with SCU-compatibility signals (name/version/LF-version/field deltas).
* `canton-devkit dar remove <package-id>` — unvet / remove where supported by the participant admin API.
* `canton-devkit dar build [--project <path>]` — optional thin shortcut that invokes `dpm` (or `daml build`) and uploads the result; skipped with a clear message if `dpm` is not installed.
* `canton-devkit dar watch <project>` — watch mode: rebuild via `dpm` and re-upload to selected participants on source change for a hot-deploy loop.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is interesting; could this tool take care of package-version/name such that upload just works. Or user will have to restart network from scratch to avoid package upgrade issues

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is interesting; could this tool take care of package-version/name such that upload just works. Or user will have to restart network from scratch to avoid package upgrade issues

Great point. I want devkit to handle as much as possible for devs, but I'm now less sure that auto re-deploy on every save is a good idea... I'm leaning toward watch only rebuilding on version bumps/name changes for re-upload. WDYT?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My suggestion is to remove this unless users want it. In full-auto redeploy mode I would expect some sort of patching of the name with random string to not hit the upgrade issues, and the user's app would simply use the latest uploaded package.

Comment thread proposals/devkit.md Outdated
- (Experimental) Cost projection view estimating how observed transaction patterns translate to traffic costs on Mainnet.
- **Adoption Metrics:** at least 3 companies have started using it in their daily Canton development workflow.

### Milestone 3: Token Faucets & CIP-56 Token Tooling
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this will be really useful, but is it possible to have this as Milestone 2, and move web UI work to Milestone 3?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this will be really useful, but is it possible to have this as Milestone 2, and move web UI work to Milestone 3?

Good point — I'm open to swapping them. Token Faucets & CIP-56/CIP0112 tooling probably delivers more immediate dev value than the web UI. I'll wait a day or two for any other reviewer input, then update the proposal.

Comment thread proposals/devkit.md
- **Focus:** Single-command LocalNet lifecycle management via CLI.
- **Deliverables / Metrics:**
- `canton-devkit localnet up/down/restart/clean/status/logs` CLI commands with auto-generated configs, keys, identities, and printed endpoints and credentials.
- Version pinning (`--version`) and basic named-instance isolation (`--name`) using deterministic Docker Compose project names, labels, and explicit port configuration.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is meant by "Version pinning", will canton-devkit support multiple splice versions. Will it be documented and maintained which versions are supported? or users will have to rely on their luck of whether a particular version will work on their machine.
Is there a plan on how many versions will be supported and what would be the delay between splice release and support of the new version?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is meant by "Version pinning", will canton-devkit support multiple splice versions. Will it be documented and maintained which versions are supported? or users will have to rely on their luck of whether a particular version will work on their machine. Is there a plan on how many versions will be supported and what would be the delay between splice release and support of the new version?

Good question — I actually just added a Compatibility section covering supported splice versions and release lag. Does that answer it, or is there something else you had in mind?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok the Compatibility section answers my question.

Comment thread proposals/devkit.md
##### DAR Management

Today developers upload DARs to each LocalNet participant manually (via `daml ledger upload-dar`, the JSON API, or the Canton Console), and there is no built-in way to inspect, diff, or hot-redeploy packages across a multi-participant LocalNet. DevKit closes that gap without replicating `dpm` / `daml build` — it accepts pre-built DAR files and, when `dpm` is available on `PATH`, offers an optional build+upload shortcut that delegates compilation to `dpm`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that DPM (which is replacing daml) has been built for much better extensibility, but in a first iteration, it just covered the bare operations that had to be carried over from the daml CLI.

In that light, I would ask you to consider instead of rolling out another CLI to integrate your commands directly into DPM. I'd be happy to connect you with the maintainers of DPM in that regard.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure @daravep we will be happy to disuss and have Dpm as the only CLI

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that DPM (which is replacing daml) has been built for much better extensibility, but in a first iteration, it just covered the bare operations that had to be carried over from the daml CLI.

In that light, I would ask you to consider instead of rolling out another CLI to integrate your commands directly into DPM. I'd be happy to connect you with the maintainers of DPM in that regard.

Hi @daravep thanks for the comments. What do you think if we release the tools both as a standalone binary and as a native dpm component? I believe adding it to dpm as a component should be a low effort change technically for most of the proposed features. And we can release it like that already in milestone 1. We will be happy to discuss with dpm team on the details. What is the best channel to reach out?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@daravep updated the proposal and choose dpm as the primary distribution method.

Comment thread proposals/devkit.md

###### Web UI Features
* Drag-and-drop DAR upload with per-participant vetting toggles.
* Package explorer tree: modules → templates → choices → fields (with types), interfaces, dependencies, and hashes.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that we wanted to beef up the package metadata endpoints in order to support this much better on the Ledger API.

Comment thread proposals/devkit.md
* `canton-devkit dar watch <project>` — watch mode: rebuild via `dpm` and re-upload to selected participants on source change for a hot-deploy loop.

###### Web UI Features
* Drag-and-drop DAR upload with per-participant vetting toggles.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A word of caution: modifying the whole package management and vetting logic is on our roadmap to rebalance the trust assumption around party <-> particpant. Do not assume that the current vetting logic is going to remain exactly the same as it is now. It must become better.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A word of caution: modifying the whole package management and vetting logic is on our roadmap to rebalance the trust assumption around party <-> particpant. Do not assume that the current vetting logic is going to remain exactly the same as it is now. It must become better.

Thanks for the heads-up — understood. The proposal is mainly focused on improving the LocalNet developer workflow around the current APIs, not assuming the existing vetting model is the long-term design.

We’ll reach out to the package management / DPM team to better understand the roadmap and make sure the tooling is designed in a way that can evolve together with the upcoming trust model changes.

Comment thread proposals/devkit.md
* `canton-devkit tx show <tx-id|offset>` — render the transaction as a tree of creates and (nested) exercises, with contract IDs and choice arguments.
* `canton-devkit tx replay <tx-id>` — reconstruct the per-party visibility projection ("what this party sees") for debugging privacy and authorization issues.

###### Web UI Features
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this functionality was previously delivered by Navigator. I do think that this is indeed a missing gap.

Comment thread proposals/devkit.md
* **Saved queries / bookmarks** shareable via URL, and an ad-hoc **event subscription panel** that updates in real time.

###### Implementation Notes
* Backend uses Ledger API v2: `StateService.GetActiveContracts`, `UpdateService.GetUpdates`, and `EventQueryService`, with `PackageService` + DAR metadata (from the DAR Management feature) to decode payloads into typed form.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As said, we wanted to improve the package metadata endpoint to support exactly such workflows. The team is happy to collaborate with you on this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

100% Please let us know who to connect with, we will work with them @daravep

@hythloda hythloda moved this from Voting Live to Needs Revision in Dev Fund Incoming May 6, 2026
zheli added 7 commits May 11, 2026 12:19
Avoid overlap with dpm's existing template system; template creation,
curation, and contribution guidelines are out of scope for DevKit.
…n DevKit proposal, including new thresholds for company engagement and cumulative installs. Enhance documentation on adoption measurement methods and metrics used for sustained external usage assessment.
Lead with DPM component as the primary distribution path and standalone binary as additional, addressing reviewer feedback on PR canton-foundation#18. All DevKit commands now nest under a single 'localnet' top-level command (e.g.  'dpm localnet up', 'dpm localnet dar upload'), so DPM only registers one command and avoids naming conflicts with existing or future builtins.  # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.
…estone deliverables. Update Milestone 4 to focus on meaningful external adoption, specifying documentation of at least 5 external apps/projects and a composite evaluation approach for sustained usage. Adjust language for improved readability and precision throughout the document.
Copy link
Copy Markdown
Contributor

@mziolekda mziolekda left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your proposal. I have left a number of comments

Comment thread proposals/devkit.md Outdated

The solution is delivered as a **standalone CLI application** (`canton-devkit`) with web UI. It will be implemented in **Go** and distributed as standalone native binaries for macOS and Linux on arm64 and amd64. End users will not need Go, Node.js, Python, Rust, or a source checkout to run it. DevKit uses Docker containers and runs LocalNet using Splice nodes, but packages the developer experience into a single binary that requires no git clone, no Makefile knowledge, and no manual environment variable setup. It will also include other optional helper services that developers can enable or disable as needed.

Windows native support is out of scope for the initial grant. Windows users may be documented later through WSL2 if there is demand, but it is not part of the committed deliverables.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not need amd64 for macOS. However Windows support is mandatory IMO. Commitment to a Windows implementation should be included in one of the planned grant phases (even if it is a late one). If it were not the case, it would create a gap that may never be closed as contributors come and go.

Comment thread proposals/devkit.md Outdated
Today developers upload DARs to each LocalNet participant manually (via `daml ledger upload-dar`, the JSON API, or the Canton Console), and there is no built-in way to inspect, diff, or hot-redeploy packages across a multi-participant LocalNet. DevKit closes that gap without replicating `dpm` / `daml build` — it accepts pre-built DAR files and, when `dpm` is available on `PATH`, offers an optional build+upload shortcut that delegates compilation to `dpm`.

###### CLI Commands
* `canton-devkit dar upload <path> [--participant <name> | --all-participants] [--vet] [--dry-run]` — upload a DAR to one or all participants of the active (or `--name`-selected) LocalNet, optionally vetting for Smart Contract Upgrade (SCU).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • For seamless integration this should use dpm as the command entry e.g. dpm dar upload
  • it should respect the local daml.yaml and upload the locally produced dar if no explicit dar is given
  • you need to specify which localnet the participant is in, don't you?
  • all-participants could be the default

Comment thread proposals/devkit.md Outdated
###### CLI Commands
* `canton-devkit dar upload <path> [--participant <name> | --all-participants] [--vet] [--dry-run]` — upload a DAR to one or all participants of the active (or `--name`-selected) LocalNet, optionally vetting for Smart Contract Upgrade (SCU).
* `canton-devkit dar list [--participant <name>]` — list uploaded packages with package ID, name, version, Daml-LF version, module count, upload time, and vetting status.
* `canton-devkit dar info <package-id|package-name>` — show modules, templates, interfaces, choices, fields, dependencies, and hash for a package.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unrelated to the rest of the proposal. I would not mix DAR inspection with management on the localnet

Comment thread proposals/devkit.md Outdated
* `canton-devkit dar list [--participant <name>]` — list uploaded packages with package ID, name, version, Daml-LF version, module count, upload time, and vetting status.
* `canton-devkit dar info <package-id|package-name>` — show modules, templates, interfaces, choices, fields, dependencies, and hash for a package.
* `canton-devkit dar download <package-id> [--out <file>]` — fetch a DAR back from a participant.
* `canton-devkit dar diff <package-a> <package-b>` — human-readable diff of templates/choices/fields between two package versions, with SCU-compatibility signals (name/version/LF-version/field deltas).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also unrelated, let's not mix it into this proposal

Comment thread proposals/devkit.md Outdated
* `canton-devkit dar download <package-id> [--out <file>]` — fetch a DAR back from a participant.
* `canton-devkit dar diff <package-a> <package-b>` — human-readable diff of templates/choices/fields between two package versions, with SCU-compatibility signals (name/version/LF-version/field deltas).
* `canton-devkit dar remove <package-id>` — unvet / remove where supported by the participant admin API.
* `canton-devkit dar build [--project <path>]` — optional thin shortcut that invokes `dpm` (or `daml build`) and uploads the result; skipped with a clear message if `dpm` is not installed.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is covered by dpm and is much harder to do right (with multi-project support) than this bullet point suggests. Let's drop

Comment thread proposals/devkit.md

###### Splice Version Compatibility

`--version <version>` selects the Splice LocalNet version to run. DevKit documentation will include a compatibility matrix for supported Splice versions and platforms. The initial release will validate the initially supported version, while maintenance releases will cover smoke testing, compatibility updates, and patch releases for newer Splice releases.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Selection of the localnet version should follow the dpm version selection convention. I.e. respect the version written in the daml.yaml and use the symbolic version names "DevNet", "TestNet", "MainNet"

Comment thread proposals/devkit.md
Today developers upload DARs to each LocalNet participant manually (via `daml ledger upload-dar`, the JSON API, or the Canton Console), and there is no built-in way to inspect, diff, or hot-redeploy packages across a multi-participant LocalNet. DevKit closes that gap without replicating `dpm build` / `daml build` — it accepts pre-built DAR files and, when `dpm` is available, offers a `build-upload` convenience shortcut that delegates compilation to `dpm` and then uploads the resulting DAR to LocalNet participants in a single step.

###### New dpm Commands
* `dpm localnet dar upload <path> [--participant <name> | --all-participants] [--vet] [--dry-run]` (or `canton-devkit localnet dar upload ...` standalone) — upload a DAR to one or all participants of the active (or `--name`-selected) LocalNet, optionally vetting for Smart Contract Upgrade (SCU).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • You could use the dar as the top level command here: entry e.g. dpm dar upload
  • it should respect the local daml.yaml and upload the locally produced dar if no explicit dar is given
  • you need to specify which localnet the participant is in, don't you?
  • all-participants could be the default

Comment thread proposals/devkit.md Outdated

Throughout this document, commands are shown in their DPM form (`dpm localnet ...`). Standalone users invoke the same commands by replacing `dpm` with `canton-devkit` (e.g. `canton-devkit localnet up`). Both forms execute the same code path.

Windows support is not tested under this proposal. Users on Windows may still be able to run DevKit under WSL2 (Linux).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not need amd64 for macOS. However Windows support is mandatory IMO. Commitment to a Windows implementation should be included in one of the planned grant phases (even if it is a late one). If it were not the case, it would create a gap that may never be closed as contributors come and go.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not need amd64 for macOS. However Windows support is mandatory IMO. Commitment to a Windows implementation should be included in one of the planned grant phases (even if it is a late one). If it were not the case, it would create a gap that may never be closed as contributors come and go.

Added to milestone 1.

Comment thread proposals/devkit.md
###### New dpm Commands
* `dpm localnet dar upload <path> [--participant <name> | --all-participants] [--vet] [--dry-run]` (or `canton-devkit localnet dar upload ...` standalone) — upload a DAR to one or all participants of the active (or `--name`-selected) LocalNet, optionally vetting for Smart Contract Upgrade (SCU).
* `dpm localnet dar list [--participant <name>]` — list uploaded packages with package ID, name, version, Daml-LF version, module count, upload time, and vetting status.
* `dpm localnet dar info <package-id|package-name>` — show modules, templates, interfaces, choices, fields, dependencies, and hash for a package.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unrelated to the rest of the proposal. I would not mix DAR inspection with management on the localnet

Comment thread proposals/devkit.md
* `dpm localnet dar list [--participant <name>]` — list uploaded packages with package ID, name, version, Daml-LF version, module count, upload time, and vetting status.
* `dpm localnet dar info <package-id|package-name>` — show modules, templates, interfaces, choices, fields, dependencies, and hash for a package.
* `dpm localnet dar download <package-id> [--out <file>]` — fetch a DAR back from a participant.
* `dpm localnet dar diff <package-a> <package-b>` — human-readable diff of templates/choices/fields between two package versions, with SCU-compatibility signals (name/version/LF-version/field deltas).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also unrelated, I would not mix it into this proposal

zheli added 6 commits May 11, 2026 21:46
…amline documentation and focus on core features. Update related sections for clarity and consistency.
…reamline the table format for existing tools and their relationship with DevKit, ensuring a more concise presentation of information while maintaining essential details.
…ation paths. Update documentation to reflect support for macOS, Linux, and Windows from the start, and improve details on Docker preflight checks and standalone binary release artifacts. Ensure consistency in installation guides across all platforms.
…toolkit

Introduce two new images: 'devkit-mock-overview.png' illustrating the LocalNet dashboard and 'devkit-mock-token-faucet.png' showcasing the token toolkit interface. Update documentation to reference these mockups, enhancing clarity on proposed UI features and functionalities.
…pdate documentation to streamline command descriptions for contract tracking, ensuring consistency in naming conventions and improving overall readability.
@zheli zheli changed the title Proposal: Canton devkit - a dpm component for LocalNet management Proposal: Canton devkit - a dpm component for local development unified toolkit (LocalNet management + app dev helpers) May 12, 2026
@github-actions
Copy link
Copy Markdown

Champion identified: List OR need

The committee will verify this champion during review.

@zheli zheli changed the title Proposal: Canton devkit - a dpm component for local development unified toolkit (LocalNet management + app dev helpers) Proposal: Canton devkit (dpm component) - a unified toolkit for Canton app development (LocalNet, dar helpers, etc) May 12, 2026
@github-actions
Copy link
Copy Markdown

Champion identified: List OR need

The committee will verify this champion during review.

3 similar comments
@github-actions
Copy link
Copy Markdown

Champion identified: List OR need

The committee will verify this champion during review.

@github-actions
Copy link
Copy Markdown

Champion identified: List OR need

The committee will verify this champion during review.

@github-actions
Copy link
Copy Markdown

Champion identified: List OR need

The committee will verify this champion during review.

@mgaare
Copy link
Copy Markdown
Contributor

mgaare commented May 12, 2026

HI @zheli ! Michael from Denex here.

There are some compelling ideas here.

  1. How does this differentiate from Denex PR Proposal: Denex Developer SDK #238, which also addresses a LocalNet CLI? Is the intent to eventually consolidate, or are these solving different layers of the problem?

Thanks for raising this. Our view is that the two efforts are related but operate at different layers. Denex appears to address a broader developer workflow (including TypeScript SDK and ADZ/Zod-based codegen), while our DevKit proposal is intentionally narrower: we focus on LocalNet infrastructure lifecycle pain points and making that layer reliable and easy to operate.

To avoid duplication, we will proactively coordinate with the Denex team on the LocalNet surface area. The goal is to ensure the ecosystem does not end up funding two overlapping lifecycle CLIs, and to converge where practical (or clearly separate responsibilities where not).

At the request of the committee, we split the localnet part of that referenced proposal into a separate proposal: Proposal: Denex Localnet #318

I think some collaboration could be valuable here. One of the major pain points that we see and are addressing with our system is the difficulty in managing configuration using the current splice-localnet layer. Specifying participants, users, parties, network bindings, and authentication layer considerations on splice-localnet is really challenging for app developers today. That's something we wanted to surface and give direct access to in a single surface for managing Canton localnets, with a view towards both app development integration and test/CI enablement.

Maybe there's a case here for using our denex-localnet rather than the splice localnet components as the implementation layer for your tools, which seem like they're targeting more of an orchestration layer. Not sure if that makes sense.

I do think it's a miss to say that topology, user and node-level configuration is out of scope for tools like this. That leaves a set of problems for developers to still solve.

…phrasing regarding the `build-upload` shortcut. This update enhances readability while maintaining the focus on the functionality of uploading DARs to LocalNet participants.
@hythloda hythloda merged commit 1871e48 into canton-foundation:main May 13, 2026
@hythloda hythloda moved this from Voting Live to Approved in Dev Fund Incoming May 13, 2026
@zheli
Copy link
Copy Markdown
Contributor Author

zheli commented May 18, 2026

HI @zheli ! Michael from Denex here.

There are some compelling ideas here.

  1. How does this differentiate from Denex PR Proposal: Denex Developer SDK #238, which also addresses a LocalNet CLI? Is the intent to eventually consolidate, or are these solving different layers of the problem?

Thanks for raising this. Our view is that the two efforts are related but operate at different layers. Denex appears to address a broader developer workflow (including TypeScript SDK and ADZ/Zod-based codegen), while our DevKit proposal is intentionally narrower: we focus on LocalNet infrastructure lifecycle pain points and making that layer reliable and easy to operate.
To avoid duplication, we will proactively coordinate with the Denex team on the LocalNet surface area. The goal is to ensure the ecosystem does not end up funding two overlapping lifecycle CLIs, and to converge where practical (or clearly separate responsibilities where not).

At the request of the committee, we split the localnet part of that referenced proposal into a separate proposal: Proposal: Denex Localnet #318

I think some collaboration could be valuable here. One of the major pain points that we see and are addressing with our system is the difficulty in managing configuration using the current splice-localnet layer. Specifying participants, users, parties, network bindings, and authentication layer considerations on splice-localnet is really challenging for app developers today. That's something we wanted to surface and give direct access to in a single surface for managing Canton localnets, with a view towards both app development integration and test/CI enablement.

Maybe there's a case here for using our denex-localnet rather than the splice localnet components as the implementation layer for your tools, which seem like they're targeting more of an orchestration layer. Not sure if that makes sense.

I do think it's a miss to say that topology, user and node-level configuration is out of scope for tools like this. That leaves a set of problems for developers to still solve.

Thanks, Michael — appreciate the input. The proposal is already finalized/approved, so it’s hard to make substantial amendments right now without impacting scope/timeline. Let’s revisit the config/topology pieces after we deliver our first milestone and reassess alignment then.

We’re also open to coordinating with your team (and others) to avoid duplication and explore convergence—let’s revisit after milestone 1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Approved

Development

Successfully merging this pull request may close these issues.