An open-source full-stack app for collecting, organizing, searching, and sharing website bookmarks.
Built for personal and team use, with a public showcase, user workspace, admin tools, and AI-assisted bookmark workflows.
简体中文 | English
BMM is an open-source application for managing website bookmarks. It combines collecting links, organizing them with tags, publishing curated websites, and maintaining the data from an admin interface in one system, with automatic metadata fetching and AI-assisted entry flows.
You can use it as:
- a personal bookmark dashboard
- a team knowledge directory
- a public website curation portal
- Public pages, user workspaces, and admin tools live in the same product, so you can grow from personal use to a shared navigation site.
- Browser bookmark exports can be imported and mapped into tag relationships, which makes migration easier.
- Supports many-to-many tag and bookmark relations, drag-and-drop sorting, keyword search, and pinyin search.
- Automatically fetches website titles, descriptions, and icons, with extra probing for common icon paths.
- Supports both GitHub OAuth and email/password authentication.
- Uses AI to analyze websites, suggest tags, and generate related-tag suggestions and theme colors.
- Responsive UI works across desktop and mobile, with light and dark themes.
- Multi-purpose cards such as weather and news
- Browser extension
- Bookmark availability checks
- Read-it-later workflow
| Category | Technology |
|---|---|
| Framework | Next.js 16 + React 19 |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| UI | HeroUI + Ant Design |
| Database | SQLite / PostgreSQL / Turso |
| ORM | Drizzle ORM |
| Auth | NextAuth v5 beta |
| AI | Vercel AI SDK + OpenAI-compatible provider |
| Testing | Vitest |
Tip
Local startup uses SQLite by default. pnpm dev, pnpm build, and pnpm start all run the database bootstrap script first, so manual database setup is usually unnecessary.
git clone https://github.com/Y80/bmm.git
cd bmm
pnpm install
pnpm devThen open http://localhost:3000.
| Command | Description |
|---|---|
pnpm dev |
Start the development server and initialize the database first |
pnpm build |
Build for production |
pnpm start |
Run the production build |
pnpm lint |
Run ESLint |
pnpm test |
Run Vitest |
pnpm db:test |
Check database connectivity |
pnpm db:migrate |
Generate and apply database migrations |
pnpm db:push |
Push schema changes directly and may risk data loss |
pnpm studio |
Open Drizzle Studio |
See .env for the full example.
Tip
If you only want to get the app running, local development usually works with the default SQLite configuration. AI features and GitHub login are optional add-ons.
| Variable | Purpose |
|---|---|
DB_DRIVER |
Database driver, sqlite or postgresql |
DB_CONNECTION_URL |
Database connection string |
DB_AUTH_TOKEN |
Optional token for Turso or libsql |
AUTH_URL |
Current site URL used by auth and deployment flows |
AUTH_SECRET |
NextAuth secret, recommended for production |
AUTH_GITHUB_ID |
Optional GitHub OAuth Client ID |
AUTH_GITHUB_SECRET |
Optional GitHub OAuth Client Secret |
OPENAI_API_KEY |
Optional AI provider key |
OPENAI_BASE_URL |
Optional OpenAI-compatible base URL |
OPENAI_MODEL |
Optional AI model name |
BMM currently supports SQLite, PostgreSQL, and Turso directly.
- SQLite is the default local option, and the database file is initialized automatically on first run.
- To switch to PostgreSQL or Turso, update
DB_DRIVERandDB_CONNECTION_URL. - The repository includes
docker-compose.ymlas a PostgreSQL deployment example.
If you only want to verify database readiness, run:
pnpm db:test
pnpm db:migrategit clone https://github.com/Y80/bmm.git
cd bmm
pnpm install
pnpm build
pnpm startThe repository includes a ready-to-use Dockerfile. The example below uses SQLite with a mounted volume:
docker build -t bmm .
docker run --rm \
-e DB_DRIVER=sqlite \
-e DB_CONNECTION_URL=file:/app/volume/sqlite.db \
-v bmm:/app/volume \
-p 3000:3000 \
bmm- Fork this repository and import it into Vercel.
- Configure database, auth, and optional AI variables in Environment Variables.
- After deployment, verify that
AUTH_URLmatches the GitHub OAuth callback URL.
The AI features reduce manual work during bookmark entry and organization. Current coverage includes:
- automatic website title, description, and icon analysis
- related tag suggestions for bookmarks
- related-tag suggestions and theme colors for tags
The project uses Vercel AI SDK with an OpenAI-compatible provider. A typical configuration looks like:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chatSupported options include OpenAI-compatible providers such as OpenAI, DeepSeek, Moonshot, and GLM. For non OpenAI-compatible services, refer to AI SDK Providers.
Important
AUTH_URL, the GitHub OAuth App Authorization callback URL, and the actual URL users use to access BMM must match exactly.
- Create a GitHub OAuth App at https://github.com/settings/applications/new.
- Set the callback URL in the form
https://your-domain.com/api/auth/callback/github. - Configure these variables:
AUTH_GITHUB_ID=your-client-id
AUTH_GITHUB_SECRET=your-client-secret
AUTH_URL=https://your-domain.comThese screenshots can help when checking the configuration:
What should AUTH_URL be?
It should equal the real URL users open BMM with, for example:
http://localhost:3000https://bmm.vercel.apphttps://example.comhttp://10.1.2.3:3000
What if GitHub login fails with a redirect_uri error?
Check whether these three values are exactly the same:
- the GitHub OAuth App
Authorization callback URL - the
AUTH_URLenvironment variable - the actual BMM access URL
Example error screenshot:
What if the callback URL becomes wrong after changing the port or using an IP address?
Whenever the access URL changes, update both AUTH_URL and the callback URL in the GitHub OAuth App.
Are more databases supported?
This repository directly implements SQLite / PostgreSQL / Turso. Because it uses Drizzle ORM, extending to more databases is feasible, but it still requires the matching schema and driver work.






