Skip to content

feat(cairn): add cairn, a guest-first directory page - #995

Open
MorganKryze wants to merge 1 commit into
IceWhaleTech:mainfrom
MorganKryze:add-cairn
Open

feat(cairn): add cairn, a guest-first directory page#995
MorganKryze wants to merge 1 commit into
IceWhaleTech:mainfrom
MorganKryze:add-cairn

Conversation

@MorganKryze

Copy link
Copy Markdown

What this is: a new app.

What changed: adds Apps/cairn/, one docker-compose.yml plus icon.svg,
thumbnail.png and three screenshots. It touches nothing else in the tree.

What cairn is: the directory page for the people you host services for. You
hand it to your family, your club or your members. One YAML file in, a static
multilingual page out, with no account to create, no database and no outbound
requests. Each service can show a live status pill pulled from Gatus or Uptime
Kuma, and cairn serves its own legal and privacy pages, which associations and
small hosts need.

I'm its author. Tell me if anything below is in the wrong shape and I'll fix it.

Why it fits here: I read the 166 app folders under Apps/ and found no start
page or service directory, so cairn overlaps with nothing you already carry.

How I validated it, on a fresh clone with the app in place:

  • validate_compose.py --app-path cairn: 0 errors, 0 warnings
  • docker compose config -q: passes
  • ./scripts/build_dist.sh: completes, 167 apps, dist/apps/org.icewhale.cairn/
    generated with meta.json, the seven meta.{locale}.json files and all assets
  • dist/apps/org.icewhale.cairn/docker-compose.yml: still carries read_only,
    cap_drop: ALL, no-new-privileges and the read-only /config bind

Notes for review:

  • The image is FROM scratch, two files and 4.4 MB to pull on amd64, 4.0 on
    arm64. It writes nothing at runtime, hence read_only with every capability
    dropped. The image has no shell, so the healthcheck is the binary probing
    itself: /cairn -healthcheck.
  • No environment variables at all. cairn is configured by files, and it needs
    no secret to run. The one credential it can want is optional, for status pills
    against an authenticated monitoring API, and cairn reads it from a file path
    set in the YAML.
  • The first run works with an empty /config: cairn serves a getting-started
    page explaining what to do. Drop a services.yaml in and it reloads within
    seconds, no restart. That is what tips.before_install says.
  • I used org.icewhale.cairn for the id to match the convention I saw on the
    other apps. Happy to change it if you'd rather namespace third-party
    submissions differently.
  • Metadata is localized into eight languages: en_US, fr_FR, de_DE, es_ES,
    it_IT, nl_NL, pt_PT and sv_SE. Those are the eight languages cairn's own
    interface ships, so the store card speaks what the product speaks. Each
    translation follows the register of cairn's string table: formal in German,
    Spanish, Dutch and Portuguese, informal in Italian, European rather than
    Brazilian Portuguese.

Links:

Thanks for keeping the store open to outside submissions.

cairn is the directory page you hand to the people you host services for:
one YAML file in, a static multilingual page out, with no account to
create, no database and no outbound requests. Each service can show a live
status pill pulled from Gatus or Uptime Kuma.

Adds Apps/cairn with the compose, icon.svg, a thumbnail and three
screenshots. Store metadata is localized into the eight languages cairn's
own interface already ships.
@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2026

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant