diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000..b4283b4
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,71 @@
+name: Deploy Docs
+
+on:
+ push:
+ branches:
+ - refactor
+ paths:
+ - 'docs/**'
+ pull_request:
+ branches:
+ - refactor
+ paths:
+ - 'docs/**'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ name: Build Docs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install Mintlify CLI
+ run: npm install -g mintlify
+
+ - name: Export Docs
+ working-directory: docs
+ run: mintlify export
+
+ - name: Unzip Export
+ working-directory: docs
+ run: unzip export.zip -d site
+
+ - name: Add SPA fallback
+ run: |
+ cp docs/site/index.html docs/site/404.html
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/site
+
+ deploy:
+ name: Deploy to GitHub Pages
+ if: github.event_name == 'push'
+ needs: build
+ runs-on: ubuntu-latest
+
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/docs/api-reference/grpc.mdx b/docs/api-reference/grpc.mdx
new file mode 100644
index 0000000..bdae86e
--- /dev/null
+++ b/docs/api-reference/grpc.mdx
@@ -0,0 +1,403 @@
+---
+title: "gRPC API"
+description: "High-performance Protocol Buffer API reference"
+---
+
+# gRPC API Reference
+
+VortexDB's gRPC API provides high-performance vector operations using Protocol Buffers over HTTP/2.
+
+## Connection
+
+| Parameter | Default |
+|-----------|---------|
+| Host | `localhost` |
+| Port | `50051` |
+| Protocol | HTTP/2 (plaintext) |
+
+```bash
+# Test connection with grpcurl
+grpcurl -plaintext localhost:50051 list
+```
+
+## Authentication
+
+All gRPC calls require the `authorization` header with your API key:
+
+```bash
+-H "authorization: your-api-key"
+```
+
+The API key is set via the `GRPC_ROOT_PASSWORD` environment variable.
+
+---
+
+## Service Definition
+
+```protobuf
+syntax = "proto3";
+package vectordb;
+
+service VectorDB {
+ // Insert a vector with a payload and return the assigned PointID
+ rpc InsertVector(InsertVectorRequest) returns (PointID);
+
+ // Delete a vector by its PointID
+ rpc DeletePoint(PointID) returns (google.protobuf.Empty);
+
+ // Get a vector and its payload by PointID
+ rpc GetPoint(PointID) returns (Point);
+
+ // Search for the k nearest vectors to a target vector
+ rpc SearchPoints(SearchRequest) returns (SearchResponse);
+}
+```
+
+---
+
+## Methods
+
+### InsertVector
+
+Insert a vector with its associated payload.
+
+
+ The vector to insert. Must match the configured `DIMENSION`.
+
+
+
+ Metadata associated with the vector.
+
+
+**Request:**
+
+```protobuf
+message InsertVectorRequest {
+ DenseVector vector = 1;
+ Payload payload = 2;
+}
+```
+
+**Response:**
+
+```protobuf
+message PointID {
+ UUID id = 1;
+}
+```
+
+**Example:**
+
+```bash
+grpcurl -plaintext \
+ -H "authorization: secret" \
+ -d '{
+ "vector": {"values": [0.1, 0.2, 0.3, 0.4]},
+ "payload": {"content_type": 1, "content": "Hello world"}
+ }' \
+ localhost:50051 vectordb.VectorDB/InsertVector
+```
+
+**Response:**
+
+```json
+{
+ "id": {
+ "value": "550e8400-e29b-41d4-a716-446655440000"
+ }
+}
+```
+
+---
+
+### GetPoint
+
+Retrieve a point by its ID.
+
+
+ The unique identifier of the point.
+
+
+**Request:**
+
+```protobuf
+message PointID {
+ UUID id = 1;
+}
+```
+
+**Response:**
+
+```protobuf
+message Point {
+ PointID id = 1;
+ Payload payload = 2;
+ DenseVector vector = 3;
+}
+```
+
+**Example:**
+
+```bash
+grpcurl -plaintext \
+ -H "authorization: secret" \
+ -d '{"id": {"value": "550e8400-e29b-41d4-a716-446655440000"}}' \
+ localhost:50051 vectordb.VectorDB/GetPoint
+```
+
+**Response:**
+
+```json
+{
+ "id": {
+ "id": {
+ "value": "550e8400-e29b-41d4-a716-446655440000"
+ }
+ },
+ "payload": {
+ "contentType": "Text",
+ "content": "Hello world"
+ },
+ "vector": {
+ "values": [0.1, 0.2, 0.3, 0.4]
+ }
+}
+```
+
+---
+
+### DeletePoint
+
+Delete a point by its ID.
+
+
+ The unique identifier of the point to delete.
+
+
+**Request:**
+
+```protobuf
+message PointID {
+ UUID id = 1;
+}
+```
+
+**Response:**
+
+```protobuf
+google.protobuf.Empty
+```
+
+**Example:**
+
+```bash
+grpcurl -plaintext \
+ -H "authorization: secret" \
+ -d '{"id": {"value": "550e8400-e29b-41d4-a716-446655440000"}}' \
+ localhost:50051 vectordb.VectorDB/DeletePoint
+```
+
+**Response:**
+
+```json
+{}
+```
+
+---
+
+### SearchPoints
+
+Search for the k nearest neighbors to a query vector.
+
+
+ The vector to search with. Must match the configured `DIMENSION`.
+
+
+
+ The distance metric to use.
+
+
+
+ Maximum number of results to return.
+
+
+**Request:**
+
+```protobuf
+message SearchRequest {
+ DenseVector query_vector = 1;
+ Similarity similarity = 2;
+ uint64 limit = 3;
+}
+```
+
+**Response:**
+
+```protobuf
+message SearchResponse {
+ repeated PointID result_point_ids = 1;
+}
+```
+
+**Example:**
+
+```bash
+grpcurl -plaintext \
+ -H "authorization: secret" \
+ -d '{
+ "query_vector": {"values": [0.1, 0.2, 0.3, 0.4]},
+ "similarity": 3,
+ "limit": 5
+ }' \
+ localhost:50051 vectordb.VectorDB/SearchPoints
+```
+
+**Response:**
+
+```json
+{
+ "resultPointIds": [
+ {"id": {"value": "550e8400-e29b-41d4-a716-446655440000"}},
+ {"id": {"value": "6ba7b810-9dad-11d1-80b4-00c04fd430c8"}}
+ ]
+}
+```
+
+---
+
+## Message Types
+
+### UUID
+
+```protobuf
+message UUID {
+ string value = 1; // UUID v4 string
+}
+```
+
+### DenseVector
+
+```protobuf
+message DenseVector {
+ repeated float values = 1; // Vector components
+}
+```
+
+### Point
+
+```protobuf
+message Point {
+ PointID id = 1; // Unique identifier
+ Payload payload = 2; // Associated metadata
+ DenseVector vector = 3; // Vector values
+}
+```
+
+### PointID
+
+```protobuf
+message PointID {
+ UUID id = 1;
+}
+```
+
+### Payload
+
+```protobuf
+message Payload {
+ ContentType content_type = 1; // Type of content
+ string content = 2; // Content string
+}
+```
+
+---
+
+## Enums
+
+### Similarity
+
+Distance/similarity metric for search operations.
+
+| Value | Name | Description |
+|-------|------|-------------|
+| `0` | `Euclidean` | L2 distance (straight line) |
+| `1` | `Manhattan` | L1 distance (city block) |
+| `2` | `Hamming` | Count of differing elements |
+| `3` | `Cosine` | Angular distance |
+
+### ContentType
+
+Type of payload content.
+
+| Value | Name | Description |
+|-------|------|-------------|
+| `0` | `Image` | Image reference or data |
+| `1` | `Text` | Text content |
+
+---
+
+## Error Codes
+
+| gRPC Code | Name | Description |
+|-----------|------|-------------|
+| `0` | `OK` | Success |
+| `3` | `INVALID_ARGUMENT` | Invalid request (e.g., wrong dimensions) |
+| `5` | `NOT_FOUND` | Point does not exist |
+| `13` | `INTERNAL` | Server error |
+| `16` | `UNAUTHENTICATED` | Invalid or missing API key |
+
+---
+
+## Client Libraries
+
+### Python
+
+```python
+from vortexdb import VortexDB, DenseVector, Payload, Similarity
+
+with VortexDB(grpc_url="localhost:50051", api_key="secret") as db:
+ # Insert
+ point_id = db.insert(
+ vector=DenseVector([0.1, 0.2, 0.3, 0.4]),
+ payload=Payload.text("Hello")
+ )
+
+ # Search
+ results = db.search(
+ vector=DenseVector([0.1, 0.2, 0.3, 0.4]),
+ similarity=Similarity.COSINE,
+ limit=5
+ )
+```
+
+### Generate Clients
+
+Use `protoc` to generate clients in any language:
+
+```bash
+# Python
+python -m grpc_tools.protoc \
+ -I./crates/grpc/proto \
+ --python_out=./client \
+ --grpc_python_out=./client \
+ ./crates/grpc/proto/vector-db.proto
+
+# Go
+protoc --go_out=. --go-grpc_out=. vector-db.proto
+
+# TypeScript
+protoc --plugin=protoc-gen-ts \
+ --ts_out=./client \
+ vector-db.proto
+```
+
+## Next Steps
+
+
+
+ REST API reference
+
+
+ Python client documentation
+
+
diff --git a/docs/api-reference/http.mdx b/docs/api-reference/http.mdx
new file mode 100644
index 0000000..fe88632
--- /dev/null
+++ b/docs/api-reference/http.mdx
@@ -0,0 +1,364 @@
+---
+title: "HTTP API"
+description: "RESTful JSON API reference"
+---
+
+# HTTP API Reference
+
+VortexDB's HTTP API provides a RESTful interface for vector operations using JSON over HTTP/1.1.
+
+## Base URL
+
+```
+http://localhost:3000
+```
+
+The port can be configured via the `HTTP_PORT` environment variable.
+
+
+The HTTP API does not require authentication and is designed for development and trusted internal networks. For production, use the gRPC API or deploy behind a reverse proxy with authentication.
+
+
+---
+
+## Endpoints
+
+### Health Check
+
+Check if the server is running.
+
+
+ Returns "OK" if the server is healthy.
+
+
+
+```bash Request
+curl http://localhost:3000/health
+```
+
+```text Response
+OK
+```
+
+
+---
+
+### Root
+
+Verify the server is running.
+
+
+```bash Request
+curl http://localhost:3000/
+```
+
+```text Response
+Vector Database server is running!
+```
+
+
+---
+
+### Insert Point
+
+
+ Array of floating-point numbers representing the vector. Must match the configured `DIMENSION`.
+
+
+
+ Metadata object associated with the vector.
+
+
+
+ Type of content: `"Text"` or `"Image"`
+
+
+ The content string
+
+
+
+
+
+ The UUID of the created point.
+
+
+
+```bash Request
+curl -X POST http://localhost:3000/points \
+ -H "Content-Type: application/json" \
+ -d '{
+ "vector": [0.1, 0.2, 0.3, 0.4],
+ "payload": {
+ "content_type": "Text",
+ "content": "Hello, VortexDB!"
+ }
+ }'
+```
+
+```json Response (201 Created)
+{
+ "point_id": "550e8400-e29b-41d4-a716-446655440000"
+}
+```
+
+
+**Error Responses:**
+
+| Status | Description |
+|--------|-------------|
+| `400 Bad Request` | Invalid JSON or missing fields |
+| `500 Internal Server Error` | Server error during insertion |
+
+---
+
+### Get Point
+
+Retrieve a point by its ID.
+
+
+ The UUID of the point to retrieve.
+
+
+
+ The point's UUID.
+
+
+
+ The stored vector values.
+
+
+
+ The associated payload metadata.
+
+
+
+```bash Request
+curl http://localhost:3000/points/550e8400-e29b-41d4-a716-446655440000
+```
+
+```json Response (200 OK)
+{
+ "id": "550e8400-e29b-41d4-a716-446655440000",
+ "vector": [0.1, 0.2, 0.3, 0.4],
+ "payload": {
+ "content_type": "Text",
+ "content": "Hello, VortexDB!"
+ }
+}
+```
+
+
+**Error Responses:**
+
+| Status | Description |
+|--------|-------------|
+| `404 Not Found` | Point does not exist |
+| `500 Internal Server Error` | Server error during retrieval |
+
+---
+
+### Delete Point
+
+Delete a point by its ID.
+
+
+ The UUID of the point to delete.
+
+
+
+```bash Request
+curl -X DELETE http://localhost:3000/points/550e8400-e29b-41d4-a716-446655440000
+```
+
+```text Response (204 No Content)
+(empty body)
+```
+
+
+**Error Responses:**
+
+| Status | Description |
+|--------|-------------|
+| `500 Internal Server Error` | Server error during deletion |
+
+---
+
+### Search Points
+
+Search for the k nearest neighbors to a query vector.
+
+
+ Query vector. Must match the configured `DIMENSION`.
+
+
+
+ Distance metric: `"Euclidean"`, `"Manhattan"`, `"Hamming"`, or `"Cosine"`
+
+
+
+ Maximum number of results to return.
+
+
+
+ Array of point IDs ordered by similarity (closest first).
+
+
+
+```bash Request
+curl -X POST http://localhost:3000/points/search \
+ -H "Content-Type: application/json" \
+ -d '{
+ "vector": [0.1, 0.2, 0.3, 0.4],
+ "similarity": "Cosine",
+ "limit": 5
+ }'
+```
+
+```json Response (200 OK)
+{
+ "results": [
+ "550e8400-e29b-41d4-a716-446655440000",
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
+ "f47ac10b-58cc-4372-a567-0e02b2c3d479"
+ ]
+}
+```
+
+
+**Error Responses:**
+
+| Status | Description |
+|--------|-------------|
+| `400 Bad Request` | Invalid JSON or missing fields |
+| `500 Internal Server Error` | Server error during search |
+
+---
+
+## Data Types
+
+### Vector
+
+An array of floating-point numbers:
+
+```json
+[0.1, 0.2, 0.3, 0.4]
+```
+
+
+The vector length must match the `DIMENSION` environment variable configured on the server.
+
+
+### Payload
+
+```json
+{
+ "content_type": "Text",
+ "content": "Your content here"
+}
+```
+
+| Field | Type | Values |
+|-------|------|--------|
+| `content_type` | string | `"Text"` or `"Image"` |
+| `content` | string | Any string content |
+
+### Similarity
+
+| Value | Description |
+|-------|-------------|
+| `"Euclidean"` | L2 distance (straight line) |
+| `"Manhattan"` | L1 distance (city block) |
+| `"Hamming"` | Count of differing elements |
+| `"Cosine"` | Angular distance (1 - cosine similarity) |
+
+---
+
+## Error Format
+
+Errors are returned as plain text with an appropriate HTTP status code:
+
+```bash
+curl -v http://localhost:3000/points/nonexistent-id
+```
+
+```
+< HTTP/1.1 404 Not Found
+< content-type: text/plain; charset=utf-8
+<
+Point not found
+```
+
+---
+
+## Examples
+
+### Complete Workflow
+
+```bash
+# 1. Check health
+curl http://localhost:3000/health
+# OK
+
+# 2. Insert a vector
+POINT_ID=$(curl -s -X POST http://localhost:3000/points \
+ -H "Content-Type: application/json" \
+ -d '{
+ "vector": [0.1, 0.2, 0.3, 0.4],
+ "payload": {"content_type": "Text", "content": "First document"}
+ }' | jq -r '.point_id')
+
+echo "Created point: $POINT_ID"
+
+# 3. Get the point
+curl http://localhost:3000/points/$POINT_ID
+
+# 4. Search for similar vectors
+curl -X POST http://localhost:3000/points/search \
+ -H "Content-Type: application/json" \
+ -d '{
+ "vector": [0.15, 0.25, 0.35, 0.45],
+ "similarity": "Cosine",
+ "limit": 10
+ }'
+
+# 5. Delete the point
+curl -X DELETE http://localhost:3000/points/$POINT_ID
+```
+
+### Batch Insert (using shell loop)
+
+```bash
+for i in {1..10}; do
+ curl -s -X POST http://localhost:3000/points \
+ -H "Content-Type: application/json" \
+ -d "{
+ \"vector\": [$(echo "scale=2; $i/10" | bc), $(echo "scale=2; $i/10 + 0.1" | bc), 0.3, 0.4],
+ \"payload\": {\"content_type\": \"Text\", \"content\": \"Document $i\"}
+ }"
+done
+```
+
+---
+
+## OpenAPI Specification
+
+The complete OpenAPI specification is available at:
+
+```
+/docs/openapi.yaml
+```
+
+You can import this into tools like Postman or Swagger UI for interactive API exploration.
+
+---
+
+## Next Steps
+
+
+
+ High-performance gRPC API reference
+
+
+ Build applications with the Python client
+
+
diff --git a/docs/api-reference/overview.mdx b/docs/api-reference/overview.mdx
new file mode 100644
index 0000000..5a149c3
--- /dev/null
+++ b/docs/api-reference/overview.mdx
@@ -0,0 +1,173 @@
+---
+title: "API Overview"
+description: "VortexDB exposes two APIs: gRPC and HTTP"
+---
+
+# API Overview
+
+VortexDB provides two complementary APIs for different use cases:
+
+## Available APIs
+
+
+
+ High-performance Protocol Buffer interface for production workloads
+
+
+ RESTful JSON interface for quick testing and prototyping
+
+
+
+## Comparison
+
+| Feature | gRPC | HTTP |
+|---------|------|------|
+| **Protocol** | HTTP/2 + Protobuf | HTTP/1.1 + JSON |
+| **Default Port** | 50051 | 3000 |
+| **Authentication** | API key required | None |
+| **Performance** | Higher throughput | Lower latency for simple requests |
+| **Client Libraries** | Auto-generated | Any HTTP client |
+| **Best For** | Production, SDKs | Debugging, curl |
+
+## Authentication
+
+### gRPC
+
+The gRPC API requires authentication via the `authorization` header:
+
+```bash
+# Using grpcurl
+grpcurl -plaintext \
+ -H "authorization: your-api-key" \
+ localhost:50051 vectordb.VectorDB/GetPoint
+```
+
+```python
+# Python SDK
+db = VortexDB(
+ grpc_url="localhost:50051",
+ api_key="your-api-key"
+)
+```
+
+### HTTP
+
+The HTTP API does not require authentication by default. It's designed for trusted internal networks and development.
+
+
+In production, always deploy the HTTP API behind a reverse proxy with authentication, or disable it entirely using `DISABLE_HTTP=true`.
+
+
+## Common Operations
+
+Both APIs support the same core operations:
+
+| Operation | gRPC Method | HTTP Endpoint |
+|-----------|-------------|---------------|
+| Insert vector | `InsertVector` | `POST /points` |
+| Get point | `GetPoint` | `GET /points/:id` |
+| Delete point | `DeletePoint` | `DELETE /points/:id` |
+| Search vectors | `SearchPoints` | `POST /points/search` |
+| Health check | - | `GET /health` |
+
+## Error Handling
+
+### gRPC Error Codes
+
+| Code | Name | Description |
+|------|------|-------------|
+| `0` | OK | Success |
+| `3` | INVALID_ARGUMENT | Invalid request parameters |
+| `5` | NOT_FOUND | Point not found |
+| `13` | INTERNAL | Server error |
+| `16` | UNAUTHENTICATED | Invalid or missing API key |
+
+### HTTP Status Codes
+
+| Code | Description |
+|------|-------------|
+| `200` | Success |
+| `201` | Created (for insert) |
+| `204` | No Content (for delete) |
+| `400` | Bad Request |
+| `404` | Not Found |
+| `500` | Internal Server Error |
+
+## Data Types
+
+### Vector
+
+A dense vector of floating-point values:
+
+
+
+ ```protobuf
+ message DenseVector {
+ repeated float values = 1;
+ }
+ ```
+
+
+ ```json
+ {
+ "vector": [0.1, 0.2, 0.3, 0.4]
+ }
+ ```
+
+
+
+### Payload
+
+Metadata attached to vectors:
+
+
+
+ ```protobuf
+ enum ContentType {
+ Image = 0;
+ Text = 1;
+ }
+
+ message Payload {
+ ContentType content_type = 1;
+ string content = 2;
+ }
+ ```
+
+
+ ```json
+ {
+ "payload": {
+ "content_type": "Text",
+ "content": "Hello, world!"
+ }
+ }
+ ```
+
+
+
+### Similarity Metric
+
+Distance function for search:
+
+| Value | gRPC Enum | HTTP String |
+|-------|-----------|-------------|
+| Euclidean (L2) | `0` | `"Euclidean"` |
+| Manhattan (L1) | `1` | `"Manhattan"` |
+| Hamming | `2` | `"Hamming"` |
+| Cosine | `3` | `"Cosine"` |
+
+## Rate Limiting
+
+VortexDB does not implement built-in rate limiting. For production deployments, use a reverse proxy or API gateway to enforce limits.
+
+## Next Steps
+
+
+
+ Complete gRPC API documentation
+
+
+ Complete HTTP API documentation
+
+
diff --git a/docs/concepts/architecture.mdx b/docs/concepts/architecture.mdx
new file mode 100644
index 0000000..2af8ee7
--- /dev/null
+++ b/docs/concepts/architecture.mdx
@@ -0,0 +1,217 @@
+---
+title: "Architecture"
+description: "Understanding VortexDB's modular architecture"
+---
+
+# Architecture
+
+VortexDB is a high-performance vector database built in Rust, designed with modularity and flexibility at its core. This page explains how the components work together.
+
+## High-Level Overview
+
+```mermaid
+flowchart TB
+ subgraph Clients
+ HTTP[HTTP Client]
+ GRPC[gRPC Client]
+ SDK[Python SDK
gRPC under hood]
+ end
+
+ subgraph Server[VortexDB Server]
+ subgraph Transport[Transport Layer]
+ HTTPLayer[HTTP Layer
Axum]
+ GRPCLayer[gRPC Layer
tonic + prost]
+ end
+
+ API[API Core]
+
+ subgraph Backend[Backend Layer]
+ Index[Index Layer]
+ Storage[Storage Layer]
+ Snapshot[Snapshot Engine]
+ end
+ end
+
+ HTTP --> HTTPLayer
+ GRPC --> GRPCLayer
+ SDK --> GRPCLayer
+
+ HTTPLayer <--> GRPCLayer
+ HTTPLayer --> API
+ GRPCLayer --> API
+
+ API --> Index
+ API --> Storage
+ API --> Snapshot
+```
+
+## Crate Structure
+
+VortexDB is organized as a Rust workspace with the following crates:
+
+| Crate | Purpose |
+|-------|---------|
+| `server` | Main entry point, configuration, server startup |
+| `api` | Core database logic and error handling |
+| `grpc` | Protocol Buffers definitions and gRPC service |
+| `http` | REST API handlers using Axum |
+| `index` | Vector indexing algorithms (Flat, KD-Tree, HNSW) |
+| `storage` | Persistence backends (InMemory, RocksDB) |
+| `snapshot` | Point-in-time backup and restore |
+| `defs` | Shared type definitions |
+| `tui` | Terminal user interface |
+
+## Transport Layers
+
+VortexDB exposes two APIs that share the same underlying database:
+
+### gRPC API
+
+The **gRPC layer** is the primary high-performance interface:
+
+- **Protocol**: HTTP/2 with Protocol Buffers
+- **Port**: 50051 (default)
+- **Authentication**: API key via `authorization` header
+- **Use cases**: Production workloads, SDKs, high-throughput scenarios
+
+```protobuf
+service VectorDB {
+ rpc InsertVector(InsertVectorRequest) returns (PointID);
+ rpc DeletePoint(PointID) returns (google.protobuf.Empty);
+ rpc GetPoint(PointID) returns (Point);
+ rpc SearchPoints(SearchRequest) returns (SearchResponse);
+}
+```
+
+### HTTP API
+
+The **HTTP layer** provides a RESTful interface:
+
+- **Protocol**: HTTP/1.1 with JSON
+- **Port**: 3000 (default)
+- **Authentication**: None (designed for internal/trusted networks)
+- **Use cases**: Quick testing, curl commands, prototyping
+
+| Method | Endpoint | Description |
+|--------|----------|-------------|
+| `GET` | `/` | Root endpoint |
+| `GET` | `/health` | Health check |
+| `POST` | `/points` | Insert a point |
+| `GET` | `/points/:id` | Get a point by ID |
+| `DELETE` | `/points/:id` | Delete a point |
+| `POST` | `/points/search` | Search for similar vectors |
+
+### When to Use Which?
+
+
+
+ - Building production applications
+ - Using the Python SDK (it uses gRPC)
+ - Need authentication
+ - Processing high volumes of requests
+ - Want strongly-typed client libraries
+
+
+ - Quick prototyping with curl
+ - Integrating with systems that don't support gRPC
+ - Debugging and testing
+ - Building browser-based tools
+
+
+
+## Storage Layer
+
+The storage layer persists vectors and their payloads using a trait-based design:
+
+```rust
+pub trait StorageEngine: Send + Sync {
+ fn insert(&self, vector: DenseVector, payload: Payload) -> Result;
+ fn get(&self, point_id: PointId) -> Result