Ghost Circle is the first Zero-Knowledge Privacy Rollup built on the Sui blockchain. This is the official whitelist registration website where early supporters can secure their spot for exclusive benefits and early access.
- π Sui Wallet Integration - Connect with any Sui-compatible wallet
- π Real-time Task Tracking - Interactive status tracker for social tasks
- π Live User Count - Real-time statistics from Supabase database (updates every 30s)
- π¨ Cyberpunk UI - Stunning neon-themed design with animations
- πΎ Supabase Backend - Secure and scalable data storage
- π± Fully Responsive - Works perfectly on all devices
- β‘ Lightning Fast - Built with Next.js 14 and optimized for performance
- Node.js 18+ and npm
- A Supabase account (free tier works)
- Sui wallet for testing
# Clone the repository
git clone https://github.com/yourusername/ghost-circle-whitelist.git
cd ghost-circle-whitelist
# Install dependencies
npm install
# Copy environment variables
cp .env.local.example .env.local
# Edit .env.local and add your Supabase credentials
# NEXT_PUBLIC_SUPABASE_URL=your_url
# SUPABASE_SERVICE_KEY=your_key
# Run development server
npm run devVisit http://localhost:3000 to see the website.
ghost-circle-whitelist/
βββ app/
β βββ api/
β β βββ whitelist/
β β βββ route.ts # API endpoint for submissions
β βββ globals.css # Global styles with Cyberpunk theme
β βββ layout.tsx # Root layout with providers
β βββ page.tsx # Main landing page
β βββ providers.tsx # Sui dApp Kit & React Query setup
βββ components/
β βββ AuditProgress.tsx # Project audit progress bar
β βββ HeroSection.tsx # Hero section with project intro
β βββ StatusTracker.tsx # Main whitelist task tracker
βββ .env.local.example # Environment variables template
βββ next.config.js # Next.js configuration
βββ package.json # Dependencies
βββ tailwind.config.js # Tailwind with custom theme
βββ tsconfig.json # TypeScript configuration
Go to supabase.com and create a new project.
Run this SQL in the Supabase SQL editor:
CREATE TABLE whitelist (
id BIGSERIAL PRIMARY KEY,
wallet_address TEXT UNIQUE NOT NULL,
twitter_followed BOOLEAN DEFAULT FALSE,
discord_joined BOOLEAN DEFAULT FALSE,
status TEXT DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Create index for faster lookups
CREATE INDEX idx_wallet_address ON whitelist(wallet_address);
-- Enable Row Level Security (optional but recommended)
ALTER TABLE whitelist ENABLE ROW LEVEL SECURITY;
-- Create policy to allow inserts
CREATE POLICY "Allow public inserts" ON whitelist
FOR INSERT WITH CHECK (true);
-- Create policy to allow public selects
CREATE POLICY "Allow public selects" ON whitelist
FOR SELECT USING (true);- Go to Project Settings β API
- Copy the
URLtoNEXT_PUBLIC_SUPABASE_URL - Copy the
service_rolekey toSUPABASE_SERVICE_KEY
π Detailed Setup Guide: See docs/SETUP_REAL_STATS.md for complete instructions on enabling real-time user count.
Edit components/StatusTracker.tsx:
const handleTwitter = () => {
window.open('https://x.com/YOUR_HANDLE', '_blank')
}
const handleDiscord = () => {
window.open('https://discord.gg/YOUR_INVITE', '_blank')
}Edit tailwind.config.js:
colors: {
'cyber-purple': '#8B5CF6', // Change to your brand color
'cyber-violet': '#A855F7',
// ... add more colors
}Edit components/HeroSection.tsx to customize the hero text, features, and messaging.
- Push your code to GitHub
- Go to vercel.com
- Import your repository
- Add environment variables in Vercel dashboard
- Deploy!
npm run build
npm startTo verify that users actually followed your account:
- Apply for Twitter Developer account
- Create an app and get API keys
- Implement OAuth flow in the API route
- Check follower status via Twitter API
To verify Discord server membership:
- Create Discord application
- Set up OAuth2 redirect URLs
- Implement Discord OAuth flow
- Check server membership via Discord API
Add analytics to track conversions:
npm install @vercel/analyticsIn app/layout.tsx:
import { Analytics } from '@vercel/analytics/react'
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Analytics />
</body>
</html>
)
}Contributions are welcome! Please open an issue or submit a pull request.
MIT License - feel free to use this for your own projects!
- Twitter: @ghost_onsui
- Discord: Join our community
- Website: ghostcircle.io
If you have questions or need help:
- Join our Discord server
- Open an issue on GitHub
- Contact us on Twitter
Built with β€οΈ for the Ghost Circle community
Made with Next.js, Sui dApp Kit, and Supabase