← Standards

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

![hero](hero.svg)

# <namespace>/<repo>

[![pipeline](badge)](pipeline-url)
[![license](badge)](LICENSE)
![built with GitLab](badge)

<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.

fetch as markdown
curl https://reference.dunn.dev/standards/repository/index.md
check conformance
just -f ~/gitlab.com/dunn.dev/reference/justfile check