@jimhoyd/urlcode 0.4.0-alpha.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.claude/skills/urlcode-authoring/SKILL.md +17 -19
  2. package/.claude/skills/urlcode-operations/SKILL.md +9 -9
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CONTRIBUTING.md +20 -16
  5. package/README.md +59 -64
  6. package/ROADMAP.md +66 -376
  7. package/dist/BUILD-MANIFEST.json +26 -25
  8. package/dist/agents-guide.js +6 -6
  9. package/dist/authoring.js +15 -1
  10. package/dist/build-static.js +2 -0
  11. package/dist/capability-query.js +0 -1
  12. package/dist/catalog.js +0 -1
  13. package/dist/cli.js +25 -9
  14. package/dist/config.js +1 -1
  15. package/dist/explain-cli.js +4 -2
  16. package/dist/explain.js +8 -2
  17. package/dist/extensions.js +1 -1
  18. package/dist/http-response.js +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/init-with.js +36 -11
  21. package/dist/manifest.js +8 -2
  22. package/dist/mcp-authoring.js +4 -4
  23. package/dist/mcp.js +1 -1
  24. package/dist/policies/cache.js +2 -2
  25. package/dist/policies.js +3 -1
  26. package/dist/prerender.js +4 -0
  27. package/dist/project-dependencies.js +305 -0
  28. package/dist/readiness.js +3 -0
  29. package/dist/route-diff.js +12 -5
  30. package/dist/runtime.js +1 -1
  31. package/dist/trusted-functions.js +4 -5
  32. package/dist/types/authoring.d.ts +9 -1
  33. package/dist/types/capability-query.d.ts +0 -1
  34. package/dist/types/catalog.d.ts +0 -4
  35. package/dist/types/config.d.ts +1 -9
  36. package/dist/types/explain.d.ts +6 -1
  37. package/dist/types/extensions.d.ts +1 -1
  38. package/dist/types/http-response.d.ts +0 -1
  39. package/dist/types/index.d.ts +1 -0
  40. package/dist/types/init-with.d.ts +7 -13
  41. package/dist/types/manifest.d.ts +5 -2
  42. package/dist/types/project-dependencies.d.ts +78 -0
  43. package/dist/types/readiness.d.ts +2 -0
  44. package/dist/types/trusted-functions.d.ts +1 -4
  45. package/dist/types/types.d.ts +8 -1
  46. package/dist/types.js +8 -1
  47. package/dist/typescript-authoring.js +18 -7
  48. package/docs/AI-AUTHORING.md +15 -7
  49. package/docs/ASSETS.md +2 -1
  50. package/docs/AUTH-BACKUP.md +32 -0
  51. package/docs/AWS.md +9 -0
  52. package/docs/BEST-PRACTICES.md +17 -9
  53. package/docs/CAPABILITIES.md +1 -1
  54. package/docs/CI-FOLLOWUP-2026-09-19.md +97 -0
  55. package/docs/CI-RELEASE-AUDIT-2026-09-19.md +322 -0
  56. package/docs/CI.md +8 -3
  57. package/docs/CODEBASE-AUDIT-2026-09-20.md +284 -0
  58. package/docs/COMPOSING-A-SITE.md +278 -0
  59. package/docs/DEVELOPMENT-PIPELINE.md +270 -0
  60. package/docs/EXTENSIONS.md +51 -11
  61. package/docs/FRAMEWORK.md +67 -48
  62. package/docs/FUNCTION-SECURITY.md +44 -0
  63. package/docs/INSTALL.md +13 -8
  64. package/docs/LOCAL-DEVELOPMENT.md +3 -0
  65. package/docs/MIDDLEWARE.md +10 -4
  66. package/docs/OPEN-DECISIONS.md +224 -212
  67. package/docs/OPERATIONAL-PROOF.md +3 -3
  68. package/docs/OPERATIONS.md +3 -3
  69. package/docs/POLICIES.md +13 -5
  70. package/docs/PRERENDER.md +23 -11
  71. package/docs/PROJECT-DIRECTION.md +3 -3
  72. package/docs/READINESS.md +10 -5
  73. package/docs/README.md +20 -44
  74. package/docs/RELEASE-0.4.0-alpha.3.md +50 -0
  75. package/docs/RELEASE-0.4.1.md +73 -0
  76. package/docs/RELEASE-READINESS.md +6 -6
  77. package/docs/RELEASE-SECURITY.md +96 -181
  78. package/docs/RESILIENCE.md +3 -3
  79. package/docs/ROUTING.md +3 -4
  80. package/docs/SECURITY-AUDIT.md +2 -2
  81. package/docs/SPECIFICATION.md +12 -6
  82. package/docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md +6 -5
  83. package/docs/SPIKE-BUSINESS-SUITE.md +14 -6
  84. package/docs/SPIKE-CORE-LAYERING.md +49 -18
  85. package/docs/SPIKE-DEFAULT-TRUST-MODEL.md +7 -5
  86. package/docs/STARTERS.md +17 -5
  87. package/docs/STATIC.md +14 -3
  88. package/docs/TOOLING.md +10 -7
  89. package/docs/TYPESCRIPT-AUTHORING.md +6 -1
  90. package/docs/VERCEL.md +10 -2
  91. package/docs/VERSION-ALIGNMENT.md +76 -201
  92. package/docs/archive/2026-09-19/EXTENSION-IMPLEMENTATION.md +68 -0
  93. package/docs/archive/2026-09-19/MANAGEMENT-SECURITY.md +102 -0
  94. package/docs/{NEXT-PHASE-PLAN.md → archive/2026-09-19/NEXT-PHASE-PLAN.md} +15 -5
  95. package/docs/{NEXT-STEPS.md → archive/2026-09-19/NEXT-STEPS.md} +15 -3
  96. package/docs/archive/2026-09-19/OPEN-DECISIONS.md +277 -0
  97. package/docs/archive/2026-09-19/RELEASE-SECURITY.md +186 -0
  98. package/docs/archive/2026-09-19/ROADMAP.md +387 -0
  99. package/docs/{SPIKE-EXTENSION-MODEL.md → archive/2026-09-19/SPIKE-EXTENSION-MODEL.md} +11 -0
  100. package/docs/{SPIKE-EXTENSIONS.md → archive/2026-09-19/SPIKE-EXTENSIONS.md} +25 -14
  101. package/docs/archive/2026-09-19/SPIKE-LAMBDA-COMPILE.md +365 -0
  102. package/docs/archive/2026-09-19/SPIKE-MONOREPO.md +778 -0
  103. package/docs/{USABILITY-REVIEW.md → archive/2026-09-19/USABILITY-REVIEW.md} +12 -2
  104. package/docs/archive/README.md +28 -0
  105. package/docs/policies/agents.md +1 -1
  106. package/docs/policies/compression.md +3 -2
  107. package/docs/policies/security.md +3 -2
  108. package/docs/yaml/functions.md +10 -2
  109. package/docs/yaml/middleware.md +5 -3
  110. package/examples/assets/example.yaml +1 -1
  111. package/examples/cookbook/middleware/envelope.mjs +4 -2
  112. package/examples/cookbook/route-index.json +1 -1
  113. package/examples/cookbook/routes/middleware.yaml +1 -1
  114. package/examples/prerender/README.md +14 -6
  115. package/examples/prerender/functions/page.mjs +4 -2
  116. package/examples/prerender/middleware/template.mjs +1 -1
  117. package/examples/prerender/prerender.mjs +1 -1
  118. package/examples/prerender/urlcode.yaml +8 -4
  119. package/llms-full.txt +503 -88
  120. package/llms.txt +6 -4
  121. package/package.json +27 -4
  122. package/packaging/claude-plugin/.claude-plugin/plugin.json +2 -2
  123. package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +17 -19
  124. package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +9 -9
  125. package/recipes/authenticated-json-api/README.md +4 -3
  126. package/recipes/authenticated-json-api/functions/profile.mjs +2 -1
  127. package/recipes/authenticated-json-api/recipe.yaml +1 -1
  128. package/recipes/contact-form/functions/contact.mjs +2 -1
  129. package/recipes/contact-form/recipe.yaml +2 -2
  130. package/recipes/cors-api/README.md +2 -2
  131. package/recipes/cors-api/recipe.yaml +1 -1
  132. package/recipes/health-page/README.md +1 -1
  133. package/recipes/json-api/README.md +1 -1
  134. package/recipes/json-api/recipe.yaml +3 -3
  135. package/recipes/middleware/README.md +8 -4
  136. package/recipes/middleware/middleware/envelope.mjs +4 -2
  137. package/recipes/protected-download/README.md +1 -1
  138. package/recipes/protected-download/recipe.yaml +1 -1
  139. package/recipes/static-plus-api/README.md +2 -2
  140. package/recipes/static-plus-api/public/index.html +1 -1
  141. package/recipes/static-plus-api/recipe.yaml +1 -1
  142. package/recipes/static-plus-api/urlcode.yaml +1 -1
  143. package/recipes/typescript/recipe.yaml +4 -4
  144. package/skills/urlcode/SKILL.md +6 -6
  145. package/starters/default/AGENTS.md +6 -6
  146. package/docs/SPIKE-LAMBDA-COMPILE.md +0 -201
  147. package/docs/SPIKE-MONOREPO.md +0 -322
@@ -26,17 +26,12 @@ Documentation, schema and runtime must come from the **same revision**. Read fro
26
26
  the project's installed runtime (`node_modules/@jimhoyd/urlcode/`) or the
27
27
  checkout you are working in — never from memory of another version.
28
28
 
29
- 1. `docs/AI-AUTHORING.md` the authoring contract and the **capability matrix**
30
- of what is available versus unavailable. Read this first and in full.
31
- 2. `schemas/urlcode.schema.json` the exact accepted structure.
32
- 3. `docs/YAML-REFERENCE.md` and `docs/SPECIFICATION.md` every field, and the
33
- implemented semantics, defaults and sandbox API.
34
- 4. `docs/YAML-GUIDE.md` and `examples/cookbook/` recipes and runnable files.
35
- 5. `docs/ROUTING.md`, `docs/HTTP.md`, `docs/MIDDLEWARE.md`, `docs/ASSETS.md` —
36
- matching precedence, methods, composition, MIME and ranges.
37
- 6. `docs/FUNCTION-SECURITY.md` — the sandbox and operator binding policy.
38
-
39
- `llms.txt` at the repository root is a compact index of all of the above.
29
+ Start with `urlcode context --project <dir> --budget 4000`, then retrieve the
30
+ capability, schema fragment, recipe or example relevant to the change. Use the
31
+ read-only MCP equivalents when available. `llms.txt` is the index; read the
32
+ matching task guide from `docs/` when a query needs more explanation.
33
+ `docs/SPECIFICATION.md` and `schemas/urlcode.schema.json` resolve contract
34
+ questions. Archived plans are historical, not valid YAML guidance.
40
35
 
41
36
  ## Workflow
42
37
 
@@ -52,8 +47,8 @@ checkout you are working in — never from memory of another version.
52
47
  - Bind typed inputs through `args` or context. There is no `${...}`
53
48
  interpolation anywhere in the format.
54
49
  - Create every referenced module, page and asset **before** validating. All
55
- paths resolve from the project root; functions and middleware use relative
56
- ES-module imports only.
50
+ source paths resolve from the project root. Trusted modules can import Node built-ins and npm packages;
51
+ only `sandbox: true` modules are restricted to the relative snapshotted graph.
57
52
  - Write exact response fixtures for success and failure, covering every active
58
53
  method, middleware behavior, HEAD, and any range or cache semantics.
59
54
  - Follow `docs/BEST-PRACTICES.md` for layout and readability as the project grows.
@@ -69,14 +64,17 @@ mistakes that recur:
69
64
  - `function`/`middleware` routes run trusted and unsandboxed by default: full
70
65
  Node, npm, filesystem and `fetch` access, in-process, like any other project
71
66
  code. `sandbox: true` opts a route into isolation — reach for it when that
72
- route's own code warrants it (untrusted input, an unreviewed contribution, a
73
- particularly sensitive secret), not reflexively on every route. A
67
+ route's own code warrants it (unreviewed or third-party code, a secret whose
68
+ blast radius matters, complex logic), not reflexively on every route and
69
+ never merely because it handles request data -- that is untrusted in both
70
+ modes and must be validated either way. A
74
71
  `sandbox: true` route gets a text/JSON `Request`/`Response` sandbox only:
75
72
  **no** `fetch`, Node or npm APIs, filesystem, WebSocket, streaming or crypto
76
73
  API.
77
74
  - No global middleware, Express compatibility or automatic auth.
78
75
  - `policies` accepts only `throttle`, `agents`, `security`, `compression` and
79
- `cache`, every key off unless declared; `hardened` is the only built-in
76
+ `cache`, plus registered extension requirements under `extensions`;
77
+ the built-in policies are off unless declared; `hardened` is the only built-in
80
78
  profile. Check the per-target table in `docs/POLICIES.md` before declaring
81
79
  one for a serverless or Cloudflare deployment — an unsupported policy refuses
82
80
  activation rather than degrading.
@@ -84,9 +82,9 @@ mistakes that recur:
84
82
  only and off unless declared; a declared route at the same path wins. Its
85
83
  generated routes count toward `--expect-routes`, and `site.sitemap` needs
86
84
  `--origin` on every command that activates the project.
87
- - There is no native `link` handler or `dynamicLinks` project flag. Stored
88
- short links are moving to a future `urlcode-dynamic-link` extension package,
89
- not yet published; report that as a gap, never invent a `link` field.
85
+ - There is no native `link` handler or `dynamicLinks` project flag, and no
86
+ supported extension package provides one; report stored short links as a gap,
87
+ never invent a `link` field.
90
88
  - Infrastructure (proxy ranges, storage URLs, vendor rule identifiers) is an
91
89
  operator flag, never route YAML.
92
90
 
@@ -74,20 +74,20 @@ by the operator.
74
74
 
75
75
  ## Hard limits — report these as gaps, never invent around them
76
76
 
77
- - No provider adapters, automatic TLS/DNS, distributed rate limiting, metrics
78
- exporters or durable event delivery are included; these remain the
79
- operator's own infrastructure.
77
+ - Provider adapters exist with different capability limits; query
78
+ `urlcode capabilities --target NAME`. Automatic TLS/DNS, distributed rate
79
+ limiting, metrics exporters and durable delivery require operator infrastructure.
80
80
  - No orchestration, traffic switching or automated rollback; recovery is an
81
81
  explicit snapshot reload from a known-good artifact.
82
82
  - `verify-deployment` has no infrastructure access, uses no credential,
83
83
  follows no redirect and offers no `--insecure`. It cannot check anything a
84
84
  read-only HTTP probe cannot observe.
85
- - Core has no durable store and no private management API of its own; stored
86
- short links are moving to a future `urlcode-dynamic-link` extension
87
- package, not yet published.
88
- - Sandbox concurrency, worker slots and execution deadlines are shared across
89
- every programmable route in a snapshot; there is no per-route fairness or
90
- reserved capacity, and awaiting a guest timer still occupies a slot.
85
+ - Core has no durable store and no private management API of its own, and no
86
+ supported extension package provides stored short links.
87
+ - Only `sandbox: true` routes share the sandbox worker slots and forced
88
+ execution deadlines. Trusted routes run in Node under HTTP admission limits;
89
+ their cooperative timeout cannot stop blocking JavaScript. A guest timer still
90
+ occupies a sandbox slot. Size both modes from `docs/CAPACITY.md`.
91
91
  - `throttle` and `agents` policy counters are per instance, not distributed;
92
92
  they are a second layer behind the edge, never a replacement for it.
93
93
 
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Claude plugins published from the URLCode repository.",
9
- "version": "0.4.0-alpha.2"
9
+ "version": "0.4.1"
10
10
  },
11
11
  "plugins": [
12
12
  {
package/CONTRIBUTING.md CHANGED
@@ -37,9 +37,11 @@ update docs when support changes. Do not claim a provider or OS is supported
37
37
  without a passing test run. Preserve portable behavior and useful self-hosting.
38
38
 
39
39
  Use synthetic data. Never commit secrets, customer URL collections or local
40
- environment files. Treat all application function code as untrusted. Never import it into Node or
41
- add an unsafe fallback. Capability grants must come from operator policy outside
42
- the project. Extend adversarial tests with every new guest/host bridge. See the
40
+ environment files. Project function and middleware code runs trusted in Node by default. Preserve
41
+ explicit `sandbox: true` isolation: never add a host-execution fallback for that
42
+ mode. Binding grants come from operator policy outside the project and govern
43
+ what URLCode injects, not ambient access by trusted code. Extend adversarial
44
+ tests with every new sandbox guest/host bridge. See the
43
45
  [security model](docs/FUNCTION-SECURITY.md).
44
46
 
45
47
  ## Maintaining the starter
@@ -68,19 +70,19 @@ explicit in `docs/AI-AUTHORING.md`; never present future roadmap fields as valid
68
70
 
69
71
  ## Documentation
70
72
 
71
- Public documentation lives in
72
- [urlcode-docs](https://github.com/jimhoyd-com/urlcode-docs) and is authored
73
- there. It is not generated from this repository and must not be mirrored into
74
- it. Write new guides, references and recipes as a pull request against
75
- urlcode-docs.
76
-
77
- `docs/` here is contributor and maintainer material: local development, CI,
78
- the release process, internal reviews, spikes, plans and the generated
79
- `YAML-REFERENCE.md`. Reader-facing pages still under `docs/` are being
80
- migrated to urlcode-docs; edit them in place and do not add new ones.
73
+ Documentation lives in `docs/` in this repository. Write new guides,
74
+ references and recipes here, alongside the contributor and maintainer material
75
+ already there: local development, CI, the release process, internal reviews,
76
+ spikes, plans and the generated `YAML-REFERENCE.md`.
81
77
 
82
78
  A behavior change that a reader depends on is not finished until the matching
83
- urlcode-docs pull request exists. Link the two so review can see both halves.
79
+ page in `docs/` is updated. Put both in the **same** pull request so review can
80
+ see both halves and neither can land alone.
81
+
82
+ `urlcode-docs` was deleted on 2026-09-19. It held its own copy of most of these
83
+ pages and had drifted from them; the content that was ahead has been brought
84
+ across, and the repository was retired rather than reconciled page by page.
85
+ Links to it no longer resolve.
84
86
 
85
87
  If you find a gap you cannot close, file it as an issue on the repository that
86
88
  owns the code rather than leaving it undocumented. Feature requests are wanted:
@@ -93,8 +95,10 @@ Work on a branch and open a focused pull request. Explain the problem, resulting
93
95
  behavior, validation and compatibility/security implications. Never include real
94
96
  credentials or customer data. Use the PR template and keep unrelated changes out.
95
97
 
96
- `main` requires a pull request, an up-to-date branch, the required Node/OS verification
97
- jobs, container verification, CodeQL results and resolved conversations. High/critical
98
+ `main` requires a pull request, the `verify-complete` and `container` checks,
99
+ CodeQL results and resolved conversations. The current ruleset does not require
100
+ an up-to-date branch. The [development pipeline](docs/DEVELOPMENT-PIPELINE.md)
101
+ describes the fast prose lane, full code lane and exact-commit release gate. High/critical
98
102
  security findings and error-level CodeQL alerts block merging. Force pushes and branch
99
103
  deletion are blocked; squash merging keeps a linear history. Administrators have
100
104
  no configured ruleset bypass. Automation cannot approve pull requests.
package/README.md CHANGED
@@ -20,7 +20,7 @@ and agents can read: the agent describes what, the runtime owns how, and
20
20
  generated code goes to the part that is actually the application. It is
21
21
  infrastructure for AI-built software, not a framework for building AI models.
22
22
  [Why](docs/PROJECT-DIRECTION.md#why-your-ai-should-build-your-application-not-your-framework) ·
23
- [next steps](docs/NEXT-STEPS.md).
23
+ [roadmap](ROADMAP.md).
24
24
 
25
25
  ## What it is
26
26
 
@@ -32,8 +32,10 @@ compiles it once, and refuses anything a target cannot enforce with the route
32
32
  named. Functions and middleware run trusted, in-process, with full Node
33
33
  access by default; a route opts into an isolated QuickJS/WebAssembly sandbox
34
34
  with a fresh heap per call and no Node, filesystem or network by declaring
35
- `sandbox: true`. Either way, secrets reach them only through operator grants
36
- pinned to the project revision.
35
+ `sandbox: true`. Either way, the `env`/`secrets` the runtime *hands* a route
36
+ come only from operator grants pinned to the project revision; grants govern
37
+ that injected context, not the ambient Node environment a trusted, in-process
38
+ module can reach on its own like any other code in the host.
37
39
 
38
40
  URLCode is not a URL shortener: stored short links are an operator-installed
39
41
  extension, not core's job. It is not a
@@ -53,20 +55,34 @@ an AI agent must follow are in [the framework](docs/FRAMEWORK.md).
53
55
 
54
56
  | Package | Adds | Status |
55
57
  |---|---|---|
56
- | [urlcode](https://github.com/jimhoyd-com/urlcode) (this repository) | Runtime, CLI, policies, provider adapters, extension contract | `0.4.0-alpha.2` (alpha) on top of the `0.3.0` release, Apache-2.0 |
57
- | [urlcode-ui](https://github.com/jimhoyd-com/urlcode-ui) | Shared presentation: escaped templates, shadcn/ui partials, themes, translations | `0.1.0-alpha.5` on npm, alpha: review pending |
58
- | [urlcode-auth](https://github.com/jimhoyd-com/urlcode-auth) | Accounts: password, passkeys, OIDC, email codes, TOTP, sessions, roles, account page | `0.1.0-alpha.3` on npm, alpha: review pending |
59
- | [urlcode-admin](https://github.com/jimhoyd-com/urlcode-admin) | Administration: users, sessions, roles, audit, approvals, cases, impersonation | `0.1.0-alpha.3` on npm, alpha: review pending |
60
- | [urlcode-dynamic-link](https://github.com/jimhoyd-com/urlcode-dynamic-link) | Stored short links: the mount-based successor to core's removed `link` handler | `0.1.0-alpha.2` on npm, alpha: review pending |
61
- | [urlcode-middleware](https://github.com/jimhoyd-com/urlcode-middleware) | Per-route middleware through the extension seam, alongside core's native array | `0.1.0-alpha.2` on npm, alpha: review pending |
62
- | [urlcode-short](https://github.com/jimhoyd-com/urlcode-short) | A complete link shortener assembled from the packages above | `0.1.0-alpha.2` on npm, alpha: review pending |
63
-
64
- Every version in this table is the one published to npm under the `alpha`
65
- dist-tag, and they are released together in the order core → ui → auth →
66
- admin dynamic-link/middleware short. The authoritative cross-repository
67
- register, including each package's declared peer ranges and the rules that
68
- keep them consistent, is
69
- [docs/VERSION-ALIGNMENT.md](docs/VERSION-ALIGNMENT.md).
58
+ | [urlcode](https://github.com/jimhoyd-com/urlcode) (this repository) | Runtime, CLI, policies, provider adapters, extension contract | `0.4.1` stable release target, Apache-2.0 |
59
+ | [urlcode-ui](packages/ui) (in this repository) | Shared presentation: escaped templates, shadcn/ui partials, themes, translations | `0.4.1` stable release target; review pending |
60
+ | [urlcode-auth](packages/auth) (in this repository) | Accounts: password, passkeys, OIDC, email codes, TOTP, sessions, roles, account page | `0.4.1` stable release target; review pending |
61
+ | [urlcode-admin](packages/admin) (in this repository) | Administration: users, sessions, roles, audit, approvals, cases, impersonation | `0.4.1` stable release target; review pending |
62
+
63
+ This release aligns all four packages at `0.4.1`, with publication to npm's
64
+ `latest` channel in the order core ui auth admin. The table describes
65
+ the release target; confirm publication with `npm run release:status` before
66
+ installing it. Matching numbers do not establish a permanent fixed-version
67
+ policy. Peer ranges, channel rules and generated application pins are documented
68
+ in [package and channel alignment](docs/VERSION-ALIGNMENT.md).
69
+
70
+ `urlcode-dynamic-link` and `urlcode-short` were published once as
71
+ `0.1.0-alpha.1` and have since been retired: both were unpublished from npm and
72
+ their repositories deleted, and neither has a successor. Nothing supported
73
+ provides stored short links today — a project that needs them owns that storage
74
+ itself. Anything still pinned to `@jimhoyd/urlcode-dynamic-link@0.1.0-alpha.1`
75
+ also has to deal with its exact declared peer `@jimhoyd/urlcode: 0.4.0-alpha.1`,
76
+ which cannot be installed beside core `0.4.0-alpha.2` and never will be.
77
+
78
+ `urlcode-middleware` was retired the same way on 2026-09-19 —
79
+ `@jimhoyd/urlcode-middleware` was unpublished from npm at `0.1.0-alpha.2` and
80
+ its repository deleted. Unlike the two above, its capability did not go away
81
+ with it: **per-route middleware is native to core**, through the
82
+ `middleware:` array documented in [docs/MIDDLEWARE.md](docs/MIDDLEWARE.md).
83
+ The deleted package only ever offered the same behavior through the extension
84
+ seam. A project using it moves its entries to the native array; there is no
85
+ gap to report here.
70
86
 
71
87
  ```yaml
72
88
  version: "1"
@@ -90,8 +106,9 @@ it. Cross-repository acceptance is tracked in
90
106
 
91
107
  ## Status
92
108
 
93
- `0.4.0-alpha.2` is the current release of the extension contract and the
94
- agent tooling, on top of the `0.3.0` self-hosted release. `0.4.0-alpha.1`
109
+ The `0.4.1` release line brings core, UI, auth and admin to matching stable
110
+ versions. A stable version selects the npm `latest` channel; it does not close
111
+ the review and deployment evidence gaps below. `0.4.0-alpha.1`
95
112
  added the extension contract, capabilities and provider conformance, strict
96
113
  redirect interchange, bulk import, recipes and search, TypeScript guest
97
114
  authoring, conditions, bounded proxy and signals, and the MCP read and
@@ -106,10 +123,9 @@ The [roadmap](ROADMAP.md) separates implemented from planned, and
106
123
  what is not: provider deployments, soak and independent security review
107
124
  remain open.
108
125
 
109
- Stored short links have moved out of core into
110
- [urlcode-dynamic-link](https://github.com/jimhoyd-com/urlcode-dynamic-link)
111
- (mount-based, like `auth`/`admin`, published on npm); core no longer has a
112
- native `link` handler.
126
+ Core has no native `link` handler. Stored short links moved out to a
127
+ mount-based `urlcode-dynamic-link` extension, which has since been retired and
128
+ unpublished; no supported package provides them.
113
129
 
114
130
  URLCode is free and open-source software licensed under the
115
131
  [Apache License 2.0](LICENSE). Commercial use, modification, redistribution and
@@ -128,6 +144,14 @@ project grows. Operators should read [capacity/concurrency](docs/CAPACITY.md) an
128
144
  [DDoS and recovery playbook](docs/RESILIENCE.md). Embedding the runtime from
129
145
  TypeScript is covered in [TypeScript](docs/TYPESCRIPT.md). [All documentation](docs/README.md).
130
146
 
147
+ All of it lives in [`docs/`](docs/README.md) in this repository — guides,
148
+ references and recipes alongside the contributor and maintainer material: local
149
+ development, CI, the release process, reviews and the generated field
150
+ reference. New pages belong here, in the same pull request as the change they
151
+ describe. `urlcode-docs`, a private repository that served a documentation site
152
+ from its own copy of these pages, is being retired; the content that was ahead
153
+ of this repository has been brought across.
154
+
131
155
  ## Start your own project
132
156
 
133
157
  Use [urlcode-template](https://github.com/jimhoyd-com/urlcode-template) for a small
@@ -142,28 +166,6 @@ npm ci
142
166
  npm run dev
143
167
  ```
144
168
 
145
- ## Built with URLCode
146
-
147
- [urlcode-short](https://github.com/jimhoyd-com/urlcode-short) is a
148
- standalone, account-free demo built on URLCode's public runtime. It predates
149
- this repository's removal of the native link-store API from core; its
150
- retrospective should be read alongside that change, not as current guidance.
151
- It combines short links that expire after one hour or less, QR downloads, and a
152
- shadcn/ui + Tailwind frontend. URLCode handles the page/assets and routing; the
153
- application adds anonymous creation, stored-link storage and its own limits.
154
-
155
- Read its [build retrospective](https://github.com/jimhoyd-com/urlcode-short/blob/main/docs/BUILD-RETROSPECTIVE.md)
156
- for what the runtime supplied, what the application still needed, and proposed
157
- improvements. The demo's license, hosting and production validation remain open;
158
- it does not change URLCode's Apache-2.0 license or guest isolation model.
159
-
160
- `urlcode-docs` demonstrates URLCode hosting a static documentation site with
161
- shadcn/ui and Tailwind: content authored directly in that repository, applying
162
- templates through its own sandbox-opted-in (`sandbox: true`) middleware during
163
- the build, served through native page/static/download routes. That repository
164
- is currently private, so it isn't publicly browsable yet. Hosting and a public
165
- domain are not yet selected; the original site-code license is pending.
166
-
167
169
  ## Start from YAML
168
170
 
169
171
  Already wrote `urlcode.yaml`? Run `urlcode scaffold --project ./my-links --dry-run`,
@@ -176,7 +178,8 @@ SQLite build requirement, unverified from this repository.
176
178
  ## Try it
177
179
 
178
180
  ```sh
179
- npm install --global @jimhoyd/urlcode # or: brew tap jimhoyd-com/urlcode && brew install urlcode
181
+ # After the 0.4.1 release has been published:
182
+ npm install --global @jimhoyd/urlcode@0.4.1
180
183
  urlcode init my-urls && cd my-urls
181
184
  urlcode dev
182
185
  ```
@@ -254,26 +257,18 @@ inspection, validation and conversion previews over stdio, and
254
257
  `--allow-authoring` adds project-confined authoring tools
255
258
  ([tooling](docs/TOOLING.md)).
256
259
 
257
- ## Documentation
258
-
259
- Full documentation is authored in a separate `urlcode-docs` repository, where
260
- new guides, references and recipes belong — but that repository is currently
261
- private, so its content isn't publicly browsable yet. Until it's made public,
262
- the practical reference is this README and [`docs/`](docs/README.md) in this
263
- repository.
264
-
265
- `docs/` in this repository is contributor and maintainer material — local
266
- development, CI, the release process, reviews and the generated field
267
- reference. Reader-facing pages still under `docs/` are being migrated.
268
-
269
260
  ## Built with URLCode
270
261
 
271
- [urlcode-short](https://github.com/jimhoyd-com/urlcode-short), an
272
- account-free short-link demo with a shadcn/ui front end, and `urlcode-docs`, a
273
- static documentation site rendered through its own sandbox-opted-in middleware
274
- at build time (currently a private repository). Both are ordinary consumers of
275
- the public runtime; urlcode-short's retrospective lists what the runtime
276
- supplied and what it still had to build.
262
+ Two applications were built on the public runtime as ordinary consumers, and
263
+ both have since been retired: `urlcode-docs`, a static documentation site
264
+ rendered through its own middleware at build time and served through native
265
+ page/static/download routes, and `urlcode-short`, an account-free short-link
266
+ demo combining expiring links, QR downloads and a shadcn/ui frontend — URLCode
267
+ supplied the pages, assets and routing, the application supplied anonymous
268
+ creation, link storage and its own limits. `urlcode-short`'s repository is
269
+ deleted, so its build retrospective is no longer reachable; what it recorded
270
+ about the gap between the runtime and a real application is carried in
271
+ [principles and open decisions](docs/OPEN-DECISIONS.md) and [roadmap](ROADMAP.md).
277
272
 
278
273
  ## License and contributing
279
274