beeline 0.1.0

Async Rust helpers for Foursquare/Swarm OAuth and latest checkin polling.
Documentation
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Beeline</title>
    <meta

      name="description"

      content="Async Rust helpers for Foursquare and Swarm OAuth plus latest checkin polling."

    >
    <style>
      :root {
        color-scheme: light dark;
        --background: #f7f8fb;
        --panel: #ffffff;
        --text: #1b1f2a;
        --muted: #596276;
        --border: #d9deea;
        --accent: #146c75;
        --accent-strong: #0e5259;
      }

      @media (prefers-color-scheme: dark) {
        :root {
          --background: #11151d;
          --panel: #181d27;
          --text: #edf1f7;
          --muted: #aeb7c8;
          --border: #303847;
          --accent: #58c4cf;
          --accent-strong: #8adce4;
        }
      }

      * {
        box-sizing: border-box;
      }

      body {
        margin: 0;
        background: var(--background);
        color: var(--text);
        font-family:
          Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
          "Segoe UI", sans-serif;
        line-height: 1.55;
      }

      main {
        width: min(920px, calc(100% - 32px));
        margin: 0 auto;
        padding: 64px 0;
      }

      header {
        margin-bottom: 32px;
      }

      h1 {
        margin: 0 0 12px;
        font-size: clamp(2.25rem, 8vw, 4.75rem);
        line-height: 1;
        letter-spacing: 0;
      }

      h2 {
        margin: 0 0 12px;
        font-size: 1.25rem;
      }

      p {
        margin: 0 0 16px;
      }

      .lede {
        max-width: 760px;
        color: var(--muted);
        font-size: 1.2rem;
      }

      .actions {
        display: flex;
        flex-wrap: wrap;
        gap: 12px;
        margin-top: 28px;
      }

      a.button {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        min-height: 44px;
        padding: 0 16px;
        border: 1px solid var(--accent);
        border-radius: 6px;
        background: var(--accent);
        color: #ffffff;
        font-weight: 650;
        text-decoration: none;
      }

      a.button.secondary {
        background: transparent;
        color: var(--accent-strong);
      }

      section {
        border-top: 1px solid var(--border);
        padding: 28px 0;
      }

      .grid {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
        gap: 16px;
      }

      .item {
        min-height: 128px;
        padding: 18px;
        border: 1px solid var(--border);
        border-radius: 8px;
        background: var(--panel);
      }

      .item p {
        color: var(--muted);
        font-size: 0.96rem;
      }

      code {
        padding: 2px 5px;
        border-radius: 4px;
        background: color-mix(in srgb, var(--border) 45%, transparent);
        font-family: ui-monospace, "SFMono-Regular", Consolas, monospace;
        font-size: 0.92em;
      }

      footer {
        color: var(--muted);
        font-size: 0.92rem;
      }
    </style>
  </head>
  <body>
    <main>
      <header>
        <h1>Beeline</h1>
        <p class="lede">
          Async Rust helpers for Foursquare and Swarm OAuth plus latest checkin
          polling. Designed for Discord bots and other Rust services that own
          their own user linking, token storage, and scheduling.
        </p>
        <nav class="actions" aria-label="Project links">
          <a class="button" href="https://docs.rs/beeline">API Docs</a>
          <a class="button secondary" href="https://crates.io/crates/beeline">Crate</a>
          <a class="button secondary" href="https://github.com/tdmackey/beeline">GitHub</a>
        </nav>
      </header>

      <section>
        <h2>What It Provides</h2>
        <div class="grid">
          <div class="item">
            <h2>OAuth Helpers</h2>
            <p>
              Build Foursquare authorization URLs, parse callbacks, exchange
              authorization codes, and carry signed Discord metadata through
              OAuth with <code>LinkState</code>.
            </p>
          </div>
          <div class="item">
            <h2>Checkin Polling</h2>
            <p>
              Fetch <code>/v2/users/self/checkins</code> for one authorized user
              or poll many linked users with bounded concurrency and per-user
              success or failure results.
            </p>
          </div>
          <div class="item">
            <h2>Library Boundary</h2>
            <p>
              Beeline stays storage- and framework-neutral. Your bot owns slash
              commands, callback routes, token persistence, and posting policy.
            </p>
          </div>
        </div>
      </section>

      <section>
        <h2>Integration Docs</h2>
        <p>
          Start with the
          <a href="https://github.com/tdmackey/beeline/blob/main/docs/discord-bot-integration.md">
            Discord bot integration guide
          </a>
          and the
          <a href="https://github.com/tdmackey/beeline/blob/main/docs/api-validation.md">
            API validation notes
          </a>.
        </p>
      </section>

      <footer>
        Foursquare and Swarm are trademarks of their respective owners. This
        project is an independent Rust API helper.
      </footer>
    </main>
  </body>
</html>