repository
Every repo in the estate ships three brand artifacts, the brand.png
derived from them, and a small set of repository-level files. Lift the
templates in ./templates/, replace the placeholders,
leave the structure alone. The visual language the artifacts answer to
(glyph sizes, character budgets, the token whitelist, territory tags)
is at Repository (design).
What this standard checks
Generated from ./check.sh, in the order the check
runs them.
| assertion | target | pattern or value | note |
|---|---|---|---|
| file exists | avatar.svg |
without one the forge draws generated initials wherever the project is listed | |
| file exists | hero.svg |
the README's opening image, and the source every social preview is cut from | |
| file exists | favicon.svg |
pages and docs deployed from the repo otherwise render the browser's blank sheet | |
| file exists | brand.png |
the raster surfaces that cannot take SVG have nothing to fall back to | |
| file exists | LICENSE |
an unlicensed public repo is legally unusable however well it reads | |
| file exists | CODEOWNERS |
review requests have no owner to route to when the file is absent | |
| file exists | README.md |
the only page most visitors will read | |
| file matches | README.md |
^!\[hero\]\(hero\.svg\) |
a hero committed but never embedded leaves the README opening on prose |
| GitLab setting reads | only_allow_merge_if_pipeline_succeeds |
true |
on an estate with no group cascade to outrank it, this is the only thing keeping a red pipeline out of main |
The artifacts
| Artifact | Role | Rendered at |
|---|---|---|
avatar.svg |
Metaphorical logo. | GitLab repo avatar |
hero.svg |
Data-sheet: title, tagline, four tiles, territory tags, embedded glyph. | README banner |
favicon.svg |
The glyph alone, no text, sized for 16-32px. | Browser tab, bookmarks, PWA |
brand.png |
Composite: avatar over hero, derived from the two SVGs. | Social cards, external embeds |
The hero exists because GitHub does not render the repo avatar. The hero carries the brand on mirrored views.
If the repo's web build uses a static-assets directory (Astro's
public/, Next's public/, Vite's public/), keep a byte-identical
copy of favicon.svg there. The root file is the canonical source.
The skeleton files
<repo>/
├── avatar.svg
├── hero.svg
├── favicon.svg # glyph extracted from avatar, sized for 16-32px
├── brand.png # derived via `just brand`
├── LICENSE # MIT, current year, holder per the estate (here: Andrew Dunn)
├── CODEOWNERS # one line, the estate's handle (here: `* @andrewdunndev`)
└── README.md # hero embed + three-badge row + body
CODEOWNERS content: a single line * @andrewdunndev is the canonical
estate handle and the canonical minimum. Multi-owner repos use one line
per path glob; GitLab merges follow the same conventions as GitHub's
CODEOWNERS. Older repos may still carry @adunn-dev; flip them on next
touch.
This standard governs gitlab.com/dunn.dev/* and nothing else. The
handle and the copyright holder above are this estate's identity, not a
default; neither travels to a repo in another estate. A repo in a work
namespace takes its holder and its owners from that estate's own
standard.
README shape

# <namespace>/<repo>
[](pipeline-url)
[](LICENSE)

<one-paragraph description>
The hero embed is mandatory, opens the README as shown above, and is
literal: the alt text is the exact string hero, not the project
name and not a description. check.sh grades the literal embed line
being present in the file; opening position is shape, held by the
template and by review, the same way the badge order below it is. The
three badges in that order are the canonical row; additional badges
(release, language) can follow.
One brand image per README. hero.svg is the single brand-image
surface. A second banner below it or in the body (assets/foo.jpg,
logo.png, an LLM-generated cover image) read as visually inconsistent
in real-world repos; the qobuz cleanup is the canonical failure case to
avoid. Diagrams and figures embedded in the body, sequence diagrams,
flow charts, screenshots of actual output, are not banners and are
welcome. The rule is against decorative second-image surfaces, not
against load-bearing illustrations.
Merge requests wait for the pipeline
only_allow_merge_if_pipeline_succeeds is project state, not repo
state, so no file in the tree can carry it and a repo created after a
hand sweep drifts silently. Set it under Settings, Merge requests,
"Pipelines must succeed". See ./check.sh for the
dunn.dev group-cascade wrinkle and when it reads false without being
a real violation.
How to satisfy
A repo with no SVGs yet runs
./scripts/brand-init.sh, which authors the
three of them from a config block (glyph name included) and chains into
brand.sh. A repo that already has them runs
./scripts/brand.sh, the canonical recipe the
whole estate shares: it writes avatar.png (256x256) and brand.png
(1648x1421) and is idempotent, so re-run it whenever either SVG
changes. Reference's own just brand is one line delegating to it.
Done when the three brand artifacts and brand.png are in the repo
root, the README opens with the hero embed, and check.sh reports
green.
avatar.png also feeds the GitLab project's avatar slot, which is
separate forge state that never auto-syncs from the repo; the check
stays offline and does not assert it.
GitHub mirror
A dunn.dev repo that is public, active and usable by an outsider is
push-mirrored to github.com/andrewdunndev/<repo>. Evidence stores,
archives, forks, sites, talks, lessons, catalogs, profiles, private
infrastructure and unmaintained repos are not mirrored. A mirrored repo
meets this baseline on both forges; contact is welcome on either.
| # | Requirement | Graded by |
|---|---|---|
| 1 | Mirror enabled and finished, no last_error, keep_divergent_refs false |
mirror-check |
| 2 | Visibility equal; GitHub archived exactly when GitLab is | mirror-check |
| 3 | Description (optional (mirror of gitlab.com/<path>) suffix), lowercased topics and homepage (the GitLab URL) match |
mirror-check |
| 4 | GitLab avatar slot set | mirror-check |
| 5 | GitHub issues on; wiki, projects, discussions and Dependabot off; owner subscribed | mirror-check |
| 6 | The latest GitLab release cut by a tag pipeline is on GitHub, through an included github-release; earlier releases are not backfilled |
mirror-check |
| 7 | README and CONTRIBUTING name both forges | mirror-check |
| 8 | Skeleton files | check.sh |
| 9 | README opens with the hero embed | check.sh |
| 10 | First three badges are pipeline, license, built with GitLab, with absolute URLs that return 200 anonymously | mirror-check |
| 11 | README shape: description, quickstart, progressive disclosure, one brand image | review |
| 12 | Nothing GitLab-only in README or CONTRIBUTING (](/-/, /uploads/, [[_TOC_]]); README images resolve on GitHub and are not LFS pointers |
mirror-check |
| 13 | Social preview set (1280x640 cut of the hero; the UI is the only setter) | mirror-check |
./scripts/mirror-check.sh grades the
mirror-check rows online with glab, gh and curl, GET only, and is
separate from check.sh, which stays offline:
bash repository/scripts/mirror-check.sh <repo>...
Contributor stanza for README and CONTRIBUTING:
## Contributing
Issues and changes are welcome on either forge:
GitLab (canonical): https://gitlab.com/dunn.dev/<repo> (issues, merge requests)
GitHub (mirror): https://github.com/andrewdunndev/<repo> (issues, pull requests)
GitHub pull requests are landed through GitLab; the mirror then marks them merged.
Deviations
A repo covered by a group-level pipeline cascade declares
repository/gitlab:only_allow_merge_if_pipeline_succeeds; see
Deviations for the format.
Templates
./templates/ holds the lift-and-replace starters: avatar.svg,
hero.svg and favicon.svg alongside two documented subdirectories,
the reusable 64-unit glyph vocabulary
(./templates/glyphs/README.md) and the
Astro consumer scaffold
(./templates/web-starter/README.md).
Lift, replace placeholders, regenerate the derived PNGs with
scripts/brand.sh, commit. A repo without its own metaphor yet leaves
the dunn.dev mark as the placeholder glyph and still carries the estate
identity.
See ./check.sh for the executable assertions.
curl https://reference.dunn.dev/standards/repository/index.md
check conformance
just -f ~/gitlab.com/dunn.dev/reference/justfile check