clone

a personal forge on plain git: static pages, stacked-diff reviews, signed local ci, repo sites and releases

Drop the letter mark from repo cards

cat committed 3282a99
Each card on the index and owner pages led with a colored square holding
the repo's first letter. It said nothing the name beside it doesn't, so
the card now starts with the name; the hue filter that colored the mark
goes with it.
commit
3282a9991a0ca1d320ca293d12609e046663306d
parent
cb2b99dc4c067a67617270fd95580fea80edc7f7
author
cat <admin@dev.site>
ci
✓ passed in 78s, signed by cat
kind
chore risk score 1.3 of 3, Jev's estimate
review
#10 Put a commit's type in a column, and its risk as a small score
ci attestation
forge-attestation 1
type ci
commit 3282a9991a0ca1d320ca293d12609e046663306d
tree de9278734f2d40d0e884cfabfc7aa9ef5b7414be
script .forge/ci 38df37c0d5a6382f60569079a0dd821094e37e4a
result pass
exit 0
started 2026-10-19T00:31:20Z
duration 78s
runner (not shown here; refs/notes/ci has it)
system Darwin 25.5.0 arm64
env host
log sha256:c2194e9fdffd5457b52195b3b26be85892b1dc1ea71825f1a9c419f52e8ed985 244 lines
|remote: review #4: /dami/greet/reviews/4/
|pushed wip/i18n
|2cad298 running .forge/ci: greet.sh: say what it is
|  | sh: /bin/sh
|  | ok   greet
|2cad298 pass in 0s, signed
|pushed main
|remote: review #4: /dami/greet/reviews/4/
|pushed wip/i18n
|24789f9 running .forge/ci: wave at the world
|  | sh: /bin/sh
|  | FAIL greet : got 'hello, world o/', want 'hello, world'
|24789f9 fail in 0s, signed
|forge: 1 commit(s) did not pass
|remote: review #6: /dami/greet/reviews/6/
|pushed ana/wave
|495fa4f running .forge/ci: update the test for the wave
|  | sh: /bin/sh
|  | ok   greet
|495fa4f pass in 0s, signed
|remote: review #6: /dami/greet/reviews/6/
|pushed ana/wave
|warning: You appear to have cloned an empty repository.
|site home: deployed 6b84642 -> /sites/ana/dotfiles/home/
|created ana/notes
|remote: review #1: /ana/notes/reviews/1/
|pushed ana/todo
|landing #1 A todo list: ana/todo -> main
|bc6d94c running .forge/ci: web, server and Python versions of greet
|  | sh: /bin/sh
|  | ok   greet
|bc6d94c pass in 0s, signed
|pushed main
|efa6e74 running .forge/ci: messages: notes for the later regions
|  | sh: /bin/sh
|  | ok   greet
|efa6e74 pass in 0s, signed
|remote: review #7: /dami/greet/reviews/7/
|pushed dami/regions
|created dami/forge
|warning: You appear to have cloned an empty repository.
|site guide: deployed 92f4eb0 -> /sites/dami/forge/guide/
|(node:36679) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built ana/dotfiles in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www
|(node:36806) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built ana/notes in 0s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www
|(node:36943) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built dami/forge in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www
|(node:37073) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built dami/greet in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www
|(node:37743) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built - in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www
|226 of 226 pages render the same without 11ty
|guide: 4 files, links ok
|ok

Signature: good, cat

2 files changed, +1 -4
Mlib/forge.ts2--
Msite/_includes/macros.njk3+--
M lib/forge.ts +0 -2
M site/_includes/macros.njk +1 -2
@@ -158,7 +158,6 @@ a.rev { font-size: 0.85em; color: var(--muted); border: 1px solid var(--border);
158158 .card:hover, .card:focus-within, .card.sel { border-color: var(--faint); background: var(--hover); }159159 .card.sel { box-shadow: inset 2px 0 0 var(--accent); }160160 .card-top { display: flex; align-items: center; gap: 10px; min-width: 0; }161-.card-mark { flex: none; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 6px; background: hsl(var(--h) 55% 68%); color: #0d1117; font-weight: 700; font-size: 0.8rem; }162161 .card-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 650; }163162 .card-name::after { content: ''; position: absolute; inset: 0; border-radius: var(--radius); }164163 .card-name .desc { font-weight: normal; }
@@ -181,7 +180,7 @@ a.rev { font-size: 0.85em; color: var(--muted); border: 1px solid var(--border);
181180 <ul class="cards nav-cards">182181 {% for s in sh.repos %}183182 <li class="card" data-name="{{ s.name | lower }}" data-date="{{ s.lastCommit }}"{% if s.counts.sites %} data-site{% endif %}>184-<div class="card-top"><span class="card-mark" style="--h: {{ s.name | hue }}" aria-hidden="true">{{ s.name[0] | upper }}</span><a class="card-name" href="{{ s.urls.home.href }}">{% if owners %}<span class="desc">{{ s.owner }} / </span>{% endif %}{{ s.name }}</a></div>183+<div class="card-top"><a class="card-name" href="{{ s.urls.home.href }}">{% if owners %}<span class="desc">{{ s.owner }} / </span>{% endif %}{{ s.name }}</a></div>185184 {% if s.description %}<p class="card-desc">{{ s.description }}</p>{% endif %}186185 <div class="card-foot">{{ sitesLink(s) }}{% if s.counts.reviews %}<a href="{{ s.urls.reviews.href }}">{{ s.counts.reviews | plural('review') }}</a>{% endif %}<span class="grow"></span>{{ s.lastCommit | date }}</div>187186 </li>