@jimhoyd/urlcode 0.4.0-alpha.2 → 0.4.0-alpha.3

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 (115) 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 +44 -54
  6. package/ROADMAP.md +61 -376
  7. package/dist/BUILD-MANIFEST.json +15 -15
  8. package/dist/agents-guide.js +6 -6
  9. package/dist/build-static.js +2 -0
  10. package/dist/cli.js +3 -3
  11. package/dist/explain-cli.js +4 -2
  12. package/dist/explain.js +7 -1
  13. package/dist/extensions.js +1 -1
  14. package/dist/manifest.js +7 -1
  15. package/dist/mcp-authoring.js +2 -2
  16. package/dist/mcp.js +1 -1
  17. package/dist/policies.js +3 -1
  18. package/dist/prerender.js +4 -0
  19. package/dist/readiness.js +3 -0
  20. package/dist/route-diff.js +12 -5
  21. package/dist/types/explain.d.ts +6 -0
  22. package/dist/types/extensions.d.ts +1 -1
  23. package/dist/types/manifest.d.ts +5 -1
  24. package/dist/types/readiness.d.ts +2 -0
  25. package/dist/types/types.d.ts +8 -1
  26. package/dist/types.js +8 -1
  27. package/dist/typescript-authoring.js +18 -7
  28. package/docs/AI-AUTHORING.md +10 -6
  29. package/docs/ASSETS.md +2 -1
  30. package/docs/AUTH-BACKUP.md +32 -0
  31. package/docs/BEST-PRACTICES.md +17 -9
  32. package/docs/CAPABILITIES.md +1 -1
  33. package/docs/CI-FOLLOWUP-2026-09-19.md +97 -0
  34. package/docs/CI-RELEASE-AUDIT-2026-09-19.md +322 -0
  35. package/docs/CI.md +8 -3
  36. package/docs/CODEBASE-AUDIT-2026-09-20.md +278 -0
  37. package/docs/DEVELOPMENT-PIPELINE.md +181 -0
  38. package/docs/EXTENSIONS.md +15 -5
  39. package/docs/FRAMEWORK.md +22 -18
  40. package/docs/FUNCTION-SECURITY.md +44 -0
  41. package/docs/LOCAL-DEVELOPMENT.md +3 -0
  42. package/docs/OPEN-DECISIONS.md +184 -212
  43. package/docs/OPERATIONAL-PROOF.md +3 -3
  44. package/docs/OPERATIONS.md +3 -3
  45. package/docs/POLICIES.md +13 -5
  46. package/docs/PRERENDER.md +23 -11
  47. package/docs/PROJECT-DIRECTION.md +3 -3
  48. package/docs/READINESS.md +6 -2
  49. package/docs/README.md +18 -41
  50. package/docs/RELEASE-0.4.0-alpha.3.md +50 -0
  51. package/docs/RELEASE-READINESS.md +6 -6
  52. package/docs/RELEASE-SECURITY.md +68 -168
  53. package/docs/RESILIENCE.md +3 -3
  54. package/docs/ROUTING.md +3 -4
  55. package/docs/SECURITY-AUDIT.md +2 -2
  56. package/docs/SPECIFICATION.md +7 -5
  57. package/docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md +6 -5
  58. package/docs/SPIKE-BUSINESS-SUITE.md +14 -6
  59. package/docs/SPIKE-CORE-LAYERING.md +48 -17
  60. package/docs/SPIKE-DEFAULT-TRUST-MODEL.md +7 -5
  61. package/docs/SPIKE-LAMBDA-COMPILE.md +8 -0
  62. package/docs/STATIC.md +14 -3
  63. package/docs/TOOLING.md +4 -3
  64. package/docs/TYPESCRIPT-AUTHORING.md +6 -1
  65. package/docs/VERSION-ALIGNMENT.md +46 -205
  66. package/docs/archive/2026-09-19/EXTENSION-IMPLEMENTATION.md +68 -0
  67. package/docs/archive/2026-09-19/MANAGEMENT-SECURITY.md +102 -0
  68. package/docs/{NEXT-PHASE-PLAN.md → archive/2026-09-19/NEXT-PHASE-PLAN.md} +15 -5
  69. package/docs/{NEXT-STEPS.md → archive/2026-09-19/NEXT-STEPS.md} +15 -3
  70. package/docs/archive/2026-09-19/OPEN-DECISIONS.md +277 -0
  71. package/docs/archive/2026-09-19/RELEASE-SECURITY.md +186 -0
  72. package/docs/archive/2026-09-19/ROADMAP.md +386 -0
  73. package/docs/{SPIKE-EXTENSION-MODEL.md → archive/2026-09-19/SPIKE-EXTENSION-MODEL.md} +10 -0
  74. package/docs/{SPIKE-EXTENSIONS.md → archive/2026-09-19/SPIKE-EXTENSIONS.md} +25 -14
  75. package/docs/archive/2026-09-19/SPIKE-MONOREPO.md +776 -0
  76. package/docs/{USABILITY-REVIEW.md → archive/2026-09-19/USABILITY-REVIEW.md} +12 -2
  77. package/docs/archive/README.md +27 -0
  78. package/docs/policies/agents.md +1 -1
  79. package/docs/policies/compression.md +3 -2
  80. package/docs/policies/security.md +3 -2
  81. package/examples/assets/example.yaml +1 -1
  82. package/examples/cookbook/route-index.json +1 -1
  83. package/examples/cookbook/routes/middleware.yaml +1 -1
  84. package/examples/prerender/README.md +14 -6
  85. package/examples/prerender/functions/page.mjs +4 -2
  86. package/examples/prerender/middleware/template.mjs +1 -1
  87. package/examples/prerender/prerender.mjs +1 -1
  88. package/examples/prerender/urlcode.yaml +8 -4
  89. package/llms-full.txt +117 -45
  90. package/llms.txt +5 -4
  91. package/package.json +24 -4
  92. package/packaging/claude-plugin/.claude-plugin/plugin.json +2 -2
  93. package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +17 -19
  94. package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +9 -9
  95. package/recipes/authenticated-json-api/README.md +4 -3
  96. package/recipes/authenticated-json-api/functions/profile.mjs +2 -1
  97. package/recipes/authenticated-json-api/recipe.yaml +1 -1
  98. package/recipes/contact-form/functions/contact.mjs +2 -1
  99. package/recipes/contact-form/recipe.yaml +2 -2
  100. package/recipes/cors-api/README.md +2 -2
  101. package/recipes/cors-api/recipe.yaml +1 -1
  102. package/recipes/health-page/README.md +1 -1
  103. package/recipes/json-api/README.md +1 -1
  104. package/recipes/json-api/recipe.yaml +3 -3
  105. package/recipes/middleware/README.md +8 -4
  106. package/recipes/protected-download/README.md +1 -1
  107. package/recipes/protected-download/recipe.yaml +1 -1
  108. package/recipes/static-plus-api/README.md +2 -2
  109. package/recipes/static-plus-api/public/index.html +1 -1
  110. package/recipes/static-plus-api/recipe.yaml +1 -1
  111. package/recipes/static-plus-api/urlcode.yaml +1 -1
  112. package/recipes/typescript/recipe.yaml +4 -4
  113. package/skills/urlcode/SKILL.md +6 -6
  114. package/starters/default/AGENTS.md +6 -6
  115. 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.0-alpha.3"
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
 
@@ -54,20 +54,33 @@ an AI agent must follow are in [the framework](docs/FRAMEWORK.md).
54
54
  | Package | Adds | Status |
55
55
  |---|---|---|
56
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 |
57
+ | [urlcode-ui](packages/ui) (in this repository) | Shared presentation: escaped templates, shadcn/ui partials, themes, translations | `0.1.0-alpha.5` on npm, alpha: review pending |
58
+ | [urlcode-auth](packages/auth) (in this repository) | Accounts: password, passkeys, OIDC, email codes, TOTP, sessions, roles, account page | `0.1.0-alpha.3` on npm, alpha: review pending |
59
+ | [urlcode-admin](packages/admin) (in this repository) | Administration: users, sessions, roles, audit, approvals, cases, impersonation | `0.1.0-alpha.3` on npm, alpha: review pending |
63
60
 
64
61
  Every version in this table is the one published to npm under the `alpha`
65
62
  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
63
+ admin. The authoritative cross-repository register, including each
64
+ package's declared peer ranges and the rules that keep them consistent, is
69
65
  [docs/VERSION-ALIGNMENT.md](docs/VERSION-ALIGNMENT.md).
70
66
 
67
+ `urlcode-dynamic-link` and `urlcode-short` were published once as
68
+ `0.1.0-alpha.1` and have since been retired: both were unpublished from npm and
69
+ their repositories deleted, and neither has a successor. Nothing supported
70
+ provides stored short links today — a project that needs them owns that storage
71
+ itself. Anything still pinned to `@jimhoyd/urlcode-dynamic-link@0.1.0-alpha.1`
72
+ also has to deal with its exact declared peer `@jimhoyd/urlcode: 0.4.0-alpha.1`,
73
+ which cannot be installed beside core `0.4.0-alpha.2` and never will be.
74
+
75
+ `urlcode-middleware` was retired the same way on 2026-09-19 —
76
+ `@jimhoyd/urlcode-middleware` was unpublished from npm at `0.1.0-alpha.2` and
77
+ its repository deleted. Unlike the two above, its capability did not go away
78
+ with it: **per-route middleware is native to core**, through the
79
+ `middleware:` array documented in [docs/MIDDLEWARE.md](docs/MIDDLEWARE.md).
80
+ The deleted package only ever offered the same behavior through the extension
81
+ seam. A project using it moves its entries to the native array; there is no
82
+ gap to report here.
83
+
71
84
  ```yaml
72
85
  version: "1"
73
86
  extensions:
@@ -106,10 +119,9 @@ The [roadmap](ROADMAP.md) separates implemented from planned, and
106
119
  what is not: provider deployments, soak and independent security review
107
120
  remain open.
108
121
 
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.
122
+ Core has no native `link` handler. Stored short links moved out to a
123
+ mount-based `urlcode-dynamic-link` extension, which has since been retired and
124
+ unpublished; no supported package provides them.
113
125
 
114
126
  URLCode is free and open-source software licensed under the
115
127
  [Apache License 2.0](LICENSE). Commercial use, modification, redistribution and
@@ -128,6 +140,14 @@ project grows. Operators should read [capacity/concurrency](docs/CAPACITY.md) an
128
140
  [DDoS and recovery playbook](docs/RESILIENCE.md). Embedding the runtime from
129
141
  TypeScript is covered in [TypeScript](docs/TYPESCRIPT.md). [All documentation](docs/README.md).
130
142
 
143
+ All of it lives in [`docs/`](docs/README.md) in this repository — guides,
144
+ references and recipes alongside the contributor and maintainer material: local
145
+ development, CI, the release process, reviews and the generated field
146
+ reference. New pages belong here, in the same pull request as the change they
147
+ describe. `urlcode-docs`, a private repository that served a documentation site
148
+ from its own copy of these pages, is being retired; the content that was ahead
149
+ of this repository has been brought across.
150
+
131
151
  ## Start your own project
132
152
 
133
153
  Use [urlcode-template](https://github.com/jimhoyd-com/urlcode-template) for a small
@@ -142,28 +162,6 @@ npm ci
142
162
  npm run dev
143
163
  ```
144
164
 
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
165
  ## Start from YAML
168
166
 
169
167
  Already wrote `urlcode.yaml`? Run `urlcode scaffold --project ./my-links --dry-run`,
@@ -254,26 +252,18 @@ inspection, validation and conversion previews over stdio, and
254
252
  `--allow-authoring` adds project-confined authoring tools
255
253
  ([tooling](docs/TOOLING.md)).
256
254
 
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
255
  ## Built with URLCode
270
256
 
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.
257
+ Two applications were built on the public runtime as ordinary consumers, and
258
+ both have since been retired: `urlcode-docs`, a static documentation site
259
+ rendered through its own middleware at build time and served through native
260
+ page/static/download routes, and `urlcode-short`, an account-free short-link
261
+ demo combining expiring links, QR downloads and a shadcn/ui frontend — URLCode
262
+ supplied the pages, assets and routing, the application supplied anonymous
263
+ creation, link storage and its own limits. `urlcode-short`'s repository is
264
+ deleted, so its build retrospective is no longer reachable; what it recorded
265
+ about the gap between the runtime and a real application is carried in
266
+ [principles and open decisions](docs/OPEN-DECISIONS.md) and [roadmap](ROADMAP.md).
277
267
 
278
268
  ## License and contributing
279
269