Initial commit: goblin.st static landing site

Static landing page for goblin.st (index, privacy, terms) with Geist
fonts and brand assets. Matches the currently-deployed /opt/goblin/www.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 01:22:01 -04:00
commit 08bbd74532
16 changed files with 1251 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
*.bak-*
.DS_Store
.claude/
+93
View File
@@ -0,0 +1,93 @@
Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="600.000000pt" height="601.000000pt" viewBox="0 0 600.000000 601.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,601.000000) scale(0.050000,-0.050000)"
fill="#000000" stroke="none">
<path d="M195 11784 c-515 -1551 98 -2966 1520 -3514 171 -66 171 -72 2 -72
-415 0 -893 215 -1273 572 -178 167 -181 163 -77 -83 478 -1130 1770 -1734
2963 -1384 283 83 309 101 420 292 376 648 1038 1116 1763 1245 l143 26 100
202 c887 1780 -911 3344 -3076 2675 l-170 -52 220 -14 c480 -32 818 -114 1118
-273 258 -137 548 -414 624 -597 l32 -76 -87 76 c-435 375 -938 524 -1557 461
-273 -28 -340 -39 -740 -120 -893 -182 -1449 24 -1756 650 l-98 200 -71 -214z"/>
<path d="M9720 10053 c0 -146 -256 -556 -441 -705 -381 -308 -766 -380 -1559
-290 -1178 133 -2048 -270 -2488 -1152 -57 -115 -92 -149 -92 -89 0 78 123
415 199 548 43 74 73 135 67 135 -25 0 -397 -184 -512 -253 -962 -578 -1594
-1675 -1594 -2767 0 -209 -2 -210 -154 -95 -393 297 -523 388 -751 525 -321
192 -571 311 -843 400 -290 95 -302 94 -242 -15 52 -95 166 -372 191 -465 9
-33 34 -121 56 -195 48 -161 120 -508 194 -935 118 -684 437 -1371 795 -1715
185 -178 324 -239 594 -262 144 -13 150 -15 147 -63 -1 -27 -14 -174 -28 -326
-83 -902 258 -1568 1037 -2024 139 -81 161 -80 127 4 -37 96 -85 369 -96 546
l-10 170 46 -60 c328 -431 869 -753 1497 -891 351 -77 1285 -67 1426 15 9 5
-104 50 -250 98 -653 218 -1499 778 -1704 1129 -43 73 -54 78 188 -79 230
-149 543 -303 750 -369 783 -249 1542 -242 2332 20 l274 91 106 -83 c298 -236
798 -328 1259 -231 197 42 196 38 32 169 -156 124 -344 356 -443 546 l-60 116
70 52 c544 408 783 906 627 1300 l-41 102 170 138 c442 355 584 624 813 1537
186 742 257 952 452 1328 l118 227 -145 -14 c-693 -68 -1425 -411 -1729 -810
-99 -130 -112 -127 -165 44 -54 175 -217 511 -308 636 -64 88 -70 91 -224 117
-419 70 -947 328 -1223 597 -98 96 -153 192 -70 122 41 -35 332 -177 487 -238
97 -38 146 -55 348 -118 335 -105 983 -129 1280 -47 1070 294 1688 1238 1761
2691 16 304 7 325 -82 190 -88 -134 -504 -535 -669 -645 -618 -412 -1228 -507
-1895 -296 -192 60 -199 77 -67 163 428 277 628 871 480 1428 -20 75 -38 98
-38 48z m-682 -4962 c306 -158 601 -1396 416 -1747 -118 -224 -283 -345 -526
-387 -455 -78 -577 227 -456 1143 96 725 320 1118 566 991z m-3115 -156 c371
-172 699 -815 799 -1565 34 -251 19 -307 -108 -422 -575 -519 -1624 -162
-1931 657 -265 709 593 1630 1240 1330z m5261 -120 c20 -377 -135 -912 -290
-995 -70 -38 -72 -35 -157 230 l-64 200 -24 -90 c-50 -192 -144 -340 -215
-340 -111 0 -316 804 -228 893 53 53 200 -130 226 -283 l14 -80 36 105 c100
293 222 333 332 109 l54 -110 35 105 c89 260 271 427 281 256z m-8491 -284
l75 -230 52 160 c89 272 210 336 295 154 126 -268 210 -757 142 -825 -44 -44
-163 120 -247 340 -12 33 -19 24 -39 -50 -89 -330 -286 -346 -374 -30 l-22 80
-35 -125 c-54 -196 -223 -428 -275 -377 -37 37 -29 448 11 608 70 276 219 524
314 524 17 0 56 -87 103 -229z m4164 -2698 c137 -310 856 -372 1401 -121 175
81 194 76 89 -23 -356 -336 -878 -447 -1310 -278 -224 88 -517 339 -517 443 0
53 140 267 212 324 l58 46 14 -152 c8 -84 31 -191 53 -239z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="600.000000pt" height="601.000000pt" viewBox="0 0 600.000000 601.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,601.000000) scale(0.050000,-0.050000)"
fill="#ffffff" stroke="none">
<path d="M195 11784 c-515 -1551 98 -2966 1520 -3514 171 -66 171 -72 2 -72
-415 0 -893 215 -1273 572 -178 167 -181 163 -77 -83 478 -1130 1770 -1734
2963 -1384 283 83 309 101 420 292 376 648 1038 1116 1763 1245 l143 26 100
202 c887 1780 -911 3344 -3076 2675 l-170 -52 220 -14 c480 -32 818 -114 1118
-273 258 -137 548 -414 624 -597 l32 -76 -87 76 c-435 375 -938 524 -1557 461
-273 -28 -340 -39 -740 -120 -893 -182 -1449 24 -1756 650 l-98 200 -71 -214z"/>
<path d="M9720 10053 c0 -146 -256 -556 -441 -705 -381 -308 -766 -380 -1559
-290 -1209 137 -2026 -255 -2519 -1208 -78 -151 -82 -156 -72 -77 18 140 128
450 210 592 43 74 73 135 67 135 -25 0 -397 -184 -512 -253 -966 -580 -1594
-1674 -1594 -2777 0 -104 -4 -190 -10 -190 -5 0 -65 43 -132 95 -650 503
-1118 775 -1606 935 -290 95 -302 94 -242 -15 52 -95 166 -372 191 -465 9 -33
34 -121 56 -195 48 -161 120 -508 194 -935 118 -684 437 -1371 795 -1715 185
-178 324 -239 594 -262 144 -13 150 -15 147 -63 -1 -27 -14 -174 -28 -326 -83
-902 258 -1568 1037 -2024 139 -81 161 -80 127 4 -37 96 -85 369 -96 546 l-10
170 46 -60 c328 -431 869 -753 1497 -891 351 -77 1285 -67 1426 15 9 5 -104
50 -250 98 -649 217 -1341 668 -1680 1096 -81 102 -88 147 -11 78 157 -142
653 -406 925 -493 783 -249 1542 -242 2332 20 l274 91 106 -83 c298 -236 798
-328 1259 -231 197 42 196 38 32 169 -156 124 -344 356 -443 546 l-60 116 70
52 c544 408 783 906 627 1300 l-41 102 170 138 c442 355 584 624 813 1537 186
742 257 952 452 1328 l118 227 -145 -14 c-693 -68 -1425 -411 -1729 -810 -99
-130 -112 -127 -165 44 -54 175 -217 511 -308 636 -64 88 -70 91 -224 117
-314 52 -637 184 -956 390 -260 168 -509 436 -280 302 127 -74 302 -160 430
-211 97 -38 146 -55 348 -118 335 -105 983 -129 1280 -47 961 264 1554 1048
1729 2286 28 199 45 685 23 677 -9 -4 -73 -77 -141 -163 -650 -810 -1594
-1147 -2451 -873 -251 80 -246 76 -171 121 395 240 638 767 578 1253 -25 209
-77 395 -77 278z m-682 -4962 c306 -158 601 -1396 416 -1747 -118 -224 -283
-345 -526 -387 -455 -78 -577 227 -456 1143 96 725 320 1118 566 991z m-3115
-156 c371 -172 699 -815 799 -1565 34 -251 19 -307 -108 -422 -575 -519 -1624
-162 -1931 657 -265 709 593 1630 1240 1330z m5261 -120 c20 -377 -135 -912
-290 -995 -70 -38 -72 -35 -157 230 l-64 200 -24 -90 c-50 -192 -144 -340
-215 -340 -111 0 -316 804 -228 893 53 53 200 -130 226 -283 l14 -80 36 105
c100 293 222 333 332 109 l54 -110 35 105 c89 260 271 427 281 256z m-8491
-284 l75 -230 52 160 c89 272 210 336 295 154 126 -268 210 -757 142 -825 -44
-44 -163 120 -247 340 -12 33 -19 24 -39 -50 -89 -330 -286 -346 -374 -30
l-22 80 -35 -125 c-54 -196 -223 -428 -275 -377 -37 37 -29 448 11 608 70 276
219 524 314 524 17 0 56 -87 103 -229z m4164 -2698 c137 -311 883 -373 1408
-116 162 78 171 64 42 -61 -317 -305 -854 -408 -1271 -244 -223 87 -516 338
-516 442 0 53 140 267 212 324 l58 46 14 -152 c8 -84 31 -191 53 -239z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

+314
View File
@@ -0,0 +1,314 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Goblin — a private wallet for GRIN ツ</title>
<meta name="description" content="Pay a username and the payment travels as an end-to-end encrypted message over nostr, through the Nym mixnet. No files to swap, no addresses on the chain.">
<meta property="og:type" content="website">
<meta property="og:title" content="Goblin — a private wallet for GRIN ツ">
<meta property="og:description" content="Pay a username — slatepacks and the Nym mixnet handled for you. Relays only ever see ciphertext.">
<meta property="og:url" content="https://goblin.st/">
<meta property="og:image" content="https://goblin.st/assets/goblin-icon.png">
<link rel="icon" type="image/png" href="assets/goblin-icon.png">
<link rel="apple-touch-icon" href="assets/goblin-icon.png">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="wrap">
<header class="site">
<a class="brand" href="/">
<span class="mark" aria-hidden="true"></span>
<span class="word">Goblin</span>
</a>
<nav class="site" aria-label="Site">
<a href="#features">Features</a>
<a href="#handles">Handles</a>
<a href="#downloads">Downloads</a>
<a class="gh" href="https://github.com/2ro/goblin" rel="noopener">
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
GitHub
</a>
</nav>
</header>
<main>
<section class="hero">
<div>
<span class="kicker">Free &amp; open source · GRIN ツ</span>
<h1>Send grin like <span class="strike">a&nbsp;text.</span></h1>
<p class="lede">
Goblin is a private wallet for
<strong>GRIN</strong> — confidential digital cash with no amounts or
addresses on the chain. Pay a <span class="at">username</span> and the payment is
delivered as an end-to-end encrypted message over <strong>nostr</strong>, through
the <strong>Nym mixnet</strong>. No files to swap. No need to both be online.
</p>
<div class="cta-row">
<a class="btn-primary" href="#downloads">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v10.6l3.3-3.3 1.4 1.4-5.7 5.7-5.7-5.7 1.4-1.4 3.3 3.3V3h2zM5 19h14v2H5v-2z"/></svg>
Get the builds
</a>
<div class="store-btns" role="note" aria-label="App stores coming soon">
<span class="store" aria-disabled="true" title="Coming soon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M17.05 12.54c-.03-2.89 2.36-4.28 2.47-4.35-1.35-1.97-3.44-2.24-4.18-2.27-1.78-.18-3.47 1.05-4.37 1.05-.9 0-2.29-1.02-3.77-1-1.94.03-3.72 1.13-4.72 2.86-2.01 3.49-.51 8.65 1.45 11.48.96 1.39 2.1 2.94 3.6 2.88 1.45-.06 1.99-.93 3.74-.93 1.74 0 2.24.93 3.77.9 1.56-.03 2.54-1.41 3.49-2.81 1.1-1.61 1.55-3.17 1.58-3.25-.04-.02-3.03-1.16-3.06-4.56zM14.17 4.04c.8-.97 1.34-2.32 1.19-3.66-1.15.05-2.55.77-3.38 1.74-.74.85-1.39 2.22-1.22 3.53 1.29.1 2.6-.65 3.41-1.61z"/></svg>
<span class="lines"><small>App Store</small><span>Coming soon</span></span>
<i class="soon">SOON</i>
</span>
<span class="store" aria-disabled="true" title="Coming soon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3.6 1.8c-.35.37-.55.94-.55 1.68v17.07c0 .74.2 1.31.55 1.68l.09.08 9.56-9.56v-.22L3.69 1.71l-.09.09zm13.05 13.04-3.18-3.18v-.22l3.19-3.19.07.04 3.78 2.15c1.08.61 1.08 1.61 0 2.23l-3.78 2.14-.08.03zm-3.4-2.96L3.69 22.31c.36.38 1.5.42 2.13.06l11.27-6.4-3.84-4.09zm0-7.76L5.82 1.63C5.19 1.27 4.05 1.31 3.69 1.7l9.56 9.56 3.84-4.1-3.84-2.04z" transform="translate(1.5 0)"/></svg>
<span class="lines"><small>Google Play</small><span>Coming soon</span></span>
<i class="soon">SOON</i>
</span>
</div>
</div>
<p class="micro">
Linux · Windows · Android today — macOS
<a href="https://github.com/2ro/goblin#build" rel="noopener">builds from source</a>.
Apache-2.0, sha256 checksums on every build.
</p>
</div>
<div class="phone-wrap" aria-hidden="true">
<div class="phone">
<div class="notch"></div>
<div class="p-head">
<span class="w">Goblin</span>
<span class="av"></span>
</div>
<div class="balance">
<div class="eyebrow">Balance</div>
<div class="amt">4.2069<span class="tsu"></span></div>
<div class="fiat">≈ $0.11 · 1ツ = $0.026</div>
</div>
<div class="pr-row">
<div class="pr pay">Pay</div>
<div class="pr req">Request</div>
</div>
<div class="act">
<div class="row">
<span class="dot" style="background:linear-gradient(135deg,#5BB0D9,#3D7FA6)"></span>
<span class="who"><b>mira</b><i>arrived sealed · just now</i></span>
<span class="val in">+0.5ツ</span>
</div>
<div class="row">
<span class="dot" style="background:linear-gradient(135deg,#9D8BE8,#6C58C4)"></span>
<span class="who"><b>kit</b><i>delivered over Nym · 2h</i></span>
<span class="val">1.2ツ</span>
</div>
<div class="row">
<span class="dot" style="background:linear-gradient(135deg,#E8854B,#C25A2E)"></span>
<span class="who"><b>npub1g0b…l1n</b><i>finalized · yesterday</i></span>
<span class="val in">+2.0ツ</span>
</div>
</div>
<div class="tabbar">
<span class="t"><svg viewBox="0 0 24 24"><path d="M4 10.5 12 4l8 6.5V20a1 1 0 0 1-1 1h-5v-6h-4v6H5a1 1 0 0 1-1-1v-9.5z"/></svg></span>
<span class="puck"></span>
<span class="t"><svg viewBox="0 0 24 24"><path d="M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h10v2H4v-2z"/></svg></span>
</div>
</div>
</div>
</section>
<section class="rail-sec" aria-label="How a payment travels">
<div class="rail-card">
<div class="rail-title">
<h2>How a payment travels</h2>
<span class="sub">Payments are NIP-44 encrypted; relays only ever see ciphertext — never the amount, sender, or recipient. Privacy is Mimblewimble on-chain + Nym on the wire.</span>
</div>
<div class="rail">
<img class="packet" src="assets/grin-logo.png" alt="" aria-hidden="true">
<div class="stop">
<div class="pin"><svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="3.4"/><path d="M5 20c.8-3.6 3.6-5.6 7-5.6s6.2 2 7 5.6"/></svg></div>
<b>You</b><i>type an amount, pick a name</i>
</div>
<div class="stop">
<div class="pin"><svg viewBox="0 0 24 24"><rect x="4" y="7" width="16" height="13" rx="2"/><path d="M4 11h16M12 7v13M9.5 7C7.5 5 8.5 3 10.5 3.5 11.7 3.8 12 5.5 12 7c0-1.5.3-3.2 1.5-3.5 2-.5 3 1.5 1 3.5"/></svg></div>
<b>Gift wrap</b><i>slatepack sealed, <a href="https://nips.nostr.com/17" rel="noopener">NIP-17</a></i>
</div>
<div class="stop">
<div class="pin"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="5.2"/><circle cx="12" cy="12" r="2"/></svg></div>
<b>Nym mixnet</b><i>5-hop, linked in-process</i>
</div>
<div class="stop">
<div class="pin"><svg viewBox="0 0 24 24"><path d="M12 21s-6.5-4.3-6.5-9.2C5.5 8 8 6 12 6s6.5 2 6.5 5.8C18.5 16.7 12 21 12 21z" transform="translate(0 -1.5)"/><path d="M9 11.5l2 2 4-4.5"/></svg></div>
<b>them</b><i>unwrapped, verified, applied</i>
</div>
</div>
</div>
</section>
<section id="features">
<div class="sec-head">
<h2>Private by construction</h2>
<p>Pay anyone instantly and directly — an addressless, confidential
chain underneath.</p>
</div>
<div class="features">
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><path d="M9.88 9.88a3 3 0 1 0 4.24 4.24"/><path d="M10.73 5.08A10.4 10.4 0 0 1 12 5c7 0 10 7 10 7a13.2 13.2 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.5 13.5 0 0 0 2 12s3 7 10 7a9.7 9.7 0 0 0 5.39-1.61"/><path d="M2 2l20 20"/></svg></div>
<h3>Confidential by design</h3>
<p>GRIN is confidential digital cash — every amount is cryptographically
hidden. Like handing someone cash, what you send stays between the two
of you.</p>
</article>
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8"/></svg></div>
<h3>Pay a username</h3>
<p>Handles are <a href="https://nips.nostr.com/5" rel="noopener">NIP-05</a> identities at <code>goblin.st</code>. Pay
<code>mira</code> — or any raw <code>npub</code> on nostr.</p>
</article>
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg></div>
<h3>Sealed delivery</h3>
<p>The slatepack travels as a NIP-17 gift-wrapped DM (<a href="https://nostrbook.dev/kinds/1059" rel="noopener">kind 1059</a>) and is
applied automatically by the recipient's wallet — no files, no meetups.</p>
</article>
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="5.5"/><circle cx="12" cy="12" r="2"/></svg></div>
<h3>Mixnet, built in</h3>
<p>Your payments and identity — nostr messages, names, price and
avatars — ride the
<a href="https://nym.com" rel="noopener">Nym mixnet</a>, with the SDK
linked right into the app. Five hops of cover traffic hide who pays
whom. (The grin node connects directly — public chain data, not tied
to you.) Nothing to set up.</p>
</article>
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><circle cx="8" cy="15" r="5"/><path d="M11.5 11.5 21 2"/><path d="M16.5 6.5 19 9"/><path d="M14 9l2.5 2.5"/></svg></div>
<h3>Separate from your wallet key</h3>
<p>Your nostr payment key is deliberately separate from your funds.
Rotate it any time to stay unlinkable — your grin never moves.</p>
</article>
<article class="feat">
<div class="glyph"><svg viewBox="0 0 24 24"><path d="M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6"/></svg></div>
<h3>Your numbers, your way</h3>
<p>Off by default. Opt into a world currency, Bitcoin, or sats and the
rate is fetched over the mixnet — nothing leaves your device otherwise.</p>
</article>
</div>
</section>
<section id="handles">
<div class="handle-grid">
<div>
<p class="big-at">Be <span class="at-name">yourself</span>.</p>
<p>Claim a free handle in the app and friends can pay you by name.
Your handle resolves through the open <a href="https://github.com/2ro/goblin-nip05d" rel="noopener">goblin.st identity service</a>
standard NIP-05, one name per key, yours until you release it.</p>
<p>Or remain anonymous and reset your identity whenever you want.</p>
</div>
<div class="code-card" aria-label="NIP-05 resolution example">
<span class="c-dim">$</span> curl 'https://goblin.st/.well-known/nostr.json?name=mira'<br>
{<br>
&nbsp;&nbsp;<span class="c-key">"names"</span>: {<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="c-key">"mira"</span>: <span class="c-str">"7d2f19c0…a4c41a"</span><br>
&nbsp;&nbsp;}<br>
}
</div>
</div>
</section>
<section id="downloads">
<div class="sec-head">
<h2>Downloads</h2>
<p>Fresh from the forge. Verify with the checksums file — every build ships one.</p>
</div>
<div class="dl-grid">
<div class="dl-card">
<span class="build-chip"><span class="dot"></span> latest release</span>
<div class="dl-rows">
<a href="https://github.com/2ro/goblin/releases/latest">
<svg viewBox="0 0 24 24"><path d="M12 3c-2 0-3.5 1.6-3.5 3.8 0 1.5-.6 2.7-1.5 4-1 1.4-2 3-2 5C5 19 7 21 9.5 20.4c.8-.2 1.6-.2 2.5-.2s1.7 0 2.5.2C17 21 19 19 19 15.8c0-2-1-3.6-2-5-.9-1.3-1.5-2.5-1.5-4C15.5 4.6 14 3 12 3z"/><path d="M9.5 9.8h.01M14.5 9.8h.01"/></svg>
<span class="name">Linux <span class="file">x86_64 · tar.gz</span></span>
<span class="arrow"></span>
</a>
<a href="https://github.com/2ro/goblin/releases/latest">
<svg viewBox="0 0 24 24"><path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z"/><path d="M4 7.5l8 4.5 8-4.5M12 12v9"/></svg>
<span class="name">Linux AppImage <span class="file">x86_64 · chmod +x, run</span></span>
<span class="arrow"></span>
</a>
<a href="https://github.com/2ro/goblin/releases/latest">
<svg viewBox="0 0 24 24"><path d="M4 6.5 10.5 5v6H4v-4.5zM11.5 4.8 20 3.5V11h-8.5V4.8zM4 12.5h6.5v6L4 17.1v-4.6zM11.5 12.5H20v7.4l-8.5-1.3v-6.1z"/></svg>
<span class="name">Windows <span class="file">x86_64 · zip</span></span>
<span class="arrow"></span>
</a>
<a href="https://github.com/2ro/goblin/releases/latest">
<svg viewBox="0 0 24 24"><path d="M7 8.5C7 6 9.2 4 12 4s5 2 5 4.5M7 8.5h10M7 8.5v7a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-7M9 4 8 2.5M15 4l1-1.5M9.5 19.5V22M14.5 19.5V22"/></svg>
<span class="name">Android <span class="file">armv7 + arm64 · apk</span></span>
<span class="arrow"></span>
</a>
<a href="https://github.com/2ro/goblin/releases">
<svg viewBox="0 0 24 24"><path d="M12 4v9M12 13l-3.5-3.5M12 13l3.5-3.5M5 17h14M5 20h14"/></svg>
<span class="name">All builds &amp; checksums <span class="file">sha256sums.txt</span></span>
<span class="arrow"></span>
</a>
</div>
<p class="dl-meta">
macOS: <a href="https://github.com/2ro/goblin#build" rel="noopener">build from source</a>
clone with <code>--recursive</code>, then <code>cargo build --release</code>.
</p>
</div>
<div class="dl-card stores-card">
<span class="store" aria-disabled="true" title="Coming soon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M17.05 12.54c-.03-2.89 2.36-4.28 2.47-4.35-1.35-1.97-3.44-2.24-4.18-2.27-1.78-.18-3.47 1.05-4.37 1.05-.9 0-2.29-1.02-3.77-1-1.94.03-3.72 1.13-4.72 2.86-2.01 3.49-.51 8.65 1.45 11.48.96 1.39 2.1 2.94 3.6 2.88 1.45-.06 1.99-.93 3.74-.93 1.74 0 2.24.93 3.77.9 1.56-.03 2.54-1.41 3.49-2.81 1.1-1.61 1.55-3.17 1.58-3.25-.04-.02-3.03-1.16-3.06-4.56zM14.17 4.04c.8-.97 1.34-2.32 1.19-3.66-1.15.05-2.55.77-3.38 1.74-.74.85-1.39 2.22-1.22 3.53 1.29.1 2.6-.65 3.41-1.61z"/></svg>
<span class="lines"><small>Download on the</small><span>App Store</span></span>
<i class="soon">SOON</i>
</span>
<span class="store" aria-disabled="true" title="Coming soon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3.6 1.8c-.35.37-.55.94-.55 1.68v17.07c0 .74.2 1.31.55 1.68l.09.08 9.56-9.56v-.22L3.69 1.71l-.09.09zm13.05 13.04-3.18-3.18v-.22l3.19-3.19.07.04 3.78 2.15c1.08.61 1.08 1.61 0 2.23l-3.78 2.14-.08.03zm-3.4-2.96L3.69 22.31c.36.38 1.5.42 2.13.06l11.27-6.4-3.84-4.09zm0-7.76L5.82 1.63C5.19 1.27 4.05 1.31 3.69 1.7l9.56 9.56 3.84-4.1-3.84-2.04z" transform="translate(1.5 0)"/></svg>
<span class="lines"><small>Get it on</small><span>Google Play</span></span>
<i class="soon">SOON</i>
</span>
<p>Store listings are on the way. Until then, grab the APK on the left —
it's the same wallet.</p>
</div>
</div>
</section>
</main>
</div>
<footer class="site">
<div class="wrap">
<div class="foot-grid">
<div class="foot-brand">
<span class="mark" aria-hidden="true"></span>
<p>Goblin is a peer-to-peer wallet for GRIN ツ — confidential digital
cash on Mimblewimble. Keys, names and history stay on your device.</p>
</div>
<div>
<h4>Project</h4>
<ul>
<li><a href="https://github.com/2ro/goblin" rel="noopener">Wallet on GitHub</a></li>
<li><a href="https://github.com/2ro/goblin/releases" rel="noopener">Releases</a></li>
<li><a href="https://github.com/2ro/goblin-nip05d" rel="noopener">Identity service</a></li>
</ul>
</div>
<div>
<h4>Network</h4>
<ul>
<li><a href="https://grin.mw" rel="noopener">GRIN ツ</a></li>
<li><a href="https://github.com/nostr-protocol/nips" rel="noopener">Nostr NIPs</a></li>
<li><a href="https://nym.com" rel="noopener">Nym</a></li>
</ul>
</div>
<div>
<h4>Legal</h4>
<ul>
<li><a href="terms.html">Terms of Use</a></li>
<li><a href="privacy.html">Privacy</a></li>
<li><a href="https://www.apache.org/licenses/LICENSE-2.0" rel="noopener">Apache-2.0</a></li>
</ul>
</div>
</div>
<div class="foot-bottom">
<span>© 2026 the Goblin project · Built on <a href="https://code.gri.mw/GUI/grim" rel="noopener" style="color:inherit">Grim</a> by Ardocrat</span>
<span>Money is a conversation. Keep it between friends. ツ</span>
</div>
</div>
</footer>
</body>
</html>
+107
View File
@@ -0,0 +1,107 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Privacy — Goblin</title>
<meta name="robots" content="noindex">
<link rel="icon" type="image/png" href="assets/goblin-icon.png">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="wrap">
<header class="site">
<a class="brand" href="/">
<span class="mark" aria-hidden="true"></span>
<span class="word">Goblin</span>
</a>
<nav class="site" aria-label="Site">
<a href="/#downloads">Downloads</a>
<a class="gh" href="https://github.com/2ro/goblin" rel="noopener">GitHub</a>
</nav>
</header>
<main class="legal">
<h1>Privacy</h1>
<p class="updated">Last updated · June 12, 2026</p>
<div class="callout">
<strong>The short version:</strong> privacy is the product. The wallet
keeps everything on your device, this website sets no cookies and runs
no analytics, and the identity service stores only what it publishes:
the name→key mapping you asked it to publish.
</div>
<h2>1. The wallet</h2>
<ul>
<li>Your seed, keys, contacts, payment history, and settings are stored
<strong>only on your device</strong>. They are never uploaded.</li>
<li>Wallet network traffic — relay connections, name lookups, exchange
rates — is routed through the Nym mixnet. The services you reach see
mixnet exit traffic, not your IP address, and the mixnet's 5-hop design
hides who is talking to whom at the network layer.</li>
<li>Payments travel as end-to-end encrypted nostr events. Relays see
ciphertext and the recipient's ephemeral routing key — not the amount,
the sender, or the message.</li>
<li>The wallet contains no telemetry, analytics, or crash reporting.</li>
</ul>
<h2>2. This website</h2>
<ul>
<li>Static pages, served by us. No cookies, no analytics, no trackers,
no third-party embeds — fonts and images are served from this domain.</li>
<li>Our web server keeps standard, short-lived access logs (IP address,
request path, user agent) for security and abuse prevention.</li>
</ul>
<h2>3. The identity service (goblin.st)</h2>
<ul>
<li>If you claim a handle, we store the data the service exists to
publish: <strong>your chosen name, your nostr public key</strong>, and —
if you upload one — your avatar image. This mapping is public by
design (that's what <a href="https://nips.nostr.com/5" rel="noopener">NIP-05</a> is).</li>
<li>Registration and release requests are authenticated by signature
(<a href="https://nips.nostr.com/98" rel="noopener">NIP-98</a>); we never see a private key.</li>
<li>Rate-limiting uses connection IP addresses transiently. Since the
wallet talks to goblin.st over the Nym mixnet, we typically see mixnet
exit addresses, not yours.</li>
<li>Release your name and it leaves public resolution immediately and
becomes available for anyone to register.</li>
</ul>
<h2>4. The relay</h2>
<p>The project's public nostr relay stores the encrypted events it
relays (that's its job) within its retention and size limits. Event
contents are ciphertext we cannot read.</p>
<h2>5. What we don't do</h2>
<ul>
<li>No selling, sharing, or monetizing of any data.</li>
<li>No advertising, profiling, or cross-site tracking.</li>
<li>No accounts, emails, or phone numbers — there is nothing to leak.</li>
</ul>
<h2>6. Your choices</h2>
<p>Use the wallet without a handle and the identity service learns
nothing about you. Rotate your payment key at any time to unlink your
history. Run your own node, relay, or name service — the software lets
you point at them.</p>
<h2>7. Contact</h2>
<p>Privacy questions: open an issue on
<a href="https://github.com/2ro/goblin" rel="noopener">GitHub</a>.</p>
</main>
</div>
<footer class="site">
<div class="wrap">
<div class="foot-bottom">
<span>© 2026 the Goblin project</span>
<span><a href="terms.html" style="color:inherit">Terms</a> · <a href="privacy.html" style="color:inherit">Privacy</a></span>
</div>
</div>
</footer>
</body>
</html>
+532
View File
@@ -0,0 +1,532 @@
/* goblin.st — midnight ledger / cheeky mascot
Dark-first, follows device theme. Accent #FFD60A on ink #0E0E0C.
Serif display (echoes the banner wordmark) + Geist UI + Geist Mono data. */
@font-face {
font-family: "Geist";
src: url("assets/fonts/Geist-Regular.ttf") format("truetype");
font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
font-family: "Geist";
src: url("assets/fonts/Geist-SemiBold.ttf") format("truetype");
font-weight: 600; font-style: normal; font-display: swap;
}
@font-face {
font-family: "Geist";
src: url("assets/fonts/Geist-Bold.ttf") format("truetype");
font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
font-family: "Geist Mono";
src: url("assets/fonts/GeistMono-Regular.ttf") format("truetype");
font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
font-family: "Geist Mono";
src: url("assets/fonts/GeistMono-SemiBold.ttf") format("truetype");
font-weight: 600; font-style: normal; font-display: swap;
}
:root {
--accent: #FFD60A;
--accent-deep: #E8B800;
--ink: #0E0E0C;
--bg: #0E0E0C;
--bg-raise: #14140F;
--surface: #191914;
--surface-2: #21211A;
--text: #F4F2E8;
--dim: #A9A698;
--mute: #6E6B5E;
--line: rgba(244, 242, 232, 0.1);
--shadow: rgba(0, 0, 0, 0.55);
--phone-glow: rgba(255, 214, 10, 0.07);
--serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
--sans: "Geist", system-ui, -apple-system, "Segoe UI", sans-serif;
--mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
}
@media (prefers-color-scheme: light) {
:root {
--bg: #FAF8EF;
--bg-raise: #F4F1E3;
--surface: #FFFFFF;
--surface-2: #F1EDDD;
--text: #171511;
--dim: #686556;
--mute: #98947F;
--line: rgba(23, 21, 17, 0.12);
--shadow: rgba(60, 50, 10, 0.18);
--phone-glow: rgba(255, 214, 10, 0.22);
}
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--sans);
font-size: 17px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
::selection { background: var(--accent); color: var(--ink); }
a { color: inherit; }
a:focus-visible, button:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 3px;
border-radius: 4px;
}
/* faint grain so the dark field isn't flat */
body::before {
content: "";
position: fixed; inset: 0;
pointer-events: none;
z-index: 40;
opacity: 0.035;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}
.wrap { max-width: 1120px; margin: 0 auto; padding: 0 24px; }
/* ---------- header ---------- */
header.site {
display: flex; align-items: center; justify-content: space-between;
padding: 26px 0 10px;
}
.brand { display: flex; align-items: center; gap: 13px; text-decoration: none; }
.brand .mark {
width: 40px; height: 40px; display: inline-block;
background: currentColor;
-webkit-mask: url("assets/goblin-mark-white.svg") center / contain no-repeat;
mask: url("assets/goblin-mark-white.svg") center / contain no-repeat;
}
.brand .word {
font-family: var(--serif);
font-size: 27px; letter-spacing: 0.34em; font-weight: 600;
text-transform: uppercase; text-indent: 0.1em;
}
nav.site { display: flex; gap: 26px; align-items: center; font-size: 15px; }
nav.site a { text-decoration: none; color: var(--dim); transition: color .15s; }
nav.site a:hover { color: var(--text); }
nav.site a.gh {
color: var(--text); border: 1px solid var(--line);
padding: 8px 16px; border-radius: 99px;
display: inline-flex; align-items: center; gap: 8px;
}
nav.site a.gh:hover { border-color: var(--accent); }
nav.site svg { width: 17px; height: 17px; fill: currentColor; }
@media (max-width: 640px) {
nav.site a:not(.gh) { display: none; }
.brand .word { font-size: 22px; }
}
/* ---------- hero ---------- */
.hero {
position: relative;
display: grid; grid-template-columns: minmax(0, 1fr) 360px;
gap: 56px; align-items: center;
padding: 72px 0 96px;
}
@media (max-width: 920px) {
.hero { grid-template-columns: 1fr; padding: 48px 0 64px; }
}
/* watermark currency glyph */
.hero::after {
content: "ツ";
position: absolute; right: -110px; top: -150px;
font-family: var(--serif);
font-size: 560px; line-height: 1;
color: var(--text); opacity: 0.026;
transform: rotate(12deg);
pointer-events: none; user-select: none;
}
.hero h1 {
font-family: var(--serif);
font-weight: 600;
font-size: clamp(44px, 6.4vw, 76px);
line-height: 1.04;
letter-spacing: -0.01em;
margin: 18px 0 22px;
}
.hero h1 .strike {
position: relative; white-space: nowrap;
}
.hero h1 .strike::after {
content: "";
position: absolute; left: -2%; right: -3%; bottom: 0.04em;
height: 0.16em;
background: var(--accent);
z-index: -1;
transform: skewY(-0.6deg);
}
.kicker {
font-family: var(--mono); font-size: 13px; letter-spacing: 0.18em;
text-transform: uppercase; color: var(--dim);
display: inline-flex; align-items: center; gap: 10px;
}
.kicker::before {
content: ""; width: 26px; height: 2px; background: var(--accent); display: inline-block;
}
.hero p.lede { color: var(--dim); font-size: 19px; max-width: 30em; margin: 0 0 34px; }
.hero p.lede strong { color: var(--text); font-weight: 600; }
.hero p.lede .at { color: var(--accent-deep); font-family: var(--mono); font-weight: 600; }
@media (prefers-color-scheme: dark) {
.hero p.lede .at { color: var(--accent); }
}
.cta-row { display: flex; flex-wrap: wrap; gap: 14px; align-items: stretch; }
.btn-primary {
display: inline-flex; align-items: center; gap: 10px;
background: var(--accent); color: var(--ink);
font-weight: 700; font-size: 16.5px; text-decoration: none;
padding: 15px 26px; border-radius: 14px;
box-shadow: 0 10px 30px -10px var(--accent-deep);
transition: transform .15s, box-shadow .15s;
}
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 16px 36px -10px var(--accent-deep); }
.btn-primary svg { width: 18px; height: 18px; fill: currentColor; }
.store-btns { display: flex; gap: 10px; }
.store {
display: inline-flex; align-items: center; gap: 10px;
border: 1px solid var(--line); border-radius: 14px;
padding: 10px 16px; min-width: 148px;
color: var(--mute); cursor: not-allowed; user-select: none;
position: relative; overflow: hidden;
background: var(--bg-raise);
}
.store svg { width: 22px; height: 22px; fill: var(--mute); flex: none; }
.store .lines { display: flex; flex-direction: column; line-height: 1.18; text-align: left; }
.store .lines small { font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; }
.store .lines span { font-size: 15px; font-weight: 600; }
.store .soon {
position: absolute; top: 7px; right: -26px;
background: var(--surface-2); color: var(--dim);
font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.14em;
padding: 2px 28px; transform: rotate(33deg);
}
.hero .micro {
margin-top: 18px; font-size: 13.5px; color: var(--mute);
}
.hero .micro a { color: var(--dim); }
.hero .micro a:hover { color: var(--text); }
/* ---------- phone ---------- */
.phone-wrap { position: relative; justify-self: center; }
.phone-wrap::before {
content: "";
position: absolute; inset: -60px -40px;
background: radial-gradient(closest-side, var(--phone-glow), transparent 75%);
pointer-events: none;
}
@media (max-width: 920px) { .phone-wrap { display: none; } }
.phone {
position: relative;
width: 318px; height: 642px;
border-radius: 46px;
background: var(--surface);
border: 1px solid var(--line);
box-shadow:
0 40px 80px -30px var(--shadow),
inset 0 0 0 7px var(--bg);
padding: 20px 17px;
display: flex; flex-direction: column;
transform: rotate(2.4deg);
}
.phone .notch {
width: 96px; height: 22px; border-radius: 99px;
background: var(--bg); margin: 2px auto 18px; flex: none;
}
.phone .p-head { display: flex; justify-content: space-between; align-items: center; padding: 0 8px; }
.phone .p-head .w { font-family: var(--serif); letter-spacing: 0.3em; font-size: 13px; text-transform: uppercase; }
.phone .p-head .av { width: 28px; height: 28px; border-radius: 50%; background: linear-gradient(135deg, #E8854B, #C25A2E); }
.phone .balance { text-align: center; margin: 44px 0 6px; }
.phone .balance .eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.22em; color: var(--mute); text-transform: uppercase; }
.phone .balance .amt { font-size: 44px; font-weight: 700; letter-spacing: -0.02em; margin-top: 6px; }
.phone .balance .amt .tsu { color: var(--accent-deep); font-weight: 400; }
@media (prefers-color-scheme: dark) { .phone .balance .amt .tsu { color: var(--accent); } }
.phone .balance .fiat { font-family: var(--mono); font-size: 12px; color: var(--mute); margin-top: 4px; }
.phone .pr-row { display: flex; gap: 10px; margin: 26px 8px 30px; }
.phone .pr-row .pr {
flex: 1; text-align: center; padding: 13px 0; border-radius: 13px;
font-weight: 600; font-size: 15px;
}
.phone .pr-row .pay { background: var(--accent); color: var(--ink); }
.phone .pr-row .req { background: var(--surface-2); }
.phone .act { padding: 0 8px; display: flex; flex-direction: column; gap: 16px; }
.phone .act .row { display: flex; align-items: center; gap: 12px; }
.phone .act .dot { width: 34px; height: 34px; border-radius: 50%; flex: none; }
.phone .act .who { flex: 1; min-width: 0; }
.phone .act .who b { display: block; font-size: 14px; font-weight: 600; }
.phone .act .who i { display: block; font-style: normal; font-size: 11.5px; color: var(--mute); }
.phone .act .val { font-family: var(--mono); font-size: 13px; }
.phone .act .val.in { color: #58B368; }
.phone .tabbar {
margin-top: auto;
display: flex; align-items: center; justify-content: space-around;
background: var(--surface-2); border-radius: 99px; padding: 9px 12px;
}
.phone .tabbar .t { width: 20px; height: 20px; opacity: 0.45; }
.phone .tabbar .puck {
width: 44px; height: 44px; border-radius: 50%;
background: var(--accent); color: var(--ink);
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 19px;
box-shadow: 0 8px 18px -6px var(--accent-deep);
}
.phone .tabbar svg { width: 100%; height: 100%; fill: var(--text); }
/* ---------- ciphertext rail ---------- */
.rail-sec { padding: 30px 0 10px; }
.rail-card {
border: 1px solid var(--line); border-radius: 24px;
background: var(--bg-raise);
padding: 44px 40px 38px;
position: relative; overflow: hidden;
}
.rail-title { display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 8px; margin-bottom: 40px; }
.rail-title h2 { margin: 0; }
.rail-title .sub { color: var(--dim); font-size: 15px; }
.rail {
position: relative;
display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
}
.rail::before {
content: "";
position: absolute; left: 6%; right: 6%; top: 26px;
border-top: 2px dashed var(--line);
}
.packet {
position: absolute; top: 11px; left: 12.5%;
width: 30px; height: 30px; margin-left: -15px;
animation: hop 7s cubic-bezier(.45,0,.25,1) infinite;
filter: drop-shadow(0 4px 10px rgba(255, 214, 10, 0.45));
z-index: 2;
}
@keyframes hop {
0% { left: 12.5%; opacity: 0; }
6% { left: 12.5%; opacity: 1; }
30% { left: 37.5%; }
55% { left: 62.5%; }
80% { left: 87.5%; opacity: 1; }
92% { left: 87.5%; opacity: 0; }
100% { left: 87.5%; opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
.packet { animation: none; left: 12.5%; }
}
.stop { text-align: center; position: relative; z-index: 1; }
.stop .pin {
width: 52px; height: 52px; margin: 0 auto 14px;
border-radius: 16px;
background: var(--surface); border: 1px solid var(--line);
display: flex; align-items: center; justify-content: center;
}
.stop .pin svg { width: 24px; height: 24px; stroke: var(--text); fill: none; stroke-width: 1.7; }
.stop b { display: block; font-size: 15px; font-weight: 600; }
.stop i { display: block; font-style: normal; font-size: 13px; color: var(--mute); margin-top: 3px; }
@media (max-width: 760px) {
.rail { grid-template-columns: repeat(2, 1fr); gap: 28px 12px; }
.rail::before, .packet { display: none; }
}
/* ---------- sections / features ---------- */
section { padding: 64px 0; }
h2 {
font-family: var(--serif); font-weight: 600;
font-size: clamp(28px, 3.6vw, 40px);
letter-spacing: -0.005em; line-height: 1.15;
margin: 0 0 10px;
}
.sec-head { max-width: 36em; margin-bottom: 44px; }
.sec-head p { color: var(--dim); margin: 8px 0 0; }
.features {
display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 14px;
}
.feat {
border: 1px solid var(--line); border-radius: 18px;
background: var(--bg-raise);
padding: 26px 24px 24px;
position: relative; overflow: hidden;
transition: transform .18s, border-color .18s;
}
.feat::before {
content: ""; position: absolute; top: 0; left: 24px; right: 24px; height: 2px;
background: var(--accent); opacity: 0; transition: opacity .18s;
}
.feat:hover { transform: translateY(-3px); border-color: var(--accent-deep); }
.feat:hover::before { opacity: 1; }
.feat .glyph {
width: 42px; height: 42px; border-radius: 12px;
background: var(--accent); color: var(--ink);
display: flex; align-items: center; justify-content: center;
margin-bottom: 16px;
}
.feat .glyph svg { width: 22px; height: 22px; stroke: var(--ink); fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.feat h3 { font-size: 17.5px; font-weight: 600; margin: 0 0 6px; }
.feat p { font-size: 14.5px; color: var(--dim); margin: 0; }
.feat p code { font-family: var(--mono); font-size: 13px; color: var(--text); }
/* ---------- downloads ---------- */
.dl-grid {
display: grid; grid-template-columns: 1.25fr 1fr; gap: 14px;
align-items: stretch;
}
@media (max-width: 860px) { .dl-grid { grid-template-columns: 1fr; } }
.dl-card {
border: 1px solid var(--line); border-radius: 24px;
background: var(--bg-raise); padding: 30px;
}
.dl-card .build-chip {
display: inline-flex; align-items: center; gap: 8px;
font-family: var(--mono); font-size: 12.5px; letter-spacing: 0.06em;
background: var(--surface-2); border-radius: 99px; padding: 5px 13px;
margin-bottom: 18px; color: var(--dim);
}
.dl-card .build-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: #58B368; }
.dl-rows { display: flex; flex-direction: column; }
.dl-rows a {
display: flex; align-items: center; gap: 14px;
padding: 13px 6px; text-decoration: none;
border-bottom: 1px solid var(--line);
transition: background .12s;
}
.dl-rows a:last-child { border-bottom: 0; }
.dl-rows a:hover { background: var(--surface); border-radius: 10px; }
.dl-rows svg { width: 20px; height: 20px; stroke: var(--dim); fill: none; stroke-width: 1.6; flex: none; }
.dl-rows .name { flex: 1; font-weight: 600; font-size: 15.5px; }
.dl-rows .file { font-family: var(--mono); font-size: 12px; color: var(--mute); }
.dl-rows .arrow { color: var(--accent-deep); font-weight: 700; }
.dl-meta { margin-top: 16px; font-size: 13px; color: var(--mute); }
.dl-meta a { color: var(--dim); }
.dl-meta a:hover { color: var(--text); }
.stores-card { display: flex; flex-direction: column; gap: 12px; justify-content: center; }
.stores-card .store { min-height: 64px; }
.stores-card p { font-size: 13.5px; color: var(--mute); margin: 6px 4px 0; }
/* ---------- handle ---------- */
.handle-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; }
@media (max-width: 860px) { .handle-grid { grid-template-columns: 1fr; gap: 28px; } }
.handle-grid .big-at {
font-family: var(--serif); font-size: clamp(40px, 5vw, 62px); line-height: 1.05;
margin: 0 0 14px;
}
.handle-grid .big-at .at-name { color: var(--accent-deep); }
@media (prefers-color-scheme: dark) { .handle-grid .big-at .at-name { color: var(--accent); } }
.handle-grid p { color: var(--dim); max-width: 30em; }
.code-card {
border: 1px solid var(--line); border-radius: 18px;
background: var(--ink); color: #EDEAD9;
font-family: var(--mono); font-size: 13.5px; line-height: 1.75;
padding: 24px 26px; overflow-x: auto;
box-shadow: 0 30px 60px -30px var(--shadow);
}
.code-card .c-dim { color: #6E6B5E; }
.code-card .c-key { color: #FFD60A; }
.code-card .c-str { color: #9CCC6B; }
/* ---------- footer ---------- */
footer.site {
border-top: 1px solid var(--line);
margin-top: 40px;
padding: 52px 0 60px;
font-size: 14.5px;
}
.foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 28px; }
@media (max-width: 760px) { .foot-grid { grid-template-columns: 1fr 1fr; } }
.foot-brand .mark {
width: 34px; height: 34px; display: inline-block;
background: currentColor;
-webkit-mask: url("assets/goblin-mark-white.svg") center / contain no-repeat;
mask: url("assets/goblin-mark-white.svg") center / contain no-repeat;
}
.foot-brand p { color: var(--mute); max-width: 26em; margin: 12px 0 0; }
.foot-grid h4 {
font-family: var(--mono); font-size: 11.5px; letter-spacing: 0.18em;
text-transform: uppercase; color: var(--mute); margin: 4px 0 14px; font-weight: 600;
}
.foot-grid ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.foot-grid a { text-decoration: none; color: var(--dim); }
.foot-grid a:hover { color: var(--text); }
.foot-bottom {
display: flex; justify-content: space-between; flex-wrap: wrap; gap: 10px;
margin-top: 44px; color: var(--mute); font-size: 13px;
}
/* ---------- legal pages ---------- */
.legal { max-width: 720px; margin: 0 auto; padding: 30px 0 80px; }
.legal h1 { font-family: var(--serif); font-weight: 600; font-size: clamp(34px, 5vw, 50px); margin: 26px 0 6px; }
.legal .updated { font-family: var(--mono); font-size: 13px; color: var(--mute); margin-bottom: 38px; }
.legal h2 { font-size: 23px; margin: 40px 0 10px; }
.legal p, .legal li { color: var(--dim); font-size: 16px; }
.legal li { margin-bottom: 8px; }
.legal strong { color: var(--text); }
.legal a { color: var(--text); }
.legal .callout {
border: 1px solid var(--line); border-left: 3px solid var(--accent);
background: var(--bg-raise); border-radius: 0 12px 12px 0;
padding: 16px 20px; margin: 24px 0;
}
+106
View File
@@ -0,0 +1,106 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Terms of Use — Goblin</title>
<meta name="robots" content="noindex">
<link rel="icon" type="image/png" href="assets/goblin-icon.png">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="wrap">
<header class="site">
<a class="brand" href="/">
<span class="mark" aria-hidden="true"></span>
<span class="word">Goblin</span>
</a>
<nav class="site" aria-label="Site">
<a href="/#downloads">Downloads</a>
<a class="gh" href="https://github.com/2ro/goblin" rel="noopener">GitHub</a>
</nav>
</header>
<main class="legal">
<h1>Terms of Use</h1>
<p class="updated">Last updated · June 12, 2026</p>
<div class="callout">
<strong>The short version:</strong> Goblin is free, open-source,
non-custodial software. You hold your own keys, you are responsible for
your own funds, and everything is provided as-is.
</div>
<h2>1. What Goblin is</h2>
<p>Goblin is open-source wallet software for the GRIN cryptocurrency,
licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0" rel="noopener">Apache
License 2.0</a>. The software runs on your own device. The project also
operates an optional identity service at <strong>goblin.st</strong> that
maps human-readable names to nostr public keys (<a href="https://nips.nostr.com/5" rel="noopener">NIP-05</a>), and a public
nostr relay. Together these are "the Services".</p>
<h2>2. Non-custodial — your keys, your funds</h2>
<ul>
<li>Goblin never holds, transmits custody of, or has access to your
funds, seed phrase, or private keys. They exist only on your device.</li>
<li>If you lose your seed phrase or identity backup, <strong>nobody can
recover it</strong> — not you-support, not the project, nobody.</li>
<li>Transactions on the GRIN network are irreversible. Verify amounts
and recipients before sending.</li>
</ul>
<h2>3. The name service</h2>
<ul>
<li>Handles are free, first-come, registered to exactly one nostr key
at a time, and yours until you release them.</li>
<li>Releasing a name is permanent and immediate — once released it is
available for anyone to register, so don't release a name you want to
keep. Name changes are limited to one every 10 minutes per key.</li>
<li>Names that impersonate others, infringe rights, or are used for
abuse may be removed. Reserved names may be withheld.</li>
<li>The name service is a convenience layer. The wallet is fully usable
without it.</li>
</ul>
<h2>4. Acceptable use</h2>
<p>Don't use the Services to break the law, to harm others, or to attack
the network (spam, denial of service, abuse of rate limits). We may block
traffic that does.</p>
<h2>5. No warranty</h2>
<p>The software and Services are provided <strong>"as is"</strong>,
without warranty of any kind, express or implied, including
merchantability, fitness for a particular purpose, and non-infringement.
Use them at your own risk. To the maximum extent permitted by law, the
project and its contributors are not liable for any loss of funds, data,
or profits, or any indirect, incidental, or consequential damages arising
from your use of the software or Services.</p>
<h2>6. Not financial advice</h2>
<p>Nothing here is investment, legal, or tax advice. Cryptocurrency is
volatile and may be regulated differently where you live. You are
responsible for complying with your local laws.</p>
<h2>7. Changes</h2>
<p>These terms may change as the project evolves; the current version
always lives at this page. Continued use of the Services after a change
constitutes acceptance.</p>
<h2>8. Contact</h2>
<p>Questions and reports: open an issue on
<a href="https://github.com/2ro/goblin" rel="noopener">GitHub</a>.</p>
</main>
</div>
<footer class="site">
<div class="wrap">
<div class="foot-bottom">
<span>© 2026 the Goblin project</span>
<span><a href="terms.html" style="color:inherit">Terms</a> · <a href="privacy.html" style="color:inherit">Privacy</a></span>
</div>
</div>
</footer>
</body>
</html>