diff --git a/.gitignore b/.gitignore
index bbe42e1..8a07a3a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,13 @@
-# macOS-specific files
+# mise local overrides (the committed .mise.toml is the shared config)
+.mise.local.toml
+mise.local.toml
+
+# environment variables
+.env
+.env.*
+
+# editor and OS cruft
.DS_Store
+.idea/
+.vscode/
+*.swp
diff --git a/.mise.toml b/.mise.toml
index 8fff695..2b2ace3 100644
--- a/.mise.toml
+++ b/.mise.toml
@@ -40,3 +40,20 @@ run = "./scripts/refresh-icons.sh"
description = "Remove build output and dependencies"
dir = "docs"
run = "rm -rf dist node_modules .astro"
+
+# A `run` list, not `depends`: mise runs dependencies in parallel, and these
+# three have to happen in this order.
+[tasks.ci]
+description = "Run everything the CI build job runs, in the same order"
+run = ["mise run docs-install", "mise run docs-check", "mise run docs-build"]
+
+[tasks.ci-watch]
+description = "Watch GitHub Actions CI for the current branch; exits non-zero on failure"
+run = """
+sleep 5
+remote_url=$(git remote get-url upstream 2>/dev/null || git remote get-url origin)
+repo=$(echo "$remote_url" | sed -E 's|^.*github\\.com[:/]||; s|\\.git$||')
+run_id=$(gh run list --repo "$repo" --branch "$(git branch --show-current)" --limit 1 --json databaseId --jq '.[0].databaseId')
+if [ -z "$run_id" ]; then echo "No run found for current branch on $repo" >&2; exit 1; fi
+gh run watch --repo "$repo" --exit-status "$run_id"
+"""
diff --git a/AGENTS.md b/AGENTS.md
index eef9649..1087fec 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,5 +1,8 @@
# AGENTS.md
+This file (`AGENTS.md`) is the canonical agent configuration. `CLAUDE.md` is a
+symlink to this file.
+
Source for , an Astro Starlight landing page for the
[Lab271](https://github.com/Lab271) organization. The site lives in `docs/` (a
subdirectory, not the repo root) so it can sit alongside repo-level tooling like
@@ -24,8 +27,15 @@ mise run docs-check # astro check (type/content check)
mise run docs-build # static build into docs/dist
mise run docs-repos # regenerate docs/src/data/repos.json from the Lab271 org (needs `gh` auth)
mise run docs-icons # re-export the favicon PNGs from src/assets/badge.svg (needs librsvg)
+mise run docs-preview # serve the production build locally
+mise run docs-clean # remove dist, node_modules and .astro
+mise run ci # docs-install, docs-check, docs-build, as CI runs them
+mise run ci-watch # follow the GitHub Actions run for the current branch
```
+Run `mise run ci` before pushing, and `mise run ci-watch` after. Local success
+is not proof the workflow passes; only the real run is.
+
When starting the dev server directly (not via mise), use background mode:
`astro dev --background`, then `astro dev stop`/`status`/`logs`.
@@ -49,6 +59,8 @@ When starting the dev server directly (not via mise), use background mode:
docs-repos` rather than editing by hand.
- `scripts/refresh-repos.mjs`: what `mise run docs-repos` runs. Plain node, no
dependencies, so it works without `bun install`.
+ - `agents/issue-tracker.md`: the issue tracker and labels in use. Not part of
+ the site; Astro only builds `docs/src/`.
- `.github/workflows/ci.yml`: build and type-check on push/PR, plus a `zizmor`
job auditing the workflows themselves.
- `.github/workflows/deploy.yml`: builds and publishes `docs/dist` to GitHub
@@ -60,6 +72,26 @@ When starting the dev server directly (not via mise), use background mode:
afterwards instead of relying on the push event.
- `.github/dependabot.yml`: weekly updates for the `docs/` bun lockfile and the
GitHub Actions used in workflows.
+- `LICENSE`: proprietary, all rights reserved. The repository is public so
+ GitHub Pages can serve it, not so it can be reused.
+- `CONTRIBUTING.md`: this repository does not take third-party contributions.
+ Issues reporting a broken or inaccurate page are still welcome.
+
+## Agent skills
+
+### Git remote
+
+Use GitHub with the `gh` CLI. The remote is
+.
+
+### Issue tracker
+
+Use GitHub issues. See `docs/agents/issue-tracker.md`.
+
+### Triage labels
+
+Use needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix. See
+`docs/agents/issue-tracker.md`.
## Branding
@@ -102,7 +134,10 @@ meantime. The rules that shaped what is here:
(customer, demo, infrastructure and thesis repos). `docs-repos` filters to
public sources, and hand-written sections must do the same.
- Third-party GitHub Actions are pinned to a full commit SHA with a trailing
- `# vX.Y.Z` comment; Dependabot bumps them.
+ `# vX.Y.Z` comment; Dependabot bumps them. Audit with
+ `GH_TOKEN=$(gh auth token) zizmor --collect=all --strict-collection .github/`
+ and scope it to `.github/`: a bare `zizmor .` walks `docs/node_modules` and
+ reports on vendored dependencies' own workflows.
- `@astrojs/check` doesn't yet support TypeScript's native (7.x) compiler API,
so `docs/package.json` pins `typescript` to `^6`. See
`.github/dependabot.yml` for the corresponding ignore rule.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..a52e5d0
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,96 @@
+# Code of Conduct
+
+## Our Goal
+
+We aim to make participation in our community a harassment-free experience
+for everyone.
+
+We aim to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Any conduct which could reasonably be considered inappropriate in a
+professional setting is unacceptable.
+
+## Moderation
+
+Community leaders should take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the ability to remove or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and should communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to [@lsimons](https://github.com/lsimons) or, if you would rather not go to an individual maintainer, to [abuse@schubergphilis.com](mailto:abuse@schubergphilis.com). Complaints will be reviewed and investigated.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved for a specified period of time.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the Contributor Covenant, version 2.0,
+available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..fea5ccb
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,40 @@
+# Contributing
+
+This repository holds the source for , the Lab271
+open source landing page. It is maintained by Schuberg Philis and is **not
+open to third-party contributions**: it is a company-branded page, and its
+content and design are ours to decide.
+
+That does not mean feedback is unwelcome. Two things are useful:
+
+- **Something on the page is wrong, broken or out of date.** Open an
+ [issue](https://github.com/Lab271/lab271.github.io/issues). Wrong links,
+ a project described inaccurately, a broken layout and accessibility
+ problems are all worth reporting.
+- **You found a security problem.** Do not open an issue. Follow
+ [SECURITY.md](SECURITY.md) instead.
+
+Note that the list of repositories on the page is generated, not hand-written.
+It comes from the public, licensed repositories in the
+[Lab271](https://github.com/Lab271) organization, refreshed weekly by
+`.github/workflows/refresh-repos.yml`. To get a project listed or delisted,
+change the repository itself (its visibility, license or description) rather
+than this site.
+
+Everyone taking part is expected to follow the
+[Code of Conduct](CODE_OF_CONDUCT.md). Anything in this repository is governed
+by its [License](LICENSE).
+
+## For maintainers
+
+Setup, tasks and layout are in [README.md](README.md); the branding rules and
+the conventions an agent needs are in [AGENTS.md](AGENTS.md).
+
+- Work on a branch and open a pull request; `main` is what deploys.
+- `mise run ci` runs the same install, type-check and build that
+ `.github/workflows/ci.yml` runs. Run it before pushing.
+- After pushing, `mise run ci-watch` follows the real run.
+- Keep this repository structurally aligned with its sibling,
+ [schubergphilis.github.io](https://github.com/schubergphilis/schubergphilis.github.io):
+ same layout, same tasks, same workflows, diverging only on branding and
+ content.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..7f80102
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Proprietary License
+
+Copyright 2026 Schuberg Philis B.V. All rights reserved.
+
+This repository is published publicly so that the site it builds can be
+served from GitHub Pages. Publication does not grant a license to reuse it.
+
+No part of this repository may be copied, modified, distributed,
+sublicensed, published, or used in any form, in whole or in part, without
+the prior written permission of the copyright holder.
+
+The Lab271 and Schuberg Philis names, logos, wordmarks and other brand
+assets in this repository are trademarks of Schuberg Philis B.V. and are
+not licensed for use.
+
+The software is provided "as is", without warranty of any kind, express
+or implied.
+
+For permissions or inquiries, contact the copyright holder.
diff --git a/README.md b/README.md
index 103283d..2964d4c 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,12 @@ mise run docs-install # bun install
mise run docs-dev # dev server at http://localhost:4321/
mise run docs-build # static build into docs/dist
mise run docs-repos # regenerate the repo list from the Lab271 org
+mise run ci # install, check and build, exactly as CI does
+mise run ci-watch # follow the GitHub Actions run for the current branch
```
+`mise tasks` lists all of them.
+
## Publish
Every push to `main` runs `.github/workflows/deploy.yml`, which builds
@@ -32,13 +36,20 @@ The Pages source must be set to "GitHub Actions" in the repository settings.
- `docs/`: the Astro Starlight site. Landing page:
`docs/src/content/docs/index.mdx`.
- `.mise.toml`: pinned tools and dev/build tasks (run with `mise run `).
-- `.github/workflows/`: `ci.yml` (build and check on PRs) and `deploy.yml`
- (publish on push to main).
+- `.github/workflows/`: `ci.yml` (build and check on PRs), `deploy.yml`
+ (publish on push to main) and `refresh-repos.yml` (weekly repo-list refresh).
-Branding follows the Lab271 brand kit; see [AGENTS.md](AGENTS.md) for the rules
-the theme implements.
+Branding follows the Lab271 design refresh; see [AGENTS.md](AGENTS.md) for the
+rules the theme implements.
## Contributing
This repository is maintained by Schuberg Philis and is not open to
-third-party contributions.
+third-party contributions. Reports of a broken or inaccurate page are welcome:
+see [CONTRIBUTING.md](CONTRIBUTING.md), and
+[SECURITY.md](SECURITY.md) for anything security-related.
+
+## License
+
+Proprietary, all rights reserved. See [LICENSE](LICENSE). The repository is
+public so GitHub Pages can serve the site, not so the source can be reused.
diff --git a/docs/.gitignore b/docs/.gitignore
index 148f96b..6240da8 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -19,6 +19,3 @@ pnpm-debug.log*
# macOS-specific files
.DS_Store
-
-# generated font cache for scripts/refresh-marks.py
-scripts/.font-cache/
diff --git a/docs/agents/issue-tracker.md b/docs/agents/issue-tracker.md
new file mode 100644
index 0000000..9e0da9f
--- /dev/null
+++ b/docs/agents/issue-tracker.md
@@ -0,0 +1,39 @@
+# Issue tracker: GitHub
+
+Issues for this project are managed as GitHub issues.
+
+The issues live in the same remote as the source code (the GitHub default):
+.
+
+Use the `gh` CLI for all operations.
+
+You can learn about the `gh` issue CLI with `gh issue --help`.
+
+Note this file sits at `docs/agents/` for consistency with the other
+Schuberg Philis repositories. `docs/` is also the Astro site root here, but
+Astro only builds `docs/src/`, so nothing in `docs/agents/` is published.
+
+## Labels
+
+The following issue labels are used:
+
+```
+NAME DESCRIPTION COLOR
+bug Something isn't working #d73a4a
+documentation Improvements or additions to documentation #0075ca
+enhancement New feature or request #a2eeef
+needs-triage Maintainer needs to evaluate this issue #e6e6fa
+needs-info Waiting on reporter for more information #e6e6fa
+ready-for-agent Fully specified, ready for an autonomous agent #e6e6fa
+ready-for-human Requires human implementation #e6e6fa
+wontfix This will not be worked on #ffffff
+```
+
+The repository also carries GitHub's stock labels (`duplicate`,
+`good first issue`, `help wanted`, `invalid`, `question`) and two applied by
+automation to pull requests (`dependencies`, `javascript`). Prefer the set
+above when triaging.
+
+`good first issue` and `help wanted` are misleading here: this repository is
+not open to third-party contributions (see `CONTRIBUTING.md`). Do not apply
+them.