Layer B tracking — Aspire Deno hosting (AddDenoApp / DenoAppResource)
Part of the Deno-on-Aspire dogfood proof (umbrella: #295). This issue tracks Layer B only, the
app-model hosting layer. It needs its own upstream tracking issue — microsoft/aspire#16218 is
Layer-A (CLI toolchain) scope, not hosting.
Feature
Fork rickylabs/aspire branch feat/deno-hosting-adddenoapp adds AddDenoApp / DenoAppResource to
Aspire.Hosting.JavaScript (the same assembly that ships AddBunApp). deno run -A;
WithDenoDefaults sets OTEL_DENO=true + WithOtlpExporter() (native OTel, zero app SDK);
deny-by-default perms; denoland/deno:2 single-stage publish, non-root deno user; VS Code
type:"deno" debug config; dev-cert trust; auto package-manager detection.
Parity verdict vs community toolkit
CommunityToolkit.Aspire.Hosting.Deno (stable 13.4.0, ~62.8K downloads) hosts Deno as an
executable-on-PATH wrapper. Layer B covers 100% of its surface and adds native OTEL_DENO zero-SDK
telemetry, denoland/deno:2 publish, type:"deno" debug, and dev-cert trust — all provably absent
from the community package. Full matrix + verdict: aspire-deno-parity-and-motivation.md.
Open follow-ups (gaps to close before upstreaming)
Proof (dogfooded against NetScript)
Dogfood branch dogfood/aspire-deno-runtime (commit 75e4dea7) swaps NetScript services + plugins
onto AddDenoApp. Live boot: resource source=deno, appArgs=["run","-A","src/main.ts"],
Running/Healthy, GET /health 200; OTEL_DENO denoApp 3-var + fork-injected OTLP endpoint, zero
app-side OpenTelemetry SDK. Targeted harness cb2c3e98 — 12/12 PASS. Full scaffold.runtime E2E
(warm Docker, server 29.6.1, two runs): 11 passed / 1 failed — all 11 swap-relevant steps green
(scaffold init incl. apphost.mts type-check, 4 plugin installs, plugin list, aspire
restore/start/stop); the lone failure is database.init hitting the operation-runner's 900s cap,
which is swap-orthogonal: db init boots the AppHost in db-cli-mode short-circuit whose targets
come only from infrastructure.databases (never the swapped addDenoApp services/plugins), so it
exercises the untouched addExecutable DB path — the known pre-existing Prisma schema-engine
db-init flake (#98/#145), reproduced identically across both runs. Node-free proof: stack runs
entirely on Deno (node-free-proof.md).
Independence
Functionally standalone; merge after Layer A (Layer-A-first order). Does not require Layer A to build.
Guardrails
Evidence-only. Do NOT open the upstream Aspire PR without explicit user go.
Layer B tracking — Aspire Deno hosting (
AddDenoApp/DenoAppResource)Part of the Deno-on-Aspire dogfood proof (umbrella: #295). This issue tracks Layer B only, the
app-model hosting layer. It needs its own upstream tracking issue —
microsoft/aspire#16218isLayer-A (CLI toolchain) scope, not hosting.
Feature
Fork
rickylabs/aspirebranchfeat/deno-hosting-adddenoappaddsAddDenoApp/DenoAppResourcetoAspire.Hosting.JavaScript(the same assembly that shipsAddBunApp).deno run -A;WithDenoDefaultssetsOTEL_DENO=true+WithOtlpExporter()(native OTel, zero app SDK);deny-by-default perms;
denoland/deno:2single-stage publish, non-rootdenouser; VS Codetype:"deno"debug config; dev-cert trust; auto package-manager detection.pr-body-layer-b.md.Parity verdict vs community toolkit
CommunityToolkit.Aspire.Hosting.Deno(stable 13.4.0, ~62.8K downloads) hosts Deno as anexecutable-on-PATH wrapper. Layer B covers 100% of its surface and adds native
OTEL_DENOzero-SDKtelemetry,
denoland/deno:2publish,type:"deno"debug, and dev-cert trust — all provably absentfrom the community package. Full matrix + verdict:
aspire-deno-parity-and-motivation.md.Open follow-ups (gaps to close before upstreaming)
AddDenoTask-shaped ergonomic entry point (community exposes it as a distinct method).WithDeno(install: true)as theWithDenoPackageInstallationequivalent.OTEL_DENOis upstream-unstable — docs must carry the caveat; verify the flag against thepinned
denoland/deno:2tag.AddExecutable-replacement with tests (see Dogfood proof: Aspire Deno runtime (Layers A+B) verified against the full NetScript framework #295 ask S1: package quality — slow-types + docs (supervisor) — Waves 0–6 ✅ merged #2).Proof (dogfooded against NetScript)
Dogfood branch
dogfood/aspire-deno-runtime(commit75e4dea7) swaps NetScript services + pluginsonto
AddDenoApp. Live boot: resourcesource=deno,appArgs=["run","-A","src/main.ts"],Running/Healthy,
GET /health200;OTEL_DENOdenoApp 3-var + fork-injected OTLP endpoint, zeroapp-side OpenTelemetry SDK. Targeted harness
cb2c3e98— 12/12 PASS. Fullscaffold.runtimeE2E(warm Docker, server 29.6.1, two runs): 11 passed / 1 failed — all 11 swap-relevant steps green
(scaffold init incl.
apphost.mtstype-check, 4 plugin installs, plugin list, aspirerestore/start/stop); the lone failure is
database.inithitting the operation-runner's 900s cap,which is swap-orthogonal:
db initboots the AppHost in db-cli-mode short-circuit whose targetscome only from
infrastructure.databases(never the swappedaddDenoAppservices/plugins), so itexercises the untouched
addExecutableDB path — the known pre-existing Prisma schema-enginedb-init flake (#98/#145), reproduced identically across both runs. Node-free proof: stack runs
entirely on Deno (
node-free-proof.md).Independence
Functionally standalone; merge after Layer A (Layer-A-first order). Does not require Layer A to build.
Guardrails
Evidence-only. Do NOT open the upstream Aspire PR without explicit user go.