Intelligent content moderation at scale. Keep unwanted content off your platform without managing a team of moderators.
Features:
- Moderation Dashboard: View and manage all content moderation activity from a single place.
- User Lifecycle: Automatically suspend users with flagged content (and handle automatic compliance when moderated content is removed).
- Appeals Management: Handle user appeals efficiently through email notifications and a user-friendly web form.
- Powerful Rules & Presets: Create rules to automatically moderate content based on your unique business needs.
You may self-host Iffy Community for free, if your business has less than 1 million USD total revenue in the prior tax year, and less than 10 million USD GMV (Gross Merchandise Value). For more details, see the Iffy Community License 1.0.
Here are the differences between the managed, hosted Iffy Cloud and the free Iffy Community version.
Iffy Cloud | Iffy Community | |
---|---|---|
Infrastructure | Easy setup. We manage everything. | You set up a server and dependent services. You are responsible for installation, maintenance, upgrades, uptime, security, and service costs. |
Rules/Presets | 9 powerful presets: Adult content, Spam, Harassment, Non-fiat currency, Weapon components, Government services, Gambling, IPTV, and Phishing | 2 basic presets: Adult content and Spam |
Install postgres with a username postgres
and password postgres
brew install postgresql
brew services start postgresql
createdb
psql -c "CREATE USER postgres WITH LOGIN SUPERUSER PASSWORD 'postgres';"
Install dependencies:
npm i
Copy .env.example
to .env.local
.
Generate a FIELD_ENCRYPTION_KEY
:
npx @47ng/cloak generate | head -1 | cut -d':' -f2 | tr -d ' *'
Generate an API_KEY_ENCRYPTION_KEY
and an APPEAL_ENCRYPTION_KEY
:
openssl rand -base64 32
Clerk
- Go to clerk.com and create a new app.
- Name the app and disable all login methods except Email.
- Under "Configure > Email, phone, username", limit authentication strategies to "Email verification link" and "Email verification code". Turn on "Personal information > Name"
- Under "Configure > Restrictions", turn on "Sign-up mode > Restricted"
- Under "Configure > Organization Management", turn on "Enable organizations"
- Under "Configure > API Keys", add
CLERK_SECRET_KEY
andNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
to your.env.local
file. - Under "Organizations", create a new organization and add your email to the "Members" list.
- Add the organization ID to your
.env.local
file asSEED_CLERK_ORGANIZATION_ID
. - (Optional, for testing) In the Clerk dashboard, disable the "Require the same device and browser" setting to ensure tests with Mailosaur work properly.
OpenAI
- Create an account at openai.com.
- Create a new API key at platform.openai.com/api-keys.
- Add the API key to your
.env.local
file asOPENAI_API_KEY
.
Resend (Optional, for email notifications)
In order to send email with Iffy, you will additionally need a Resend API key.
- Create an account at resend.com.
- Create and verify a new domain. Add the desired from email (e.g.
[email protected]
) to your.env.local
file asRESEND_FROM_EMAIL
. - Add the desired from name (e.g.
Iffy
) to your.env.local
file asRESEND_FROM_NAME
. - Create a new API key at API Keys.
- Add the API key to your
.env.local
file asRESEND_API_KEY
.
Shortest (Optional, for testing)
In order to write and run natural language AI tests with Shortest, you will additionally need an Anthropic API key and a Mailosaur API key.
- Create an account at anthropic.com.
- Create a new API key at Account Settings.
- Add the API key to your
.env.local
file asSHORTEST_ANTHROPIC_API_KEY
. - Create an account at mailosaur.com.
- Create a new Inbox/Server.
- Go to API Keys and create a standard key.
- Update the environment variables:
MAILOSAUR_API_KEY
: Your API keyMAILOSAUR_SERVER_ID
: Your server ID
Set up the database, run migrations, and seed data:
createdb iffy_development
npm run dev:db:setup
Run the development server:
npm run dev
Open http://localhost:3000 to access the app.
To run asynchronous jobs, you will need to set up a local Inngest server. In a separate terminal, run:
npm run dev:inngest
Start the development server
npm run dev
Start the local Inngest server (for asynchronous jobs)
npm run dev:inngest
Run API (unit) tests
npm run test
Run app (end-to-end) tests
npm run shortest
npm run shortest -- --no-cache # with arguments