commit 08bbd74532ed2f9e4de2bd3763bcbb3a9bc3a554 Author: butler Date: Wed Jun 17 01:22:01 2026 -0400 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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f58ada --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.bak-* +.DS_Store +.claude/ diff --git a/assets/fonts/GEIST-OFL.txt b/assets/fonts/GEIST-OFL.txt new file mode 100644 index 0000000..04e95fc --- /dev/null +++ b/assets/fonts/GEIST-OFL.txt @@ -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. \ No newline at end of file diff --git a/assets/fonts/Geist-Bold.ttf b/assets/fonts/Geist-Bold.ttf new file mode 100644 index 0000000..863b286 Binary files /dev/null and b/assets/fonts/Geist-Bold.ttf differ diff --git a/assets/fonts/Geist-Regular.ttf b/assets/fonts/Geist-Regular.ttf new file mode 100644 index 0000000..4da1b3a Binary files /dev/null and b/assets/fonts/Geist-Regular.ttf differ diff --git a/assets/fonts/Geist-SemiBold.ttf b/assets/fonts/Geist-SemiBold.ttf new file mode 100644 index 0000000..b2b0618 Binary files /dev/null and b/assets/fonts/Geist-SemiBold.ttf differ diff --git a/assets/fonts/GeistMono-Regular.ttf b/assets/fonts/GeistMono-Regular.ttf new file mode 100644 index 0000000..50c9d5a Binary files /dev/null and b/assets/fonts/GeistMono-Regular.ttf differ diff --git a/assets/fonts/GeistMono-SemiBold.ttf b/assets/fonts/GeistMono-SemiBold.ttf new file mode 100644 index 0000000..1b21724 Binary files /dev/null and b/assets/fonts/GeistMono-SemiBold.ttf differ diff --git a/assets/goblin-icon.png b/assets/goblin-icon.png new file mode 100644 index 0000000..f5b1440 Binary files /dev/null and b/assets/goblin-icon.png differ diff --git a/assets/goblin-mark-black.svg b/assets/goblin-mark-black.svg new file mode 100644 index 0000000..c014090 --- /dev/null +++ b/assets/goblin-mark-black.svg @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/assets/goblin-mark-white.svg b/assets/goblin-mark-white.svg new file mode 100644 index 0000000..0fd9751 --- /dev/null +++ b/assets/goblin-mark-white.svg @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/assets/grin-logo.png b/assets/grin-logo.png new file mode 100644 index 0000000..a863a47 Binary files /dev/null and b/assets/grin-logo.png differ diff --git a/assets/screenshot.png b/assets/screenshot.png new file mode 100644 index 0000000..d442e80 Binary files /dev/null and b/assets/screenshot.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..138d237 --- /dev/null +++ b/index.html @@ -0,0 +1,314 @@ + + + + + +Goblin — a private wallet for GRIN ツ + + + + + + + + + + + + +
+
+ + + Goblin + + +
+ +
+
+
+ Free & open source · GRIN ツ +

Send grin like a text.

+

+ Goblin is a private wallet for + GRIN — confidential digital cash with no amounts or + addresses on the chain. Pay a username and the payment is + delivered as an end-to-end encrypted message over nostr, through + the Nym mixnet. No files to swap. No need to both be online. +

+
+ + + Get the builds + +
+ + + App StoreComing soon + SOON + + + + Google PlayComing soon + SOON + +
+
+

+ Linux · Windows · Android today — macOS + builds from source. + Apache-2.0, sha256 checksums on every build. +

+
+ + +
+ +
+
+
+

How a payment travels

+ 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. +
+
+ +
+
+ Youtype an amount, pick a name +
+
+
+ Gift wrapslatepack sealed, NIP-17 +
+
+
+ Nym mixnet5-hop, linked in-process +
+
+
+ themunwrapped, verified, applied +
+
+
+
+ +
+
+

Private by construction

+

Pay anyone instantly and directly — an addressless, confidential + chain underneath.

+
+
+
+
+

Confidential by design

+

GRIN is confidential digital cash — every amount is cryptographically + hidden. Like handing someone cash, what you send stays between the two + of you.

+
+
+
+

Pay a username

+

Handles are NIP-05 identities at goblin.st. Pay + mira — or any raw npub on nostr.

+
+
+
+

Sealed delivery

+

The slatepack travels as a NIP-17 gift-wrapped DM (kind 1059) and is + applied automatically by the recipient's wallet — no files, no meetups.

+
+
+
+

Mixnet, built in

+

Your payments and identity — nostr messages, names, price and + avatars — ride the + Nym mixnet, 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.

+
+
+
+

Separate from your wallet key

+

Your nostr payment key is deliberately separate from your funds. + Rotate it any time to stay unlinkable — your grin never moves.

+
+
+
+

Your numbers, your way

+

Off by default. Opt into a world currency, Bitcoin, or sats and the + rate is fetched over the mixnet — nothing leaves your device otherwise.

+
+
+
+ +
+
+
+

Be yourself.

+

Claim a free handle in the app and friends can pay you by name. + Your handle resolves through the open goblin.st identity service — + standard NIP-05, one name per key, yours until you release it.

+

Or remain anonymous and reset your identity whenever you want.

+
+
+ $ curl 'https://goblin.st/.well-known/nostr.json?name=mira'
+ {
+   "names": {
+     "mira": "7d2f19c0…a4c41a"
+   }
+ } +
+
+
+ +
+
+

Downloads

+

Fresh from the forge. Verify with the checksums file — every build ships one.

+
+
+ +
+ + + Download on theApp Store + SOON + + + + Get it onGoogle Play + SOON + +

Store listings are on the way. Until then, grab the APK on the left — + it's the same wallet.

+
+
+
+
+
+ + + + + diff --git a/privacy.html b/privacy.html new file mode 100644 index 0000000..9f649ff --- /dev/null +++ b/privacy.html @@ -0,0 +1,107 @@ + + + + + +Privacy — Goblin + + + + + + +
+
+ + + Goblin + + +
+ +
+

Privacy

+

Last updated · June 12, 2026

+ +
+ The short version: 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. +
+ +

1. The wallet

+
    +
  • Your seed, keys, contacts, payment history, and settings are stored + only on your device. They are never uploaded.
  • +
  • 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.
  • +
  • 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.
  • +
  • The wallet contains no telemetry, analytics, or crash reporting.
  • +
+ +

2. This website

+
    +
  • Static pages, served by us. No cookies, no analytics, no trackers, + no third-party embeds — fonts and images are served from this domain.
  • +
  • Our web server keeps standard, short-lived access logs (IP address, + request path, user agent) for security and abuse prevention.
  • +
+ +

3. The identity service (goblin.st)

+
    +
  • If you claim a handle, we store the data the service exists to + publish: your chosen name, your nostr public key, and — + if you upload one — your avatar image. This mapping is public by + design (that's what NIP-05 is).
  • +
  • Registration and release requests are authenticated by signature + (NIP-98); we never see a private key.
  • +
  • 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.
  • +
  • Release your name and it leaves public resolution immediately and + becomes available for anyone to register.
  • +
+ +

4. The relay

+

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.

+ +

5. What we don't do

+
    +
  • No selling, sharing, or monetizing of any data.
  • +
  • No advertising, profiling, or cross-site tracking.
  • +
  • No accounts, emails, or phone numbers — there is nothing to leak.
  • +
+ +

6. Your choices

+

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.

+ +

7. Contact

+

Privacy questions: open an issue on + GitHub.

+
+
+ + + + + diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..0e3f408 --- /dev/null +++ b/styles.css @@ -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; +} diff --git a/terms.html b/terms.html new file mode 100644 index 0000000..7ef9741 --- /dev/null +++ b/terms.html @@ -0,0 +1,106 @@ + + + + + +Terms of Use — Goblin + + + + + + +
+
+ + + Goblin + + +
+ +
+

Terms of Use

+

Last updated · June 12, 2026

+ +
+ The short version: 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. +
+ +

1. What Goblin is

+

Goblin is open-source wallet software for the GRIN cryptocurrency, + licensed under the Apache + License 2.0. The software runs on your own device. The project also + operates an optional identity service at goblin.st that + maps human-readable names to nostr public keys (NIP-05), and a public + nostr relay. Together these are "the Services".

+ +

2. Non-custodial — your keys, your funds

+
    +
  • Goblin never holds, transmits custody of, or has access to your + funds, seed phrase, or private keys. They exist only on your device.
  • +
  • If you lose your seed phrase or identity backup, nobody can + recover it — not you-support, not the project, nobody.
  • +
  • Transactions on the GRIN network are irreversible. Verify amounts + and recipients before sending.
  • +
+ +

3. The name service

+
    +
  • Handles are free, first-come, registered to exactly one nostr key + at a time, and yours until you release them.
  • +
  • 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.
  • +
  • Names that impersonate others, infringe rights, or are used for + abuse may be removed. Reserved names may be withheld.
  • +
  • The name service is a convenience layer. The wallet is fully usable + without it.
  • +
+ +

4. Acceptable use

+

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.

+ +

5. No warranty

+

The software and Services are provided "as is", + 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.

+ +

6. Not financial advice

+

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.

+ +

7. Changes

+

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.

+ +

8. Contact

+

Questions and reports: open an issue on + GitHub.

+
+
+ + + + +