Brand: one master mark (black square, no circle) for every icon, favicon and profile picture
the project lead's rule, 4 October 2026: the mark sits in a black square, never in a circle, never on another colour, 20% clear space; the Mac app is the model. brand/master/igneum-mark-square.svg (1024, #0C0C0E, the exact header polygons at 62%) and igneum-mark-square-rounded.svg (Apple's 824-on-1024 grid, DMG volume icon only). make-icons.py now rasterises the masters (rsvg-convert if installed, else Pillow draws the polygons) into igneum.icns (plain square, 16 to 1024), igneum-volume.icns, igneum.ico (each size from the vector), the Inno art, the DMG background, site favicons (favicon.ico 16/32/48, favicon-32, apple-touch 180, 192, 512, maskable 512 + manifest entry), relay favicons, and brand/profile (400/512/1024, github-org-512, X banner). Every page head's inline SVG favicon and the relay header lose the ring. The .rc and Info.plist paths are unchanged (same file names). docs/brand/before holds the old set. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
57
brand/README.md
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
# Igneum brand assets
|
||||
|
||||
## The rule (the project lead, 4 October 2026)
|
||||
|
||||
One global logo for apps, profile pictures, favicons, everything. The mark sits in a black square. Never in a circle.
|
||||
Never on another colour. Minimum clear space = 20% of the square. The Mac app icon is the model: a full square, all
|
||||
black, the mark in the middle.
|
||||
|
||||
- Square: `#0C0C0E` (the site's obsidian token, `--obsidian` in `site/index.html`).
|
||||
- Mark: `#F2541B` ember, the flame's centre cut in obsidian. Geometry = the two polygons in the site header
|
||||
(`site/index.html`, 100 x 100 viewBox). Do not redraw it.
|
||||
- Mark height = 62% of the square (so 19% clear on top and bottom, 30% on each side).
|
||||
- No ring, no border, no rounded corners baked in, apart from the one rounded variant below.
|
||||
|
||||
## Masters (`brand/master/`)
|
||||
|
||||
| File | Use |
|
||||
|---|---|
|
||||
| `igneum-mark-square.svg` | The master. 1024 x 1024, full-bleed obsidian, mark centred. Every derivative comes from this. |
|
||||
| `igneum-mark-square-rounded.svg` | Apple's icon grid (824 x 824 shape on the 1024 canvas, continuous corner as a superellipse). Only for the DMG volume icon. Tahoe masks the plain square itself, so the app bundle ships the plain square. |
|
||||
|
||||
## Generator
|
||||
|
||||
`python3 brand/icons/make-icons.py` rebuilds every file below from the masters. It uses `rsvg-convert` when installed
|
||||
(`brew install librsvg`), otherwise Pillow draws the master's polygons at 4x to 16x supersampling (exact, the mark is two
|
||||
polygons). The Windows `.ico` and the favicons render each size from the vector, never by shrinking a bitmap.
|
||||
|
||||
## File map
|
||||
|
||||
| File | What | Where it is used |
|
||||
|---|---|---|
|
||||
| `brand/icons/igneum.icns` | plain square, 16 to 1024 | `Igneum Miner.app/Contents/Resources` (`packaging/mac/build-dmg.sh`, `CFBundleIconFile` = `igneum`) |
|
||||
| `brand/icons/igneum-volume.icns` | rounded variant | the DMG volume icon (`packaging/mac/dmg/settings.py`) |
|
||||
| `brand/icons/igneum.ico` | 16 24 32 48 64 128 256, BMP entries | every Windows exe through the `.rc` files (`packaging/windows/resources/*.rc`, `proto-cuda/nvrtc/*.rc`, `app/igneum-app/resources/igneum-app.rc`, `app/windows/host.rc`), Inno Setup (`Igneum-Miner.iss`) |
|
||||
| `brand/icons/igneum-256.png` | the square at 256 | reference |
|
||||
| `brand/icons/inno-*.bmp` | installer wizard art | Inno Setup |
|
||||
| `brand/icons/dmg-background*.png/.tiff` | DMG window background | `packaging/mac/dmg/settings.py` |
|
||||
| `site/favicon.ico` (16 32 48), `favicon-32.png`, `apple-touch-icon.png` (180, square: iOS rounds it), `icon-192.png`, `icon-512.png`, `maskable-512.png` (mark at 50%) | site favicons | every `site/*.html`, the header template in `site/build.mjs`, `site/site.webmanifest` |
|
||||
| `relay/favicon.ico`, `favicon-32.png`, `apple-touch-icon.png` | relay favicons | `relay/index.html`, `relay/ui.html` (static files at the relay root) |
|
||||
| `brand/profile/profile-400.png`, `profile-512.png`, `profile-1024.png` | profile pictures | X, Discord, Telegram, LinkedIn |
|
||||
| `brand/profile/github-org-512.png` | organisation avatar | github.com/igneum-network (uploaded by hand from the Igneum Chrome profile) |
|
||||
| `brand/profile/x-banner-1500x500.png` | X header | the mark centred on obsidian |
|
||||
| `brand/igneum-icon-512.png`, `igneum-icon-1024.png` | the square at 512 and 1024 | the same as the profile files; kept for links that already point here |
|
||||
|
||||
Inline SVG favicons (the `data:` link in every page head) carry the same square and mark, so a page shows the right icon
|
||||
before the `.ico` loads.
|
||||
|
||||
## Not regenerated
|
||||
|
||||
- `site/og-small.png`, `og-square.png`, `og-coin.png`: the social card design, left as it was by instruction (4 October 2026).
|
||||
- `brand/igneum-coin-1024.png`: the old ringed coin. Retired as a source; nothing reads it now.
|
||||
- `brand/igneum-mark-transparent-1024.png`, the wordmark PNGs and `Unbounded.ttf`: unchanged.
|
||||
|
||||
## Before and after
|
||||
|
||||
`docs/brand/before/` holds the icons as they were (ringed coin everywhere except the GitHub avatar), `docs/brand/after-*.png`
|
||||
the new set.
|
||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 6.6 KiB |
BIN
brand/icons/igneum-volume.icns
Normal file
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 353 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
|
|
@ -1,31 +1,155 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Builds the Igneum Miner icon and installer art from brand/igneum-coin-1024.png (3 October 2026).
|
||||
"""Builds every Igneum icon from the master mark, brand/master/igneum-mark-square.svg (4 October 2026).
|
||||
|
||||
Outputs, all in brand/icons/:
|
||||
igneum.icns Mac app and DMG volume icon (iconutil from the full 10-file iconset)
|
||||
igneum.ico Windows icon, 16 24 32 48 64 128 256 px, uncompressed BMP entries
|
||||
igneum-256.png the coin cut out on transparency (the source of both)
|
||||
inno-wizard-164x314.bmp Inno Setup WizardImageFile (left side of the welcome and finish pages)
|
||||
inno-wizard-small-55x58.bmp Inno Setup WizardSmallImageFile (top right of the other pages)
|
||||
inno-banner-150x57.bmp header banner (NSIS size; kept for the Windows README and any header-style page)
|
||||
dmg-background.png 660x400 DMG window background
|
||||
dmg-background@2x.png the same at 1320x800 for Retina; dmg-background.tiff holds both when tiffutil is present
|
||||
Needs Pillow and, on a Mac, iconutil and tiffutil (both ship with macOS).
|
||||
the project lead's rule (4 October 2026): one global logo for apps, profile pictures, favicons, everything. The mark sits in a black
|
||||
square (#0C0C0E, the site's obsidian token), centred, no circle, no ring, no border, never on another colour. The Mac app
|
||||
is the model. The rounded variant (brand/master/igneum-mark-square-rounded.svg, Apple's 824-on-1024 icon grid) is used
|
||||
only where the shape has to be baked into the file: the DMG volume icon. Tahoe masks the plain square itself.
|
||||
|
||||
Outputs:
|
||||
brand/icons/
|
||||
igneum.icns the app bundle icon (plain square, 16 to 1024, iconutil)
|
||||
igneum-volume.icns the DMG volume icon (rounded variant)
|
||||
igneum.ico Windows icon, 16 24 32 48 64 128 256 px, uncompressed BMP entries, each rendered from the vector
|
||||
igneum-256.png the square at 256 px
|
||||
inno-wizard-164x314.bmp Inno Setup WizardImageFile
|
||||
inno-wizard-small-55x58.bmp Inno Setup WizardSmallImageFile
|
||||
inno-banner-150x57.bmp header banner (NSIS size)
|
||||
dmg-background.png / @2x 660x400 DMG window background; dmg-background.tiff holds both when tiffutil is present
|
||||
site/ favicon.ico (16 32 48), favicon-32.png, apple-touch-icon.png (180, square: iOS rounds it), icon-192.png,
|
||||
icon-512.png, maskable-512.png (the mark at 50% of the square, inside the maskable safe zone)
|
||||
relay/ favicon.ico, favicon-32.png, apple-touch-icon.png (the relay serves static files from its root)
|
||||
brand/profile/ profile-400.png, profile-512.png, profile-1024.png (X, Discord, Telegram, LinkedIn), github-org-512.png,
|
||||
x-banner-1500x500.png (the mark centred on obsidian)
|
||||
brand/igneum-icon-512.png and igneum-icon-1024.png are refreshed from the master as well.
|
||||
|
||||
Rendering: rsvg-convert when it is installed (brew install librsvg), else Pillow draws the master's rect and polygons
|
||||
itself at 4x to 16x supersampling (the mark is two polygons, so this is exact). cairosvg is not used: the conda build on
|
||||
this Mac has no libcairo. Needs Pillow and, on a Mac, iconutil and tiffutil (both ship with macOS).
|
||||
python3 brand/icons/make-icons.py
|
||||
"""
|
||||
import os, subprocess, sys, shutil, tempfile
|
||||
import os, re, subprocess, sys, shutil, tempfile
|
||||
import xml.etree.ElementTree as ET
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
BRAND = os.path.dirname(HERE)
|
||||
COIN = os.path.join(BRAND, 'igneum-coin-1024.png')
|
||||
ROOT = os.path.dirname(BRAND)
|
||||
MASTER = os.path.join(BRAND, 'master', 'igneum-mark-square.svg')
|
||||
MASTER_ROUNDED = os.path.join(BRAND, 'master', 'igneum-mark-square-rounded.svg')
|
||||
SITE = os.path.join(ROOT, 'site')
|
||||
RELAY = os.path.join(ROOT, 'relay')
|
||||
PROFILE = os.path.join(BRAND, 'profile')
|
||||
FONT = os.path.join(BRAND, 'Unbounded.ttf')
|
||||
OBSIDIAN = (12, 12, 14)
|
||||
EMBER = (242, 84, 27)
|
||||
MOLTEN = (255, 179, 92)
|
||||
BONE = (244, 241, 236)
|
||||
RADIUS = 480.0 # the ember ring's outer edge, measured on the 1024 px coin
|
||||
CENTRE = (511.5, 511.5)
|
||||
ARTBOARD = 1024
|
||||
SVG = '{http://www.w3.org/2000/svg}'
|
||||
|
||||
# ---- the vector -------------------------------------------------------------------------------------------------
|
||||
|
||||
def hex_rgb(s):
|
||||
s = s.strip().lstrip('#')
|
||||
return tuple(int(s[i:i + 2], 16) for i in (0, 2, 4))
|
||||
|
||||
def parse_transform(t):
|
||||
"""translate(tx ty) scale(s) -> (tx, ty, s); only the two forms the masters use."""
|
||||
tx = ty = 0.0
|
||||
s = 1.0
|
||||
for name, args in re.findall(r'(\w+)\(([^)]*)\)', t or ''):
|
||||
v = [float(x) for x in re.split(r'[\s,]+', args.strip()) if x]
|
||||
if name == 'translate':
|
||||
tx, ty = v[0], (v[1] if len(v) > 1 else 0.0)
|
||||
elif name == 'scale':
|
||||
s = v[0]
|
||||
return tx, ty, s
|
||||
|
||||
def load_master(path):
|
||||
"""The master as a list of shapes: ('rect', fill) or ('poly', [(x, y), ...], fill), in document order, on the 1024 artboard."""
|
||||
root = ET.parse(path).getroot()
|
||||
shapes = []
|
||||
def walk(el, tx, ty, s):
|
||||
tag = el.tag.replace(SVG, '')
|
||||
if tag == 'g':
|
||||
gx, gy, gs = parse_transform(el.get('transform'))
|
||||
for c in el:
|
||||
walk(c, tx + gx * s, ty + gy * s, s * gs)
|
||||
elif tag == 'rect':
|
||||
shapes.append(('rect', hex_rgb(el.get('fill'))))
|
||||
elif tag == 'polygon':
|
||||
pts = [float(v) for v in re.split(r'[\s,]+', el.get('points').strip()) if v]
|
||||
poly = [(tx + pts[i] * s, ty + pts[i + 1] * s) for i in range(0, len(pts), 2)]
|
||||
shapes.append(('poly', poly, hex_rgb(el.get('fill'))))
|
||||
else:
|
||||
for c in el:
|
||||
walk(c, tx, ty, s)
|
||||
walk(root, 0.0, 0.0, 1.0)
|
||||
return shapes
|
||||
|
||||
def render_pillow(shapes, size, mark_scale=1.0):
|
||||
"""The shapes at `size` px, supersampled, on transparency. mark_scale shrinks the polygons about the centre
|
||||
(the maskable icon wants the mark at 50% of the square instead of 62%)."""
|
||||
ss = max(2, min(16, 4096 // size))
|
||||
big = size * ss
|
||||
k = big / ARTBOARD
|
||||
im = Image.new('RGBA', (big, big), (0, 0, 0, 0))
|
||||
d = ImageDraw.Draw(im)
|
||||
c = ARTBOARD / 2
|
||||
for sh in shapes:
|
||||
if sh[0] == 'rect':
|
||||
d.rectangle((0, 0, big, big), fill=sh[1] + (255,))
|
||||
else:
|
||||
pts = [((c + (x - c) * mark_scale) * k, (c + (y - c) * mark_scale) * k) for x, y in sh[1]]
|
||||
d.polygon(pts, fill=sh[2] + (255,))
|
||||
return im.resize((size, size), Image.LANCZOS)
|
||||
|
||||
def render_rsvg(path, size):
|
||||
out = subprocess.run(['rsvg-convert', '-w', str(size), '-h', str(size), path], capture_output=True, check=True).stdout
|
||||
import io
|
||||
return Image.open(io.BytesIO(out)).convert('RGBA')
|
||||
|
||||
_cache = {}
|
||||
def render(size, rounded=False, mark_scale=1.0):
|
||||
key = (size, rounded, mark_scale)
|
||||
if key not in _cache:
|
||||
path = MASTER_ROUNDED if rounded else MASTER
|
||||
if mark_scale == 1.0 and shutil.which('rsvg-convert'):
|
||||
im = render_rsvg(path, size)
|
||||
else:
|
||||
im = render_pillow(load_master(path), size, mark_scale)
|
||||
_cache[key] = im
|
||||
return _cache[key].copy()
|
||||
|
||||
# ---- outputs ----------------------------------------------------------------------------------------------------
|
||||
|
||||
def save_png(im, path):
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
im.save(path, optimize=True)
|
||||
return path
|
||||
|
||||
def make_icns(name, rounded):
|
||||
tmp = tempfile.mkdtemp()
|
||||
iconset = os.path.join(tmp, 'igneum.iconset')
|
||||
os.mkdir(iconset)
|
||||
for s in (16, 32, 128, 256, 512):
|
||||
render(s, rounded).save(os.path.join(iconset, f'icon_{s}x{s}.png'))
|
||||
render(s * 2, rounded).save(os.path.join(iconset, f'icon_{s}x{s}@2x.png'))
|
||||
out = os.path.join(HERE, name)
|
||||
subprocess.run(['iconutil', '-c', 'icns', iconset, '-o', out], check=True)
|
||||
shutil.rmtree(tmp)
|
||||
return out
|
||||
|
||||
def make_ico(path, sizes):
|
||||
frames = [render(s).convert('RGBA') for s in sizes]
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
base, rest = frames[-1], frames[:-1]
|
||||
try:
|
||||
base.save(path, format='ICO', sizes=[(s, s) for s in sizes], append_images=rest, bitmap_format='bmp')
|
||||
except TypeError:
|
||||
base.save(path, format='ICO', sizes=[(s, s) for s in sizes], append_images=rest)
|
||||
return path
|
||||
|
||||
def font(size, weight='SemiBold'):
|
||||
f = ImageFont.truetype(FONT, size)
|
||||
|
|
@ -35,42 +159,6 @@ def font(size, weight='SemiBold'):
|
|||
pass
|
||||
return f
|
||||
|
||||
def coin_rgba():
|
||||
"""The coin on transparency: a 4x supersampled circular mask at the ring's outer edge."""
|
||||
im = Image.open(COIN).convert('RGBA')
|
||||
big = Image.new('L', (4096, 4096), 0)
|
||||
d = ImageDraw.Draw(big)
|
||||
cx, cy, r = CENTRE[0] * 4 + 2, CENTRE[1] * 4 + 2, (RADIUS - 0.5) * 4
|
||||
d.ellipse((cx - r, cy - r, cx + r, cy + r), fill=255)
|
||||
mask = big.resize((1024, 1024), Image.LANCZOS)
|
||||
im.putalpha(mask)
|
||||
return im
|
||||
|
||||
def fit(im, size):
|
||||
return im.resize((size, size), Image.LANCZOS)
|
||||
|
||||
def make_icns(coin):
|
||||
tmp = tempfile.mkdtemp()
|
||||
iconset = os.path.join(tmp, 'igneum.iconset')
|
||||
os.mkdir(iconset)
|
||||
for s in (16, 32, 128, 256, 512):
|
||||
fit(coin, s).save(os.path.join(iconset, f'icon_{s}x{s}.png'))
|
||||
fit(coin, s * 2).save(os.path.join(iconset, f'icon_{s}x{s}@2x.png'))
|
||||
out = os.path.join(HERE, 'igneum.icns')
|
||||
subprocess.run(['iconutil', '-c', 'icns', iconset, '-o', out], check=True)
|
||||
shutil.rmtree(tmp)
|
||||
return out
|
||||
|
||||
def make_ico(coin):
|
||||
out = os.path.join(HERE, 'igneum.ico')
|
||||
sizes = [(s, s) for s in (16, 24, 32, 48, 64, 128, 256)]
|
||||
base = fit(coin, 256)
|
||||
try:
|
||||
base.save(out, format='ICO', sizes=sizes, bitmap_format='bmp')
|
||||
except TypeError:
|
||||
base.save(out, format='ICO', sizes=sizes)
|
||||
return out
|
||||
|
||||
def wordmark(text, size, colour=BONE, weight='SemiBold'):
|
||||
f = font(size, weight)
|
||||
l, t, r, b = f.getbbox(text)
|
||||
|
|
@ -84,20 +172,18 @@ def paste_centre(dst, src, cx, cy):
|
|||
def bmp(im, path):
|
||||
im.convert('RGB').save(path, format='BMP')
|
||||
|
||||
def make_inno(coin):
|
||||
# 164x314: the coin above a two-line wordmark
|
||||
def make_inno():
|
||||
# The installer pages are obsidian already, so the square tile merges with the page: the mark reads centred, no edge.
|
||||
big = Image.new('RGBA', (164, 314), OBSIDIAN + (255,))
|
||||
paste_centre(big, fit(coin, 112), 82, 110)
|
||||
paste_centre(big, render(124), 82, 110)
|
||||
paste_centre(big, wordmark('IGNEUM', 19, BONE, 'Bold'), 82, 205)
|
||||
paste_centre(big, wordmark('MINER', 13, MOLTEN, 'Medium'), 82, 232)
|
||||
bmp(big, os.path.join(HERE, 'inno-wizard-164x314.bmp'))
|
||||
# 55x58: the coin alone
|
||||
small = Image.new('RGBA', (55, 58), OBSIDIAN + (255,))
|
||||
paste_centre(small, fit(coin, 50), 27.5, 29)
|
||||
paste_centre(small, render(55), 27.5, 29)
|
||||
bmp(small, os.path.join(HERE, 'inno-wizard-small-55x58.bmp'))
|
||||
# 150x57: coin left, wordmark right
|
||||
banner = Image.new('RGBA', (150, 57), OBSIDIAN + (255,))
|
||||
paste_centre(banner, fit(coin, 44), 28, 28.5)
|
||||
paste_centre(banner, render(50), 28, 28.5)
|
||||
w1 = wordmark('IGNEUM', 15, BONE, 'Bold')
|
||||
w2 = wordmark('MINER', 10, MOLTEN, 'Medium')
|
||||
banner.alpha_composite(w1, (56, 14))
|
||||
|
|
@ -110,7 +196,7 @@ def arrow(draw, x0, x1, y, colour, width):
|
|||
draw.polygon([(x1, y), (x1 - h * 1.6, y - h), (x1 - h * 1.6, y + h)], fill=colour)
|
||||
|
||||
# Finder icon slots on the DMG (1x pixels, icon size 96): the app at APP_SLOT, the Applications link at APPS_SLOT,
|
||||
# README.txt and the Stop command in the row below. build-dmg.sh uses the same numbers.
|
||||
# README.txt and the Stop command in the row below. packaging/mac/dmg/settings.py uses the same numbers.
|
||||
ICON = 96
|
||||
APP_SLOT = (165, 130)
|
||||
APPS_SLOT = (495, 130)
|
||||
|
|
@ -132,9 +218,9 @@ def dashed_box(im, cx, cy, r, colour, width=3, dash=16, gap=10, radius=18):
|
|||
layer.putalpha(alpha)
|
||||
im.alpha_composite(layer)
|
||||
|
||||
def make_dmg_background(coin):
|
||||
"""660x400 at 1x; drawn at 2x and downsampled. The coin is painted under the app slot, so the slot reads as the
|
||||
product even before Finder draws the app icon on top of it."""
|
||||
def make_dmg_background():
|
||||
"""660x400 at 1x; drawn at 2x and downsampled. The rounded icon is painted under the app slot, so the slot reads as
|
||||
the product even before Finder draws the app icon on top of it."""
|
||||
S = 2
|
||||
W, H = 660 * S, 400 * S
|
||||
im = Image.new('RGBA', (W, H), OBSIDIAN + (255,))
|
||||
|
|
@ -146,7 +232,7 @@ def make_dmg_background(coin):
|
|||
for i, a in ((76 * S, 10), (66 * S, 12), (58 * S, 14)):
|
||||
gd.ellipse((ax - i, ay - i, ax + i, ay + i), fill=EMBER + (a,))
|
||||
im.alpha_composite(glow)
|
||||
paste_centre(im, fit(coin, ICON * S), ax, ay)
|
||||
paste_centre(im, render(ICON * S, rounded=True), ax, ay)
|
||||
dashed_box(im, bx, by, (ICON // 2 + 14) * S, MOLTEN + (190,), width=2 * S, dash=9 * S, gap=6 * S, radius=9 * S)
|
||||
arrow(d, (APP_SLOT[0] + 78) * S, (APPS_SLOT[0] - 78) * S, ay, EMBER + (255,), 4 * S)
|
||||
paste_centre(im, wordmark('Drag Igneum Miner to Applications', 16 * S, BONE, 'Medium'), 330 * S, 236 * S)
|
||||
|
|
@ -160,20 +246,51 @@ def make_dmg_background(coin):
|
|||
subprocess.run(['tiffutil', '-cathidpicheck', os.path.join(HERE, 'dmg-background.png'),
|
||||
os.path.join(HERE, 'dmg-background@2x.png'), '-out', tiff], check=True)
|
||||
|
||||
def make_site(folder, full=True):
|
||||
out = []
|
||||
out.append(make_ico(os.path.join(folder, 'favicon.ico'), (16, 32, 48)))
|
||||
out.append(save_png(render(32).convert('RGB'), os.path.join(folder, 'favicon-32.png')))
|
||||
out.append(save_png(render(180).convert('RGB'), os.path.join(folder, 'apple-touch-icon.png')))
|
||||
if full:
|
||||
out.append(save_png(render(192).convert('RGB'), os.path.join(folder, 'icon-192.png')))
|
||||
out.append(save_png(render(512).convert('RGB'), os.path.join(folder, 'icon-512.png')))
|
||||
out.append(save_png(render(512, mark_scale=50 / 62).convert('RGB'), os.path.join(folder, 'maskable-512.png')))
|
||||
return out
|
||||
|
||||
def make_profile():
|
||||
out = []
|
||||
for s in (400, 512, 1024):
|
||||
out.append(save_png(render(s).convert('RGB'), os.path.join(PROFILE, f'profile-{s}.png')))
|
||||
out.append(save_png(render(512).convert('RGB'), os.path.join(PROFILE, 'github-org-512.png')))
|
||||
banner = Image.new('RGB', (1500, 500), OBSIDIAN)
|
||||
tile = render(500).convert('RGB')
|
||||
banner.paste(tile, (500, 0))
|
||||
out.append(save_png(banner, os.path.join(PROFILE, 'x-banner-1500x500.png')))
|
||||
out.append(save_png(render(512).convert('RGB'), os.path.join(BRAND, 'igneum-icon-512.png')))
|
||||
out.append(save_png(render(1024).convert('RGB'), os.path.join(BRAND, 'igneum-icon-1024.png')))
|
||||
return out
|
||||
|
||||
def main():
|
||||
coin = coin_rgba()
|
||||
fit(coin, 256).save(os.path.join(HERE, 'igneum-256.png'))
|
||||
made = []
|
||||
made.append(save_png(render(256), os.path.join(HERE, 'igneum-256.png')))
|
||||
if sys.platform == 'darwin' and shutil.which('iconutil'):
|
||||
print('icns:', make_icns(coin))
|
||||
made.append(make_icns('igneum.icns', rounded=False))
|
||||
made.append(make_icns('igneum-volume.icns', rounded=True))
|
||||
else:
|
||||
print('icns skipped: iconutil is a macOS tool')
|
||||
print('ico:', make_ico(coin))
|
||||
make_inno(coin)
|
||||
make_dmg_background(coin)
|
||||
made.append(make_ico(os.path.join(HERE, 'igneum.ico'), (16, 24, 32, 48, 64, 128, 256)))
|
||||
make_inno()
|
||||
make_dmg_background()
|
||||
made += make_site(SITE)
|
||||
made += make_site(RELAY, full=False)
|
||||
made += make_profile()
|
||||
for f in sorted(os.listdir(HERE)):
|
||||
p = os.path.join(HERE, f)
|
||||
if os.path.isfile(p) and not f.endswith('.py'):
|
||||
print(f'{os.path.getsize(p):>8} {f}')
|
||||
made.append(p)
|
||||
print('renderer:', 'rsvg-convert' if shutil.which('rsvg-convert') else 'Pillow (polygons from the master SVG)')
|
||||
for p in sorted(set(made)):
|
||||
print(f'{os.path.getsize(p):>8} {os.path.relpath(p, ROOT)}')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
11
brand/master/igneum-mark-square-rounded.svg
Normal file
|
After Width: | Height: | Size: 11 KiB |
11
brand/master/igneum-mark-square.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024">
|
||||
<!-- Igneum master mark, 4 October 2026. The mark sits in a black square. No circle, no ring, no border, never on another colour.
|
||||
Square: #0C0C0E (the site's obsidian token). Mark: #F2541B ember, the flame's centre cut in obsidian.
|
||||
Mark geometry: the exact polygons from site/index.html's header (100 x 100 viewBox); mark height 92 units = 62% of the square,
|
||||
so scale 6.901 and translate 166.95. Clear space on every side is at least 20% of the square. -->
|
||||
<rect width="1024" height="1024" fill="#0C0C0E"/>
|
||||
<g transform="translate(166.95 166.95) scale(6.901)">
|
||||
<polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"/>
|
||||
<polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 849 B |
BIN
brand/profile/github-org-512.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
brand/profile/profile-1024.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
brand/profile/profile-400.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
brand/profile/profile-512.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
brand/profile/x-banner-1500x500.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/brand/after-contact-sheet.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
docs/brand/after-icns-and-favicon16.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
docs/brand/before/brand-igneum-coin-1024.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
docs/brand/before/brand-igneum-icon-1024.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
docs/brand/before/brand-igneum-icon-512.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
docs/brand/before/brand-mark-transparent-1024.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
docs/brand/before/contact-sheet-before.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/brand/before/dmg-file-icon-finder-256.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/brand/before/dmg-volume-icon-256.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/brand/before/dmg-volume-icon-finder-256.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/brand/before/finder-before.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/brand/before/icons-dmg-background.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/brand/before/icons-igneum-256.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/brand/before/icons-igneum-ico-256.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/brand/before/mac-app-icon-256.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/brand/before/mac-app-icon-finder-256.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/brand/before/site-apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/brand/before/site-favicon-32-upscaled.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
docs/brand/before/site-icon-192.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/brand/before/site-icon-512.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/brand/before/site-og-coin.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
docs/brand/before/site-og-small.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/brand/before/site-og-square.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
|
|
@ -15,7 +15,7 @@ Output: `packaging/mac/dist/Igneum-Miner-0.3.0.dmg` (about 20 MB, lzfse). The sc
|
|||
same target), takes `igneumd` and `igneum-miner` from `vendor/igneum-node/target-integration/release` (the devnet-v4
|
||||
integration build; `NODE=`, `MINER=`, `WORKER=`, `ENGINE=` override), strips and ad-hoc signs the copies, checks each
|
||||
one runs, writes `igneum-app.json` (below) and lays the image out with `dmgbuild` (`pip3 install dmgbuild`; without it a
|
||||
plain hdiutil image). The icon is `brand/icons/igneum.icns`, the DMG art `brand/icons/dmg-background.tiff`
|
||||
plain hdiutil image). The app icon is `brand/icons/igneum.icns` (the master mark, a plain black square), the volume icon `brand/icons/igneum-volume.icns` (its rounded variant), the DMG art `brand/icons/dmg-background.tiff`
|
||||
(`python3 brand/icons/make-icons.py`). `build/` and `dist/` are ignored by git.
|
||||
|
||||
## The bundle
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash
|
||||
# Builds packaging/mac/dist/Igneum-Miner-<version>.dmg: "Igneum Miner.app" + README.txt + "Stop Igneum Miner.command" +
|
||||
# a link to /Applications, on a branded image (volume "Igneum Miner", coin volume icon, background with the drag arrow,
|
||||
# a link to /Applications, on a branded image (volume "Igneum Miner", the rounded mark as the volume icon, background with the drag arrow,
|
||||
# icons placed). 3 October 2026; 0.2.0 for devnet v4 on 4 October 2026; 0.3.0 the same day: the app (no Terminal).
|
||||
#
|
||||
# The bundle, 0.3.0:
|
||||
|
|
@ -11,13 +11,13 @@
|
|||
# with -target arm64-apple-macos11 so it loads on any Apple silicon macOS)
|
||||
# Contents/Resources/igneum-app.json the update manifest URL (token from ~/.config/igneum/dl-token, not in the repo),
|
||||
# the log intake, the live page (packaged-config.sh)
|
||||
# Contents/Resources/igneum.icns
|
||||
# Contents/Resources/igneum.icns the master mark, a plain black square (brand/master/igneum-mark-square.svg; Tahoe masks it)
|
||||
# Copies of the binaries are stripped and re-signed ad hoc (strip invalidates the linker signature and arm64 macOS
|
||||
# refuses an unsigned binary); the originals are not touched.
|
||||
#
|
||||
# packaging/mac/build-dmg.sh build
|
||||
# NODE=<path> MINER=<path> WORKER=<path> ENGINE=<path> use other binaries; REBUILD_WORKER=0 ships proto-metal/igneum-bench-hotswap
|
||||
# Needs: brand/icons/igneum.icns and dmg-background.tiff (python3 brand/icons/make-icons.py), swiftc, cargo (rustup), and
|
||||
# Needs: brand/icons/igneum.icns, igneum-volume.icns and dmg-background.tiff (python3 brand/icons/make-icons.py), swiftc, cargo (rustup), and
|
||||
# dmgbuild (pip3 install dmgbuild) for the icon layout. Without dmgbuild a plain hdiutil image is built and said so.
|
||||
set -euo pipefail
|
||||
HERE="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
|
@ -50,7 +50,7 @@ fi
|
|||
for f in "$NODE" "$MINER"; do
|
||||
file "$f" | grep -q 'arm64' || { echo "$f is not an arm64 binary"; exit 1; }
|
||||
done
|
||||
[ -f "$ICONS/igneum.icns" ] || { echo "no $ICONS/igneum.icns; run: python3 brand/icons/make-icons.py"; exit 1; }
|
||||
for f in igneum.icns igneum-volume.icns; do [ -f "$ICONS/$f" ] || { echo "no $ICONS/$f; run: python3 brand/icons/make-icons.py"; exit 1; }; done
|
||||
command -v swiftc >/dev/null 2>&1 || { echo "swiftc is needed for the window (xcode-select --install)"; exit 1; }
|
||||
|
||||
rm -rf "$BUILD"
|
||||
|
|
@ -126,7 +126,7 @@ if command -v dmgbuild >/dev/null 2>&1; then
|
|||
else
|
||||
echo "note: dmgbuild is not installed (pip3 install dmgbuild); building a plain image without icon positions or background"
|
||||
ln -s /Applications "$STAGE/Applications"
|
||||
cp "$ICONS/igneum.icns" "$STAGE/.VolumeIcon.icns"
|
||||
cp "$ICONS/igneum-volume.icns" "$STAGE/.VolumeIcon.icns"
|
||||
hdiutil create -volname "Igneum Miner" -srcfolder "$STAGE" -ov -format ULFO -fs HFS+ "$DMG" >/dev/null
|
||||
fi
|
||||
hdiutil verify "$DMG" >/dev/null
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ filesystem = 'HFS+'
|
|||
size = None
|
||||
files = [app, os.path.join(stage, 'README.txt'), os.path.join(stage, 'Stop Igneum Miner.command')]
|
||||
symlinks = {'Applications': '/Applications'}
|
||||
icon = os.path.join(icons, 'igneum.icns') # the volume icon (.VolumeIcon.icns, hidden, custom-icon flag set)
|
||||
icon = os.path.join(icons, 'igneum-volume.icns') # the volume icon (.VolumeIcon.icns, hidden, custom-icon flag set): the rounded
|
||||
# variant of the master mark; the app bundle itself carries the plain square igneum.icns
|
||||
background = os.path.join(icons, 'dmg-background.tiff') if os.path.exists(os.path.join(icons, 'dmg-background.tiff')) else os.path.join(icons, 'dmg-background.png')
|
||||
show_status_bar = False
|
||||
show_tab_view = False
|
||||
|
|
|
|||
BIN
relay/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
relay/favicon-32.png
Normal file
|
After Width: | Height: | Size: 834 B |
BIN
relay/favicon.ico
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
|
@ -1 +1 @@
|
|||
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Igneum relay</title><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><style>body{margin:0;min-height:100vh;display:grid;place-items:center;background:#0C0C0E;color:#9A9A9E;font:14px 'IBM Plex Mono',monospace}</style></head><body>igneum relay</body></html>
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Igneum relay</title><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico" sizes="48x48"><link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32"><link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180"><style>body{margin:0;min-height:100vh;display:grid;place-items:center;background:#0C0C0E;color:#9A9A9E;font:14px 'IBM Plex Mono',monospace}</style></head><body>igneum relay</body></html>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,10 @@
|
|||
<title>Igneum relay</title>
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Unbounded:wght@700;900&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap">
|
||||
|
|
@ -115,7 +118,7 @@ pre.code{color:var(--bone)}
|
|||
</head>
|
||||
<body>
|
||||
<header><div class="wrap">
|
||||
<div class="brand"><svg width="22" height="22" viewBox="0 0 100 100" aria-hidden="true"><circle cx="50" cy="50" r="48" fill="#0C0C0E"/><circle cx="50" cy="50" r="45" fill="none" stroke="#F2541B" stroke-width="6"/><g transform="translate(24 24) scale(0.52)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"/><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"/></g></svg><span class="word">IGNEUM</span><span class="sub">relay</span></div>
|
||||
<div class="brand"><svg width="22" height="22" viewBox="0 0 100 100" aria-hidden="true"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"/><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"/></svg><span class="word">IGNEUM</span><span class="sub">relay</span></div>
|
||||
<div class="status"><span class="dot" id="dot"></span><span id="stat">connecting</span></div>
|
||||
</div></header>
|
||||
<main class="wrap">
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 4.4 KiB |
|
|
@ -21,8 +21,9 @@
|
|||
<meta name="twitter:description" content="Every Igneum benchmark and test, with the hardware and the commands that produced it. Prototype numbers are labelled as such.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ function md(src) {
|
|||
|
||||
const mark = `<svg viewBox="0 0 100 100" width="26" height="26" aria-hidden="true"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></svg>`;
|
||||
const ORIGIN = 'https://igneum.network';
|
||||
const svgIcon = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E";
|
||||
const svgIcon = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E";
|
||||
// Search and share metadata. Same set as the hand-written pages (index, litepaper, live); keep them in step.
|
||||
function meta(title, desc, path) {
|
||||
const url = ORIGIN + path; const t = esc(title); const d = esc(desc);
|
||||
|
|
@ -68,6 +68,7 @@ function meta(title, desc, path) {
|
|||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="${svgIcon}" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
|
|
@ -21,8 +21,9 @@
|
|||
<meta name="twitter:description" content="Every public Igneum claim with its status: designed, implemented, tested by the team, reproduced externally, reviewed independently. Nothing has been reproduced or reviewed yet.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
BIN
site/favicon-32.png
Normal file
|
After Width: | Height: | Size: 834 B |
BIN
site/favicon.ico
|
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 12 KiB |
|
|
@ -21,8 +21,9 @@
|
|||
<meta name="twitter:description" content="A GPU-mined chain whose mining program rewrites itself every hour. Miners also prove the blocks. No premine, no stake, no fee to any team.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og-small.png">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml" type="image/svg+xml">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
|
|
@ -21,8 +21,9 @@
|
|||
<meta name="twitter:description" content="The Igneum litepaper. The hourly GPU lottery, blocks proven by miners, GHOSTDAG ordering, miner-only finality, the 4 billion cap. No premine, no stake.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og-small.png">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml" type="image/svg+xml">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
|
|
@ -21,8 +21,9 @@
|
|||
<meta name="twitter:description" content="The Igneum devnet as it runs: blocks, miners, difficulty and peers, read from a node every two seconds.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og-small.png">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%230C0C0E'/%3E%3Ccircle cx='50' cy='50' r='45' fill='none' stroke='%23F2541B' stroke-width='6'/%3E%3Cg transform='translate(24 24) scale(0.52)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml" type="image/svg+xml">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
|
|
|
|||
BIN
site/maskable-512.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
|
@ -8,6 +8,7 @@
|
|||
"background_color": "#0C0C0E",
|
||||
"icons": [
|
||||
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
|
||||
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }
|
||||
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
|
||||
{ "src": "/maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
|
||||
]
|
||||
}
|
||||
|
|
|
|||