base on One-click to deploy your own ai tools directory with the open source web-ui # Open Source Tap4 AI Web UI
This is an open-source AI Tools Directory project from [Tap4 AI Tool Directory](https://tap4.ai). Our goal is to make it
easy for everyone to have their own AI Tools Directory, to collect their favorite AI tool products. This project is very
lightweight and easy to maintain, suitable for individual developers interested in AI navigation sites, and also
suitable for learners interested in NextJs. Everyone is welcome to fork and star.
[Simplified Chinese](https://github.com/6677-ai/tap4-ai-webui/blob/main/README.zh-CN.md) | English
## Support Tap4 AI in Product Hunt
<a href="https://www.producthunt.com/posts/ai-tools-directory-by-tap4-ai?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-ai-tools-directory-by-tap4-ai" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=464357&theme=light" alt="AI Tools Directory by Tap4 AI - Open-source AI navigation & discovery with multi-language | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
## Version 2.0.0 Update Notes
- AI site data is stored using a supabase database.
- It is connected to the Tap4 AI crawler project, supporting fully automatic submission and collection.
- Supports simple categorization and search.
Note: If you are not familiar with the database, or are concerned about compatibility issues with version 1.0.0, please
click to switch to the [version 1.0.0 branch](https://github.com/6677-ai/tap4-ai-webui/tree/v1.0.0).
## Latest Features Introduction
- Supports the display of AI tool lists.
- Supports AI tool category filtering.
- Supports AI tool search.
- Supports the display of AI tool Markdown details.
- SEO friendly (supports i18n).
## Technical Stack Description
- Uses NEXT 14 and app routing (React server components).
- Supabase serverless database.
- Internationalization.
- SEO friendly (supports i18n).
- Dynamic sitemap.xml (supports i18n).
- Tailwind CSS.
## Front-end Page Screenshot
![tap4-ai](./public/images/tap4ai.zh-CN.png)
## Follow and Support Links
Please follow our Twitter: https://x.com/tap4ai
If you find the project helpful, please consider buying me a coffee:
<a href="https://www.buymeacoffee.com/tap4ai0o" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
If you are interested in the project, please add my WeChat: helloleo2023, note: "tap4 ai open source"
## Deployment Instructions
### Deploying Tap4 AI Crawler
See [Tap4 AI Crawler](https://github.com/6677-ai/tap4-ai-crawler) for details. After deployment, you can use the
platform's domain name or a custom domain name as the API interface for generating AI tool web page content (e.g.,
https://{crawler_domain}/site/crawl, where {crawler_domain} is your specific domain name).
**You need to configure it in the CRAWLER_API environment variable.**
### Creating a Supabase Database and Executing SQL Scripts
- Register on [Supabase](https://supabase.com/), create a database, and record the SUPABASE_URL and SUPABASE_ANON_KEY
for later Vercel environment variable deployment.
- Execute the SQL files in the project's db directory on the Supabase backend: create_table.sql,
insert_category_data.sql, insert_data.sql.
**Note: If you need to modify the data, you can refer to the SQL files or directly edit them on the Supabase backend.**
### Deploy on Vercel **(Don't forget to set the environment variables)**
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2F6677-ai%2Ftap4-ai-webui.git&env=NEXT_PUBLIC_SITE_URL,GOOGLE_TRACKING_ID,GOOGLE_ADSENSE_URL,CONTACT_US_EMAIL,NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY,CRAWLER_API,CRAWLER_API_KEY,CRON_AUTH_KEY,SUBMIT_AUTH_KEY&project-name=tap4-ai)
Environment params as below: **Note: All key is in need, and the value including
NEXT_PUBLIC_SITE_URL,NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY write with the correct value**
```sh
# Your domain
NEXT_PUBLIC_SITE_URL="https://tap4.ai"
# Google tracking ID and ad URL
GOOGLE_TRACKING_ID="G-XXXXXXX" GOOGLE_ADSENSE_URL="https://xxxx.googlesyndication.com/xxxxx/xxxxx"
# Contact email at the bottom
CONTACT_US_EMAIL="
[email protected]"
# Supabase database URL and key
NEXT_PUBLIC_SUPABASE_URL="https://xxxyyyzzz.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="XXX.YYY.ZZZ"
# Web crawler API interface
CRAWLER_API="https://{crawler_domain}/site/crawl_async"
# Crawler interface verification key
CRAWLER_API_KEY="xxxx"
# Custom interface verification key
CRON_AUTH_KEY="keyxxxx"
# Submit API verification key
SUBMIT_AUTH_KEY="xxxx"
```
**Note: This version uses Vercel's scheduled tasks to automatically read and submit websites and generate website
results.**
- Free version of Vercel: Supports only one call per day, you can manually call {domain}/api/cron, using POST, Header:
{"Authorization":"Bearer auth_key"}, where auth_key is a custom configured environment variable.
- Pro version of Vercel: You can refer to this document to configure
[Vercel Cron Jobs](https://vercel.com/docs/cron-jobs#cron-expressions).
## Running Locally
### Installation
- Node
- NVM
- PNPM
### Setup
#### Clone this project
```sh
git clone https://github.com/6677-ai/tap4-ai-webui.git
```
#### Create a Supabase Database and Execute SQL Scripts
Register on Supabase, create a database, and record the SUPABASE_URL and SUPABASE_ANON_KEY for later Vercel environment
variable deployment. Execute the SQL files in the project's db directory on the Supabase backend: create_table.sql,
insert_category_data.sql, insert_data.sql.
**Note: If you need to modify the data, you can refer to the SQL files or directly edit them on the Supabase backend.**
#### Set Environment Variables In the root directory, create a .env.local file and fill in the specific values, as shown below:
**Note: All key is in need, and the value including
NEXT_PUBLIC_SITE_URL,NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY write with the correct value**
```sh
# Your domain
NEXT_PUBLIC_SITE_URL="https://tap4.ai"
# Google tracking ID and ad URL
GOOGLE_TRACKING_ID="G-XXXXXXX" GOOGLE_ADSENSE_URL="https://xxxx.googlesyndication.com/xxxxx/xxxxx"
# Contact email at the bottom
CONTACT_US_EMAIL="
[email protected]"
# Supabase database URL and key
NEXT_PUBLIC_SUPABASE_URL="https://xxxyyyzzz.supabase.co" NEXT_PUBLIC_SUPABASE_ANON_KEY="XXX.YYY.ZZZ"
# Web crawler API interface
CRAWLER_API="https://craw_domain/site/crawl_async"
# Crawler interface verification key
CRAWLER_API_KEY="xxxx"
# Custom interface verification key
CRON_AUTH_KEY="keyxxxx"
# Submit API verification key
SUBMIT_AUTH_KEY="xxxx"
```
#### (5) runs on dev mode
switch to the particular node version
```sh
nvm use
```
install packages
```sh
pnpm i
```
run on dev mode
```sh
pnpm dev
```
## How to upate your content?
### Manually Modify the Database
Modify the data in the web_navigation table of Supabase, please pay attention to the format of markdown.
### If the Crawler Fails to Load, How to Handle It
Due to compatibility issues with different site anti-crawling mechanisms, the crawler may currently fail to load. For
such issues, you currently need to manually query the database submit table, and then manually create the relevant
website content and insert it into the web_navigation table.
### How to get the ai tools for project initialization?
You can get the 13000+ AIs from Tap4 AI collected from other AI Tools Directory in
[AI Source List](https://github.com/6677-ai/tap4-ai-webui/blob/main/ai_source_list)
## Wanna submit your website on Tap4.ai?
Open: [Tap4 AI](https://tap4.ai)
### Wanna add you website to our `/startup` page?
- open an issue here: [TAP4-AI-Directory](https://github.com/6677-ai/TAP4-AI-Directory/issues)
- email us:
[email protected]
## Links to our products
### AI Video Online - Advanced AI Video All in One
[AI Video Online](https://videoweb.ai/)
More about AI Video Online:
https://www.zhihu.com/pin/1835046959477567488
### Flux Pro AI - Free Online Flux.1 AI Image Generator
[Flux 1.1 Pro](https://fluxproweb.com/)
More about Flux Pro AI
https://www.zhihu.com/pin/1832771259513069568
### Free Stable Diffusion 3 Online Tool
[Free Stable Diffusion 3 Online](https://stable-diffusion-3.online)
### Free Tiny Png Tool
[Free Type Png Tool](https://freetinypng.com)
### Flux AI - Flux.1 AI Image Generator
[Flux AI](https://flux-ai.io/)
## Other open source
### Website content AI crawler
visit: [6677-ai/tap4-ai-crawler](https://github.com/6677-ai/tap4-ai-crawler)
#### More AI
### Photo to Video AI
Photo to Video AI is currently available for free experience, please visit
[Photo to Video AI](https://dreammachineai.online/)
### Flux Pro Image Generator
Flux Pro Image Generator is currently available for free experience, please visit
[Flux Pro Image Generator](https://flux-pro.net/)
### Chat o1
Chatbot build with openai o1 and chatgpt 4o, please visit
[Chat O1](https://chat4o.ai/)
### Grok Image Generator
Grok Image Generator with flux ai, please visit
[Grok Image Generator](https://grokimagegenerator.net/))
### Free Stable Diffusion 3 Online
Stable Diffusion 3 Medium is currently available for free experience, please visit
[Free Stable Diffusion 3 Online](https://stable-diffusion-3.online/)
### Artiverse AI Tools Directory
Artiverse AI Tools Directory. If you are interested with it, visit
[Tattoo AI Design](https://artiverse.app/)
### The Tattoo AI Generator and Design
Tattao AI Design is a tattoo ai generator and design for the tattoo fans. If you are interested with it, visit
[Tattoo AI Design](https://tattooai.design)
### Best AI Image Generator
Best AI Image Generator is the most powerful AI Image Generator integrated with Flux AI and Stable Diffusion AI. If you are interested with it, visit
[Best AI Image Generator](https://bestimage.ai/)
### Dream Companion AI
Let your AI companion take care of your most personal needs with our innovative NSFW AI roleplay experience.. If you are interested with it, visit
[Dream Companion AI](https://www.mydreamcompanion.com/)
", Assign "at most 3 tags" to the expected json: {"id":"10350","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"