From 91aa33b8911efe5662563a49f9385f40d3f5506b Mon Sep 17 00:00:00 2001 From: Daniel Maksymilian Syrnicki Date: Mon, 28 Sep 2026 15:08:49 +0200 Subject: [PATCH] =?UTF-8?q?feat(brand):=20Mark=20M=20is=20the=20Furtka=20l?= =?UTF-8?q?ogo=20=E2=80=94=20website,=20installer,=20box=20UI,=20console,?= =?UTF-8?q?=20boot=20splash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The logo vote on furtka.org closed with M 29 · R 13 (42 votes). - website/tools/brand-assets.py generates every brand file from the logo-assets.py geometry: favicons (small-size tier, accent with a dark-mode variant) for website / webinstaller / on-box UI, 180 px apple-touch-icon, 1200x630 default share card, 640x480 syslinux splash, and docs/brand/ (mark, small mark, lockups, 20-column console art) - website: header mark, favicon, touch icon, default og:image; /logo/ now shows the final result (static counts, winner highlighted, no voting UI or poll.js); homepage link reads 'meet our new logo' - webinstaller: M in the header + tab icon - on-box UI: .brand mark via CSS mask in brand red (not the UI's green), favicon on every page, brand line on the login page - console: M art above the text of /etc/issue on the installed box (furtka-welcome) and the live ISO (furtka-update-issue) - ISO: build.sh swaps releng's Arch splash for the Furtka one - README shows the lockup Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Wq1hzUp4ZmCKHDuLKCnu73 --- CHANGELOG.md | 12 ++ README.md | 2 + assets/bin/furtka-welcome | 11 ++ assets/www/favicon.svg | 1 + assets/www/https-install/index.html | 1 + assets/www/index.html | 1 + assets/www/settings/index.html | 1 + assets/www/style.css | 19 +++- docs/brand/README.md | 19 ++++ docs/brand/console-banner.txt | 10 ++ docs/brand/furtka-lockup-white.svg | 1 + docs/brand/furtka-lockup.svg | 1 + docs/brand/furtka-mark-small.svg | 1 + docs/brand/furtka-mark.svg | 1 + furtka/api.py | 3 + iso/build.sh | 3 + .../usr/local/bin/furtka-update-issue | 11 ++ iso/overlay/splash.png | Bin 0 -> 4371 bytes webinstaller/static/favicon.svg | 1 + webinstaller/templates/base.html | 9 +- website/assets/css/main.css | 10 ++ website/content/_index.de.md | 2 +- website/content/_index.md | 2 +- website/content/logo.de.md | 17 ++- website/content/logo.md | 15 ++- website/layouts/index.html | 2 +- website/layouts/partials/gate.html | 8 +- website/layouts/partials/head.html | 3 +- website/layouts/poll/single.html | 19 +++- website/static/apple-touch-icon.png | Bin 0 -> 1607 bytes website/static/favicon.svg | 7 +- website/static/img/brand/social.png | Bin 0 -> 14491 bytes website/tools/brand-assets.py | 104 ++++++++++++++++++ 33 files changed, 257 insertions(+), 40 deletions(-) create mode 100644 assets/www/favicon.svg create mode 100644 docs/brand/README.md create mode 100644 docs/brand/console-banner.txt create mode 100644 docs/brand/furtka-lockup-white.svg create mode 100644 docs/brand/furtka-lockup.svg create mode 100644 docs/brand/furtka-mark-small.svg create mode 100644 docs/brand/furtka-mark.svg create mode 100644 iso/overlay/splash.png create mode 100644 webinstaller/static/favicon.svg create mode 100644 website/static/apple-touch-icon.png create mode 100644 website/static/img/brand/social.png create mode 100644 website/tools/brand-assets.py diff --git a/CHANGELOG.md b/CHANGELOG.md index cb9796d..d3e88ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ This project uses calendar versioning: `YY.N-stage` (e.g. `26.0-alpha` = 2026, r ## [Unreleased] +### Added + +- **New logo: Mark M** (a lowercase *f* cut out of an arched gate), winner of + the furtka.org vote (29 of 42 votes). It is now in the website header, + favicon and share card, the installer header and tab icon, the on-box UI + (every page and the login), the console welcome screens of the live ISO + and the installed box, and the BIOS boot-menu splash. Brand files in + `docs/brand/`, generated by `website/tools/brand-assets.py`. +- **furtka.org/download/** (and `/de/download/`): ISO download with size, + date and checksum, requirements and step-by-step install guide. Releases + now publish `furtka-.iso.sha256` and refresh the site. + ### Security - **App names are validated everywhere.** `POST /api/apps/remove` with diff --git a/README.md b/README.md index 9f6aee0..62d6838 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +

Furtka

+ # Furtka **Open-source home server OS — simple enough for everyone.** · [furtka.org](https://furtka.org) diff --git a/assets/bin/furtka-welcome b/assets/bin/furtka-welcome index 2ddd3d6..8014688 100755 --- a/assets/bin/furtka-welcome +++ b/assets/bin/furtka-welcome @@ -13,6 +13,17 @@ hostname=$(cat /etc/hostname 2>/dev/null || hostname) mapfile -t ips < <(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | cut -d/ -f1) new=$( + # Furtka mark (docs/brand/console-banner.txt, from brand-assets.py) + echo ' ▄▄▄▄▄▄▄▄' + echo ' ▄██████████▄' + echo ' █████▀▀▀▀▀▀███' + echo ' ████▀ ████' + echo ' ████ █████████' + echo ' ████ ████' + echo ' ████ ▄▄▄▄▄████' + echo ' ████ █████████' + echo ' ████ █████████' + echo ' ▀▀▀▀ ▀▀▀▀▀▀▀▀▀' echo echo " Furtka is ready." echo diff --git a/assets/www/favicon.svg b/assets/www/favicon.svg new file mode 100644 index 0000000..808cfb5 --- /dev/null +++ b/assets/www/favicon.svg @@ -0,0 +1 @@ + diff --git a/assets/www/https-install/index.html b/assets/www/https-install/index.html index b517977..8d67576 100644 --- a/assets/www/https-install/index.html +++ b/assets/www/https-install/index.html @@ -2,6 +2,7 @@ + Install local HTTPS · Furtka diff --git a/assets/www/index.html b/assets/www/index.html index 86c1559..309e507 100644 --- a/assets/www/index.html +++ b/assets/www/index.html @@ -2,6 +2,7 @@ + Furtka diff --git a/assets/www/settings/index.html b/assets/www/settings/index.html index e403c2e..fb54467 100644 --- a/assets/www/settings/index.html +++ b/assets/www/settings/index.html @@ -2,6 +2,7 @@ + Settings · Furtka diff --git a/assets/www/style.css b/assets/www/style.css index 85fa9d2..381f845 100644 --- a/assets/www/style.css +++ b/assets/www/style.css @@ -73,13 +73,17 @@ body { align-items: center; gap: 0.55rem; } +/* Furtka mark (M), drawn as a mask so it takes the accent colour in both + themes. Generated geometry: website/tools/brand-assets.py. */ .brand::before { content: ""; - width: 0.7rem; - height: 0.7rem; - background: var(--accent); - border-radius: 2px; - transform: rotate(45deg); + width: 1.35rem; + height: 1.35rem; + /* Brand red, not the UI's green accent — the logo keeps its colour. + This stylesheet is dark-first; the light theme gets the deeper red. */ + background: #ff6b56; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath fill-rule='evenodd' d='M5 60V27a27 27 0 0 1 54 0v33Z M19.5 60V26A10 10 0 0 1 29.5 16H46v10H32a2.5 2.5 0 0 0-2.5 2.5V32H46v10H29.5v18Z'/%3E%3C/svg%3E") center / contain no-repeat; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath fill-rule='evenodd' d='M5 60V27a27 27 0 0 1 54 0v33Z M19.5 60V26A10 10 0 0 1 29.5 16H46v10H32a2.5 2.5 0 0 0-2.5 2.5V32H46v10H29.5v18Z'/%3E%3C/svg%3E") center / contain no-repeat; } .nav-links { display: flex; gap: 0.25rem; } .nav-links a { @@ -490,3 +494,8 @@ details.log-details[open] > summary { color: var(--fg); } color: var(--accent); } .app-icon svg { width: 36px; height: 36px; } + +.login-brand { margin: 0 0 1.5rem; font-size: 1.2rem; } +@media (prefers-color-scheme: light) { + .brand::before { background: #c03a28; } +} diff --git a/docs/brand/README.md b/docs/brand/README.md new file mode 100644 index 0000000..2d549ec --- /dev/null +++ b/docs/brand/README.md @@ -0,0 +1,19 @@ +# Furtka brand files + +The Furtka logo is **Mark M** — a lowercase *f* cut out of an arched gate. It won the +public logo vote on furtka.org (closed 2026-09-28: M 29, R 13 of 42 votes). + +| File | Use | +|---|---| +| `furtka-mark.svg` | The mark, 32 px and up | +| `furtka-mark-small.svg` | Simplified drawing for 16–24 px (favicons, tab icons) | +| `furtka-lockup.svg` | Mark + wordmark, accent colour on light grounds | +| `furtka-lockup-white.svg` | Mark + wordmark in white, for dark or accent grounds | +| `console-banner.txt` | Text-mode art for the console welcome screens | + +Colours: accent `#c03a28` (dark UI: `#ff6b56`), ink `#0d0d0f`. + +Everything here and the copies in `website/static/`, `webinstaller/static/`, +`assets/www/` and `iso/overlay/splash.png` are generated by +`website/tools/brand-assets.py` from the geometry in `website/tools/logo-assets.py`. +Change the geometry there and re-run the script — don't edit the outputs by hand. diff --git a/docs/brand/console-banner.txt b/docs/brand/console-banner.txt new file mode 100644 index 0000000..7445b03 --- /dev/null +++ b/docs/brand/console-banner.txt @@ -0,0 +1,10 @@ + ▄▄▄▄▄▄▄▄ + ▄██████████▄ + █████▀▀▀▀▀▀███ + ████▀ ████ + ████ █████████ + ████ ████ + ████ ▄▄▄▄▄████ + ████ █████████ + ████ █████████ + ▀▀▀▀ ▀▀▀▀▀▀▀▀▀ diff --git a/docs/brand/furtka-lockup-white.svg b/docs/brand/furtka-lockup-white.svg new file mode 100644 index 0000000..a494578 --- /dev/null +++ b/docs/brand/furtka-lockup-white.svg @@ -0,0 +1 @@ + diff --git a/docs/brand/furtka-lockup.svg b/docs/brand/furtka-lockup.svg new file mode 100644 index 0000000..2e3bbb0 --- /dev/null +++ b/docs/brand/furtka-lockup.svg @@ -0,0 +1 @@ + diff --git a/docs/brand/furtka-mark-small.svg b/docs/brand/furtka-mark-small.svg new file mode 100644 index 0000000..e498944 --- /dev/null +++ b/docs/brand/furtka-mark-small.svg @@ -0,0 +1 @@ + diff --git a/docs/brand/furtka-mark.svg b/docs/brand/furtka-mark.svg new file mode 100644 index 0000000..055c6d5 --- /dev/null +++ b/docs/brand/furtka-mark.svg @@ -0,0 +1 @@ + diff --git a/furtka/api.py b/furtka/api.py index c5831cd..76c78b8 100644 --- a/furtka/api.py +++ b/furtka/api.py @@ -73,6 +73,7 @@ _HTML = """ + Furtka Apps @@ -557,12 +558,14 @@ _HTML_LOGIN = """ + Furtka · {{ TITLE }}
+

{{ HEADING }}

{{ LEDE }}

diff --git a/iso/build.sh b/iso/build.sh index 1587633..d7cb387 100755 --- a/iso/build.sh +++ b/iso/build.sh @@ -55,6 +55,9 @@ cp -a "$SCRIPT_DIR/overlay/airootfs/." "$PROFILE_WORK/airootfs/" rm -rf "$PROFILE_WORK/airootfs/etc/systemd/system/getty@tty1.service.d" echo "==> Rebranding boot menu (GRUB + syslinux + systemd-boot)" +# BIOS boot menu background: Furtka lockup instead of the Arch logo +# (generated by website/tools/brand-assets.py, 640x480 as syslinux wants). +cp "$SCRIPT_DIR/overlay/splash.png" "$PROFILE_WORK/syslinux/splash.png" # releng ships menu entries labelled "Arch Linux install medium" across three # bootloader configs (BIOS syslinux, GRUB, systemd-boot for UEFI). Rewrite to # our brand. Done with sed (not a static overlay) so upstream archiso file diff --git a/iso/overlay/airootfs/usr/local/bin/furtka-update-issue b/iso/overlay/airootfs/usr/local/bin/furtka-update-issue index e56b1c5..ba62c44 100755 --- a/iso/overlay/airootfs/usr/local/bin/furtka-update-issue +++ b/iso/overlay/airootfs/usr/local/bin/furtka-update-issue @@ -16,6 +16,17 @@ issue=/etc/issue mapfile -t ips < <(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | cut -d/ -f1) new=$( + # Furtka mark (docs/brand/console-banner.txt, from brand-assets.py) + echo ' ▄▄▄▄▄▄▄▄' + echo ' ▄██████████▄' + echo ' █████▀▀▀▀▀▀███' + echo ' ████▀ ████' + echo ' ████ █████████' + echo ' ████ ████' + echo ' ████ ▄▄▄▄▄████' + echo ' ████ █████████' + echo ' ████ █████████' + echo ' ▀▀▀▀ ▀▀▀▀▀▀▀▀▀' echo echo " Open Furtka in a browser on another device on your network:" echo diff --git a/iso/overlay/splash.png b/iso/overlay/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..d65bb9b2e7b66bcbd037c2935b5ad1de476be2aa GIT binary patch literal 4371 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 M=UmScZ3EN)0b||RFaQ7m literal 0 HcmV?d00001 diff --git a/webinstaller/static/favicon.svg b/webinstaller/static/favicon.svg new file mode 100644 index 0000000..808cfb5 --- /dev/null +++ b/webinstaller/static/favicon.svg @@ -0,0 +1 @@ + diff --git a/webinstaller/templates/base.html b/webinstaller/templates/base.html index e90efb5..f6b7ab4 100644 --- a/webinstaller/templates/base.html +++ b/webinstaller/templates/base.html @@ -4,6 +4,7 @@ {% block title %}Furtka Installer{% endblock %} + {% block head_extra %}{% endblock %} @@ -11,12 +12,8 @@ diff --git a/website/layouts/partials/gate.html b/website/layouts/partials/gate.html index 2a5036b..dabcedb 100644 --- a/website/layouts/partials/gate.html +++ b/website/layouts/partials/gate.html @@ -1,6 +1,2 @@ - +{{- /* Furtka mark (M, small-size tier) — generated by tools/brand-assets.py from logo-assets.py geometry. */ -}} + diff --git a/website/layouts/partials/head.html b/website/layouts/partials/head.html index f32076a..521d87a 100644 --- a/website/layouts/partials/head.html +++ b/website/layouts/partials/head.html @@ -10,12 +10,13 @@ + -{{ with .Params.image }} +{{ with .Params.image | default "/img/brand/social.png" }} {{ end }} diff --git a/website/layouts/poll/single.html b/website/layouts/poll/single.html index cf83d34..2d8a90e 100644 --- a/website/layouts/poll/single.html +++ b/website/layouts/poll/single.html @@ -4,32 +4,43 @@ side gets the "first thing on the page" advantage for the whole poll. */}} {{- $order := $p.order | default (slice "m" "r") -}} {{- $s := $p.show -}} -
+
+ {{ with $p.result }}

{{ . | markdownify }}

{{ end }}
{{ .Content }}
{{/* ── Quick vote ─────────────────────────────────────────── */}}
{{ range $k := $order }}{{ $d := index site.Data.logo $k }} {{ $c := index $p $k }} -
+ {{- $total := 0 }}{{ range $v := $p.final }}{{ $total = add $total $v }}{{ end }} + {{- $won := and $p.closed (eq $k (cond (gt (index $p.final "m") (index $p.final "r")) "m" "r")) }} +
{{ $d.display | safeHTML }}

{{ $c.title }}

{{ $c.text }}

+ {{ if $p.closed }} + {{ $n := index $p.final $k }} + +

{{ $n }} / {{ $total }}

+ {{ else }}

+ {{ end }}
{{ end }}
+ {{ if not $p.closed }}

{{ $p.labels.nojs }}

+ {{ end }} {{/* ── Showcase ───────────────────────────────────────────── */}}
@@ -148,6 +159,7 @@
{{/* ── Vote again at the end ─────────────────────────────── */}} + {{ if not $p.closed }}

{{ $s.final }}

@@ -162,7 +174,10 @@

{{ $p.labels.note | safeHTML }}

+ {{ end }}
+{{ if not $p.closed }} {{ $js := resources.Get "js/poll.js" | minify | fingerprint }} {{ end }} +{{ end }} diff --git a/website/static/apple-touch-icon.png b/website/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23d0821676c3a4f7035ddeb890f83be41e896025 GIT binary patch literal 1607 zcma)-X;2af6vxR%NnHsrZ&y21vem4_6(Oz6o76ngEKChiLxd(Yyq&=hydgt5PJ@Bwl4#bJ5%sMDFN>sPguQbDX16ewtkSt$zPm@jOHhvSdz$L|c<@oog{jK8S#CN%kcZD97a~krHtX=y zoL3rzgwSD5+FWYW`Nc_Ae_dkaxhJuXhHL4~q=c~aNOy*P5!7nA zWouy1kV276?9GgTuiYqF2@C6aKQ!50U_gEA~ys7N@D$7Id<*@(s&^7TNblHXFL zI}KcTdSQK@x#{D{SW`2J;kXqooXKqfkI)iIJ3=c?^6zwJVM!sxB;hk;H&g(=701v% zHF`L6xqg9844FdgADcd}SBQ}GK}1rVa@m=U!BNY!x2AhKXh^C(n$h;K>`VoYYUjU@ zigieg!3GZTko?{;LI!KT*MKb)7MVIlvcuG6iQb(9SDJ&wM~=>=ozc@W<8V0dS>f?? z$T8KUF9HTUPWX@5%KLyx68RQ^x-g$-X60sQ?KXf|kcaDtOLsyauU?*-&KtYQhQVVh ziWK9gk`WQO$`}V4da2fj1iR)+ynq^v;@HkhWUU{Dx>*(Hu-kW)oSq(E7_cY&5w!jl zGD$jRFi*?PVZ@e6$7k&}6?3P7ve->IB6Xu`IH<%p=Nz4D?d<()J!wJ|Z*r0`VQID4 zKCn1?$~60ecBJsRu^K_N*irvMe$~h8`CX7A_z-SEqB)yx%+b159$lye%gfi#5EzG4 zZIzE-;o9-Cr-@7q`R8852~UtBwyA2ch~%wvxx~}Znx8okCib^P9*eKTL4<0vvc5 zb?51#hsG!7fPwJ#O83Gg!45u((vdAve}c6$as3*r;4U~6?WeSS-{1$wCoUl#P!pJP zgSIuU>l^~UB-~#Z`#1JhMZkYpNCvPj>ZNY%Ml;MWx8p1kgPgc!%$8e - - - - - + diff --git a/website/static/img/brand/social.png b/website/static/img/brand/social.png new file mode 100644 index 0000000000000000000000000000000000000000..89ec6789f98992b0c6dde54cc0f5af5ad002206b GIT binary patch literal 14491 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 literal 0 HcmV?d00001 diff --git a/website/tools/brand-assets.py b/website/tools/brand-assets.py new file mode 100644 index 0000000..a509f3d --- /dev/null +++ b/website/tools/brand-assets.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""Generate the Furtka brand files from the winning logo (Mark M) everywhere +it ships: website, live installer, on-box UI, ISO boot splash, repo docs. + + python3 website/tools/brand-assets.py + +Reuses the geometry and rasteriser of logo-assets.py (the poll showcase), so +the mark is drawn from one source. Needs the same build-only deps: cairosvg, +Pillow, fontTools. Output files are committed; re-run after a geometry change. +""" + +import importlib.util +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO = os.path.abspath(os.path.join(HERE, "..", "..")) + +_spec = importlib.util.spec_from_file_location("logo_assets", os.path.join(HERE, "logo-assets.py")) +la = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(la) + +K = "m" +COLOR = la.MARKS[K]["color"] # light-theme accent +COLOR_DARK = "#ff6b56" # dark-theme accent used by the site and the box UI +INK = la.MARKS[K]["ink"] + + +def out(*parts): + path = os.path.join(REPO, *parts) + os.makedirs(os.path.dirname(path), exist_ok=True) + return path + + +def favicon_svg(): + """Small-size tier, accent colour, lighter accent on dark browser chrome.""" + inner = la.body(K, "min", "currentColor") + x, y, w, h = la.MARKS[K]["vb"] + return ( + f'' + f"" + f"{inner}\n" + ) + + +def mark_svg(tier, color): + return ( + la.svg(K, tier, color, standalone=True) + .replace(' class="pm"', "") + .replace(' aria-hidden="true" focusable="false"', "") + + "\n" + ) + + +def lockup_svg(color): + s = la.lockup(K).replace("currentColor", color) + return ( + s.replace('