Homework / Interview Submission · April 2026
Canton owns the rails. This is the layer above — workflow, identity, approval, audit, and integration that an institution actually operates.
01 · Conceptual Overview
Canton is best understood not as a blockchain, but as a privacy-preserving synchronisation protocol for multi-party workflows in regulated markets. Public chains optimise for shared visibility and permissionless composition. Traditional permissioned DLT optimises for control but fragments interoperability. Canton sits in the gap: independent participants run their own nodes, hold only the contracts they are entitled to see, and coordinate state changes through synchronisers that order transactions without seeing their contents.
Three primitives. The rest of the architecture follows from them.
Primitive 01
One per organisation. Holds only that org's view of contracts. Privacy is per-contract, not per-channel.
Primitive 02
Order and finalise multi-party transactions without seeing payload. Trust is contractual, not custodial.
Primitive 03
Stakeholders are declared on the contract itself, so privacy and entitlement are properties of the data model.
The four-layer wiring (apps → participant nodes → synchronisers → ledger) is in slide 03. The property: selective disclosure with global coordination — shared truth without globally readable state.
02 · Building on Canton
The brief asked for a description of what to build, not generic platform copy. The repo at naimkatiman/hydrax-app is the implementation; the live app is the running surface.
The premise: institutions need the workflow, identity, approval, audit, notification, and integration layer above the ledger — what an issuer, distributor, custodian, ops team, and investor each operate. HydraX has the rails (tokenisation, custody, trading, regulatory licences in MY/SG); this is the operational platform above them.
Plane 01 · Experience
Issuer, distributor, investor, ops, admin. White-label tenant theming via CSS variables. React + Vite + RTK. Live →
Plane 02 · Orchestration
6 Go services (workflow, approval, audit, hydrax-adapter, canton-adapter, market-data) and 3 Node services (notify, integrate, BFF). Stable ports 7001–7006 + 7101–7103, each with `/healthz` + tests + Dockerfile.
Plane 03 · Rails
The only path the browser takes to the ledger. The HydraX adapter is mocked behind a stable interface until HydraX shares the API surface.
03 · Technical Deep Dive
Slide 04 is the core tension. Public chains get composability because state is globally readable; that property is what disqualifies them for regulated workflows. Canton's contract-level privacy means a custodian doesn't see a competing custodian's positions on the same domain — and it means you cannot compose blindly. Cross-contract logic requires every relevant party to be a stakeholder on every relevant contract. Feature for compliance, constraint for builders.
The implication: composability moves from the ledger to the orchestration plane. The workflow service has to bring the right parties onto a contract at issuance time so the downstream choices are possible. Get this wrong at modelling time and no UI work fixes it.
A common mistake is treating "the app" as a thin wrapper around Daml choices. 80% of institutional value lives in what surrounds the choice: who approved it, what evidence was attached, which SLA clock is running, what notification fired, what audit row was written.
That's why the orchestration plane has more services than the rails plane (workflow-svc, approval-svc, audit-svc, notify-svc, integration-svc, bff). Single-purpose services with their own state machines and `/healthz` endpoints keep debugging, scaling, and tenant isolation tractable. A monolith would have been faster to ship and harder to operate at multi-tenant scale.
Daml upgrade paths are real, but the operational question is harder than the technical one. When entitlements change — a distributor loses a licence, a regulator's reporting party rotates — what happens to in-flight contracts?
Daml gives you the upgrade primitive (interfaces, package versioning), but you still need (a) a deterministic projection of "what's in flight at cutover", (b) a migration plan per contract template, (c) a fallback for participants who haven't accepted the new package, (d) an audit trail that proves no economic state changed during the swap. Not solved — but the lifecycle decisions are isolated in the rails-plane adapters, where they belong.
04 · Deferrals
What's not built, and the reason for each.
05 · How I Built This Knowledge
Appendix
Each one is the long form of a section above.
Appendix A
Three required sections plus four deep-dives — conceptual overview, building on Canton, technical deep dive, tokenization, composability, infra, data sync.
View deck →Appendix B
What I would say if I narrated the deck — six segments, ~5 minutes, recordable as-is.
Read script →Appendix C
Five role-aware portals — issuer, distributor, investor, ops, admin — running on Railway right now.
Open live app →Appendix D
9 services, 5 portals, PRD, plan docs, this site itself. The whole repo.
View source →