OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
HASH      6f8b2bd6d5d3
DATE      2026-07-17
SUBJECT   web: projects page as panel cards, git and docs links per project
FILES     11 CHANGED
HASH      6f8b2bd6d5d3
DATE      2026-07-17
SUBJECT   web: projects page as panel cards, git
          and docs links per project
FILES     11 CHANGED
 

diff --git a/ooknet-design/src/content/docs/website/authoring/wikilinks.md b/ookne
t-design/src/content/docs/ooknet.org/authoring/wikilinks.md
similarity index 97%
rename from ooknet-design/src/content/docs/website/authoring/wikilinks.md
rename to ooknet-design/src/content/docs/ooknet.org/authoring/wikilinks.md
index 4d0435f..105255f 100644
--- a/ooknet-design/src/content/docs/website/authoring/wikilinks.md
+++ b/ooknet-design/src/content/docs/ooknet.org/authoring/wikilinks.md
@@ -12,7 +12,7 @@ order: 2
 | `[[Style Sheet\|see the sheet]]` | alias - target before the pipe |
 
 Live: [[Entropy Bounds in Sparse Graphs]] by title,
-[[website/style-sheet]] by id,
+[[ooknet.org/style-sheet]] by id,
 [[Entropy Bounds in Sparse Graphs|aliased to this]] with an alias.
 
 # Resolution

diff --git a/ooknet-design/src/content/docs/
website/authoring/wikilinks.md b/ooknet-desi
gn/src/content/docs/ooknet.org/authoring/wik
ilinks.md
similarity index 97%
rename from ooknet-design/src/content/docs/w
ebsite/authoring/wikilinks.md
rename to ooknet-design/src/content/docs/ook
net.org/authoring/wikilinks.md
index 4d0435f..105255f 100644
--- a/ooknet-design/src/content/docs/website
/authoring/wikilinks.md
+++ b/ooknet-design/src/content/docs/ooknet.
org/authoring/wikilinks.md
@@ -12,7 +12,7 @@ order: 2
 | `[[Style Sheet\|see the sheet]]` | alias 
- target before the pipe |
 
 Live: [[Entropy Bounds in Sparse Graphs]] b
y title,
-[[website/style-sheet]] by id,
+[[ooknet.org/style-sheet]] by id,
 [[Entropy Bounds in Sparse Graphs|aliased t
o this]] with an alias.
 
 # Resolution
 

diff --git a/ooknet-design/src/content/docs/website/authoring/writing-content.md b
/ooknet-design/src/content/docs/ooknet.org/authoring/writing-content.md
similarity index 100%
rename from ooknet-design/src/content/docs/website/authoring/writing-content.md
rename to ooknet-design/src/content/docs/ooknet.org/authoring/writing-content.md

diff --git a/ooknet-design/src/content/docs/
website/authoring/writing-content.md b/ookne
t-design/src/content/docs/ooknet.org/authori
ng/writing-content.md
similarity index 100%
rename from ooknet-design/src/content/docs/w
ebsite/authoring/writing-content.md
rename to ooknet-design/src/content/docs/ook
net.org/authoring/writing-content.md
 

diff --git a/ooknet-design/src/content/docs/website/design/components.md b/ooknet-
design/src/content/docs/ooknet.org/design/components.md
similarity index 100%
rename from ooknet-design/src/content/docs/website/design/components.md
rename to ooknet-design/src/content/docs/ooknet.org/design/components.md

diff --git a/ooknet-design/src/content/docs/
website/design/components.md b/ooknet-design
/src/content/docs/ooknet.org/design/componen
ts.md
similarity index 100%
rename from ooknet-design/src/content/docs/w
ebsite/design/components.md
rename to ooknet-design/src/content/docs/ook
net.org/design/components.md
 

diff --git a/ooknet-design/src/content/docs/website/design/frames.md b/ooknet-desi
gn/src/content/docs/ooknet.org/design/frames.md
similarity index 100%
rename from ooknet-design/src/content/docs/website/design/frames.md
rename to ooknet-design/src/content/docs/ooknet.org/design/frames.md

diff --git a/ooknet-design/src/content/docs/
website/design/frames.md b/ooknet-design/src
/content/docs/ooknet.org/design/frames.md
similarity index 100%
rename from ooknet-design/src/content/docs/w
ebsite/design/frames.md
rename to ooknet-design/src/content/docs/ook
net.org/design/frames.md
 

diff --git a/ooknet-design/src/content/docs/website/design/pipeline.md b/ooknet-de
sign/src/content/docs/ooknet.org/design/pipeline.md
similarity index 100%
rename from ooknet-design/src/content/docs/website/design/pipeline.md
rename to ooknet-design/src/content/docs/ooknet.org/design/pipeline.md

diff --git a/ooknet-design/src/content/docs/
website/design/pipeline.md b/ooknet-design/s
rc/content/docs/ooknet.org/design/pipeline.m
d
similarity index 100%
rename from ooknet-design/src/content/docs/w
ebsite/design/pipeline.md
rename to ooknet-design/src/content/docs/ook
net.org/design/pipeline.md
 

diff --git a/ooknet-design/src/content/docs/ooknet.org/overview.md b/ooknet-design
/src/content/docs/ooknet.org/overview.md
new file mode 100644
index 0000000..dbe17da
--- /dev/null
+++ b/ooknet-design/src/content/docs/ooknet.org/overview.md
@@ -0,0 +1,14 @@
+---
+title: "Overview"
+order: 0
+---
+
+# ooknet.org
+
+This site: a text-mode knowledge base rendered entirely as ASCII on a
+strict monospace grid. Notes, a credited knowledge base, and project
+documentation, cross-linked by a build-time wiki graph.
+
+The design system behind it lives in these docs - start with
+[[ooknet.org/design/frames]] for how the grid works, or the
+[[Style Sheet]] to see every construct the pipeline renders.

diff --git a/ooknet-design/src/content/docs/
ooknet.org/overview.md b/ooknet-design/src/c
ontent/docs/ooknet.org/overview.md
new file mode 100644
index 0000000..dbe17da
--- /dev/null
+++ b/ooknet-design/src/content/docs/ooknet.
org/overview.md
@@ -0,0 +1,14 @@
+---
+title: "Overview"
+order: 0
+---
+
+# ooknet.org
+
+This site: a text-mode knowledge base rende
red entirely as ASCII on a
+strict monospace grid. Notes, a credited kn
owledge base, and project
+documentation, cross-linked by a build-time
 wiki graph.
+
+The design system behind it lives in these 
docs - start with
+[[ooknet.org/design/frames]] for how the gr
id works, or the
+[[Style Sheet]] to see every construct the 
pipeline renders.
 

diff --git a/ooknet-design/src/content/docs/website/style-sheet.md b/ooknet-design
/src/content/docs/ooknet.org/style-sheet.md
similarity index 98%
rename from ooknet-design/src/content/docs/website/style-sheet.md
rename to ooknet-design/src/content/docs/ooknet.org/style-sheet.md
index 563cf33..7db9052 100644
--- a/ooknet-design/src/content/docs/website/style-sheet.md
+++ b/ooknet-design/src/content/docs/ooknet.org/style-sheet.md
@@ -111,7 +111,7 @@ palette stays monochrome:
 
 A wikilink resolves by title [[Entropy Bounds in Sparse Graphs]],
 by file id [[graphs/entropy-bounds]], or doc path
-[[website/design/frames]], and takes an alias:
+[[ooknet.org/design/frames]], and takes an alias:
 [[Entropy Bounds in Sparse Graphs|the entropy note]]. Unresolved
 targets render dead: [[A NOTE THAT DOES NOT EXIST]].
 

diff --git a/ooknet-design/src/content/docs/
website/style-sheet.md b/ooknet-design/src/c
ontent/docs/ooknet.org/style-sheet.md
similarity index 98%
rename from ooknet-design/src/content/docs/w
ebsite/style-sheet.md
rename to ooknet-design/src/content/docs/ook
net.org/style-sheet.md
index 563cf33..7db9052 100644
--- a/ooknet-design/src/content/docs/website
/style-sheet.md
+++ b/ooknet-design/src/content/docs/ooknet.
org/style-sheet.md
@@ -111,7 +111,7 @@ palette stays monochrome
:
 
 A wikilink resolves by title [[Entropy Boun
ds in Sparse Graphs]],
 by file id [[graphs/entropy-bounds]], or do
c path
-[[website/design/frames]], and takes an ali
as:
+[[ooknet.org/design/frames]], and takes an 
alias:
 [[Entropy Bounds in Sparse Graphs|the entro
py note]]. Unresolved
 targets render dead: [[A NOTE THAT DOES NOT
 EXIST]].
 
 

diff --git a/ooknet-design/src/lib/notes.test.ts b/ooknet-design/src/lib/notes.tes
t.ts
index 9911b3f..2c149b5 100644
--- a/ooknet-design/src/lib/notes.test.ts
+++ b/ooknet-design/src/lib/notes.test.ts
@@ -12,7 +12,7 @@ describe("published", () => {
 describe("topSegment", () => {
   it("takes the first directory of an id", () => {
     expect(topSegment("nix/flakes")).toBe("nix");
-    expect(topSegment("website/design/frames")).toBe("website");
+    expect(topSegment("ooknet.org/design/frames")).toBe("ooknet.org");
     expect(topSegment("orphan")).toBe("orphan");
   });
 });

diff --git a/ooknet-design/src/lib/notes.tes
t.ts b/ooknet-design/src/lib/notes.test.ts
index 9911b3f..2c149b5 100644
--- a/ooknet-design/src/lib/notes.test.ts
+++ b/ooknet-design/src/lib/notes.test.ts
@@ -12,7 +12,7 @@ describe("published", () =
> {
 describe("topSegment", () => {
   it("takes the first directory of an id", 
() => {
     expect(topSegment("nix/flakes")).toBe("
nix");
-    expect(topSegment("website/design/frame
s")).toBe("website");
+    expect(topSegment("ooknet.org/design/fr
ames")).toBe("ooknet.org");
     expect(topSegment("orphan")).toBe("orph
an");
   });
 });
 

diff --git a/ooknet-design/src/lib/wikilinks.test.ts b/ooknet-design/src/lib/wikil
inks.test.ts
index c8d20cd..cde52c5 100644
--- a/ooknet-design/src/lib/wikilinks.test.ts
+++ b/ooknet-design/src/lib/wikilinks.test.ts
@@ -9,11 +9,11 @@ describe("buildWikiMap", () => {
     expect(resolveWikilink("graphs/entropy-bounds", map)).toBe("/notes/graphs/ent
ropy-bounds/");
     expect(resolveWikilink("Entropy Bounds in Sparse Graphs", map)).toBe("/notes/
graphs/entropy-bounds/");
     expect(resolveWikilink("windows/collect-data-tss", map)).toBe("/kb/windows/co
llect-data-tss/");
-    expect(resolveWikilink("Style Sheet", map)).toBe("/docs/website/style-sheet/"
);
+    expect(resolveWikilink("Style Sheet", map)).toBe("/docs/ooknet.org/style-shee
t/");
   });
 
   it("is case-insensitive and trims", () => {
-    expect(resolveWikilink("  WIKILINKS  ", map)).toBe("/docs/website/authoring/w
ikilinks/");
+    expect(resolveWikilink("  WIKILINKS  ", map)).toBe("/docs/ooknet.org/authorin
g/wikilinks/");
   });
 
   it("excludes drafts", () => {
@@ -26,7 +26,7 @@ describe("buildWikiMap", () => {
 });
 
 describe("wikiNodes", () => {
-  const map = new Map([["style sheet", "/docs/website/style-sheet/"]]);
+  const map = new Map([["style sheet", "/docs/ooknet.org/style-sheet/"]]);
 
   it("leaves plain text untouched", () => {
     expect(wikiNodes("no links here", map)).toBeNull();
@@ -35,7 +35,7 @@ describe("wikiNodes", () => {
   it("splits text around a resolved link", () => {
     const nodes = wikiNodes("see [[Style Sheet]] for glyphs", map)!;
     expect(nodes.map((n) => n.type)).toEqual(["text", "link", "text"]);
-    expect(nodes[1].url).toBe("/docs/website/style-sheet/");
+    expect(nodes[1].url).toBe("/docs/ooknet.org/style-sheet/");
   });
 
   it("uses the alias as the label", () => {
@@ -69,7 +69,7 @@ describe("buildBacklinks", () => {
     // the ai note cites the kb entry
     expect(urls("/kb/windows/collect-data-tss/")).toContain("/notes/ai/using-ai-t
o-troubleshoot/");
     // the style-sheet doc cites the entropy note
-    expect(urls("/notes/graphs/entropy-bounds/")).toContain("/docs/website/style-
sheet/");
+    expect(urls("/notes/graphs/entropy-bounds/")).toContain("/docs/ooknet.org/sty
le-sheet/");
   });
 
   it("labels sources with their collection", () => {

diff --git a/ooknet-design/src/lib/wikilinks
.test.ts b/ooknet-design/src/lib/wikilinks.t
est.ts
index c8d20cd..cde52c5 100644
--- a/ooknet-design/src/lib/wikilinks.test.t
s
+++ b/ooknet-design/src/lib/wikilinks.test.t
s
@@ -9,11 +9,11 @@ describe("buildWikiMap", (
) => {
     expect(resolveWikilink("graphs/entropy-
bounds", map)).toBe("/notes/graphs/entropy-b
ounds/");
     expect(resolveWikilink("Entropy Bounds 
in Sparse Graphs", map)).toBe("/notes/graphs
/entropy-bounds/");
     expect(resolveWikilink("windows/collect
-data-tss", map)).toBe("/kb/windows/collect-
data-tss/");
-    expect(resolveWikilink("Style Sheet", m
ap)).toBe("/docs/website/style-sheet/");
+    expect(resolveWikilink("Style Sheet", m
ap)).toBe("/docs/ooknet.org/style-sheet/");
   });
 
   it("is case-insensitive and trims", () =>
 {
-    expect(resolveWikilink("  WIKILINKS  ",
 map)).toBe("/docs/website/authoring/wikilin
ks/");
+    expect(resolveWikilink("  WIKILINKS  ",
 map)).toBe("/docs/ooknet.org/authoring/wiki
links/");
   });
 
   it("excludes drafts", () => {
@@ -26,7 +26,7 @@ describe("buildWikiMap", (
) => {
 });
 
 describe("wikiNodes", () => {
-  const map = new Map([["style sheet", "/do
cs/website/style-sheet/"]]);
+  const map = new Map([["style sheet", "/do
cs/ooknet.org/style-sheet/"]]);
 
   it("leaves plain text untouched", () => {
     expect(wikiNodes("no links here", map))
.toBeNull();
@@ -35,7 +35,7 @@ describe("wikiNodes", () =
> {
   it("splits text around a resolved link", 
() => {
     const nodes = wikiNodes("see [[Style Sh
eet]] for glyphs", map)!;
     expect(nodes.map((n) => n.type)).toEqua
l(["text", "link", "text"]);
-    expect(nodes[1].url).toBe("/docs/websit
e/style-sheet/");
+    expect(nodes[1].url).toBe("/docs/ooknet
.org/style-sheet/");
   });
 
   it("uses the alias as the label", () => {
@@ -69,7 +69,7 @@ describe("buildBacklinks",
 () => {
     // the ai note cites the kb entry
     expect(urls("/kb/windows/collect-data-t
ss/")).toContain("/notes/ai/using-ai-to-trou
bleshoot/");
     // the style-sheet doc cites the entrop
y note
-    expect(urls("/notes/graphs/entropy-boun
ds/")).toContain("/docs/website/style-sheet/
");
+    expect(urls("/notes/graphs/entropy-boun
ds/")).toContain("/docs/ooknet.org/style-she
et/");
   });
 
   it("labels sources with their collection"
, () => {
 

diff --git a/ooknet-design/src/pages/components.astro b/ooknet-design/src/pages/co
mponents.astro
index 9a4e1db..f01141e 100644
--- a/ooknet-design/src/pages/components.astro
+++ b/ooknet-design/src/pages/components.astro
@@ -71,7 +71,7 @@ const DEMO_HEADINGS = [
 ];
 
 const HISTORY: TimelineEntry[] = [
-  { date: "2026-07-16", title: "FILED /WEBSITE", desc: "style sheet - exercises e
very pipeline construct", href: "/docs/website/style-sheet/" },
+  { date: "2026-07-16", title: "FILED /WEBSITE", desc: "style sheet - exercises e
very pipeline construct", href: "/docs/ooknet.org/style-sheet/" },
   { date: "2026-04-27", title: "FILED /AI", desc: "using ai to troubleshoot and r
esolve issues", href: "/notes/ai/using-ai-to-troubleshoot/" },
   { date: "2026-04-25", title: "FILED /KB", href: "/kb/windows/collect-data-tss/"
 },
   { date: "2026-04-19", title: "FILED /GRAPHS", desc: "entropy bounds in sparse g
raphs", href: "/notes/graphs/entropy-bounds/" },

diff --git a/ooknet-design/src/pages/compone
nts.astro b/ooknet-design/src/pages/componen
ts.astro
index 9a4e1db..f01141e 100644
--- a/ooknet-design/src/pages/components.ast
ro
+++ b/ooknet-design/src/pages/components.ast
ro
@@ -71,7 +71,7 @@ const DEMO_HEADINGS = [
 ];
 
 const HISTORY: TimelineEntry[] = [
-  { date: "2026-07-16", title: "FILED /WEBS
ITE", desc: "style sheet - exercises every p
ipeline construct", href: "/docs/website/sty
le-sheet/" },
+  { date: "2026-07-16", title: "FILED /WEBS
ITE", desc: "style sheet - exercises every p
ipeline construct", href: "/docs/ooknet.org/
style-sheet/" },
   { date: "2026-04-27", title: "FILED /AI",
 desc: "using ai to troubleshoot and resolve
 issues", href: "/notes/ai/using-ai-to-troub
leshoot/" },
   { date: "2026-04-25", title: "FILED /KB",
 href: "/kb/windows/collect-data-tss/" },
   { date: "2026-04-19", title: "FILED /GRAP
HS", desc: "entropy bounds in sparse graphs"
, href: "/notes/graphs/entropy-bounds/" },
 

diff --git a/ooknet-design/src/pages/projects.astro b/ooknet-design/src/pages/proj
ects.astro
index 0e1c1fa..f543a0f 100644
--- a/ooknet-design/src/pages/projects.astro
+++ b/ooknet-design/src/pages/projects.astro
@@ -3,8 +3,8 @@ import ArticleLayout from "../layouts/ArticleLayout/ArticleLayout.
astro";
 import TopHeader from "../components/TopHeader/TopHeader.astro";
 import Frame from "../components/Frame/Frame.astro";
 import Pre from "../components/Pre/Pre.astro";
-import Prose from "../components/Prose/Prose.astro";
-import Table from "../components/Table/Table.astro";
+import Panel from "../components/Panel/Panel.astro";
+import Button from "../components/Button/Button.astro";
 import ArticleFooter from "../components/ArticleFooter/ArticleFooter.astro";
 import { row2, ruleD } from "../lib/ascii";
 
@@ -12,23 +12,48 @@ const buildHeader = (w: number) =>
   [row2("PROJECT LEDGER", "DEPT. OF OOKS", w), ruleD(w)].join("\n");
 
 const PROJECTS = [
-  ["OOKNET-DESIGN", "this site and the ascii design system behind it", "ACTIVE"],
-  ["OOKNET-KB", "the notes archive: numbered technical sheets", "ONGOING"],
-  ["NIX-FIELD-GUIDE", "climbing the NixOS mountain without a sherpa", "DRAFT"],
+  {
+    name: "OOKNET",
+    desc: "the homelab: hosts, services, and the nix flake that runs them all",
+    git: "https://github.com/ooks-io/ooknet",
+    docs: "/docs/ooknet/overview/",
+  },
+  {
+    name: "OOKNET.ORG",
+    desc: "this site - a text-mode knowledge base and the ascii design system beh
ind it",
+    git: "https://github.com/ooks-io/ooknet.org",
+    docs: "/docs/ooknet.org/overview/",
+  },
+  {
+    name: "WOWSIM-STATS",
+    desc: "simulation-driven stat weights and rankings for classic wow",
+    git: "https://github.com/ooks-io/wowsim-stats",
+    docs: "/docs/wowsim-stats/overview/",
+  },
 ];
 ---
 <ArticleLayout title="OOKNET KB - Projects"
-  description="Active and archived OOKNET projects, with status and stack for eac
h.">
+  description="The project ledger: what the dept. of ooks builds, with source and
 documentation for each.">
   <TopHeader />
   <Frame build={buildHeader} />
   <Pre>{" "}</Pre>
-  <Table head={["PROJECT", "DESCRIPTION", "STATUS"]} rows={PROJECTS} />
-  <Prose>
-    <p>
-      Entries move DRAFT ? ACTIVE ? ONGOING as they stabilise. Completed
-      work is retired into the archive as numbered notes rather than
-      kept on the ledger.
-    </p>
-  </Prose>
-  <ArticleFooter page={2} />
+  {PROJECTS.map((p) => (
+    <Fragment>
+      <Panel title={p.name}>
+        <p class="project-desc">{p.desc}</p>
+        <Pre><Button label="GIT" href={p.git} />{"  "}<Button label="MORE" href={
p.docs} /></Pre>
+      </Panel>
+      <Pre>{" "}</Pre>
+    </Fragment>
+  ))}
+  <ArticleFooter />
 </ArticleLayout>
+
+<style lang="scss">
+  .project-desc {
+    margin: 0 0 0.7em;
+    font-family: var(--mono);
+    font-size: var(--fs);
+    line-height: var(--lh);
+  }
+</style>

diff --git a/ooknet-design/src/pages/project
s.astro b/ooknet-design/src/pages/projects.a
stro
index 0e1c1fa..f543a0f 100644
--- a/ooknet-design/src/pages/projects.astro
+++ b/ooknet-design/src/pages/projects.astro
@@ -3,8 +3,8 @@ import ArticleLayout from ".
./layouts/ArticleLayout/ArticleLayout.astro"
;
 import TopHeader from "../components/TopHea
der/TopHeader.astro";
 import Frame from "../components/Frame/Fram
e.astro";
 import Pre from "../components/Pre/Pre.astr
o";
-import Prose from "../components/Prose/Pros
e.astro";
-import Table from "../components/Table/Tabl
e.astro";
+import Panel from "../components/Panel/Pane
l.astro";
+import Button from "../components/Button/Bu
tton.astro";
 import ArticleFooter from "../components/Ar
ticleFooter/ArticleFooter.astro";
 import { row2, ruleD } from "../lib/ascii";
 
@@ -12,23 +12,48 @@ const buildHeader = (w: 
number) =>
   [row2("PROJECT LEDGER", "DEPT. OF OOKS", 
w), ruleD(w)].join("\n");
 
 const PROJECTS = [
-  ["OOKNET-DESIGN", "this site and the asci
i design system behind it", "ACTIVE"],
-  ["OOKNET-KB", "the notes archive: numbere
d technical sheets", "ONGOING"],
-  ["NIX-FIELD-GUIDE", "climbing the NixOS m
ountain without a sherpa", "DRAFT"],
+  {
+    name: "OOKNET",
+    desc: "the homelab: hosts, services, an
d the nix flake that runs them all",
+    git: "https://github.com/ooks-io/ooknet
",
+    docs: "/docs/ooknet/overview/",
+  },
+  {
+    name: "OOKNET.ORG",
+    desc: "this site - a text-mode knowledg
e base and the ascii design system behind it
",
+    git: "https://github.com/ooks-io/ooknet
.org",
+    docs: "/docs/ooknet.org/overview/",
+  },
+  {
+    name: "WOWSIM-STATS",
+    desc: "simulation-driven stat weights a
nd rankings for classic wow",
+    git: "https://github.com/ooks-io/wowsim
-stats",
+    docs: "/docs/wowsim-stats/overview/",
+  },
 ];
 ---
 <ArticleLayout title="OOKNET KB - Projects"
-  description="Active and archived OOKNET p
rojects, with status and stack for each.">
+  description="The project ledger: what the
 dept. of ooks builds, with source and docum
entation for each.">
   <TopHeader />
   <Frame build={buildHeader} />
   <Pre>{" "}</Pre>
-  <Table head={["PROJECT", "DESCRIPTION", "
STATUS"]} rows={PROJECTS} />
-  <Prose>
-    <p>
-      Entries move DRAFT ? ACTIVE ? ONGOING
 as they stabilise. Completed
-      work is retired into the archive as n
umbered notes rather than
-      kept on the ledger.
-    </p>
-  </Prose>
-  <ArticleFooter page={2} />
+  {PROJECTS.map((p) => (
+    <Fragment>
+      <Panel title={p.name}>
+        <p class="project-desc">{p.desc}</p
>
+        <Pre><Button label="GIT" href={p.gi
t} />{"  "}<Button label="MORE" href={p.docs
} /></Pre>
+      </Panel>
+      <Pre>{" "}</Pre>
+    </Fragment>
+  ))}
+  <ArticleFooter />
 </ArticleLayout>
+
+<style lang="scss">
+  .project-desc {
+    margin: 0 0 0.7em;
+    font-family: var(--mono);
+    font-size: var(--fs);
+    line-height: var(--lh);
+  }
+</style>
 
[ BACK TO LOG ]
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET