fix(brand): capitalize "Punktfunk" in user-facing text

The docs site's page title read "punktfunk docs". Fixed that and swept the
rest of the tree for the same defect, capitalizing the brand wherever it is
shown to a human and leaving it lowercase where it is a technical identifier
(CLI/package names, `punktfunk://` scheme, PnP enumerator, TLS SNI, logcat
tag, config paths, CMS tenant id).

User-visible fixes:

- docs-site: page title -> "Punktfunk Docs"; API reference title, meta
  description and the branded bar's aria-label; the BrandMark/Wordmark SVG
  accessible names (the web console already had these capitalized -- the
  docs site had drifted from it).
- Android: six strings of live UI copy -- the local-network permission
  dialog (x2), the connect-screen error banner, and the no-controller
  explainer.
- Apple: the "No Hosts" empty-state text and the fallback display name for
  a host that advertises no instance name.
- Windows client: the `--discover` progress line.
- KWin fake-input: the application name passed to `authenticate()` (the
  grant is cached per-exe, so the string is display-only).
- THIRD-PARTY-NOTICES: fixed in both generators (about.hbs and
  gen-third-party-notices.py) and applied to the three checked-in outputs
  so they match what a regeneration now produces.

Every changed line differs from the original only by letter case, so line
lengths are unchanged and no formatter width rule is affected.
`cargo fmt --all --check` passes.
This commit is contained in:
2026-08-06 23:10:25 +02:00
parent 50fa228bab
commit b0ec759fad
30 changed files with 44 additions and 44 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
+1 -1
View File
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates below.
Each is distributed under its own permissive license; full texts follow.
Generated by `cargo about generate about.hbs` (see about.toml) — do not edit by hand.
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
@@ -168,9 +168,9 @@ internal fun LocalNetworkDialog(onAllow: () -> Unit, onSettings: () -> Unit, onD
title = { Text("Allow local network access") },
text = {
Text(
"Android blocks punktfunk from talking to devices on your network, so it can't " +
"Android blocks Punktfunk from talking to devices on your network, so it can't " +
"find or reach any host until you allow it. If no prompt appears when you tap " +
"Allow, enable “Nearby devices” for punktfunk in system settings.",
"Allow, enable “Nearby devices” for Punktfunk in system settings.",
)
},
confirmButton = {
@@ -941,7 +941,7 @@ fun ConnectScreen(
color = MaterialTheme.colorScheme.onErrorContainer,
)
Text(
"Android blocks punktfunk from finding or reaching hosts until you allow it.",
"Android blocks Punktfunk from finding or reaching hosts until you allow it.",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onErrorContainer,
textAlign = TextAlign.Center,
@@ -191,7 +191,7 @@ fun ControllersScreen(gamepadSetting: Int, onBack: () -> Unit) {
dsUsb?.let { DsRow(it) }
if (pads.isEmpty() && !sc2Present) {
Text(
"No controller detected. punktfunk can only forward devices Android " +
"No controller detected. Punktfunk can only forward devices Android " +
"classifies as a gamepad or joystick — a pad connected through an adapter " +
"or hub may show up under \"Other input devices\" below with the adapter's " +
"identity, or not at all.",
@@ -463,11 +463,11 @@ fun GamepadLocalNetworkDialog(onAllow: () -> Unit, onSettings: () -> Unit, onDis
),
) {
DialogText(
"Android blocks punktfunk from talking to devices on your network, so it can't find " +
"Android blocks Punktfunk from talking to devices on your network, so it can't find " +
"or reach any host until you allow it.",
)
DialogText(
"If no prompt appears after Allow, enable “Nearby devices” for punktfunk in " +
"If no prompt appears after Allow, enable “Nearby devices” for Punktfunk in " +
"system settings.",
)
}
@@ -344,7 +344,7 @@ struct HomeView: View {
ContentUnavailableView {
Label("No Hosts", systemImage: "rectangle.connected.to.line.below")
} description: {
Text("Add your punktfunk host with the + button, or scan the network again.")
Text("Add your Punktfunk host with the + button, or scan the network again.")
} actions: {
Button("Add Host") { showAddHost = true }
.glassProminentButtonStyle()
@@ -453,7 +453,7 @@ public final class HostDiscovery: ObservableObject {
private static func instanceName(_ endpoint: NWEndpoint) -> String {
if case let .service(name, _, _, _) = endpoint { return name }
return "punktfunk host"
return "Punktfunk host"
}
private static func entry(_ txt: NWTXTRecord, _ field: String) -> String? {
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
+1 -1
View File
@@ -244,7 +244,7 @@ fn run_headless_cli(args: &[String], identity: (String, String)) {
#[cfg(windows)]
fn discover_and_print() {
use std::time::{Duration, Instant};
println!("Browsing the LAN for punktfunk hosts (~5 s)…");
println!("Browsing the LAN for Punktfunk hosts (~5 s)…");
let (rx, _rescan) = discovery::browse();
let deadline = Instant::now() + Duration::from_secs(5);
let mut seen = std::collections::HashSet::new();
@@ -271,7 +271,7 @@ impl KwinFakeInjector {
)?;
// Authenticate (the legacy handshake; for an interface-authorized client KWin accepts it
// without a dialog — same as krdpserver/krfb headless).
fake.authenticate("punktfunk".into(), "remote streaming input".into());
fake.authenticate("Punktfunk".into(), "remote streaming input".into());
queue
.roundtrip(&mut state)
.context("fake_input authenticate roundtrip")?;
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "punktfunk-docs",
"private": true,
"type": "module",
"description": "punktfunk documentation site — Fumadocs on TanStack Start (Vite + Nitro/bun)",
"description": "Punktfunk documentation site — Fumadocs on TanStack Start (Vite + Nitro/bun)",
"scripts": {
"dev": "vite dev --port 3001",
"build": "vite build",
+3 -3
View File
@@ -1,17 +1,17 @@
// punktfunk brand mark: two overlapping circles forming a lens — the violet
// Punktfunk brand mark: two overlapping circles forming a lens — the violet
// brand identity. Copied verbatim from the marketing site (flattened from the
// clients/apple punktfunk_Logo.icon). Back-to-front: large light-violet circle,
// deep-violet circle, light highlight where they overlap.
export default function BrandMark({ className }: { className?: string }) {
return (
<svg
aria-label="punktfunk"
aria-label="Punktfunk"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1000 1000"
className={className}
>
<title>punktfunk</title>
<title>Punktfunk</title>
<path
d="M403.037,791.672c107.586,0 194.41,-86.824 194.41,-194.41c0,-107.586 -86.824,-194.41 -194.41,-194.41c-107.586,0 -194.41,86.824 -194.41,194.41c0,107.586 86.824,194.41 194.41,194.41Z"
fill="#a79ff8"
+3 -3
View File
@@ -1,4 +1,4 @@
// The punktfunk "funk" wordmark — vectorised from
// The Punktfunk "funk" wordmark — vectorised from
// Export/Punktfunk_Logo-Text_No-Border_Dark.svg (the white export background is
// dropped). Inline SVG using currentColor so it recolours per theme: the
// deep-violet brand on light, the light-violet lens highlight on dark (matching
@@ -7,13 +7,13 @@ export default function Wordmark({ className = '' }: { className?: string }) {
return (
<svg
role="img"
aria-label="punktfunk"
aria-label="Punktfunk"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 579 136"
fill="currentColor"
className={`w-auto text-[var(--pf-brand)] dark:text-[var(--pf-highlight)] ${className}`}
>
<title>punktfunk</title>
<title>Punktfunk</title>
<path d="M16.782,16.051l0,102.687l31.253,0l0,-35.563l73.436,0l0,-23.555l-73.436,0l0,-19.398l77.285,0l0,-24.171l-108.537,0Z" />
<path d="M131.785,16.051l0,47.264c0.154,16.627 0.154,16.627 0.308,20.014c0.77,15.087 2.463,21.4 7.544,26.634c7.698,8.16 20.014,10.315 59.272,10.315c23.863,0 34.178,-0.616 43.415,-2.463c11.7,-2.463 19.552,-10.623 21.246,-22.323c0.924,-7.236 1.078,-8.929 1.54,-32.176l0,-47.264l-31.253,0l0,47.264c0,2.155 -0.154,7.082 -0.308,10.623c-0.462,9.699 -1.232,12.47 -3.695,15.087c-3.387,3.695 -9.853,4.619 -31.407,4.619c-26.634,0 -32.638,-1.693 -34.332,-9.853c-0.77,-4.157 -0.77,-4.311 -1.078,-20.476l0,-47.264l-31.253,0Z" />
<path d="M271.575,15.943l0,102.687l31.868,0l-0.77,-76.669l3.387,0l54.038,76.669l54.346,0l0,-102.687l-31.868,0l0.77,76.515l-3.233,0l-53.73,-76.515l-54.808,0Z" />
+1 -1
View File
@@ -1,4 +1,4 @@
// The docs reuse the punktfunk footer from the shared unom CMS (cms.unom.io).
// The docs reuse the Punktfunk footer from the shared unom CMS (cms.unom.io).
// The footer shape comes from @unom/app-ui/footer so the docs and the marketing
// site share one type. The CMS is multi-tenant: footer is a per-tenant
// collection, so scope the read to this project's tenant. Read-only GET, so a
+1 -1
View File
@@ -3,7 +3,7 @@ import BrandMark from '@/components/BrandMark'
import Wordmark from '@/components/Wordmark'
// Shared chrome (nav title, links) for both the docs layout and the home layout.
// The lens mark + wordmark mirror the punktfunk marketing site's header.
// The lens mark + wordmark mirror the Punktfunk marketing site's header.
export function baseOptions(): BaseLayoutProps {
return {
nav: {
+1 -1
View File
@@ -30,7 +30,7 @@ export const Route = createRootRoute({
{ charSet: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'color-scheme', content: 'dark light' },
{ title: 'punktfunk docs' },
{ title: 'Punktfunk Docs' },
],
links: [
{ rel: 'stylesheet', href: appCss },
+6 -6
View File
@@ -13,18 +13,18 @@ export const Route = createFileRoute('/api/')({
component: ApiReference,
head: () => ({
meta: [
{ title: 'punktfunk — Management API reference' },
{ title: 'Punktfunk — Management API Reference' },
{
name: 'description',
content:
'Interactive reference for the punktfunk host management REST API (OpenAPI).',
'Interactive reference for the Punktfunk host management REST API (OpenAPI).',
},
],
links: [{ rel: 'stylesheet', href: scalarCss }],
}),
})
// The full punktfunk theme rolled out onto Scalar — the same dark-violet (and
// The full Punktfunk theme rolled out onto Scalar — the same dark-violet (and
// light-lavender) product chrome as the docs/management console.
//
// IMPORTANT: Scalar toggles `.light-mode` / `.dark-mode` on `document.body`,
@@ -191,7 +191,7 @@ function ApiReference() {
url: '/openapi.json',
darkMode: isDark,
hideDarkModeToggle: true,
metaData: { title: 'punktfunk Management API' },
metaData: { title: 'Punktfunk Management API' },
hideDownloadButton: false,
customCss: SCALAR_CSS,
}),
@@ -200,13 +200,13 @@ function ApiReference() {
return (
<div className="flex min-h-screen flex-col">
{/* Slim branded bar so the reference stays inside the punktfunk identity
{/* Slim branded bar so the reference stays inside the Punktfunk identity
and links back into the docs. */}
<header className="flex h-14 shrink-0 items-center justify-between border-b border-fd-border px-4 md:px-6">
<Link
to="/docs/$"
params={{ _splat: '' }}
aria-label="punktfunk documentation"
aria-label="Punktfunk documentation"
className="flex items-center gap-2 no-underline"
>
<BrandMark className="size-6" />
+3 -3
View File
@@ -4,12 +4,12 @@
/* Pull Fumadocs UI's own classes — and @unom/ui's compiled components into
the Tailwind 4 scan so their utilities aren't purged. @unom/ui is the shared
design-token system the punktfunk marketing site also builds on. */
design-token system the Punktfunk marketing site also builds on. */
@source '../../node_modules/fumadocs-ui/dist/**/*.js';
@source '../../node_modules/@unom/ui/dist/**/*.{js,mjs}';
@source '../../node_modules/@unom/app-ui/dist/**/*.{js,mjs}';
/* punktfunk brand
/* Punktfunk brand
The brand colour is the violet lens mark. (The marketing site's blue is just
a page background, not the brand.) These values feed both @unom/ui's semantic
token contract (--brand/--primary/--accent/--highlight) and the Fumadocs
@@ -61,7 +61,7 @@
}
@theme {
/* Geist the punktfunk brand typeface, same as the marketing site
/* Geist the Punktfunk brand typeface, same as the marketing site
(the @fontsource-variable/geist face is loaded in __root.tsx). */
--font-sans: 'Geist Variable', ui-sans-serif, system-ui, sans-serif;
--font-display: 'Geist Variable', ui-sans-serif, system-ui, sans-serif;
+1 -1
View File
@@ -224,7 +224,7 @@ path below is the maintainer's test box — substitute your own `punktfunk-probe
# Recover a WEDGED driver. Symptom: every session fails with
# create virtual output: pf-vdisplay ADD ...: DeviceIoControl(0x222400): Element nicht gefunden (0x80070490)
# i.e. ERROR_NOT_FOUND — sustained ADD/REMOVE churn exhausted the IddCx monitor slots (ghost
# "Generic Monitor (punktfunk)" nodes pile up, target_ids climb). A host restart's CLEAR_ALL does NOT
# "Generic Monitor (Punktfunk)" nodes pile up, target_ids climb). A host restart's CLEAR_ALL does NOT
# fix it; the driver instance must be reloaded. This clears the ghosts + cycles the adapter (no reboot —
# this box boots to Proxmox).
powershell -ExecutionPolicy Bypass -File reset-pf-vdisplay.ps1 -Verify -Probe C:\t-goal1\debug\punktfunk-probe.exe
+1 -1
View File
@@ -83,7 +83,7 @@ export const runPluginCli = async <E, R>(opts: {
} catch (e) {
const hint =
e instanceof HostRequestError
? " (is the punktfunk host running?)"
? " (is the Punktfunk host running?)"
: "";
console.error(`${opts.def.name}: ${name} failed: ${e}${hint}`);
process.exitCode = 1;
+1 -1
View File
@@ -137,7 +137,7 @@ def main():
w("THIRD-PARTY SOFTWARE NOTICES")
w("=" * 76)
w("")
w("punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.")
w("Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.")
w("The binaries it ships statically/dynamically link the third-party Rust crates listed")
w("below. Each is distributed under its own permissive license; the full license texts")
w("follow the manifest. This file is generated by scripts/gen-third-party-notices.py")
+1 -1
View File
@@ -1,4 +1,4 @@
// punktfunk brand mark: two overlapping circles forming a lens — the violet
// Punktfunk brand mark: two overlapping circles forming a lens — the violet
// brand identity (flattened from the clients/apple punktfunk_Logo.icon, shared
// verbatim with the marketing site + docs). Back-to-front: large light-violet
// circle, deep-violet circle, light highlight where they overlap.
+1 -1
View File
@@ -2,7 +2,7 @@ import { cn } from "@/lib/utils";
import { BrandMark } from "./brand-mark";
import { Wordmark } from "./wordmark";
// Full punktfunk lockup: the lens mark anchored to the top-left corner of the
// Full Punktfunk lockup: the lens mark anchored to the top-left corner of the
// "funk" wordmark. Size the lockup with a width on the wrapper (e.g. `w-40`);
// the mark scales as a fraction of that width.
export function Logo({ className }: { className?: string }) {
+1 -1
View File
@@ -3,7 +3,7 @@ import { useEffect, useRef } from "react";
import { cn } from "@/lib/utils";
import { m } from "@/paraglide/messages";
// The punktfunk lens, alive. The two overlapping circles of the brand mark are
// The Punktfunk lens, alive. The two overlapping circles of the brand mark are
// recreated from divs and animated as if orbiting on a path whose long axis points
// INTO the screen, so depth is the dominant motion: each circle surges toward and
// away from the viewer in antiphase, passing in front of and behind the other.
+1 -1
View File
@@ -1,6 +1,6 @@
import { cn } from "@/lib/utils";
// The punktfunk "funk" wordmark — the real brand typo, vectorised from the
// The Punktfunk "funk" wordmark — the real brand typo, vectorised from the
// marketing logo. currentColor so it recolours per surface; defaults to the
// light-violet lens highlight that reads on the dark console chrome. Size via
// height (e.g. `h-5`); width follows the viewBox.
+1 -1
View File
@@ -73,7 +73,7 @@ export const Incompatible: Story = {
...BASE,
compatible: false,
incompatible_reason:
"needs punktfunk host ≥ 0.16.0 (this host is 0.15.0)",
"needs Punktfunk host ≥ 0.16.0 (this host is 0.15.0)",
},
},
};
+2 -2
View File
@@ -9,7 +9,7 @@
Tailwind 4 scan so their utilities aren't purged. */
@source "../node_modules/@unom/ui/dist/**/*.{js,mjs}";
/* punktfunk brand · violet product chrome
/* Punktfunk brand · violet product chrome
Two themes on one violet identity: LIGHT (lavender docs surface the same
palette the design/Scalar reference uses: white bg, faint-violet cards/borders,
#6c5bf3 brand) is the :root default; DARK (the violet-tinted app-icon chrome
@@ -27,7 +27,7 @@
:root {
--radius: 0.625rem;
/* Brand — the violet lens mark (from the punktfunk app icon). Theme-independent. */
/* Brand — the violet lens mark (from the Punktfunk app icon). Theme-independent. */
--pf-brand: #6c5bf3; /* deep violet — primary on light */
--pf-brand-light: #a79ff8; /* light violet — primary on dark */
--pf-highlight: #d2c9fb; /* lens highlight */
+1 -1
View File
@@ -1,4 +1,4 @@
/* Penner easing tokens shared with the punktfunk marketing site + @unom/ui.
/* Penner easing tokens shared with the Punktfunk marketing site + @unom/ui.
@unom/ui's accordion/collapsible/material animations resolve these by name. */
@theme {
--ease-in-sine: cubic-bezier(0.47, 0, 0.745, 0.715);