patx/relay-lang

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Relay</title>
  <meta name="description" content="Async-by-default programming language with Python-like syntax. No await. Built-in web server and HTTP client."/>

  <style>
    :root {
      --bg: #0b0f1a;
      --bg-soft: #111827;
      --text: #e6f1ff;
      --text-dim: #9fb3c8;
      --accent: #00d4ff;
      --accent-soft: rgba(0, 212, 255, 0.15);
      --border: rgba(255,255,255,.08);
    }

    body {
      margin: 0;
      font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
      background: radial-gradient(circle at 20% 0%, #0f1c2e 0%, #0b0f1a 60%);
      color: var(--text);
      line-height: 1.6;
      padding: 32px 24px;
      max-width: 920px;
      margin-inline: auto;
    }

    h1 {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 2rem;

      font-size: clamp(3rem, 12vw, 8rem);
      line-height: 1;
      margin: 0 0 12px;

      background: linear-gradient(90deg, #ffffff, var(--accent));
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }

    .logo {
      width: 1.5em;   /* slightly larger than text */
      height: 1.1em;
      filter: drop-shadow(0 0 30px rgba(0, 212, 255, 0.35));
      transition: transform 0.3s ease;
      flex: 0 0 auto;
    }

    .logo:hover {
      transform: translateY(-4px) scale(1.03);
    }

    .tagline {
      margin: 0 0 28px;
      color: var(--text-dim);
      text-align: center;
    }

    .buttons {
      display: flex;
      justify-content: center;
      gap: 12px;
      flex-wrap: wrap;
      margin: 24px 0 60px;
    }

    a.btn {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      padding: 10px 16px;
      border-radius: 10px;
      text-decoration: none;
      font-weight: 500;
      transition: all .2s ease;
    }

    a.btn.primary {
      background: var(--accent);
      color: #000;
      box-shadow: 0 0 20px var(--accent-soft);
    }

    a.btn.primary:hover {
      transform: translateY(-2px);
      box-shadow: 0 0 30px var(--accent);
    }

    a.btn.secondary {
      border: 1px solid var(--border);
      color: var(--text);
      background: var(--bg-soft);
    }

    a.btn.secondary:hover {
      border-color: var(--accent);
      color: var(--accent);
    }

    section {
      margin: 56px 0;
    }

    h2 {
      font-size: 1.4rem;
      margin: 0 0 16px;
      color: var(--accent);
    }

    pre {
      margin: 0;
      padding: 18px;
      background: var(--bg-soft);
      border: 1px solid var(--border);
      border-radius: 14px;
      overflow-x: auto;
      font-size: .95rem;
    }

    code {
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
    }

    .note {
      margin-top: 10px;
      color: var(--text-dim);
      font-size: .95rem;
    }

    footer {
      margin-top: 72px;
      padding-top: 24px;
      border-top: 1px solid var(--border);
      color: var(--text-dim);
      font-size: .9rem;
      text-align: center;
    }
  </style>
</head>
<body>
<main>
  <h1>
    <svg class="logo" viewBox="0 0 220 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
      <defs>
        <radialGradient id="glow" cx="50%" cy="40%" r="60%">
          <stop offset="0%" stop-color="#00d4ff" stop-opacity="0.4"/>
          <stop offset="100%" stop-color="#00d4ff" stop-opacity="0"/>
        </radialGradient>
      </defs>

      <ellipse cx="110" cy="90" rx="95" ry="75" fill="url(#glow)"/>
      <ellipse cx="110" cy="105" rx="70" ry="55" fill="#111827"/>
      <circle cx="110" cy="85" r="48" fill="#0f172a"/>

      <path d="M65 65 C40 40, 40 90, 75 75" fill="none" stroke="#00d4ff" stroke-width="8" stroke-linecap="round"/>
      <path d="M155 65 C180 40, 180 90, 145 75" fill="none" stroke="#00d4ff" stroke-width="8" stroke-linecap="round"/>

      <circle cx="95" cy="85" r="6" fill="#00d4ff"/>
      <circle cx="125" cy="85" r="6" fill="#00d4ff"/>

      <ellipse cx="110" cy="105" rx="18" ry="12" fill="#1f2937"/>
      <circle cx="104" cy="105" r="2.5" fill="#00d4ff"/>
      <circle cx="116" cy="105" r="2.5" fill="#00d4ff"/>
    </svg>
  </h1>
  <h1>
    Relay
  </h1>

  <p class="tagline">
    A networking-first, async-by-default programming language with Python-like syntax and Node.js-style non-blocking semantics.
  </p>

  <div class="buttons">
    <a class="btn primary" href="https://github.com/patx/relay-lang">GitHub</a>
    <a class="btn secondary" href="https://github.com/patx/relay-lang#quick-start">Quick Start</a>
  </div>

  <section>
    <h2>Async without await</h2>
    <pre><code>sleep(2000, print("world"))
print("hello")</code></pre>
    <p class="note">→ prints "hello" immediately, "world" after 2 seconds, no <code>await</code> keywords ever</p>
  </section>

  <section>
    <h2>Simple Web Server</h2>
    <pre><code>app = WebApp()
server = WebServer()

@app.get("/")
fn index()
    return "hello world"

server.run(app)</code></pre>
  </section>

  <section>
    <h2>Get Started</h2>
    <p class="note">→ Requires Rust</p>
    <pre><code>git clone https://github.com/patx/relay-lang
cd relay-lang
cargo install --path .

relay examples/type_hint_validation.ry</code></pre>
  </section>
</main>

<footer>
  🦬 Relay • MIT license • v0.1 • Built on Rust + Tokio
</footer>
</body>
</html>