-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwiki-demo.html
More file actions
30 lines (30 loc) · 22.2 KB
/
Copy pathwiki-demo.html
File metadata and controls
30 lines (30 loc) · 22.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>index | wiki | miniweb</title><style>:root{--bg:#f4f3ef;--ink:#0b0c0e;--accent:#4636e8;--teal:#585c64;--gold:#0b0c0e;--ok:#2f3238;--muted:#585c64;--hairline:rgba(11,12,14,.14);--font-body:Arial,Helvetica,sans-serif;--font-mono:ui-monospace,SFMono-Regular,Consolas,monospace;}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-body)}header{padding:.7rem 1rem;border-bottom:1px solid var(--hairline);font-family:var(--font-mono);font-size:.85rem}main{display:grid;grid-template-columns:260px 1fr;min-height:100vh}nav{border-right:1px solid var(--hairline);padding:1rem;font-family:var(--font-mono);font-size:.8rem;overflow:auto}nav a{display:block;color:var(--ink);text-decoration:none;padding:.15rem .3rem;border-radius:4px;word-break:break-all}nav a.active{background:var(--accent);color:var(--bg)}#pages{padding:1rem 1.5rem;overflow:auto}section.page footer{margin-top:1.2rem;padding-top:.5rem;border-top:1px solid var(--hairline);font-family:var(--font-mono);font-size:.72rem;color:var(--muted)}table{border-collapse:collapse}th,td{border:1px solid var(--hairline);padding:.2em .6em;text-align:left}.ev{font-family:var(--font-mono);font-size:.78em;color:var(--muted)}.label{font-family:var(--font-mono);font-size:.78rem;color:var(--muted)}article{border-top:1px solid var(--hairline);margin-top:1rem;padding-top:.5rem}.md pre{background:rgba(255,255,255,.55);border:1px solid var(--hairline);padding:.5em;overflow:auto}svg{max-width:100%;height:auto}@media(max-width:820px){main{grid-template-columns:1fr}nav{border-right:none}}</style></head><body><header>index wiki: <strong>miniweb</strong> pinned to <code>unversioned</code></header><main><nav aria-label="wiki pages"><a href="#" data-target="page-0">miniweb overview</a><a href="#" data-target="page-1">Architecture</a><a href="#" data-target="page-2">app</a><a href="#" data-target="page-3">models</a><a href="#" data-target="page-4">router</a><a href="#" data-target="page-5">storage</a><a href="#" data-target="page-6">Record</a><a href="#" data-target="page-7">get</a><a href="#" data-target="page-8">Docs</a></nav><div id="pages"><section class="page" id="page-0"><h2>miniweb overview</h2><table><tr><th>repo</th><td>miniweb</td></tr><tr><th>commit</th><td>unversioned</td></tr><tr><th>ecosystems</th><td>python</td></tr><tr><th>modules</th><td>4</td></tr><tr><th>internal edges</th><td>5</td></tr><tr><th>cycles</th><td>0</td></tr><tr><th>entry points (no internal importer)</th><td>app</td></tr></table><h3>doc inventory (3)</h3><ul><li><code>README.md</code></li><li><code>docs/adr-001-storage.md</code></li><li><code>docs/architecture.md</code></li></ul><p class="label">graph coverage: complete</p><footer>structure derived from the dependency graph; no generated prose; evidence shown: 0 file:line reference(s)</footer></section><section class="page" id="page-1"><h2>Architecture</h2><p class="label">rendered from the real module graph, 5 evidence-backed edge(s); never inferred</p><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 326.50 684.00" width="326.50" height="684.00"><defs><marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#585c64"/></marker></defs><style>svg{background-color:#f4f3ef;}text{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;fill:#0b0c0e;} /* labels are identifiers, use monospace not font-body */rect{stroke:rgba(11,12,14,.14);}.role-entrypoint rect{fill:#4636e8;}.role-orchestrator rect{fill:#0b0c0e;}.role-hub rect{fill:#2f3238;}.role-library rect{fill:#585c64;}.role-leaf rect{fill:#585c64;}.role-isolated rect{fill:#585c64;}.role-external rect{fill:rgba(11,12,14,.14);}.edge{fill:none;stroke:#585c64;}.edge-high{stroke:#2f3238;}.edge-moderate{stroke:#0b0c0e;stroke-dasharray:5 3;}.edge-low{stroke:#585c64;stroke-dasharray:2 3;}.edge-external{stroke:rgba(11,12,14,.14);}.edge-back{stroke:#4636e8;}.edge-cycle{stroke:#d9544d;stroke-width:2.4;stroke-dasharray:none;}.node.cycle rect{stroke:#d9544d;stroke-width:2.4;}</style><rect x="0" y="0" width="326.50" height="684.00" fill="#f4f3ef"/><path class="edge edge-high" data-from="app" data-to="router" data-signals='[{"file": "app.py", "kind": "import", "line": 1, "raw": "import router"}]' marker-end="url(#arrow)" d="M133.25,84.00 C133.25,234.40 189.00,309.60 189.00,460.00"/><path class="edge edge-high" data-from="app" data-to="storage" data-signals='[{"file": "app.py", "kind": "import", "line": 2, "raw": "import storage"}]' marker-end="url(#arrow)" d="M133.25,84.00 C133.25,234.40 81.75,309.60 81.75,460.00"/><path class="edge edge-high" data-from="router" data-to="models" data-signals='[{"file": "router.py", "kind": "import", "line": 1, "raw": "import models"}]' marker-end="url(#arrow)" d="M189.00,504.00 C189.00,542.40 133.25,561.60 133.25,600.00"/><path class="edge edge-high edge-back" data-from="router" data-to="storage" data-signals='[{"file": "router.py", "kind": "import", "line": 2, "raw": "import storage"}]' marker-end="url(#arrow)" d="M189.00,482.00 C249.00,482.00 141.75,482.00 81.75,482.00"/><path class="edge edge-high" data-from="storage" data-to="models" data-signals='[{"file": "storage.py", "kind": "import", "line": 1, "raw": "import models"}]' marker-end="url(#arrow)" d="M81.75,504.00 C81.75,542.40 133.25,561.60 133.25,600.00"/><g class="node role-entrypoint" data-name="app" data-role="entrypoint" data-roles="entrypoint" data-indeg="0" data-outdeg="2" data-hub="false" tabindex="0" role="img" aria-label="app (entrypoint)"><rect x="108.50" y="40.00" width="49.50" height="44.00" rx="6"/><text x="133.25" y="66.00" text-anchor="middle">app</text><title>app: entrypoint</title></g><g class="node role-library" data-name="storage" data-role="library" data-roles="library" data-indeg="2" data-outdeg="1" data-hub="false" tabindex="0" role="img" aria-label="storage (library)"><rect x="40.00" y="460.00" width="83.50" height="44.00" rx="6"/><text x="81.75" y="486.00" text-anchor="middle">storage</text><title>storage: library</title></g><g class="node role-library" data-name="router" data-role="library" data-roles="library" data-indeg="1" data-outdeg="2" data-hub="false" tabindex="0" role="img" aria-label="router (library)"><rect x="151.50" y="460.00" width="75.00" height="44.00" rx="6"/><text x="189.00" y="486.00" text-anchor="middle">router</text><title>router: library</title></g><g class="node role-leaf" data-name="models" data-role="leaf" data-roles="leaf" data-indeg="2" data-outdeg="0" data-hub="false" tabindex="0" role="img" aria-label="models (leaf)"><rect x="95.75" y="600.00" width="75.00" height="44.00" rx="6"/><text x="133.25" y="626.00" text-anchor="middle">models</text><title>models: leaf</title></g></svg><details><summary>mermaid source</summary><pre>flowchart TD
n_app["app"]
n_models["models"]
n_router["router"]
n_storage["storage"]
n_app -->|high (import)| n_router
n_app -->|high (import)| n_storage
n_router -->|high (import)| n_models
n_router -->|high (import)| n_storage
n_storage -->|high (import)| n_models
classDef entrypoint fill:#4636e8,stroke:#0d1b1c,color:#e9e2d0;
classDef orchestrator fill:#0b0c0e,stroke:#0d1b1c,color:#e9e2d0;
classDef hub fill:#2f3238,stroke:#0d1b1c,color:#e9e2d0;
classDef library fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;
classDef leaf fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;
classDef isolated fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;
classDef external fill:rgba(11,12,14,.14),stroke:#0d1b1c,color:#e9e2d0;
class n_app entrypoint;
class n_models leaf;
class n_router library;
class n_storage library;
</pre></details><footer>structure derived from the dependency graph; no generated prose; evidence shown: 5 file:line reference(s)</footer></section><section class="page" id="page-2"><h2>app</h2><p class="label">app.py (python)</p><h3>imports</h3><ul><li><code>router</code> <span class="ev">app.py:1</span></li><li><code>storage</code> <span class="ev">app.py:2</span></li></ul><h3>dependents</h3><p>none</p><footer>structure derived from the dependency graph; no generated prose; evidence shown: 2 file:line reference(s)</footer></section><section class="page" id="page-3"><h2>models</h2><p class="label">models.py (python)</p><h3>imports</h3><p>none</p><h3>dependents</h3><ul><li><code>router</code> <span class="ev">router.py:1</span></li><li><code>storage</code> <span class="ev">storage.py:1</span></li></ul><footer>structure derived from the dependency graph; no generated prose; evidence shown: 2 file:line reference(s)</footer></section><section class="page" id="page-4"><h2>router</h2><p class="label">router.py (python)</p><h3>imports</h3><ul><li><code>models</code> <span class="ev">router.py:1</span></li><li><code>storage</code> <span class="ev">router.py:2</span></li></ul><h3>dependents</h3><ul><li><code>app</code> <span class="ev">app.py:1</span></li></ul><footer>structure derived from the dependency graph; no generated prose; evidence shown: 3 file:line reference(s)</footer></section><section class="page" id="page-5"><h2>storage</h2><p class="label">storage.py (python)</p><h3>imports</h3><ul><li><code>models</code> <span class="ev">storage.py:1</span></li></ul><h3>dependents</h3><ul><li><code>app</code> <span class="ev">app.py:2</span></li><li><code>router</code> <span class="ev">router.py:2</span></li></ul><footer>structure derived from the dependency graph; no generated prose; evidence shown: 3 file:line reference(s)</footer></section><section class="page" id="page-6"><h2>Record</h2><p class="label">class <code>models::Record</code>, defined at <code>models.py:1</code></p><h3>called by (0)</h3><p>none</p><h3>calls (0)</h3><p>none</p><footer>structure derived from the dependency graph; no generated prose; evidence shown: 0 file:line reference(s)</footer></section><section class="page" id="page-7"><h2>get</h2><p class="label">function <code>storage::get</code>, defined at <code>storage.py:4</code></p><h3>called by (0)</h3><p>none</p><h3>calls (0)</h3><p>none</p><footer>structure derived from the dependency graph; no generated prose; evidence shown: 0 file:line reference(s)</footer></section><section class="page" id="page-8"><h2>Docs</h2><p class="label">authored by humans; joined in verbatim and rendered offline, never rewritten</p><article><h3>miniweb <code>README.md</code></h3><div class="md"><h1>miniweb</h1>
<p>A tiny demo service: <code>app</code> is the entry point, <code>router</code> dispatches, <code>storage</code> persists, <code>models</code> holds the shared records.</p></div></article><article><h3>ADR 001: Storage <code>docs/adr-001-storage.md</code></h3><div class="md"><h1>ADR 001: Storage</h1>
<table>
<thead><tr><th>option</th><th>verdict</th></tr></thead>
<tbody><tr><td>in-memory dict</td><td>chosen</td></tr>
<tr><td>external service</td><td>rejected</td></tr></tbody>
</table></div></article><article><h3>Architecture <code>docs/architecture.md</code></h3><div class="md"><h1>Architecture</h1>
<p><code>app</code> calls <code>router</code>; <code>router</code> and <code>storage</code> share <code>models</code>.</p>
<blockquote>Rule: <code>models</code> imports nothing.</blockquote></div></article><footer>structure derived from the dependency graph; no generated prose; evidence shown: 0 file:line reference(s)</footer></section></div></main><script id="wiki-data" type="application/json">{"commit":"unversioned","manifest":{"commit":"unversioned","inputs":{"clustered":false,"coverage_complete":true,"docs":3,"internal_edges":5,"modules":4,"resolved_symbol_calls":0,"symbol_pages":2,"symbols":2},"pages":[{"id":"overview","sha256":"f3ffdb4585c2d509706cc3be9287d9edd12d75033b464451260fbd91daeac829"},{"id":"architecture","sha256":"f1feca951362d8f1343c06a30d5e795c10cddfe6d6a936bbb7dea7f1405030df"},{"id":"module/app","sha256":"1a2693b3060d1307bcbcc57e9901a92f7b85ddb286022e4de7cb2554c700a250"},{"id":"module/models","sha256":"0ca20c60a8226c54d7b3429f42a79f708e182d8c8f723300e431d3b0e46c0b12"},{"id":"module/router","sha256":"527026fbdb3a462aedcda721dc3577423f0c5797ff3fe6060b5e1b2121b33696"},{"id":"module/storage","sha256":"06e9ce2c55983c832dfb418c67dd255020593caca3005cce5f4052569939341f"},{"id":"symbol/models::Record","sha256":"e619b1b4fc3ea547ff79112e0b0491266bac89d6017f0a22d1a5f285ae2fe5de"},{"id":"symbol/storage::get","sha256":"ac8e2056cab6638ae8581006cd15aaf66988ef180dcafa7eca2b5fa8ab4e97da"},{"id":"docs","sha256":"e8b070faf500f359bab1adf1a4ecb7d8427bf612d88fe95deaac971a1ee2b9e3"}],"repo":"miniweb","schema":"index.wiki/1","tool_version":"2.8.0"},"pages":[{"boundary":{"derived_from":"dependency-graph","evidence_count":0,"generated_prose":false},"commit":"unversioned","coverage":{"complete":true,"dynamic_imports":[],"parse_errors":[]},"cycle_count":0,"doc_count":3,"doc_paths":["README.md","docs/adr-001-storage.md","docs/architecture.md"],"ecosystems":["python"],"entry_points":["app"],"id":"overview","internal_edge_count":5,"kind":"overview","module_count":4,"repo":"miniweb","title":"miniweb overview"},{"boundary":{"derived_from":"dependency-graph","evidence_count":5,"generated_prose":false},"cycles":[],"edge_count":5,"granularity":"module","id":"architecture","kind":"architecture","mermaid":"flowchart TD\n n_app[\"app\"]\n n_models[\"models\"]\n n_router[\"router\"]\n n_storage[\"storage\"]\n n_app -->|high (import)| n_router\n n_app -->|high (import)| n_storage\n n_router -->|high (import)| n_models\n n_router -->|high (import)| n_storage\n n_storage -->|high (import)| n_models\n classDef entrypoint fill:#4636e8,stroke:#0d1b1c,color:#e9e2d0;\n classDef orchestrator fill:#0b0c0e,stroke:#0d1b1c,color:#e9e2d0;\n classDef hub fill:#2f3238,stroke:#0d1b1c,color:#e9e2d0;\n classDef library fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;\n classDef leaf fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;\n classDef isolated fill:#585c64,stroke:#0d1b1c,color:#e9e2d0;\n classDef external fill:rgba(11,12,14,.14),stroke:#0d1b1c,color:#e9e2d0;\n class n_app entrypoint;\n class n_models leaf;\n class n_router library;\n class n_storage library;\n","svg":"\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 326.50 684.00\" width=\"326.50\" height=\"684.00\">\u003cdefs>\u003cmarker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\u003cpath d=\"M0,0 L10,5 L0,10 z\" fill=\"#585c64\"/>\u003c/marker>\u003c/defs>\u003cstyle>svg{background-color:#f4f3ef;}text{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;fill:#0b0c0e;} /* labels are identifiers, use monospace not font-body */rect{stroke:rgba(11,12,14,.14);}.role-entrypoint rect{fill:#4636e8;}.role-orchestrator rect{fill:#0b0c0e;}.role-hub rect{fill:#2f3238;}.role-library rect{fill:#585c64;}.role-leaf rect{fill:#585c64;}.role-isolated rect{fill:#585c64;}.role-external rect{fill:rgba(11,12,14,.14);}.edge{fill:none;stroke:#585c64;}.edge-high{stroke:#2f3238;}.edge-moderate{stroke:#0b0c0e;stroke-dasharray:5 3;}.edge-low{stroke:#585c64;stroke-dasharray:2 3;}.edge-external{stroke:rgba(11,12,14,.14);}.edge-back{stroke:#4636e8;}.edge-cycle{stroke:#d9544d;stroke-width:2.4;stroke-dasharray:none;}.node.cycle rect{stroke:#d9544d;stroke-width:2.4;}\u003c/style>\u003crect x=\"0\" y=\"0\" width=\"326.50\" height=\"684.00\" fill=\"#f4f3ef\"/>\u003cpath class=\"edge edge-high\" data-from=\"app\" data-to=\"router\" data-signals='[{\"file\": \"app.py\", \"kind\": \"import\", \"line\": 1, \"raw\": \"import router\"}]' marker-end=\"url(#arrow)\" d=\"M133.25,84.00 C133.25,234.40 189.00,309.60 189.00,460.00\"/>\u003cpath class=\"edge edge-high\" data-from=\"app\" data-to=\"storage\" data-signals='[{\"file\": \"app.py\", \"kind\": \"import\", \"line\": 2, \"raw\": \"import storage\"}]' marker-end=\"url(#arrow)\" d=\"M133.25,84.00 C133.25,234.40 81.75,309.60 81.75,460.00\"/>\u003cpath class=\"edge edge-high\" data-from=\"router\" data-to=\"models\" data-signals='[{\"file\": \"router.py\", \"kind\": \"import\", \"line\": 1, \"raw\": \"import models\"}]' marker-end=\"url(#arrow)\" d=\"M189.00,504.00 C189.00,542.40 133.25,561.60 133.25,600.00\"/>\u003cpath class=\"edge edge-high edge-back\" data-from=\"router\" data-to=\"storage\" data-signals='[{\"file\": \"router.py\", \"kind\": \"import\", \"line\": 2, \"raw\": \"import storage\"}]' marker-end=\"url(#arrow)\" d=\"M189.00,482.00 C249.00,482.00 141.75,482.00 81.75,482.00\"/>\u003cpath class=\"edge edge-high\" data-from=\"storage\" data-to=\"models\" data-signals='[{\"file\": \"storage.py\", \"kind\": \"import\", \"line\": 1, \"raw\": \"import models\"}]' marker-end=\"url(#arrow)\" d=\"M81.75,504.00 C81.75,542.40 133.25,561.60 133.25,600.00\"/>\u003cg class=\"node role-entrypoint\" data-name=\"app\" data-role=\"entrypoint\" data-roles=\"entrypoint\" data-indeg=\"0\" data-outdeg=\"2\" data-hub=\"false\" tabindex=\"0\" role=\"img\" aria-label=\"app (entrypoint)\">\u003crect x=\"108.50\" y=\"40.00\" width=\"49.50\" height=\"44.00\" rx=\"6\"/>\u003ctext x=\"133.25\" y=\"66.00\" text-anchor=\"middle\">app\u003c/text>\u003ctitle>app: entrypoint\u003c/title>\u003c/g>\u003cg class=\"node role-library\" data-name=\"storage\" data-role=\"library\" data-roles=\"library\" data-indeg=\"2\" data-outdeg=\"1\" data-hub=\"false\" tabindex=\"0\" role=\"img\" aria-label=\"storage (library)\">\u003crect x=\"40.00\" y=\"460.00\" width=\"83.50\" height=\"44.00\" rx=\"6\"/>\u003ctext x=\"81.75\" y=\"486.00\" text-anchor=\"middle\">storage\u003c/text>\u003ctitle>storage: library\u003c/title>\u003c/g>\u003cg class=\"node role-library\" data-name=\"router\" data-role=\"library\" data-roles=\"library\" data-indeg=\"1\" data-outdeg=\"2\" data-hub=\"false\" tabindex=\"0\" role=\"img\" aria-label=\"router (library)\">\u003crect x=\"151.50\" y=\"460.00\" width=\"75.00\" height=\"44.00\" rx=\"6\"/>\u003ctext x=\"189.00\" y=\"486.00\" text-anchor=\"middle\">router\u003c/text>\u003ctitle>router: library\u003c/title>\u003c/g>\u003cg class=\"node role-leaf\" data-name=\"models\" data-role=\"leaf\" data-roles=\"leaf\" data-indeg=\"2\" data-outdeg=\"0\" data-hub=\"false\" tabindex=\"0\" role=\"img\" aria-label=\"models (leaf)\">\u003crect x=\"95.75\" y=\"600.00\" width=\"75.00\" height=\"44.00\" rx=\"6\"/>\u003ctext x=\"133.25\" y=\"626.00\" text-anchor=\"middle\">models\u003c/text>\u003ctitle>models: leaf\u003c/title>\u003c/g>\u003c/svg>","title":"Architecture"},{"boundary":{"derived_from":"dependency-graph","evidence_count":2,"generated_prose":false},"cycles":[],"dependents":[],"id":"module/app","imports":[{"file":"app.py","line":1,"raw":"import router","to":"router"},{"file":"app.py","line":2,"raw":"import storage","to":"storage"}],"kind":"module","language":"python","module":"app","path":"app.py","title":"app"},{"boundary":{"derived_from":"dependency-graph","evidence_count":2,"generated_prose":false},"cycles":[],"dependents":[{"file":"router.py","from":"router","line":1,"raw":"import models"},{"file":"storage.py","from":"storage","line":1,"raw":"import models"}],"id":"module/models","imports":[],"kind":"module","language":"python","module":"models","path":"models.py","title":"models"},{"boundary":{"derived_from":"dependency-graph","evidence_count":3,"generated_prose":false},"cycles":[],"dependents":[{"file":"app.py","from":"app","line":1,"raw":"import router"}],"id":"module/router","imports":[{"file":"router.py","line":1,"raw":"import models","to":"models"},{"file":"router.py","line":2,"raw":"import storage","to":"storage"}],"kind":"module","language":"python","module":"router","path":"router.py","title":"router"},{"boundary":{"derived_from":"dependency-graph","evidence_count":3,"generated_prose":false},"cycles":[],"dependents":[{"file":"app.py","from":"app","line":2,"raw":"import storage"},{"file":"router.py","from":"router","line":2,"raw":"import storage"}],"id":"module/storage","imports":[{"file":"storage.py","line":1,"raw":"import models","to":"models"}],"kind":"module","language":"python","module":"storage","path":"storage.py","title":"storage"},{"boundary":{"derived_from":"symbol-call-graph","evidence_count":0,"generated_prose":false},"callees":[],"callers":[],"definition":{"file":"models.py","line":1},"id":"symbol/models::Record","is_public":true,"kind":"symbol","module":"models","parent":null,"symbol":"models::Record","symbol_kind":"class","title":"Record","unresolved_calls":[]},{"boundary":{"derived_from":"symbol-call-graph","evidence_count":0,"generated_prose":false},"callees":[],"callers":[],"definition":{"file":"storage.py","line":4},"id":"symbol/storage::get","is_public":true,"kind":"symbol","module":"storage","parent":null,"symbol":"storage::get","symbol_kind":"function","title":"get","unresolved_calls":[]},{"boundary":{"derived_from":"dependency-graph","evidence_count":0,"generated_prose":false},"docs":[{"html":"\u003ch1>miniweb\u003c/h1>\n\u003cp>A tiny demo service: \u003ccode>app\u003c/code> is the entry point, \u003ccode>router\u003c/code> dispatches, \u003ccode>storage\u003c/code> persists, \u003ccode>models\u003c/code> holds the shared records.\u003c/p>","path":"README.md","title":"miniweb"},{"html":"\u003ch1>ADR 001: Storage\u003c/h1>\n\u003ctable>\n\u003cthead>\u003ctr>\u003cth>option\u003c/th>\u003cth>verdict\u003c/th>\u003c/tr>\u003c/thead>\n\u003ctbody>\u003ctr>\u003ctd>in-memory dict\u003c/td>\u003ctd>chosen\u003c/td>\u003c/tr>\n\u003ctr>\u003ctd>external service\u003c/td>\u003ctd>rejected\u003c/td>\u003c/tr>\u003c/tbody>\n\u003c/table>","path":"docs/adr-001-storage.md","title":"ADR 001: Storage"},{"html":"\u003ch1>Architecture\u003c/h1>\n\u003cp>\u003ccode>app\u003c/code> calls \u003ccode>router\u003c/code>; \u003ccode>router\u003c/code> and \u003ccode>storage\u003c/code> share \u003ccode>models\u003c/code>.\u003c/p>\n\u003cblockquote>Rule: \u003ccode>models\u003c/code> imports nothing.\u003c/blockquote>","path":"docs/architecture.md","title":"Architecture"}],"id":"docs","kind":"docs","provenance":"authored-by-humans","title":"Docs"}],"repo":"miniweb","schema":"index.wiki/1"}</script><script>const links=[...document.querySelectorAll('[data-target]')];function show(t){document.querySelectorAll('.page').forEach(s=>{s.hidden=(s.id!==t);});links.forEach(a=>{a.classList.toggle('active',a.dataset.target===t);});}links.forEach(a=>a.addEventListener('click',ev=>{ev.preventDefault();show(a.dataset.target);}));show('page-0');</script></body></html>