commit f2241bfd4f9325b5075e507767b57c7771833bc9
parent 660ff34e87842a89b6cef22ef347da102ae5da82
Author: Joris Hartog <jorishartog@hotmail.com>
Date: Thu, 3 Sep 2026 11:00:22 +0200
Add unified branding and site SEO
Diffstat:
18 files changed, 117 insertions(+), 56 deletions(-)
diff --git a/.dockerignore b/.dockerignore
@@ -20,4 +20,7 @@
!scripts/inject_cloudflare_analytics.py
!scripts/postprocess_stagit_site.py
!src-tauri/icons/32x32.png
+!src-tauri/icons/128x128@2x.png
+!src-tauri/icons/icon.ico
+!src-tauri/icons/icon.svg
!nginx.conf
diff --git a/Dockerfile b/Dockerfile
@@ -62,6 +62,9 @@ RUN set -eux; \
COPY www /site
COPY downloads /site/downloads
RUN set -eux; \
+ cp /src/iuna-work/src-tauri/icons/icon.svg /site/favicon.svg; \
+ cp /src/iuna-work/src-tauri/icons/icon.ico /site/favicon.ico; \
+ cp /src/iuna-work/src-tauri/icons/128x128@2x.png /site/apple-touch-icon.png; \
version="$(sed -n 's/^version = "\(.*\)"/\1/p' /src/iuna-work/Cargo.toml | head -n 1)"; \
mkdir -p /site/downloads; \
cp /site/downloads.html /site/downloads/index.html; \
diff --git a/scripts/postprocess_stagit_site.py b/scripts/postprocess_stagit_site.py
@@ -7,7 +7,7 @@ from pathlib import Path
TOPBAR = """
<div class="topbar">
<div class="wrap">
- <a class="brand repo-link" href="/"><span class="mark" aria-label="iuna"><svg viewBox="0 0 32 32" aria-hidden="true" focusable="false"><circle class="mark-dot" cx="9.4" cy="7.6" r="2.8"></circle><path class="mark-loop" d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13"></path></svg></span><span>iuna</span></a>
+ <a class="brand repo-link" href="/"><span class="mark" aria-hidden="true"><svg viewBox="0 0 32 32" focusable="false"><circle cx="9.4" cy="7.6" r="2.8" fill="currentColor"></circle><path d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13" fill="none" stroke="currentColor" stroke-width="4.2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><span>iuna</span></a>
<nav aria-label="Page sections">
<a href="/#whatisiuna">What is iuna</a>
<a href="/#howtojoin">Join</a>
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
Binary files differ.
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
Binary files differ.
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
Binary files differ.
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
Binary files differ.
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
Binary files differ.
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
Binary files differ.
diff --git a/src-tauri/icons/icon.svg b/src-tauri/icons/icon.svg
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
- <rect x="64" y="64" width="896" height="896" rx="224" fill="#d5f55f"/>
- <path fill="#101315" d="M301 349c-37 0-67 30-67 67v227c0 156 122 272 278 272s278-116 278-272V416c0-37-30-67-67-67s-67 30-67 67v227c0 81-63 138-144 138s-144-57-144-138V416c0-37-30-67-67-67Z"/>
- <circle cx="301" cy="243" r="90" fill="#101315"/>
+ <rect x="64" y="64" width="896" height="896" rx="224" fill="#101315"/>
+ <path fill="#d5f55f" d="M301 349c-37 0-67 30-67 67v227c0 156 122 272 278 272s278-116 278-272V416c0-37-30-67-67-67s-67 30-67 67v227c0 81-63 138-144 138s-144-57-144-138V416c0-37-30-67-67-67Z"/>
+ <circle cx="301" cy="243" r="90" fill="#d5f55f"/>
</svg>
diff --git a/src/adapters/http/index_html.rs b/src/adapters/http/index_html.rs
@@ -4,7 +4,7 @@ pub(super) const INDEX_HTML: &str = concat!(
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="icon" href="data:,">
+ <link rel="icon" href="/favicon.ico" sizes="any">
<title>iuna</title>
<style>
[x-cloak] { display: none !important; }
diff --git a/src/adapters/http/static_assets.rs b/src/adapters/http/static_assets.rs
@@ -1,5 +1,5 @@
use axum::{
- http::{StatusCode, header},
+ http::header,
response::{Html, IntoResponse},
};
@@ -11,8 +11,11 @@ pub(super) async fn index() -> Html<&'static str> {
pub(super) async fn favicon() -> impl IntoResponse {
(
- StatusCode::NO_CONTENT,
- [(header::CACHE_CONTROL, "public, max-age=86400")],
+ [
+ (header::CONTENT_TYPE, "image/x-icon"),
+ (header::CACHE_CONTROL, "public, max-age=86400"),
+ ],
+ include_bytes!("../../../src-tauri/icons/icon.ico").as_slice(),
)
}
diff --git a/www/assets/static-listing.css b/www/assets/static-listing.css
@@ -89,36 +89,19 @@ body > :not(.topbar):not(script) {
.brand:hover { color: var(--green); }
.mark {
- position: relative;
width: 32px;
height: 32px;
display: grid;
place-items: center;
- overflow: hidden;
- border: 1px solid #e8ff8d;
- border-radius: 8px;
- background: linear-gradient(145deg, #ecff8a 0%, var(--green) 54%, var(--cyan) 100%);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .38), 0 9px 20px rgba(213, 245, 95, .14);
+ color: var(--green);
}
.mark svg {
- position: relative;
- z-index: 1;
- width: 21px;
- height: 21px;
+ width: 24px;
+ height: 24px;
display: block;
}
-.mark .mark-loop {
- fill: none;
- stroke: #101315;
- stroke-width: 4.2;
- stroke-linecap: round;
- stroke-linejoin: round;
-}
-
-.mark .mark-dot { fill: #101315; }
-
nav {
display: flex;
gap: 16px;
diff --git a/www/downloads.html b/www/downloads.html
@@ -4,19 +4,38 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="dark">
- <title>iuna Downloads</title>
+ <meta name="theme-color" content="#0d0f10">
+ <meta name="description" content="Download the latest iuna node and desktop app releases for Linux, macOS, and Windows, with SHA-256 checksums.">
+ <meta name="robots" content="index, follow, max-image-preview:large">
+ <link rel="canonical" href="https://getiuna.org/downloads/">
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
+ <link rel="icon" href="/favicon.ico" sizes="any">
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
+ <link rel="manifest" href="/site.webmanifest">
+ <meta property="og:title" content="Download iuna">
+ <meta property="og:description" content="Get the latest iuna node and desktop app releases for Linux, macOS, and Windows.">
+ <meta property="og:type" content="website">
+ <meta property="og:url" content="https://getiuna.org/downloads/">
+ <meta property="og:site_name" content="iuna">
+ <meta property="og:locale" content="en_US">
+ <meta property="og:image" content="https://getiuna.org/assets/og.png">
+ <meta property="og:image:width" content="1200">
+ <meta property="og:image:height" content="630">
+ <meta property="og:image:type" content="image/png">
+ <meta property="og:image:alt" content="iuna — Help test a different kind of network">
+ <meta name="twitter:card" content="summary_large_image">
+ <meta name="twitter:title" content="Download iuna">
+ <meta name="twitter:description" content="Get the latest iuna node and desktop app releases for Linux, macOS, and Windows.">
+ <meta name="twitter:image" content="https://getiuna.org/assets/og.png">
+ <meta name="twitter:image:alt" content="iuna — Help test a different kind of network">
+ <title>Download iuna for Linux, macOS, and Windows</title>
<link rel="stylesheet" href="/assets/static-listing.css">
</head>
<body>
<div class="topbar">
<div class="wrap">
<a class="brand repo-link" href="/">
- <span class="mark" aria-label="iuna">
- <svg viewBox="0 0 32 32" aria-hidden="true" focusable="false">
- <circle class="mark-dot" cx="9.4" cy="7.6" r="2.8"></circle>
- <path class="mark-loop" d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13"></path>
- </svg>
- </span>
+ <span class="mark" aria-hidden="true"><svg viewBox="0 0 32 32" focusable="false"><circle cx="9.4" cy="7.6" r="2.8" fill="currentColor"></circle><path d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13" fill="none" stroke="currentColor" stroke-width="4.2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span>
<span>iuna</span>
</a>
<nav aria-label="Page sections">
diff --git a/www/index.html b/www/index.html
@@ -4,12 +4,24 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="dark">
+ <meta name="theme-color" content="#0d0f10">
<meta name="description" content="Help test iuna, an open cryptocurrency experiment exploring temporary consensus power, open issuance, and a network shaped by its participants.">
+ <meta name="robots" content="index, follow, max-image-preview:large">
+ <link rel="canonical" href="https://getiuna.org/">
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
+ <link rel="icon" href="/favicon.ico" sizes="any">
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
+ <link rel="manifest" href="/site.webmanifest">
<meta property="og:title" content="A cryptocurrency where power is temporary.">
<meta property="og:description" content="iuna is an open cryptocurrency experiment. Try the app, run a node, test the network, or explore the protocol.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://getiuna.org/">
+ <meta property="og:site_name" content="iuna">
+ <meta property="og:locale" content="en_US">
<meta property="og:image" content="https://getiuna.org/assets/og.png">
+ <meta property="og:image:width" content="1200">
+ <meta property="og:image:height" content="630">
+ <meta property="og:image:type" content="image/png">
<meta property="og:image:alt" content="iuna — Help test a different kind of network">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="A cryptocurrency where power is temporary.">
@@ -17,6 +29,32 @@
<meta name="twitter:image" content="https://getiuna.org/assets/og.png">
<meta name="twitter:image:alt" content="iuna — Help test a different kind of network">
<title>iuna — A Cryptocurrency Where Power Is Temporary</title>
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "WebSite",
+ "@id": "https://getiuna.org/#website",
+ "url": "https://getiuna.org/",
+ "name": "iuna",
+ "description": "An open cryptocurrency experiment exploring temporary consensus power and open issuance.",
+ "inLanguage": "en"
+ },
+ {
+ "@type": "SoftwareApplication",
+ "@id": "https://getiuna.org/#software",
+ "name": "iuna",
+ "url": "https://getiuna.org/",
+ "downloadUrl": "https://getiuna.org/downloads/",
+ "applicationCategory": "FinanceApplication",
+ "operatingSystem": "Linux, macOS, Windows",
+ "isAccessibleForFree": true,
+ "description": "An experimental cryptocurrency node and wallet for participating in the iuna network."
+ }
+ ]
+ }
+ </script>
<style>
:root {
color-scheme: dark;
@@ -117,31 +155,13 @@
}
.brand { display: flex; gap: 10px; align-items: center; font-weight: 900; }
.mark {
- position: relative;
width: 32px;
height: 32px;
display: grid;
place-items: center;
- overflow: hidden;
- border: 1px solid #e8ff8d;
- border-radius: 8px;
- background: linear-gradient(145deg, #ecff8a 0%, var(--green) 54%, var(--cyan) 100%);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .38), 0 9px 20px rgba(213, 245, 95, .14);
- }
- .mark::after {
- content: "";
- position: absolute;
- inset: -40% -70%;
- background: linear-gradient(100deg, transparent 42%, rgba(255, 255, 255, .34) 50%, transparent 58%);
- transform: translateX(-58%) rotate(8deg);
- opacity: 0;
- pointer-events: none;
+ color: var(--green);
}
- .mark svg { position: relative; z-index: 1; width: 21px; height: 21px; display: block; }
- .mark .mark-loop { fill: none; stroke: #101315; stroke-width: 4.2; stroke-linecap: round; stroke-linejoin: round; }
- .mark .mark-dot { fill: #101315; }
- .brand:hover .mark::after { animation: mark-sheen .72s ease both; }
- @keyframes mark-sheen { from { opacity: 0; transform: translateX(-58%) rotate(8deg); } 32% { opacity: 1; } to { opacity: 0; transform: translateX(58%) rotate(8deg); } }
+ .mark svg { width: 24px; height: 24px; display: block; }
nav { display: flex; gap: 16px; flex-wrap: wrap; color: var(--muted); font-size: 13px; font-weight: 750; }
nav a { color: var(--muted); text-decoration: none; }
nav a:hover { color: var(--green); }
@@ -743,7 +763,7 @@
</svg>
<div class="topbar">
<div class="wrap">
- <a class="brand repo-link" href="/"><span class="mark" aria-label="iuna"><svg viewBox="0 0 32 32" aria-hidden="true" focusable="false"><circle class="mark-dot" cx="9.4" cy="7.6" r="2.8"></circle><path class="mark-loop" d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13"></path></svg></span><span>iuna</span></a>
+ <a class="brand repo-link" href="/"><span class="mark" aria-hidden="true"><svg viewBox="0 0 32 32" focusable="false"><circle cx="9.4" cy="7.6" r="2.8" fill="currentColor"></circle><path d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13" fill="none" stroke="currentColor" stroke-width="4.2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><span>iuna</span></a>
<nav aria-label="Page sections">
<a href="#why">Why iuna</a>
<a href="#join">Take part</a>
diff --git a/www/robots.txt b/www/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://getiuna.org/sitemap.xml
diff --git a/www/site.webmanifest b/www/site.webmanifest
@@ -0,0 +1,17 @@
+{
+ "name": "iuna",
+ "short_name": "iuna",
+ "description": "An open cryptocurrency experiment.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#0d0f10",
+ "theme_color": "#0d0f10",
+ "icons": [
+ {
+ "src": "/favicon.svg",
+ "sizes": "any",
+ "type": "image/svg+xml",
+ "purpose": "any maskable"
+ }
+ ]
+}
diff --git a/www/sitemap.xml b/www/sitemap.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+ <url>
+ <loc>https://getiuna.org/</loc>
+ </url>
+ <url>
+ <loc>https://getiuna.org/downloads/</loc>
+ </url>
+</urlset>