Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
name: ci

# The org profile README is the company homepage (yellowpine.com redirects here), so its
# invariants are tested: assets resolve, brand SVGs are real vectors, and — because the
# tests fetch without credentials — every linked repo is publicly visible and every
# product link is live. The weekly cron catches links that die between pushes.
# The org profile README is the org's front page on GitHub (the company homepage itself is
# yellowpine.com, built from yellow-pine/yellow-pine.github.io, not from here). The README's
# invariants are what this workflow tests: assets resolve, brand SVGs are real vectors, and —
# because the tests fetch without credentials — every linked repo is publicly visible and
# every product link is live. The weekly cron catches links that die between pushes.
on:
push:
branches: [main]
Expand Down
25 changes: 15 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
# .github — the Yellow Pine homepage
# .github — the Yellow Pine org profile

Organization-wide GitHub configuration for **Yellow Pine**. Because yellowpine.com
redirects to [github.com/yellow-pine](https://github.com/yellow-pine), the org profile
rendered from this repository **is** the company homepage.
Organization-wide GitHub configuration for **Yellow Pine**. The company homepage is
[yellowpine.com](https://yellowpine.com). The org profile rendered from this repository is
what every visitor to [github.com/yellow-pine](https://github.com/yellow-pine) lands on, so
it is held to the publish rule below and to the invariants in [`tests/`](tests/) — but it is
not the homepage itself.

## Contents

- [`profile/README.md`](profile/README.md) — the public org profile / homepage.
- [`profile/README.md`](profile/README.md) — the public org profile.
- [`brand/`](brand/) — the canonical public brand library: hand-cleaned SVG masters
(logo, dark variant, tile icon, bare mark), palette, and usage rules. The full Brandmark
export archive and raster generators live in the private `yellow-pine/brand-assets` repo.
- [`tests/`](tests/) — homepage invariants, run by [CI](.github/workflows/ci.yml) on every
- [`tests/`](tests/) — profile invariants, run by [CI](.github/workflows/ci.yml) on every
push and weekly: every referenced asset exists, brand SVGs are real vectors, every
linked repo is publicly visible **without auth** (nothing private can leak onto the
homepage), and every product link is live.
profile), and every product link is live.

## The publish rule

A project appears on the homepage only if it is a public repo, or a private repo with a
live public website. The tests enforce the mechanical half of this: they fetch every
`github.com/yellow-pine/*` link anonymously and fail on anything not public.
A project is publishable — on the profile, on yellowpine.com, anywhere Yellow Pine speaks
publicly — only if it is a public repo, or a private repo with a live public website. The
rule is company-wide; what is scoped is the enforcement. The tests here cover the mechanical
half **for the profile**: they fetch every `github.com/yellow-pine/*` link anonymously and
fail on anything not public. The website repo inherits the rule and enforces it the same way
against its own page.

```sh
npm test # run the invariants locally
Expand Down
2 changes: 1 addition & 1 deletion brand/design/build-boards.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ ${FOOT}`);
<h2>Terminal</h2>
<div style="background: #202020; border-radius: 14px; padding: 24px 26px; font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.9">
<div><span style="color: #FFD100">➜</span> <span style="color: #3C91E6">~/code</span> <span style="color: #FCFCFC">gh repo view yellow-pine/.github</span></div>
<div style="color: #9a9a98">The Yellow Pine homepage — org profile, public brand library, and org-wide config.</div>
<div style="color: #9a9a98">The Yellow Pine org profile, public brand library, and org-wide config.</div>
<div><span style="color: #FFD100">➜</span> <span style="color: #3C91E6">~/code</span> <span style="color: #FCFCFC">git push</span> <span style="color: #9a9a98"># built with 💛 by a tiny human team and a fleet of agents</span></div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion brand/design/canvas/Applications.dc.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ <h2>Browser tabs</h2>
<h2>Terminal</h2>
<div style="background: #202020; border-radius: 14px; padding: 24px 26px; font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.9">
<div><span style="color: #FFD100">➜</span> <span style="color: #3C91E6">~/code</span> <span style="color: #FCFCFC">gh repo view yellow-pine/.github</span></div>
<div style="color: #9a9a98">The Yellow Pine homepage — org profile, public brand library, and org-wide config.</div>
<div style="color: #9a9a98">The Yellow Pine org profile, public brand library, and org-wide config.</div>
<div><span style="color: #FFD100">➜</span> <span style="color: #3C91E6">~/code</span> <span style="color: #FCFCFC">git push</span> <span style="color: #9a9a98"># built with 💛 by a tiny human team and a fleet of agents</span></div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@yellow-pine/dot-github",
"private": true,
"description": "Org-wide GitHub configuration + the public Yellow Pine profile (the company homepage).",
"description": "Org-wide GitHub configuration + the public Yellow Pine profile and brand library.",
"type": "module",
"scripts": {
"test": "node --test tests/profile.test.mjs tests/design.test.mjs",
Expand Down
14 changes: 7 additions & 7 deletions tests/profile.test.mjs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// Invariants for the Yellow Pine org homepage (profile/README.md) and the brand library.
// Invariants for the Yellow Pine org profile (profile/README.md) and the brand library.
//
// yellowpine.com redirects to github.com/yellow-pine, so profile/README.md IS the company
// homepage — these tests are the gate that keeps it publishable:
// The company homepage is yellowpine.com. profile/README.md is what every visitor to
// github.com/yellow-pine lands on — these tests are the gate that keeps it publishable:
//
// 1. Every relative asset a README references must exist in the repo.
// 2. Every github.com/yellow-pine/* link must be reachable WITHOUT auth — the publish
// rule expressed without naming any repo: a link to a private repo 404s for the
// anonymous public and fails here.
// 3. Every external product link must be live (a dead product link on the homepage is
// 3. Every external product link must be live (a dead product link on the profile is
// worse than no link).
// 4. brand/ must hold real vector SVGs (light + dark logo, icon) — no raster embeds.
//
Expand Down Expand Up @@ -84,7 +84,7 @@ const skipNetwork = process.env.SKIP_NETWORK === '1';

test('profile/README.md exists and is substantial', () => {
assert.ok(existsSync(join(repoRoot, PROFILE)), 'profile/README.md missing');
assert.ok(read(PROFILE).length > 500, 'profile/README.md is too thin to be the homepage');
assert.ok(read(PROFILE).length > 500, 'profile/README.md is too thin to be the org profile');
});

test('every local asset referenced by a README exists', () => {
Expand Down Expand Up @@ -119,11 +119,11 @@ test('brand SVGs are real vectors', () => {
}
});

// --- the homepage's links must hold up for the anonymous public --------------------
// --- the profile's links must hold up for the anonymous public ---------------------

test('every yellow-pine GitHub link is publicly reachable without auth', { skip: skipNetwork }, async () => {
const orgLinks = externalLinks().filter((u) => u.startsWith('https://github.com/yellow-pine'));
assert.ok(orgLinks.length >= 1, 'homepage should link at least one yellow-pine repo');
assert.ok(orgLinks.length >= 1, 'the profile should link at least one yellow-pine repo');
for (const url of orgLinks) {
const status = await fetchStatus(url);
assert.equal(status, 200, `${url} is not publicly visible without auth (HTTP ${status})`);
Expand Down
Loading