SkyeGate for Vercel — wallet-verified content gating for Next.js

Wallet-verified content gating in any Next.js app, in five minutes. @skyemeta/skyegate is live on npm — the SkyeGate gating layer, repackaged for Vercel and Next.js. Your existing SkyeGate Pro license already covers it. One license, two stacks.

SkyeGate isn't just a WordPress plugin anymore. It's a portable gating layer that drops into wherever you ship. If you bought the WordPress plugin yesterday, you can use the SDK on a Next.js side-project today, no extra cost.

Why ship a Vercel SDK?

Because half the people who emailed us about SkyeGate weren't on WordPress. They were shipping Next.js apps on Vercel, building with Cursor or Claude Code, already had wagmi or RainbowKit wired up, and just wanted the gating layer. So we made it portable.

SkyeGate is powered by InsumerAPI, the wallet verification engine. The new SDK does what the WordPress plugin does — ask InsumerAPI to sign a yes-or-no on whether a wallet meets your conditions, then let you gate content on that signed answer — without bringing along any WordPress.

Five-minute install

Bring your own wallet stack. The SDK doesn't care whether you use wagmi, RainbowKit, ConnectKit, Privy, or something else. It just needs a wallet address.

npm install @skyemeta/skyegate

Wrap whatever you want gated:

// app/page.tsx
'use client';
import { useAccount } from 'wagmi';
import { GatedContent } from '@skyemeta/skyegate/react';

export default function Page() {
  const { address } = useAccount();
  return (
    <GatedContent
      address={address}
      conditions={[{ type: 'farcaster_id' }]}
      licenseKey={process.env.NEXT_PUBLIC_SKYE_LICENSE_KEY!}
      fallback={<p>Connect a Farcaster-linked wallet.</p>}
      onPass={async (jwt) => {
        const res = await fetch('/api/gated', {
          method: 'POST',
          body: JSON.stringify({ jwt }),
        });
        // …render the gated content
      }}
    >
      <p>Welcome, Farcaster user.</p>
    </GatedContent>
  );
}

Validate the signed JWT on the server before you serve the actual gated content:

// app/api/gated/route.ts
import { validateContentToken } from '@skyemeta/skyegate';
export const runtime = 'nodejs';

export async function POST(req: Request) {
  const { jwt } = await req.json();
  const result = await validateContentToken(jwt, {
    expectedConditions: [{ type: 'farcaster_id' }],
  });
  if (!result.pass) {
    return Response.json({ error: result.error }, { status: 403 });
  }
  return Response.json({ secret: 'Real gated content here.' });
}

That's the whole flow. The browser only ever sees the gated content after the JWT clears server-side validation. The text doesn't sit in the page source, the JS bundle, or hidden by CSS — it lives on your server until a wallet earns it.

What you get

WordPress, too

SkyeGate has two doors on the WordPress side, both running the same gating engine underneath:

The simple decision tree:

Same key. Two stacks. Domain-locked.

Your existing SKYE-XXXX-XXXX-XXXX license works on the SDK without any extra activation. The first production call from your Next.js deploy auto-binds the license to that apex (e.g., myapp.com); subsequent calls from staging.myapp.com, app.myapp.com, or any subdomain are accepted under the same bind. Localhost and *.vercel.app preview URLs skip the bind so dev and preview deploys don't burn it.

Don't have a license yet? Pick a tier:

Same price, same key, both stacks. Comparison and FAQ on the SkyeGate page.

Try it without writing a line of glue

The fastest way to feel the flow is to clone the starter:

git clone https://github.com/douglasborthwick-crypto/skyegate-nextjs-starter
cd skyegate-nextjs-starter
npm install
cp .env.local.example .env.local   # set your keys
npm run dev

Open localhost:3000, connect a wallet via the RainbowKit button, and watch the gate evaluate. The default condition gates on any non-zero ETH balance on mainnet so most dev wallets pass on first try. Edit app/page.tsx to swap conditions; the docs walk through each of the four types.

Where to go from here

If you ship something, tell us — we'd love to see it. Feedback, bug reports, and weird wallet-stack edge cases all welcome at /contact.

The shortcode worked. Now the npm import does too. Same wallet, same condition, same signed answer — just a different deploy target.