Developers

Take the whole build folder.

Start from the complete public Pages build: the widget, Functions, source mirrors, migrations, and docs in one portable package.

The current build keeps the synced EnhanceMarkets-aligned SoulWall gate, adds The Giving Block support, and now includes SoulWall Lite: a light-mode, soft-gate interstitial for publisher traffic.

Unlimited integrations and community-driven updates forever. Because this project belongs to humans.

Current public build The downloadable build now includes the synced EnhanceMarkets gate flow, The Giving Block organization feed, trusted address minting, provider-proof caching scaffolding, and SoulWall Lite for Worker redirects. Download SoulWall build

Self Hosted Build Folder

Use the real pieces

Self-hosted source mirror.

Browse the public source mirrors on the site, download the build folder, wire your own credentials, and ship the parts that serve your community.

Secrets are not included.

The public build excludes real environment values, local Wrangler state, and dependency folders. Bring your own Supabase, Cloudflare, and provider keys.

SoulWall Lite

A softer charity gate for readers, articles, and low-friction traffic.

01 Use it when the full gate is too heavy.

SoulWall Lite is built for articles, downloads, newsletter links, campaign pages, and casual publisher traffic where the user should be nudged toward good, not blocked behind a hard workflow.

02 Redirect into the hosted Lite gate.

Your Cloudflare Worker sends selected requests to https://soulwall.org/lite. SoulWall shows the cause choices, tracks attention, and sends the visitor back to your original page.

03 Keep the reader moving.

Visitors can choose a verified cause or continue without donating. That makes it suitable for public content where goodwill matters more than locking the door.

title The page, article, or asset name shown in the Lite gate.
next The URL SoulWall sends the visitor back to after the gate.
sourceLabel Your publication, product, or property name.
sourceWebsite Your site origin, used for attribution and click reporting.

Quick Start

Run it like a Pages app

  1. Download the public build.
  2. Install dependencies with npm install.
  3. Create your own .dev.vars from .dev.vars.example, including the optional ledger-credit fields if you want homepage attribution.
  4. Run npm run dev to test Cloudflare Pages Functions locally.
npm install
npm run dev
<script src="https://soulwall.org/widget/soulwall-widget.js"
  data-soulwall-client="your-project"
  data-soulwall-provider="giveth"
  data-soulwall-title="Premium Research Access"
  data-soulwall-description="Unlocks the members-only dashboard for 24 hours."
  data-soulwall-website="https://example.com"></script>

If you include the title, description, and website fields, SoulWall credits your deployment on the master homepage ledger when donations are confirmed.

Light Mode

Install SoulWall Lite in a Cloudflare Worker

  1. Use this when you want a softer reader gate instead of the full verification workflow.
  2. Your Worker redirects protected traffic to https://soulwall.org/lite with the original page URL in next.
  3. SoulWall Lite shows verified charity choices, records gate views and charity clicks, then lets the reader continue.
const SOULWALL_LITE_ORIGIN = "https://soulwall.org";

function soulwallLiteRedirect(request, { title, nextPath, sourceLabel }) {
  const requestUrl = new URL(request.url);
  const next = new URL(nextPath || requestUrl.pathname, requestUrl.origin);
  const gate = new URL("/lite", SOULWALL_LITE_ORIGIN);

  gate.searchParams.set("title", title || "Protected Content");
  gate.searchParams.set("next", next.toString());
  gate.searchParams.set("sourceLabel", sourceLabel || "Your Site");
  gate.searchParams.set("sourceWebsite", requestUrl.origin);

  return Response.redirect(gate.toString(), 302);
}

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    if (request.method === "GET" && url.pathname.startsWith("/opinion-gate/")) {
      const slug = url.pathname.replace("/opinion-gate/", "").replace(/\/$/, "");
      const title = url.searchParams.get("title") || slug.replace(/-/g, " ");

      return soulwallLiteRedirect(request, {
        title,
        nextPath: `/article/${slug}`,
        sourceLabel: "Your Publication"
      });
    }

    return fetch(request);
  }
};

The important fields are title, next, sourceLabel, and sourceWebsite. Change /opinion-gate/ and /article/ to match your own routes.

Take it, use it, make it better, make it work in ways I couldn't have imagined. Godspeed. Go confidently in the direction of your dreams.