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
28 changes: 21 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# AGENTS.md

Guidance for coding agents working on the Ghost Assembly organization site,
<https://ghost-assembly.github.io/>. Read `README.md` for the human overview; this file
<https://ghost-assembly.com/>. Read `README.md` for the human overview; this file
holds the rules that are not obvious from the code.

## What gets published
Expand All @@ -11,9 +11,21 @@ holds the rules that are not obvious from the code.
- **Everything in `docs/` is public, and nothing outside it is.** Keep tooling, tests,
the design notes and the source logo out of `docs/`.
- `docs/.nojekyll` disables Jekyll. Do not remove it.
- The project docs at `/quickmusic/`, `/quickrem/`, `/quicktiler/` and `/quickts/` are
published from those projects' own repositories. Never create `docs/quickrem/` (or any
other project name) here — it would collide with them.
- The project docs at `/quickclip/`, `/quickmusic/`, `/quickrem/`, `/quicktiler/` and
`/quickts/` are published from those projects' own repositories. Never create
`docs/quickrem/` (or any other project name) here — it would collide with them.
GhostDock has no docs site, so it has no slug here; its card is Source only.

## Domain

- The site is served at `https://ghost-assembly.com/`, set by `docs/CNAME`. Do not
remove or edit that file as routine work.
- Each project's docs site inherits the same domain, `https://ghost-assembly.com/<slug>/`,
from that project's own repository and `CNAME` — not from anything in this repo.
- HTTPS enforcement (`https_enforced`) is a GitHub Pages account/repository setting, not
something this repo configures or assumes.
- Never hardcode `ghost-assembly.github.io` in new content. The old host still resolves
and redirects, but new links and metadata point at `ghost-assembly.com`.

## Hard constraints

Expand Down Expand Up @@ -65,9 +77,9 @@ WebKit is not supported on the maintainer's Fedora base, so do not add it.

A project appears in three places, and all three must change together:

1. `docs/index.html` — an `<article class="project">` in the right group. Link Docs to
`https://ghost-assembly.github.io/<slug>/` only if that project publishes a docs
site; otherwise give it Source only.
1. `docs/index.html` — an `<article class="project">` in the right group. Docs link
only where a docs site exists, at `https://ghost-assembly.com/<slug>/`; otherwise
Source only.
2. `tests/site.spec.js` — the `projects` list at the top, so its links are checked.
3. The org profile README, `profile/README.md` in the separate
[Ghost-Assembly/.github](https://github.com/Ghost-Assembly/.github) repository.
Expand All @@ -87,5 +99,7 @@ recipe are the measured bounds of the emblem and the whole logo in the 1254px so
- Branch from `main`, open a pull request, and squash-merge once the `ci` job (which
runs `just ci`) passes.
- Conventional Commits, imperative subject, no trailing period.
- American English spelling throughout (color, behavior, license, organization,
standardize). Keep third-party identifiers and quoted messages as they are.
- Third-party GitHub Actions are pinned by commit SHA with the version in a comment.
- `design/` holds the agreed design notes. Update them when the design changes.
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

[![ci](https://github.com/Ghost-Assembly/ghost-assembly.github.io/actions/workflows/ci.yml/badge.svg)](https://github.com/Ghost-Assembly/ghost-assembly.github.io/actions/workflows/ci.yml)

The Ghost Assembly organization site: **<https://ghost-assembly.github.io/>**.
The Ghost Assembly organization site: **<https://ghost-assembly.com/>**.

One hand-written page listing the org's projects, with links to each one's docs and
source. No framework, no build step and no JavaScript on the page — `docs/` is what
GitHub Pages serves, as-is.

Each project publishes its own docs from its own repository's `docs/` folder, at
`https://ghost-assembly.github.io/<project>/`. This repository only owns the root.
`https://ghost-assembly.com/<project>/`. This repository only owns the root.

## Develop

Expand All @@ -25,9 +25,14 @@ just ci # everything CI runs: lint, test, security, build

## Adding a project

Add an `<article class="project">` to the right group in `docs/index.html`, and add it
to the `projects` list at the top of `tests/site.spec.js` so the suite checks its
links. A project with no docs site gets a Source link only.
A project appears in three places, and all three must change together:

1. An `<article class="project">` in the right group in `docs/index.html`. A project
with no docs site gets a Source link only.
2. An entry in the `projects` list at the top of `tests/site.spec.js`, so the suite
checks its links.
3. The org profile README, `profile/README.md` in the separate
[Ghost-Assembly/.github](https://github.com/Ghost-Assembly/.github) repository.

## Images

Expand Down
13 changes: 13 additions & 0 deletions design/2026-09-24-org-hub-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,16 @@ Pattern sources to copy/adapt: `quickrem/justfile`, `quickrem/mise.toml`,
shared with the user.
- After Pages is enabled: `xh -h https://ghost-assembly.github.io/` returns 200, and the
existing `/quickrem/`, `/quicktiler/`, `/quickts/` docs still resolve.

## Amendment — 2026-09-26: custom domain and GhostDock

- The org bought `ghost-assembly.com`. `docs/CNAME` now points GitHub Pages at it, and
every absolute URL on the page (og:url, og:image, project Docs links) points at the
new domain instead of `ghost-assembly.github.io`. Each project's own docs site
inherits the domain the same way, from its own repository.
- The project list grew to seven: QuickClip, QuickMusic, QuickRem, QuickTiler and
QuickTS (GNOME Shell extensions), awsdiag (command-line), and GhostDock, a new
self-hosted Docker Compose manager, in a third group, "Self-hosted services", placed
after "Command-line tools". GhostDock publishes no docs site, so its card is Source
only, like awsdiag.
- Footer text and copyright year are unchanged.
99 changes: 72 additions & 27 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<title>Ghost Assembly</title>
<meta
name="description"
content="Ghost Assembly builds open-source GNOME Shell extensions and command-line tools: QuickMusic, QuickRem, QuickTiler, QuickTS and awsdiag."
content="Ghost Assembly builds open-source GNOME Shell extensions, command-line tools and self-hosted services: QuickClip, QuickMusic, QuickRem, QuickTiler, QuickTS, awsdiag and GhostDock."
/>
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#03030a" />
Expand All @@ -28,10 +28,10 @@
property="og:description"
content="Small, sharp tools for the Linux desktop and the cloud."
/>
<meta property="og:url" content="https://ghost-assembly.github.io/" />
<meta property="og:url" content="https://ghost-assembly.com/" />
<meta
property="og:image"
content="https://ghost-assembly.github.io/assets/og-image.png"
content="https://ghost-assembly.com/assets/og-image.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
Expand Down Expand Up @@ -67,8 +67,9 @@ <h1 id="title">
Small, sharp tools for the Linux desktop and the cloud.
</p>
<p class="lede">
Open-source GNOME Shell extensions and command-line tools. Each one
does a single job and stays out of your way.
Open-source GNOME Shell extensions, command-line tools and
self-hosted services. Each one does a single job and stays out of
your way.
</p>
<p class="actions">
<a class="button primary" href="#projects">Browse projects</a>
Expand All @@ -85,20 +86,38 @@ <h2 id="projects-title">Projects</h2>

<section class="group" aria-labelledby="gnome-title">
<h3 id="gnome-title">GNOME Shell extensions</h3>
<p class="group-intro">
Quick Settings tiles and keyboard tiling for GNOME Shell.
</p>
<p class="group-intro">Quick Settings tiles for GNOME Shell.</p>
<div class="list">
<article class="project">
<h4>QuickClip</h4>
<p class="meta">GNOME 50</p>
<p>
A private clipboard history in Quick Settings, with
developer transforms. Copies are kept in memory only,
and anything a password manager marks as secret is
skipped.
</p>
<p class="links">
<a href="https://ghost-assembly.com/quickclip/"
>Docs<span class="vh"> for QuickClip</span></a
>
<a href="https://github.com/Ghost-Assembly/quickclip"
>Source<span class="vh"> for QuickClip</span></a
>
</p>
</article>

<article class="project">
<h4>QuickMusic</h4>
<p class="meta">GNOME 50</p>
<p>
What is playing, in Quick Settings and the top bar.
Play, pause and skip in Spotify or any other MPRIS
player without leaving the panel.
What is playing, in Quick Settings and the top bar, with
play/pause, previous and next for any MPRIS player. It
follows whichever player started most recently, or stays
on one you pin.
</p>
<p class="links">
<a href="https://ghost-assembly.github.io/quickmusic/"
<a href="https://ghost-assembly.com/quickmusic/"
>Docs<span class="vh"> for QuickMusic</span></a
>
<a href="https://github.com/Ghost-Assembly/quickmusic"
Expand All @@ -111,12 +130,12 @@ <h4>QuickMusic</h4>
<h4>QuickRem</h4>
<p class="meta">GNOME 49–50</p>
<p>
Your saved Remmina connections in the Quick Settings
panel. The list follows Remmina’s profile folder as it
changes, so a new connection appears without a reload.
Your saved Remmina connections in Quick Settings,
following the profile folder as it changes. It never
reads Remmina’s stored passwords.
</p>
<p class="links">
<a href="https://ghost-assembly.github.io/quickrem/"
<a href="https://ghost-assembly.com/quickrem/"
>Docs<span class="vh"> for QuickRem</span></a
>
<a href="https://github.com/Ghost-Assembly/quickrem"
Expand All @@ -129,12 +148,13 @@ <h4>QuickRem</h4>
<h4>QuickTiler</h4>
<p class="meta">GNOME 49–50</p>
<p>
Keyboard-driven zone tiling. Press a direction again to
cycle the window through quarter, half and center zones,
with no overlay and no timers.
Keyboard-driven zone tiling with a Quick Settings tile,
no overlay and no timers. Press a direction again and
the focused window cycles through the zones on that
side.
</p>
<p class="links">
<a href="https://ghost-assembly.github.io/quicktiler/"
<a href="https://ghost-assembly.com/quicktiler/"
>Docs<span class="vh"> for QuickTiler</span></a
>
<a href="https://github.com/Ghost-Assembly/quicktiler"
Expand All @@ -147,12 +167,14 @@ <h4>QuickTiler</h4>
<h4>QuickTS</h4>
<p class="meta">GNOME 50</p>
<p>
Tailscale in Quick Settings. Toggle the tailnet, pick an
exit node, switch profiles and send files over Taildrop
without leaving the panel.
Tailscale in Quick Settings: toggle the tailnet, pick an
exit node, switch profiles, ping nodes and send or
receive Taildrop files. If tailscaled refuses its
socket, the menu says so instead of showing a tailnet
that looks silently disconnected.
</p>
<p class="links">
<a href="https://ghost-assembly.github.io/quickts/"
<a href="https://ghost-assembly.com/quickts/"
>Docs<span class="vh"> for QuickTS</span></a
>
<a href="https://github.com/Ghost-Assembly/quickts"
Expand All @@ -173,9 +195,10 @@ <h3 id="cli-title">Command-line tools</h3>
<h4>awsdiag</h4>
<p class="meta">Rust</p>
<p>
Fast, compact AWS diagnostic data collection. Built to
be driven by an AI agent during troubleshooting, and
just as usable by hand.
Fast, compact AWS diagnostic data collection, built to
be driven by an AI agent and rendered into a single
self-contained HTML report. It is just as usable by
hand.
</p>
<p class="links">
<a href="https://github.com/Ghost-Assembly/awsdiag"
Expand All @@ -185,6 +208,28 @@ <h4>awsdiag</h4>
</article>
</div>
</section>

<section class="group" aria-labelledby="selfhosted-title">
<h3 id="selfhosted-title">Self-hosted services</h3>
<p class="group-intro">Software you run on your own hardware.</p>
<div class="list">
<article class="project">
<h4>GhostDock</h4>
<p class="meta">Rust · Docker Compose</p>
<p>
A self-hosted, mobile-first manager for Docker Compose
stacks, with Git-backed deploys and update checks. It
follows Docker’s own events, so the board updates live
as containers start, stop or turn unhealthy.
</p>
<p class="links">
<a href="https://github.com/Ghost-Assembly/ghostdock"
>Source<span class="vh"> for GhostDock</span></a
>
</p>
</article>
</div>
</section>
</section>
</main>

Expand Down
6 changes: 4 additions & 2 deletions tests/site.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@ import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

const org = 'https://github.com/Ghost-Assembly';
const pages = 'https://ghost-assembly.github.io';
const pages = 'https://ghost-assembly.com';

// Every project on the page, and the links its card must carry. A project with
// no docs site has `docs: null`, and its card must not grow a Docs link.
// no docs site has `docs: false`, and its card must not grow a Docs link.
const projects = [
{ name: 'QuickClip', slug: 'quickclip', docs: true },
{ name: 'QuickMusic', slug: 'quickmusic', docs: true },
{ name: 'QuickRem', slug: 'quickrem', docs: true },
{ name: 'QuickTiler', slug: 'quicktiler', docs: true },
{ name: 'QuickTS', slug: 'quickts', docs: true },
{ name: 'awsdiag', slug: 'awsdiag', docs: false },
{ name: 'GhostDock', slug: 'ghostdock', docs: false },
];

test('loads every asset from its own origin, without errors', async ({
Expand Down
Loading