A comprehensive, modern web dashboard for managing Pinecone vector databases
Built for developers who need powerful vector database management with a beautiful, intuitive interface
- Create & Configure: Support for all Pinecone index types (Serverless, Pod-based)
- Real-time Monitoring: Live status updates, capacity monitoring, and health checks
- Multi-metric Support: Cosine, Euclidean, and Dot Product similarity metrics
- Batch Operations: Efficient bulk index management
- Semantic Search: Execute similarity searches with custom vectors
- Smart Filtering: JSON-based metadata filtering with complex conditions
- Namespace Management: Organize and isolate your vector data
- Export Capabilities: Download query results in multiple formats
- Interactive Dashboards: Real-time charts powered by Recharts
- Capacity Planning: Monitor index fullness and storage utilization
- Distribution Analysis: Visualize vector distributions across namespaces
- Performance Metrics: Track query performance and usage patterns
- Dark/Light Mode: Adaptive theming for comfortable development
- Responsive Design: Works seamlessly across all devices
- Type Safety: Full TypeScript support with comprehensive type definitions
- Error Handling: Graceful error management with detailed feedback
Real-time analytics showing index statistics, vector distributions, and namespace management
Experience the full functionality with your own Pinecone API key
📝 Note: You'll need to configure your Pinecone API key to access all features
|
|
💡 Want to see it in action first? Check out the live demo or view the demo screenshot above!
- Node.js 18.0 or later
- npm or yarn package manager
- Pinecone account with API key (Get one here)
-
Clone the repository
git clone https://github.com/wookingwoo/pinecone-dashboard.git cd pinecone-dashboard -
Install dependencies
npm install # or yarn install -
Environment Setup
Create
.env.localfile in the root directory:PINECONE_API_KEY=your_pinecone_api_key_here
-
Start development server
npm run dev
-
Open your browser
Navigate to http://localhost:3000
| Endpoint | Method | Description | Parameters |
|---|---|---|---|
/api/indexes |
GET |
List all indexes | - |
/api/indexes |
POST |
Create new index | name, dimension, metric |
/api/indexes/[name] |
GET |
Get index stats | includeValues? |
/api/indexes/[name] |
DELETE |
Delete index | - |
/api/indexes/[name]/namespaces |
POST |
Create namespace | namespaces[] |
/api/indexes/[name]/namespaces |
DELETE |
Delete namespaces | namespaces[], deleteAll? |
/api/query |
POST |
Vector similarity search | vector, topK, filter?, namespace? |
/api/vectors |
POST |
Upsert/Fetch vectors | vectors[], namespace? |
/api/vectors |
DELETE |
Delete vectors | ids[], namespace? |
Create Index
// POST /api/indexes
{
"name": "my-index",
"dimension": 1536,
"metric": "cosine"
}
// Response
{
"success": true,
"index": {
"name": "my-index",
"dimension": 1536,
"metric": "cosine",
"status": "Initializing"
}
}Vector Query
// POST /api/query
{
"indexName": "my-index",
"vector": [0.1, 0.2, 0.3, ...],
"topK": 10,
"filter": {
"category": "document",
"year": {"$gte": 2020}
},
"includeMetadata": true
}
// Response
{
"matches": [
{
"id": "doc-1",
"score": 0.95,
"metadata": {
"title": "Document Title",
"category": "document"
}
}
]
}┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ React Client │────│ Next.js API │────│ Pinecone API │
│ │ │ │ │ │
│ • Dashboard │ │ • Authentication│ │ • Vector Ops │
│ • Components │ │ • Rate Limiting │ │ • Index Mgmt │
│ • State Mgmt │ │ • Error Handling│ │ • Analytics │
└─────────────────┘ └─────────────────┘ └─────────────────┘
src/
├── app/ # Next.js App Router
│ ├── api/ # API Routes
│ │ ├── indexes/ # Index management
│ │ ├── query/ # Vector queries
│ │ └── vectors/ # Vector operations
│ ├── globals.css # Global styles
│ ├── layout.tsx # Root layout
│ └── page.tsx # Home page
├── components/ # React Components
│ ├── Dashboard.tsx # Main dashboard
│ ├── IndexManager.tsx # Index management
│ ├── QueryInterface.tsx # Query interface
│ ├── VectorSearch.tsx # Vector operations
│ ├── Analytics.tsx # Analytics dashboard
│ └── Settings.tsx # Configuration
└── lib/ # Utilities
├── api.ts # API client
├── pinecone.ts # Pinecone utilities
└── pinecone-server.ts # Server-side client
# Development
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
# Type checking
npx tsc --noEmit # TypeScript type check- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use TypeScript for all new code
- Follow ESLint configuration
- Write meaningful commit messages
- Add JSDoc comments for public APIs
- Ensure responsive design for UI changes
- Click the deploy button above
- Set your
PINECONE_API_KEYenvironment variable (optional) - Deploy!
Live Example: pinecone.ronny.dev
# Build the application
npm run build
# Start production server
npm startFROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]// Create a new index
const response = await fetch('/api/indexes', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'semantic-search',
dimension: 1536,
metric: 'cosine'
})
});// Perform similarity search
const searchResults = await fetch('/api/query', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
indexName: 'semantic-search',
vector: embeddings,
topK: 5,
filter: { category: 'documentation' }
})
});- Create a Pinecone account
- Generate an API key from your dashboard
- Choose your preferred cloud region
- Set up your first index (or use the dashboard!)
Custom Themes
Extend tailwind.config.js to customize the dashboard appearance:
module.exports = {
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
500: '#3b82f6',
900: '#1e3a8a',
}
}
}
}
}API Rate Limiting
Configure rate limiting in your API routes:
// Implement in your API middleware
const rateLimit = {
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
};We welcome contributions! Here's how you can help:
- Use the issue template
- Include steps to reproduce
- Provide environment details
- Check existing feature requests
- Use the feature template
- Explain the use case
- Read our contributing guide
- Follow the code style guidelines
- Add tests for new features
- Update documentation
- Pinecone - For the amazing vector database platform
- Vercel - For the excellent hosting and deployment experience
- Next.js Team - For the powerful React framework
- Tailwind CSS - For the utility-first CSS framework
- Open Source Community - For inspiration and contributions
This project is licensed under the MIT License - see the LICENSE file for details.
- 🎬 Live Demo: pinecone.ronny.dev
- 📖 Pinecone Docs: docs.pinecone.io
- 🌐 Pinecone Platform: pinecone.io
- ⚛️ Next.js Docs: nextjs.org/docs
- 🐛 Report Issues: GitHub Issues
