From 3e579d4a4b8dca31d9ce2fe61f4914c565b4a535 Mon Sep 17 00:00:00 2001 From: Ruslan Konviser Date: Thu, 1 Oct 2026 13:34:13 +0200 Subject: [PATCH 1/3] feat: ever selfhost logo, product and hosting logos, trademark note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Header: the ever® selfhost lockup, made like ever® works on ever.works (the same "ever®" outline; "selfhost" in its face, Fira Sans Light Italic, converted to outlines). Favicon (SVG, ICO, Apple touch icon): the Ever mark on this site's colours. - Logos next to the names they identify: the Ever product lockups on the home page, product and install pages and in the hosting chooser; the hosting providers' marks in the chooser, on the home page and next to the install settings. Where each file comes from: public/logos/README.md. - Footer: the trademark note the other Ever sites carry. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/k8s-build.yml | 4 +- .gitignore | 1 + README.md | 1 + apps/web/public/apple-touch-icon.png | Bin 0 -> 17892 bytes apps/web/public/favicon.ico | Bin 0 -> 6642 bytes apps/web/public/favicon.svg | 13 +-- apps/web/public/logo/ever-icon.svg | 1 + apps/web/public/logo/ever-selfhost.svg | 1 + apps/web/public/logos/README.md | 67 ++++++++++++ apps/web/public/logos/ever/demand.svg | 1 + apps/web/public/logos/ever/gauzy.svg | 1 + apps/web/public/logos/ever/rec.svg | 1 + apps/web/public/logos/ever/teams.svg | 1 + apps/web/public/logos/ever/traduora.svg | 1 + apps/web/public/logos/ever/works.svg | 1 + .../web/public/logos/vendors/digitalocean.svg | 1 + apps/web/public/logos/vendors/docker.svg | 1 + apps/web/public/logos/vendors/easypanel.svg | 1 + apps/web/public/logos/vendors/elestio.svg | 1 + apps/web/public/logos/vendors/helm.svg | 1 + apps/web/public/logos/vendors/heroku.svg | 1 + apps/web/public/logos/vendors/hostinger.svg | 1 + apps/web/public/logos/vendors/koyeb.svg | 1 + apps/web/public/logos/vendors/kubernetes.svg | 1 + apps/web/public/logos/vendors/netlify.svg | 1 + apps/web/public/logos/vendors/northflank.svg | 1 + apps/web/public/logos/vendors/railway.svg | 1 + apps/web/public/logos/vendors/render.svg | 1 + apps/web/public/logos/vendors/repocloud.svg | 1 + apps/web/src/app.css | 30 ++++++ apps/web/src/app.tsx | 17 ++- apps/web/src/components/Logo.tsx | 70 ++++++++++++ apps/web/src/components/ProductNav.tsx | 18 +++- apps/web/src/entry-server.tsx | 3 + apps/web/src/logos.test.ts | 47 ++++++++ apps/web/src/logos.ts | 101 ++++++++++++++++++ apps/web/src/routes/hosting.tsx | 18 +++- apps/web/src/routes/index.tsx | 78 ++++++++++++-- apps/web/src/routes/install/[product].tsx | 11 +- apps/web/tools/build-content.mjs | 6 +- tools/check-no-internals.mjs | 4 + 41 files changed, 479 insertions(+), 32 deletions(-) create mode 100644 apps/web/public/apple-touch-icon.png create mode 100644 apps/web/public/favicon.ico create mode 100644 apps/web/public/logo/ever-icon.svg create mode 100644 apps/web/public/logo/ever-selfhost.svg create mode 100644 apps/web/public/logos/README.md create mode 100644 apps/web/public/logos/ever/demand.svg create mode 100644 apps/web/public/logos/ever/gauzy.svg create mode 100644 apps/web/public/logos/ever/rec.svg create mode 100644 apps/web/public/logos/ever/teams.svg create mode 100644 apps/web/public/logos/ever/traduora.svg create mode 100644 apps/web/public/logos/ever/works.svg create mode 100644 apps/web/public/logos/vendors/digitalocean.svg create mode 100644 apps/web/public/logos/vendors/docker.svg create mode 100644 apps/web/public/logos/vendors/easypanel.svg create mode 100644 apps/web/public/logos/vendors/elestio.svg create mode 100644 apps/web/public/logos/vendors/helm.svg create mode 100644 apps/web/public/logos/vendors/heroku.svg create mode 100644 apps/web/public/logos/vendors/hostinger.svg create mode 100644 apps/web/public/logos/vendors/koyeb.svg create mode 100644 apps/web/public/logos/vendors/kubernetes.svg create mode 100644 apps/web/public/logos/vendors/netlify.svg create mode 100644 apps/web/public/logos/vendors/northflank.svg create mode 100644 apps/web/public/logos/vendors/railway.svg create mode 100644 apps/web/public/logos/vendors/render.svg create mode 100644 apps/web/public/logos/vendors/repocloud.svg create mode 100644 apps/web/src/components/Logo.tsx create mode 100644 apps/web/src/logos.test.ts create mode 100644 apps/web/src/logos.ts diff --git a/.github/workflows/k8s-build.yml b/.github/workflows/k8s-build.yml index 70509a4..f7b2985 100644 --- a/.github/workflows/k8s-build.yml +++ b/.github/workflows/k8s-build.yml @@ -109,7 +109,9 @@ jobs: if printf '%s' "$out" | grep -qi '^set-cookie:'; then echo "::error::a response set a cookie"; exit 1; fi } check /robots.txt 200 '^Disallow: /$' - check / 200 '.md` | the text of each install page | | `content/platform/*.md` | Ever Connect, anonymous usage statistics, free and paid | | `content/hosting/` | chooser text, the hosting list and its schema | +| `apps/web/public/logo/`, `apps/web/public/logos/` | this site's logo, and the logos of the Ever products and hosting providers (where each comes from: `logos/README.md`) | | `tools/` | repository checks, each with a self-test | | `deploy/docker/web/Dockerfile`, `deploy/docker/api/Dockerfile` | the two production images | diff --git a/apps/web/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f56607be8ce997e72ba9b8c2a021f9bb1b5cbe35 GIT binary patch literal 17892 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 Nl{{aj@NQE#{}00%SpEP2 literal 0 HcmV?d00001 diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a39bc5470afe2aa4f05d476115ec962801a5571 GIT binary patch literal 6642 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 - ever.sh - - - - - - - - - - +ever.sh diff --git a/apps/web/public/logo/ever-icon.svg b/apps/web/public/logo/ever-icon.svg new file mode 100644 index 0000000..ee9a589 --- /dev/null +++ b/apps/web/public/logo/ever-icon.svg @@ -0,0 +1 @@ +Ever diff --git a/apps/web/public/logo/ever-selfhost.svg b/apps/web/public/logo/ever-selfhost.svg new file mode 100644 index 0000000..442887d --- /dev/null +++ b/apps/web/public/logo/ever-selfhost.svg @@ -0,0 +1 @@ +ever.sh diff --git a/apps/web/public/logos/README.md b/apps/web/public/logos/README.md new file mode 100644 index 0000000..076e8a4 --- /dev/null +++ b/apps/web/public/logos/README.md @@ -0,0 +1,67 @@ +# Logos + +The logos ever.sh shows next to the names they identify: the Ever products and the places they +can run. Each mark is a trademark of its owner. It is used here for identification only, and its +use does not imply endorsement (the footer of every page says so). Apart from the two ever® +lockups made for this site (described below), the files are copies of the owners' artwork, not +redrawings; the notes say what was changed (a title for screen readers, a colour, a trimmed +canvas). + +On the dark theme, a mark whose colours do not read there is shown as the brand's white version +(`reverseOnDark` in `apps/web/src/logos.ts`). + +## This site (`../logo/`) + +| File | Source | +|---|---| +| `ever-icon.svg` | The Ever mark from the header of (the same mark heads ). Only the gradient layer is kept. | +| `ever-selfhost.svg` | The ever® selfhost wordmark. "ever®" is the exact outline of the ever® works wordmark in the header of . "selfhost" is set in Fira Sans Light Italic, the face of "works" there (same size, baseline and starting point; the outlines of "works" redrawn this way match the original), and converted to outlines. The font is from and is not part of this repository. | + +`../favicon.svg`, `../favicon.ico` and `../apple-touch-icon.png` are the Ever mark as the Ever +product sites use it for their favicons (), on this site's violet +gradient. + +## Ever products (`ever/`) + +The ever® lockups, each a single outline in the text colour, as on the products' own sites. + +| File | Source | +|---|---| +| `ever/gauzy.svg` | Header of | +| `ever/teams.svg` | Header of | +| `ever/works.svg` | Header of | +| `ever/rec.svg` | Header of | +| `ever/demand.svg` | The Ever products list in the footer of | +| `ever/traduora.svg` | Made like `../logo/ever-selfhost.svg`: "ever®" from , "traduora" in Fira Sans Light Italic. sets its name as text, so there is no outline to copy. | + +## Hosting providers (`vendors/`) + +Marks from [Simple Icons](https://github.com/simple-icons/simple-icons) 16.33.0 are filled with the +brand colour Simple Icons records for them. The others come from the owner's brand kit or website. + +| File | Source | Notes | +|---|---|---| +| `vendors/docker.svg` | Docker logo kit, | The mark in Ocean Blue (`docker-mark-ocean-blue.svg`). Simple Icons still has the previous whale and colour. | +| `vendors/kubernetes.svg` | | #326CE5 | +| `vendors/helm.svg` | | #0F1689; white on the dark theme | +| `vendors/hostinger.svg` | | #673DE6 | +| `vendors/railway.svg` | | #0B0D0E; white on the dark theme | +| `vendors/render.svg` | | #000000; white on the dark theme | +| `vendors/digitalocean.svg` | | #0080FF | +| `vendors/netlify.svg` | | #00C7B7 | +| `vendors/koyeb.svg` | | #121212; white on the dark theme | +| `vendors/easypanel.svg` | Easypanel brand assets, | The logomark, unchanged. | +| `vendors/heroku.svg` | Heroku logo kit, | The mark for light backgrounds (#5A1BA9), with the empty canvas around it trimmed; white (the kit's reversed version) on the dark theme. | +| `vendors/elestio.svg` | Elestio press kit, | The colour "e" symbol, taken with its mask from `elestio-logo-color.svg`; the kit has it as `elestio-icon-color-512px.png`. | +| `vendors/northflank.svg` | (the mark in the site header) | Unchanged. | +| `vendors/repocloud.svg` | | The app icon (white "RC" on RepoCloud blue, #3F00FF), from the site's pinned-tab outline. | + +Fly.io has no logo here: its brand guidelines () ask for +written permission before its logo is used. The chooser shows a neutral icon instead, as it does +for any host without a logo. + +## Adding a logo + +Copy the owner's SVG (or the Simple Icons one) into `vendors/`, add the host to `HOST_LOGOS` in +`apps/web/src/logos.ts` (a dark mark gets `reverseOnDark`), add a row above, and check it on both +themes. diff --git a/apps/web/public/logos/ever/demand.svg b/apps/web/public/logos/ever/demand.svg new file mode 100644 index 0000000..9a20a7c --- /dev/null +++ b/apps/web/public/logos/ever/demand.svg @@ -0,0 +1 @@ +Ever Demand diff --git a/apps/web/public/logos/ever/gauzy.svg b/apps/web/public/logos/ever/gauzy.svg new file mode 100644 index 0000000..1d4fb27 --- /dev/null +++ b/apps/web/public/logos/ever/gauzy.svg @@ -0,0 +1 @@ +Ever Gauzy diff --git a/apps/web/public/logos/ever/rec.svg b/apps/web/public/logos/ever/rec.svg new file mode 100644 index 0000000..99ca208 --- /dev/null +++ b/apps/web/public/logos/ever/rec.svg @@ -0,0 +1 @@ +Ever Rec diff --git a/apps/web/public/logos/ever/teams.svg b/apps/web/public/logos/ever/teams.svg new file mode 100644 index 0000000..a14e05d --- /dev/null +++ b/apps/web/public/logos/ever/teams.svg @@ -0,0 +1 @@ +Ever Teams diff --git a/apps/web/public/logos/ever/traduora.svg b/apps/web/public/logos/ever/traduora.svg new file mode 100644 index 0000000..761d8ca --- /dev/null +++ b/apps/web/public/logos/ever/traduora.svg @@ -0,0 +1 @@ +Ever Traduora diff --git a/apps/web/public/logos/ever/works.svg b/apps/web/public/logos/ever/works.svg new file mode 100644 index 0000000..70cdc22 --- /dev/null +++ b/apps/web/public/logos/ever/works.svg @@ -0,0 +1 @@ +Ever Works diff --git a/apps/web/public/logos/vendors/digitalocean.svg b/apps/web/public/logos/vendors/digitalocean.svg new file mode 100644 index 0000000..e038c6e --- /dev/null +++ b/apps/web/public/logos/vendors/digitalocean.svg @@ -0,0 +1 @@ +DigitalOcean diff --git a/apps/web/public/logos/vendors/docker.svg b/apps/web/public/logos/vendors/docker.svg new file mode 100644 index 0000000..a2e6d5d --- /dev/null +++ b/apps/web/public/logos/vendors/docker.svg @@ -0,0 +1 @@ +Docker diff --git a/apps/web/public/logos/vendors/easypanel.svg b/apps/web/public/logos/vendors/easypanel.svg new file mode 100644 index 0000000..a219033 --- /dev/null +++ b/apps/web/public/logos/vendors/easypanel.svg @@ -0,0 +1 @@ +Easypanel diff --git a/apps/web/public/logos/vendors/elestio.svg b/apps/web/public/logos/vendors/elestio.svg new file mode 100644 index 0000000..2e26bb9 --- /dev/null +++ b/apps/web/public/logos/vendors/elestio.svg @@ -0,0 +1 @@ +Elestio diff --git a/apps/web/public/logos/vendors/helm.svg b/apps/web/public/logos/vendors/helm.svg new file mode 100644 index 0000000..88e38cb --- /dev/null +++ b/apps/web/public/logos/vendors/helm.svg @@ -0,0 +1 @@ +Helm diff --git a/apps/web/public/logos/vendors/heroku.svg b/apps/web/public/logos/vendors/heroku.svg new file mode 100644 index 0000000..4f622fc --- /dev/null +++ b/apps/web/public/logos/vendors/heroku.svg @@ -0,0 +1 @@ +Heroku diff --git a/apps/web/public/logos/vendors/hostinger.svg b/apps/web/public/logos/vendors/hostinger.svg new file mode 100644 index 0000000..a571559 --- /dev/null +++ b/apps/web/public/logos/vendors/hostinger.svg @@ -0,0 +1 @@ +Hostinger diff --git a/apps/web/public/logos/vendors/koyeb.svg b/apps/web/public/logos/vendors/koyeb.svg new file mode 100644 index 0000000..a51b93c --- /dev/null +++ b/apps/web/public/logos/vendors/koyeb.svg @@ -0,0 +1 @@ +Koyeb diff --git a/apps/web/public/logos/vendors/kubernetes.svg b/apps/web/public/logos/vendors/kubernetes.svg new file mode 100644 index 0000000..4e0334d --- /dev/null +++ b/apps/web/public/logos/vendors/kubernetes.svg @@ -0,0 +1 @@ +Kubernetes diff --git a/apps/web/public/logos/vendors/netlify.svg b/apps/web/public/logos/vendors/netlify.svg new file mode 100644 index 0000000..e68b275 --- /dev/null +++ b/apps/web/public/logos/vendors/netlify.svg @@ -0,0 +1 @@ +Netlify diff --git a/apps/web/public/logos/vendors/northflank.svg b/apps/web/public/logos/vendors/northflank.svg new file mode 100644 index 0000000..d5da39b --- /dev/null +++ b/apps/web/public/logos/vendors/northflank.svg @@ -0,0 +1 @@ +Northflank diff --git a/apps/web/public/logos/vendors/railway.svg b/apps/web/public/logos/vendors/railway.svg new file mode 100644 index 0000000..58f361f --- /dev/null +++ b/apps/web/public/logos/vendors/railway.svg @@ -0,0 +1 @@ +Railway diff --git a/apps/web/public/logos/vendors/render.svg b/apps/web/public/logos/vendors/render.svg new file mode 100644 index 0000000..db84d65 --- /dev/null +++ b/apps/web/public/logos/vendors/render.svg @@ -0,0 +1 @@ +Render diff --git a/apps/web/public/logos/vendors/repocloud.svg b/apps/web/public/logos/vendors/repocloud.svg new file mode 100644 index 0000000..57262fd --- /dev/null +++ b/apps/web/public/logos/vendors/repocloud.svg @@ -0,0 +1 @@ +RepoCloud diff --git a/apps/web/src/app.css b/apps/web/src/app.css index c3c9058..cb1ea66 100644 --- a/apps/web/src/app.css +++ b/apps/web/src/app.css @@ -201,6 +201,36 @@ @apply text-xs text-muted-foreground; } + /* Logos (`~/components/Logo.tsx`): an that keeps its proportions in the box its width and + height attributes reserve. */ + .logo { + display: inline-block; + flex: none; + object-fit: contain; + } + + /* On the dark theme, a mark whose own colours do not read there (black, or a dark brand colour) + is shown as the brand's white version: a white silhouette of the same mark. */ + @media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) .logo-reverse-dark { + filter: brightness(0) invert(1); + } + } + + :root[data-theme="dark"] .logo-reverse-dark { + filter: brightness(0) invert(1); + } + + /* The neutral icons (a server, a cloud, a file) are drawn in the muted text colour. */ + .neutral-icon { + flex: none; + color: hsl(var(--muted-foreground)); + } + + .footer-note { + @apply max-w-[900px] text-xs leading-5 text-muted-foreground; + } + .notice { @apply rounded-lg border border-border bg-muted px-4 py-3 text-sm; } diff --git a/apps/web/src/app.tsx b/apps/web/src/app.tsx index f3c5db8..c0c04ad 100644 --- a/apps/web/src/app.tsx +++ b/apps/web/src/app.tsx @@ -10,14 +10,19 @@ import { Router } from "@solidjs/router"; import { FileRoutes } from "@solidjs/start/router"; import { ErrorBoundary, For, Suspense } from "solid-js"; +import { Logo } from "./components/Logo"; +import { EVER_MARK, SITE_WORDMARK } from "./logos"; import { PRODUCTS } from "./products"; function Header() { return (
+ {/* The trademark note the other Ever sites carry under their footer, word for word. */} +
+ +
); } diff --git a/apps/web/src/components/Logo.tsx b/apps/web/src/components/Logo.tsx new file mode 100644 index 0000000..dc67c8d --- /dev/null +++ b/apps/web/src/components/Logo.tsx @@ -0,0 +1,70 @@ +/** + * Logos and the two neutral icons, all static markup: a logo is an `` of its SVG file, an + * icon is inline SVG in the text colour. Nothing here needs JavaScript in the browser. + */ +import { Show } from "solid-js"; + +import type { Logo as LogoFile } from "~/logos"; + +/** + * A logo, `height` pixels tall (or `unit` pixels per unit of the file's viewBox, which keeps the + * ever® part of every Ever lockup the same size); the width follows the logo's proportions. `alt` + * defaults to the brand's name; pass "" where the same name is already written next to it. + */ +export function Logo(props: { + logo: LogoFile; + height?: number; + unit?: number; + alt?: string; + class?: string; +}) { + const height = () => props.height ?? props.logo.height * (props.unit ?? 1); + const width = () => (props.logo.width / props.logo.height) * height(); + return ( + {props.alt + ); +} + +/** + * A neutral icon where there is no brand logo: a server (running it yourself), a cloud (a host + * without a logo) or a file (the environment file of an install page). + */ +export function NeutralIcon(props: { kind: "server" | "cloud" | "file"; size?: number }) { + const size = () => props.size ?? 24; + return ( + + ); +} diff --git a/apps/web/src/components/ProductNav.tsx b/apps/web/src/components/ProductNav.tsx index 78b0cd6..a7cb856 100644 --- a/apps/web/src/components/ProductNav.tsx +++ b/apps/web/src/components/ProductNav.tsx @@ -1,10 +1,13 @@ /** - * A product's breadcrumbs and sub-navigation: its guide pages (only those that exist; a missing - * content file simply has no tab) and, for installable products, the install page. + * A product's breadcrumbs and sub-navigation: the product's own lockup, its guide pages (only + * those that exist; a missing content file simply has no tab) and, for installable products, the + * install page. */ import { For, Show } from "solid-js"; +import { Logo } from "~/components/Logo"; import { productTabs } from "~/content"; +import { PRODUCT_LOGOS } from "~/logos"; import { installable, type Product } from "~/products"; export function ProductNav(props: { product: Product; current: string; currentLabel?: string }) { @@ -29,8 +32,15 @@ export function ProductNav(props: { product: Product; current: string; currentLa )} -