AI model reviews. Public. No login required for reading. Users can write reviews after signing in.
- Framework: Next.js 14 (App Router, static export)
- Language: TypeScript
- Styling: TailwindCSS
- Database: Supabase (PostgreSQL)
- Auth: Supabase Auth (email/password)
- Models data: Curated list + HuggingFace trending (auto-updated via script)
- 1100+ AI models (900 curated, 200 from HuggingFace)
- Filter by company (OpenAI, Anthropic, Meta, DeepSeek, etc.)
- Filter by category (language, multimodal, reasoning, image, video, audio, code)
- Fuzzy search with typo tolerance
- Star ratings (1-5) with written reviews
- Community-submitted models
- Open source badges on models
- Responsive design for mobile and desktop
- Node.js 18 or later
- Python 3.8+ (for running the model update script)
- A Supabase project (free tier works)
git clone https://github.com/neuralbroker/zeviewer.git
cd zeviewer
npm install-
Create a project at supabase.com
-
Go to SQL Editor and run:
CREATE TABLE reviews (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
user_id UUID REFERENCES auth.users(id) DEFAULT auth.uid(),
model_id INTEGER NOT NULL,
model_name TEXT NOT NULL,
company TEXT NOT NULL,
rating INTEGER NOT NULL CHECK (rating >= 1 AND rating <= 5),
reviewer_name TEXT,
performance_review TEXT NOT NULL,
improvement_suggestions TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE user_models (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
user_id UUID REFERENCES auth.users(id) DEFAULT auth.uid(),
name TEXT NOT NULL,
company TEXT NOT NULL,
category TEXT NOT NULL,
description TEXT NOT NULL,
is_open_source BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
ALTER TABLE reviews ENABLE ROW LEVEL SECURITY;
ALTER TABLE user_models ENABLE ROW LEVEL SECURITY;
CREATE POLICY reviews_read ON reviews FOR SELECT USING (true);
CREATE POLICY reviews_insert ON reviews FOR INSERT WITH CHECK (auth.role() = 'authenticated');
CREATE POLICY user_models_read ON user_models FOR SELECT USING (true);
CREATE POLICY user_models_insert ON user_models FOR INSERT WITH CHECK (auth.role() = 'authenticated');- Enable Email provider in Authentication -> Providers
Create a .env.local file in the project root:
| Variable | Description | Example |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL | https://xxxxx.supabase.co |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anonymous (public) key | eyJhbGciOi... |
Find these in Supabase under Settings -> API.
npm run devnpm run buildOutput goes to out/ as static files. Deploy this folder to Vercel, Netlify, or any static host.
py scripts/fetch_models.py
git add src/data/trending_models.json
git commit -m 'Update trending models'
git pushzeviewer/
├── public/ # Static files served as-is
│ ├── favicon.svg # Site icon
│ ├── robots.txt # Search engine directives
│ └── sitemap.xml # SEO sitemap
├── src/
│ ├── app/ # Next.js pages and layouts
│ │ ├── page.tsx # Main page (all components in one file)
│ │ ├── layout.tsx # Root layout with metadata
│ │ ├── loading.tsx # Loading skeleton
│ │ ├── globals.css # Global styles and animations
│ │ ├── privacy-policy/ # Privacy Policy page
│ │ └── terms-of-service/# Terms of Service page
│ ├── data/ # Static model data
│ │ ├── models.ts # 900 curated AI models
│ │ └── trending_models.json # 200 trending from HuggingFace
│ └── lib/
│ └── supabase.ts # Supabase client setup
├── scripts/
│ └── fetch_models.py # Fetches trending models from HuggingFace
├── next.config.js # Next.js configuration (static export)
├── tailwind.config.js # TailwindCSS configuration
├── tsconfig.json # TypeScript configuration
└── package.json # Dependencies and scripts
- Fork the repository
- Create a branch:
git checkout -b fix/something - Make your changes
- Test with
npm run build - Push and open a pull request
MIT